Statistics
| Revision:

gvsig-scripting / org.gvsig.scripting.app / trunk / org.gvsig.scripting.app / org.gvsig.scripting.app.extension / src / main / resources / scripting / lib / gvsig.py @ 383

History | View | Annotate | Download (23.8 KB)

1
# -*- coding: utf-8 -*-
2
#
3
# File: gvsig.py
4
#
5
# Copyright (c) 2011 by Model Driven Development sl and Antonio Carrasco Valero
6
#
7
# GNU General Public License (GPL)
8
#
9
# This program is free software; you can redistribute it and/or
10
# modify it under the terms of the GNU General Public License
11
# as published by the Free Software Foundation; either version 2
12
# of the License, or (at your option) any later version.
13
#
14
# This program is distributed in the hope that it will be useful,
15
# but WITHOUT ANY WARRANTY; without even the implied warranty of
16
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
# GNU General Public License for more details.
18
#
19
# You should have received a copy of the GNU General Public License
20
# along with this program; if not, write to the Free Software
21
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22
# 02110-1301, USA.
23
#
24
#
25

    
26
__author__ = """Antonio Carrasco Valero
27
Model Driven Development sl and Antonio Carrasco Valero
28
<carrasco@modeldd.org>
29
Victor Acevedo Royer <vacevedor@gvsig.com>, <vacevedor@gmail.com>
30
"""
31

    
32
__docformat__ = 'plaintext'
33

    
34

    
35
from java.lang import RuntimeException
36
from java.lang import Throwable
37

    
38
from java.util.prefs import Preferences
39

    
40
from org.gvsig.app import ApplicationLocator
41
from org.gvsig.app.project.documents.view import ViewDocument 
42

    
43
from org.gvsig.fmap.mapcontext import MapContextLocator
44
from org.gvsig.fmap.mapcontext.layers import FLayers
45
from org.gvsig.fmap.dal import DALLocator, DataTypes
46
from org.gvsig.fmap.dal.feature import EditableFeature,  EditableFeatureType, FeatureQueryOrder
47
from org.gvsig.fmap.dal.feature.impl import DefaultEditableFeature
48

    
49
from org.gvsig.tools import ToolsLocator
50

    
51
from geom import *
52

    
53
import thread
54

    
55

    
56

    
57
"""
58
ARRAY, BOOLEAN, BYTE, BYTEARRAY, CHAR, CONTAINER, DATE, DOUBLE, DYNOBJECT, FILE,
59
FLOAT, FOLDER, INT, INVALID, LIST, LONG, MAP, MAX_TYPE_VALUE, OBJECT, SET,
60
STRING, SUBTYPE_DATE, SUBTYPE_FILE, SUBTYPE_FOLDER, TIME, TIMESTAMP, UNKNOWN,
61
URI, URL
62
"""
63

    
64
def runTask(name, function, *args):
65
  manager = ToolsLocator.getTaskStatusManager()
66
  status = manager.createDefaultSimpleTaskStatus(name)
67
  status.add()
68
  args = list(args)
69
  args.append(status)
70
  try:
71
    thread.start_new_thread(function, tuple(args))
72
    status.terminate()
73
  except Exception,e:
74
    status.abort()
75
    raise e
76
     
77

    
78
class WrapperToJava(object):
79
  """
80
  Create a wrapper that allows python object access to the Java object
81
  properties and methods
82
  """
83
  def __init__(self, javaobj):
84
    if javaobj == None:
85
      raise RuntimeException("Can't create "+ self.__class__.__name__)
86
    self._javaobj = javaobj
87

    
88
  def __call__(self):
89
    return self._javaobj
90

    
91
  def __getattr__(self,name):
92
    return getattr(self._javaobj,name)
93

    
94
class Project(WrapperToJava):
95
  """
96
  Represents a gvSIG project
97
  """
98
  def __init__(self, project):
99
    WrapperToJava.__init__(self, project)
100
  
101
  def getView(self, name=None):
102
    """
103
    Return active view, or view called 'name'  or None
104
    
105
      :param name: view name
106
      :type name: string
107
    """
108
    v = None
109
      
110
    if name == None:
111
      try:
112
        activeDocument = self.getActiveDocument()
113
        if activeDocument.getTypeName() == "project.document.view2d":
114
          v = View(activeDocument)
115
      except Exception, ex:
116
        raise Exception("%s"%repr(ex))
117

    
118
    else:
119
      views = self.getViews()
120
      if len(views) >0:
121
        for view in views:
122
          if name == view.getName():
123
            v = View(view)
124

    
125
    return v
126
    
127
  def getTable(self, name=None):
128
    """
129
    Return active Table Document, or Table Document called 'name'  or None
130
    
131
      :param name: Table Document name
132
      :type name: string
133
    """
134
    t = None
135
    if name == None:
136
      try:
137
        activeDocument = self.getActiveDocument()
138
        if activeDocument.getTypeName() == "project.document.table":
139
          t = Table(activeDocument)
140
      except Exception, ex:
141
        raise Exception("%s"%repr(ex))
142
    else:
143
      tables = self.getDocuments("project.document.table")
144
      if len(tables) >0:
145
        for table in tables:
146
          if name == table.getName():
147
            t = Table(table)
148
            
149
    return t
150
    
151
  def getProjectionCode(self):
152
    return self.getProjection().getFullCode()
153

    
154
class View(WrapperToJava):
155
  """
156
  Represents gvSIG view document.
157
  """
158
  def __init__(self,view):
159
    WrapperToJava.__init__(self,view)
160
    
161
  def getLayer(self, name=None):
162
    """
163
    Return one of the view layers documents. If name is None return view active 
164
    layer if the view has one, if name is not None return view called name else 
165
    return None.
166
      
167
      :param name: view name in Table Of Contents
168
      :type name: string
169
      :return: View
170
      :return: None
171
      
172
    """
173
    map = self.getMapContext();
174
    if name == None:
175
      activeLayers = map.getLayers().getActives()
176
      if len(activeLayers) != 1 :
177
        raise RuntimeException("The view has not an active layer")
178
      for layer in activeLayers:
179
        if not isinstance(layer, FLayers):
180
          return Layer(layer)
181
      raise RuntimeException("The view has not an active layer")
182
    
183
    ls = self.getLayers()
184
    for i in xrange(ls.getLayersCount()):
185
      l = ls.getLayer(i)
186
      if l.name == name:
187
        return Layer(l)
188
    
189
    return None
190
    
191
  def getMap(self):
192
    """
193
    Return view mapContext
194
    """
195
    return self.getMapContext();
196
 
197
  def addLayer(self, layer):
198
    if isinstance(layer, Layer):
199
      layer =layer()
200
    self.getMapContext().getLayers().addLayer(layer)
201
  
202
  def getLayers(self):
203
    """
204
    Return iterable view layers set
205
    """
206
    map = self.getMapContext();
207
    return Layers(map.getLayers())
208
    
209
  def getGraphicsLayer(self):
210
    """
211
    Return view graphics layer
212
    """
213
    return self.getMapContext().getGraphicsLayer()
214
    
215
  def getProjectionCode(self):
216
    return self.getProjection().getFullCode()
217
    
218
class Layers(WrapperToJava):
219
  """
220
  Iterable layers set
221
  """
222
  def __init__(self,layers):
223
    WrapperToJava.__init__(self, layers)
224

    
225
  def __len__(self):
226
    return self.getLayersCount()
227

    
228
  def __getitem__(self, index):
229
    return self.getLayer(index)
230

    
231
  def __iter__(self):
232
    return LayersIterator(self)
233

    
234
class LayersIterator(object):
235

    
236
  def __init__(self,layers):
237
    self.__layers = layers
238
    self.__index = -1
239

    
240
  def next(self):
241
    self.__index+=1
242
    if self.__index >= self.__layers.getLayersCount() :
243
      raise StopIteration()
244
    return Layer(self.__layers.getLayer(self.__index))    
245
  
246
class Store(WrapperToJava):
247
  """
248
  Represents gvsig store
249
  """
250
  def __init__(self,store):
251
    WrapperToJava.__init__(self, store)
252
    #self.data = None
253
    self.fset = None
254
  
255
  def features(self, expresion = None, sortBy="", asc=True):
256
    """
257
    Return layer features set (FeatureSet)
258
    
259
        :param expresion: filter to apply to the feature set to select
260
determinates features that match with expression
261
        :type expresion: string
262
        :param sortBy: name of attribute to sort
263
        :type sortby: string
264
        :param: asc: order
265
        :type asc: boolean
266
        :return: FeatureSet
267
    """
268
    
269
    if expresion == None and sortBy =="":
270
      self.fset = self.getFeatureSet()         
271
    else:
272
      application = ApplicationLocator.getManager()
273
      datamanager =  application.getDataManager()
274
      query = self.createFeatureQuery()
275
      if sortBy != "":
276
        order = FeatureQueryOrder()
277
        order.add(sortBy, asc)
278
        query.setOrder(order)
279
      if expresion != None:
280
        query.setFilter(datamanager.createExpresion(expresion))
281
      #self.fset = data.getFeatureSet(query)    
282
      self.fset = self.getFeatureSet(query)
283
    
284
    return FeatureSet(self.fset)    
285

    
286
  def edit(self):
287
    """
288
    Set layer data store in edition mode
289
    """
290
     
291
    if not self.isEditing():
292
        self().edit() 
293
     
294
  def append(self, *valuesList, **values):
295
    """
296
    Create a new feature from given values and insert it in the feature set
297
    
298
      :param values: dictionary with name property value or list named params
299
      :type values: dict
300
    
301
    """
302
    try:
303
      if len(valuesList) ==1:
304
        values.update(valuesList[0])
305
      
306
      if not self.isEditing():
307
        self.edit() 
308
      f = self.createNewFeature()
309
      
310
      if f == None:
311
        raise RuntimeError("Failed to create a new Feature")
312
      for k,v in values.iteritems():
313
        f.set(k,v)
314
        self.insert(f)
315
    except Throwable, ex:
316
      raise RuntimeException("Can't append values %s to layer %s (%s)" % (
317
        repr(values), 
318
        self.getName(), 
319
        str(ex)
320
        )
321
      )
322

    
323
  def updateSchema(self, schema):
324
    try:
325
      self().update(schema._javaobj)
326
    except Throwable, ex:
327
      raise RuntimeException(repr(ex))
328
    
329
  def update(self, feature):
330
    """
331
    Update exist feature in the layer featureSet
332
    
333
      :param editableFeature: editableFeature
334
      :type editableFeature: Java editableFeature
335
    """
336
    if not isinstance(feature, EditableFeature):
337
      feature = feature._javaobj
338
    self.fset.update(feature)
339
  
340
  def getSchema(self):
341
    """
342
    Return layer schema definition
343
    """
344
    return Schema(self.getDefaultFeatureType())
345

    
346
  def commit(self):
347
    """
348
    Finish layer edition
349
    """
350
    try:
351
      self.finishEditing()          
352
    except Throwable, ex:
353
      self.abort()
354
      raise Throwable("Can't finish layer edition, cancelling changes. %s" % repr(ex))
355
  
356
  def abort(self):
357
    """
358
    Cancel layer edition
359
    """
360
    self.cancelEditing() 
361
    self.dispose()
362

    
363
  def getSelection(self):
364
    """
365
    Return layer feature selected set
366
    """
367
    return FeatureSet(self().getSelection())
368

    
369
class __DefaultTable__(WrapperToJava):
370
  def __init__(self,document, data):
371
    self.data = Store(data)
372
    WrapperToJava.__init__(self,document)
373

    
374
  def features(self, expresion = None, sortBy="", asc=True):
375
    """
376
    Return table features set
377
    
378
        :param expresion: filter to apply to the feature set to select
379
determinates features that match with expression
380
        :type expresion: string
381
        :return: FeatureSet
382
    """
383
    
384
    return self.data.features(expresion, sortBy, asc)
385

    
386
  def edit(self):
387
    """
388
    Set layer data store in edition mode
389
    """
390
     
391
    self.data.edit() 
392
     
393
  def append(self, *valuesList, **values):
394
    """
395
    Create a new feature from given values and insert it in the feature set
396
    
397
      :param values: dictionary with name property value or list named params
398
      :type values: dict
399
    
400
    """
401
    self.data.append(*valuesList, **values)
402
    
403
  def updateSchema(self, schema):
404
    self.data.updateSchema(schema)
405
    
406
  def update(self, feature):
407
    """
408
    Update exist feature in the layer featureSet
409
    
410
      :param editableFeature: editableFeature
411
      :type editableFeature: Java editableFeature
412
    """
413
    self.data.update(feature)
414
  
415
  def getSchema(self):
416
    """
417
    Return layer schema definition
418
    """
419
    return self.data.getSchema()
420

    
421
  def commit(self):
422
    """
423
    Finish layer edition
424
    """
425
    self.data.commit()
426
  
427
  def abort(self):
428
    """
429
    Cancel layer edition
430
    """
431
    self.data.abort()
432
    
433
  def getSelection(self):
434
    """
435
    Return layer feature selected set
436
    """
437
    return self.data.getSelection()
438
  
439
  def getProjectionCode(self):
440
    """
441
    Return layer projection code
442
    """
443
    return self.getProjection().getFullCode()
444

    
445
class Table(__DefaultTable__):
446
  """
447
  Represents gvsig layer document
448
  """
449
  def __init__(self,table):
450
    __DefaultTable__.__init__(self, table, table.getStore())
451

    
452
class Layer(__DefaultTable__):
453
  """
454
  Represents gvsig layer document
455
  """
456
  def __init__(self,layer):
457
    __DefaultTable__.__init__(self, layer, layer.getFeatureStore())
458
    #WrapperToJava.__init__(self,layer)
459
    
460
  def getTypeVectorLayer(self):
461
    return self().getTypeVectorLayer()
462
        
463
class FeatureSet(WrapperToJava):
464
  def __init__(self,featureSet):
465
    WrapperToJava.__init__(self,featureSet)
466
    
467
  def getCount(self):
468
    return self.getSize()
469
  
470
  def update(self, feature):
471
    """
472
    Update exist feature in the featureSet
473
    
474
      :param editableFeature: editableFeature
475
      :type editableFeature: Java editableFeature
476
    """
477
    #FIXME
478
    if not isinstance(feature, EditableFeature) and not isinstance(feature, DefaultEditableFeature):
479
      feature = feature._javaobj
480
    self().update(feature)
481
  
482
  def __iter__(self):
483
    return  Iterator(self.fastIterator())
484
   
485
class Iterator(WrapperToJava):
486

    
487
  def __init__(self,iterator):
488
    WrapperToJava.__init__(self,iterator)
489

    
490
  def next(self):
491
    if not self.hasNext():
492
      raise StopIteration()
493
    return Feature(self().next())
494
    
495
class Feature(WrapperToJava):
496
  """
497
  Represents layer feature data
498
  """
499
  def __init__(self,feature):
500
    WrapperToJava.__init__(self,feature)
501
    self.featureNoEditable = None
502

    
503
  def geometry(self):
504
    """
505
    Return feature default geometry
506
    """
507
    return self.getDefaultGeometry()
508
   
509
  def getValues(self):
510
    """
511
    Return dictionary with name value attributes
512
    """
513
    descriptor = self.getType()
514
    items = dict()
515
    for attr in descriptor.getAttributeDescriptors():
516
      name = attr.getName()
517
      value = self.get(attr.getName())
518
      items[name] = value
519
    return items 
520
  
521
  def edit(self):
522
    """
523
    Return editable feature
524
    """
525
    if not isinstance(self._javaobj, EditableFeature):
526
      self.featureNoEditable = self._javaobj
527
      self._javaobj = self._javaobj.getEditable()
528
  
529
  def __getitem__(self,key):
530
    return self.get(key)
531
  
532
  def __getattr__(self,name):
533
    try:
534
      v = getattr(self._javaobj,name, None)
535
      if v == None:
536
        v = self().get(name)        
537
      return v
538
    except Throwable, ex:
539
      raise RuntimeException("Can't access to attribute %s of feature (%s)" % (name, str(ex)))    
540

    
541
class Schema(WrapperToJava):
542
  """
543
  Layer feature definition
544
  """
545

    
546
  def __init__(self, featureType):
547
    WrapperToJava.__init__(self,featureType)
548
    self.featureTypeNoEditable = None
549
  
550
  def append(self, name, type, size=None, default=None, precision=4):
551
    """
552
    Adds property to feature properties definition.
553
    
554
        :param name: Feature property name
555
        :type name: String
556
        :param type: Feature property type
557
        :type name: String
558
        :param size: Feature property size
559
        :type size: int
560
        :param default: Feature property default value
561
        :return: new atribute
562

563
    """
564
    if not isinstance(self._javaobj, EditableFeatureType):
565
      self.modify()
566
      #self.featureTypeNoEditable = self._javaobj
567
      #self._javaobj = self._javaobj.getEditable()
568
    
569
    if isinstance(type, str):
570
      try:
571
        application = ApplicationLocator.getManager()
572
        datamanager =  application.getDataManager()
573
        dataTypes = application.getDataTypesManager()
574
        type = dataTypes.getType(type) #dataType constant value from string
575
      except:
576
        raise RuntimeError(
577
            "Feature Property Data type (%s) is not valid.  name=%s, type=%s, size=%s, default=%s)" % (
578
                type, 
579
                name, 
580
                type, 
581
                size, 
582
                default
583
            )
584
        )
585
    if isinstance(type, int):
586
      try:
587
        type = dataTypes.get(type)
588
      except:
589
        raise RuntimeError(
590
            "Data type (%s) is not valid.  name=%s, type=%s, size=%s, default=%s)" % (
591
                type, 
592
                name, 
593
                type, 
594
                size, 
595
                default
596
            )
597
        )
598
      
599
    attribute = self.add(name, type.getType())
600
 
601
    if size != None: 
602
      attribute.setSize(size)
603
    
604
    if default != None:
605
      attribute.setDefaultValue(default)
606
      
607
    if precision != None and type.getType() in (DataTypes.DOUBLE, DataTypes.FLOAT):
608
      attribute.setPrecision(precision)
609
    
610
    if type.getType() == DataTypes.GEOMETRY and self.getDefaultGeometryAttributeName()==None:
611
      self.setDefaultGeometryAttributeName(name)
612
    
613
    return attribute
614

    
615
  def __getitem__(self, name):
616
    return self.getAttributeDescriptor(name)
617

    
618
  def get(self, name, default=None):
619
    """
620
    Return a feature attribute descriptor that contains information about 
621
    one of the attributes in a feature, such as its name, data type or 
622
    precision. 
623
      :param name: Attribute name
624
      :type name: string
625
      :param default: Value to return if no attribute name found. 
626
      :return: AttributeDescriptor
627
    """
628
    x = self.getAttributeDescriptor(name)
629
    if x == None:
630
      return default
631
    return x
632
  
633
  def getListAttrNames(self):
634
    """
635
    Return dictionary with atribute names as dict keys and None as values
636
    """
637
    l = list()
638
    for attr in self.getAttributeDescriptors():
639
      l.append(attr.getName())
640
      
641
    return l  
642
    
643
  def getCopy(self):
644
    return Schema(self().getCopy())
645
  
646
  def modify(self):
647
    if not isinstance(self._javaobj, EditableFeatureType):
648
      self.featureTypeNoEditable = self._javaobj
649
      self._javaobj = self._javaobj.getEditable()
650

    
651
      
652
#=====================#
653
# Vectorial Functions #
654
#=====================#
655

    
656
def createSchema(schema = None):
657
  """
658
  Return empty layer definition
659
  """
660
  if schema != None:
661
    s = schema.getCopy()
662
    s.modify()
663
    return s
664
    
665
  application = ApplicationLocator.getManager()
666
  datamanager =  application.getDataManager()
667
  return Schema(datamanager.createFeatureType())
668

    
669
def createLayer(schema, servertype, layertype=None, **parameters):
670
  """ 
671
  Create a new layer and return it 
672
  
673
      :param schema: layer data definition
674
      :type schema: Schema
675
      :param servertype: 
676
      :type servertype: string
677
      :return: new layer
678
      :rtype: Layer
679
      :raise: RuntimeException
680
  
681
  """
682
  if layertype == None:
683
    layertype = servertype
684
    servertype = "FilesystemExplorer"
685

    
686
  if layertype == "Shape" :
687
    if schema.get("GEOMETRY",None) == None:
688
      raise RuntimeException("Shape need a field named GEOMETRY in the schema")
689
  
690
  #parameters["geometryType"] = getGeometryType(parameters["geometryType"])
691
    
692
  if parameters["geometryType"] == None:
693
    raise RuntimeException("Invalid geometry type for new layer")
694
      
695
  try:
696
    application = ApplicationLocator.getManager()
697
    datamanager =  application.getDataManager()
698

    
699
    mapcontextmanager = application.getMapContextManager()
700

    
701
    server_parameters = datamanager.createServerExplorerParameters(servertype)
702
    copyToDynObject(parameters, server_parameters)
703

    
704
    server = datamanager.openServerExplorer(servertype, server_parameters)
705

    
706
    store_parameters = server.getAddParameters(layertype)
707
    copyToDynObject(parameters, store_parameters)
708
    store_parameters.setDefaultFeatureType(schema())
709

    
710
    server.add(layertype, store_parameters, True)
711

    
712
    store = datamanager.openStore(layertype, store_parameters)
713

    
714
    layer = mapcontextmanager.createLayer(store.getName(), store)
715

    
716
    return Layer(layer)
717
  except Throwable, ex:
718
    raise RuntimeException("Can't create layer, "+ str(ex))
719

    
720
def createShape(definition, filename, geometryType, CRS="wsg86"):
721
  """ 
722
  Create a new shape layer 
723
      
724
      :param definition: layer data definition
725
      :type definition: Schema
726
      :param filename: absolute path for shape files. 
727
      :type filename: string
728
      :param geometryType: geometry type for shape
729
      :type geometryType: string
730
      :return: new shape layer
731
      :rtype: Layer
732
  """
733
  return createLayer(
734
    definition, 
735
    "FilesystemExplorer", 
736
    "Shape", 
737
    shpFile=filename, 
738
    CRS=CRS,
739
    geometryType = geometryType
740
  )
741

    
742
def createTable(schema, servertype, tableType=None, **parameters):
743
  if tableType == None:
744
    tableType = servertype
745
    servertype = "FilesystemExplorer"
746

    
747
  try:
748
    application = ApplicationLocator.getManager()
749
    datamanager =  application.getDataManager()
750
    
751
    server_parameters = datamanager.createServerExplorerParameters(servertype)
752
    copyToDynObject(parameters, server_parameters)
753

    
754
    server = datamanager.openServerExplorer(servertype, server_parameters)
755
    
756
    store_parameters = server.getAddParameters(tableType)
757
    copyToDynObject(parameters, store_parameters)
758
    store_parameters.setDefaultFeatureType(schema())
759
    
760
    server.add(tableType, store_parameters, True)
761

    
762
    store = datamanager.openStore(tableType, store_parameters)
763
    
764
    return Table(store)
765
  
766
  except Throwable, ex:
767
    raise RuntimeException("Can't create table, "+ str(ex))
768
  
769
def createDBF(definition, DbfFile, CRS="wsg86"):
770
  """ 
771
  Create a new dbf document 
772
      
773
      :param definition: layer data definition
774
      :type definition: Schema
775
      :param DbfFile: absolute path for shape files. 
776
      :type DbfFile: string
777
      :return: new dbf
778
      :rtype: Table
779
  """
780
  return createTable(
781
    definition, 
782
    "FilesystemExplorer", 
783
    "DBF", 
784
    DbfFile=DbfFile, 
785
    CRS=CRS,
786
  )
787

    
788
#=====================#
789
# Documents Functions #
790
#=====================#  
791

    
792
def currentProject():
793
  """
794
  Return the current gvSIG proyect
795
    :return: Proyect
796
  """
797

    
798
  application = ApplicationLocator.getManager()
799
  project = application.getCurrentProject()
800
  return Project(project)
801

    
802
def currentDocument():
803
  """
804
  Return the current active document if it's a DocumentTable or DocumentView2D
805
  
806
    :return: Active document, None
807
  """
808

    
809
  application = ApplicationLocator.getManager()
810
  doc = application.getActiveDocument()
811
  
812
  if doc.getTypeName() == "project.document.table":
813
    return Table(doc)
814
  
815
  if doc.getTypeName() == "project.document.view2d": 
816
    return View(doc)  
817

    
818
  return None  
819
  
820
def currentTable():
821
  """
822
  Return the current active table document or None 
823
  
824
    :return: Table or None
825
  """  
826
  return Table(currentProject().getTable())
827
  
828
def currentView():
829
  """
830
  Return the current active view document or None 
831
  
832
    :return: View or None
833
  """
834

    
835
  return View(currentProject().getView())
836

    
837
def currentLayer():
838
  """ 
839
  Return current view active layer
840
  
841
    :return: gvSIG active layer
842
  """
843
  
844
  return currentView().getLayer()
845

    
846
#=====================#
847
# Simbology Functions #
848
#=====================#  
849
  
850
def simplePointSymbol(color):
851
  """
852
  Return simple point symbol using parameter color
853
  
854
    :param color: Color name
855
    :return: gvSIG point symbol
856
  """
857
  return MapContextLocator.getSymbolManager().createSymbol(Geometry.TYPES.POINT, color)
858

    
859
def simpleLineSymbol(color):
860
  """
861
  Return simple line symbol using parameter color
862
  
863
    :param color: Color name
864
    :return: gvSIG line symbol
865
  """
866
  return MapContextLocator.getSymbolManager().createSymbol(Geometry.TYPES.CURVE, color)
867

    
868
def simplePoligonSymbol(color):
869
  """
870
  Return simple poligon symbol using parameter color
871
  
872
    :param color: Color name
873
    :return: gvSIG poligon symbol
874
  """
875
  return MapContextLocator.getSymbolManager().createSymbol(Geometry.TYPES.SURFACE, color)
876
  
877

    
878
#=========================================#
879
# gvSIG Application Preferences Functions #
880
#=========================================#  
881

    
882
def getDataFolder():
883
  """
884
  Return gvSIG data folder. This folder is defined in application preferences
885
  If not defined return None
886
  """
887
  
888
  return Preferences.userRoot().node("gvsig.foldering").get('DataFolder', None)
889
  
890
def getProjectsFolder():
891
  """
892
  Return gvSIG projects folder. This folder is defined in application preferences.
893
  If not defined return None
894
  """
895
  
896
  return Preferences.userRoot().node("gvsig.foldering").get('ProjectsFolder', None)
897
  
898
def copyToDynObject(values, target):
899
  definition = target.getDynClass();
900
  fields = definition.getDynFields();
901
  for field in fields:
902
    name = field.getName()
903
    keys = values.keys()
904
    for k in keys:
905
      if k.lower() == name.lower():
906
        target.setDynValue(name, values[name])
907
        break#
908
# ====================================
909
#
910

    
911
def main():
912
  layer = currentLayer()
913
  schema = createSchema()
914
  schema.append("ID", "String", 50)
915
  schema.append("GEOMETRY", "Geometry")
916
  
917
  output = createLayer(
918
      schema, 
919
      "FilesystemExplorer", 
920
      "Shape", 
921
      shpFile="/tmp/pp.shp", 
922
      CRS="EPSG:23030", 
923
      geometryType=POINT
924
  )
925
  
926
  for feature in layer.features():
927
    point = feature.geometry().centroid()
928
    output.append(ID=feature.ID, GEOMETRY=point)
929
      
930
  output.commit() 
931
  
932
  currentView().addLayer(output())