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 @ 385

History | View | Annotate | Download (24.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 POINT, POLIGON, LINE, MULTIPOINT, MULTILINE, MULTIPOLIGON
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
    self.selection = None
374

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

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

    
425
  def commit(self):
426
    """
427
    Finish edition
428
    """
429
    self.data.commit()
430
  
431
  def abort(self):
432
    """
433
    Cancel edition
434
    """
435
    self.data.abort()
436
    
437
  def getSelection(self):
438
    """
439
    Return features selected set
440
    """
441
    if self.selection == None:
442
      self.selection = self.data.getSelection()
443
      
444
    return self.selection
445
  
446
  def select(self, selection):
447
    """
448
    Insert features in the features selection set
449
    """
450
    if isinstance(selection,Feature) or isinstance(selection, FeatureSet):
451
      self.data.getSelection().select(selection._javaobj)
452
    else:
453
      self.data.getSelection().select(selection)
454

    
455
  def deselect(self, selection):
456
    """
457
    Remove features in the features selection set
458
    """
459
    if isinstance(selection,Feature) or isinstance(selection, FeatureSet):
460
      self.data.getSelection().deselect(selection._javaobj)
461
    else:
462
      self.data.getSelection().deselect(selection)
463

    
464
  def isSelected(feature):
465
    """
466
    Returns if feature is selected
467
    """
468
    if isinstance(feature, Feature):
469
      self.data.getSelection().deselect(feature._javaobj)
470
    else:
471
      self.data.getSelection().deselect(feature)
472

    
473
  def getProjectionCode(self):
474
    """
475
    Return layer projection code
476
    """
477
    return self.getProjection().getFullCode()
478

    
479

    
480
class Table(__DefaultTable__):
481
  """
482
  Represents gvsig layer document
483
  """
484
  def __init__(self,table):
485
    __DefaultTable__.__init__(self, table, table.getStore())
486

    
487
class Layer(__DefaultTable__):
488
  """
489
  Represents gvsig layer document
490
  """
491
  def __init__(self,layer):
492
    __DefaultTable__.__init__(self, layer, layer.getFeatureStore())
493
    #WrapperToJava.__init__(self,layer)
494
    
495
  def getTypeVectorLayer(self):
496
    return self().getTypeVectorLayer()
497
        
498
class FeatureSet(WrapperToJava):
499
  def __init__(self,featureSet):
500
    WrapperToJava.__init__(self,featureSet)
501
    
502
  def getCount(self):
503
    return self.getSize()
504
  
505
  def update(self, feature):
506
    """
507
    Update exist feature in the featureSet
508
    
509
      :param editableFeature: editableFeature
510
      :type editableFeature: Java editableFeature
511
    """
512
    #FIXME
513
    if not isinstance(feature, EditableFeature) and not isinstance(feature, DefaultEditableFeature):
514
      feature = feature._javaobj
515
    self().update(feature)
516
  
517
  def __iter__(self):
518
    return  Iterator(self.fastIterator())
519
   
520
class Iterator(WrapperToJava):
521

    
522
  def __init__(self,iterator):
523
    WrapperToJava.__init__(self,iterator)
524

    
525
  def next(self):
526
    if not self.hasNext():
527
      raise StopIteration()
528
    return Feature(self().next())
529
    
530
class Feature(WrapperToJava):
531
  """
532
  Represents layer feature data
533
  """
534
  def __init__(self,feature):
535
    WrapperToJava.__init__(self,feature)
536
    self.featureNoEditable = None
537

    
538
  def geometry(self):
539
    """
540
    Return feature default geometry
541
    """
542
    return self.getDefaultGeometry()
543
   
544
  def getValues(self):
545
    """
546
    Return dictionary with name value attributes
547
    """
548
    descriptor = self.getType()
549
    items = dict()
550
    for attr in descriptor.getAttributeDescriptors():
551
      name = attr.getName()
552
      value = self.get(attr.getName())
553
      items[name] = value
554
    return items 
555
  
556
  def edit(self):
557
    """
558
    Return editable feature
559
    """
560
    if not isinstance(self._javaobj, EditableFeature):
561
      self.featureNoEditable = self._javaobj
562
      self._javaobj = self._javaobj.getEditable()
563
  
564
  def __getitem__(self,key):
565
    return self.get(key)
566
  
567
  def __getattr__(self,name):
568
    try:
569
      v = getattr(self._javaobj,name, None)
570
      if v == None:
571
        v = self().get(name)        
572
      return v
573
    except Throwable, ex:
574
      raise RuntimeException("Can't access to attribute %s of feature (%s)" % (name, str(ex)))    
575

    
576
class Schema(WrapperToJava):
577
  """
578
  Layer feature definition
579
  """
580

    
581
  def __init__(self, featureType):
582
    WrapperToJava.__init__(self,featureType)
583
    self.featureTypeNoEditable = None
584
  
585
  def append(self, name, type, size=None, default=None, precision=4):
586
    """
587
    Adds property to feature properties definition.
588
    
589
        :param name: Feature property name
590
        :type name: String
591
        :param type: Feature property type
592
        :type name: String
593
        :param size: Feature property size
594
        :type size: int
595
        :param default: Feature property default value
596
        :return: new atribute
597

598
    """
599
    if not isinstance(self._javaobj, EditableFeatureType):
600
      self.modify()
601
      #self.featureTypeNoEditable = self._javaobj
602
      #self._javaobj = self._javaobj.getEditable()
603
    
604
    if isinstance(type, str):
605
      try:
606
        application = ApplicationLocator.getManager()
607
        datamanager =  application.getDataManager()
608
        dataTypes = application.getDataTypesManager()
609
        type = dataTypes.getType(type) #dataType constant value from string
610
      except:
611
        raise RuntimeError(
612
            "Feature Property Data type (%s) is not valid.  name=%s, type=%s, size=%s, default=%s)" % (
613
                type, 
614
                name, 
615
                type, 
616
                size, 
617
                default
618
            )
619
        )
620
    if isinstance(type, int):
621
      try:
622
        type = dataTypes.get(type)
623
      except:
624
        raise RuntimeError(
625
            "Data type (%s) is not valid.  name=%s, type=%s, size=%s, default=%s)" % (
626
                type, 
627
                name, 
628
                type, 
629
                size, 
630
                default
631
            )
632
        )
633
      
634
    attribute = self.add(name, type.getType())
635
 
636
    if size != None: 
637
      attribute.setSize(size)
638
    
639
    if default != None:
640
      attribute.setDefaultValue(default)
641
      
642
    if precision != None and type.getType() in (DataTypes.DOUBLE, DataTypes.FLOAT):
643
      attribute.setPrecision(precision)
644
    
645
    if type.getType() == DataTypes.GEOMETRY and self.getDefaultGeometryAttributeName()==None:
646
      self.setDefaultGeometryAttributeName(name)
647
    
648
    return attribute
649

    
650
  def __getitem__(self, name):
651
    return self.getAttributeDescriptor(name)
652

    
653
  def get(self, name, default=None):
654
    """
655
    Return a feature attribute descriptor that contains information about 
656
    one of the attributes in a feature, such as its name, data type or 
657
    precision. 
658
      :param name: Attribute name
659
      :type name: string
660
      :param default: Value to return if no attribute name found. 
661
      :return: AttributeDescriptor
662
    """
663
    x = self.getAttributeDescriptor(name)
664
    if x == None:
665
      return default
666
    return x
667
  
668
  def getAttrNames(self):
669
    """
670
    Return list with definition schema atribute names 
671
    """
672
    names = list(attr.getName() for attr in self.getAttributeDescriptors())
673
    return names
674
    """
675
    l = list()
676
    for attr in self.getAttributeDescriptors():
677
      l.append(attr.getName())
678
      
679
    return l  
680
    """
681
    
682
  def getCopy(self):
683
    return Schema(self().getCopy())
684
  
685
  def modify(self):
686
    if not isinstance(self._javaobj, EditableFeatureType):
687
      self.featureTypeNoEditable = self._javaobj
688
      self._javaobj = self._javaobj.getEditable()
689

    
690
      
691
#=====================#
692
# Vectorial Functions #
693
#=====================#
694

    
695
def createSchema(schema = None):
696
  """
697
  Return empty layer definition
698
  """
699
  if schema != None:
700
    s = schema.getCopy()
701
    s.modify()
702
    return s
703
    
704
  application = ApplicationLocator.getManager()
705
  datamanager =  application.getDataManager()
706
  return Schema(datamanager.createFeatureType())
707

    
708
def createLayer(schema, servertype, layertype=None, **parameters):
709
  """ 
710
  Create a new layer and return it 
711
  
712
      :param schema: layer data definition
713
      :type schema: Schema
714
      :param servertype: 
715
      :type servertype: string
716
      :return: new layer
717
      :rtype: Layer
718
      :raise: RuntimeException
719
  
720
  """
721
  if layertype == None:
722
    layertype = servertype
723
    servertype = "FilesystemExplorer"
724

    
725
  if layertype == "Shape" :
726
    if schema.get("GEOMETRY",None) == None:
727
      raise RuntimeException("Shape need a field named GEOMETRY in the schema")
728
  
729
  #parameters["geometryType"] = getGeometryType(parameters["geometryType"])
730
    
731
  if parameters["geometryType"] == None:
732
    raise RuntimeException("Invalid geometry type for new layer")
733
      
734
  try:
735
    application = ApplicationLocator.getManager()
736
    datamanager =  application.getDataManager()
737

    
738
    mapcontextmanager = application.getMapContextManager()
739

    
740
    server_parameters = datamanager.createServerExplorerParameters(servertype)
741
    copyToDynObject(parameters, server_parameters)
742

    
743
    server = datamanager.openServerExplorer(servertype, server_parameters)
744

    
745
    store_parameters = server.getAddParameters(layertype)
746
    copyToDynObject(parameters, store_parameters)
747
    store_parameters.setDefaultFeatureType(schema())
748

    
749
    server.add(layertype, store_parameters, True)
750

    
751
    store = datamanager.openStore(layertype, store_parameters)
752

    
753
    layer = mapcontextmanager.createLayer(store.getName(), store)
754

    
755
    return Layer(layer)
756
  except Throwable, ex:
757
    raise RuntimeException("Can't create layer, "+ str(ex))
758

    
759
def createShape(definition, filename, geometryType, CRS="wsg86"):
760
  """ 
761
  Create a new shape layer 
762
      
763
      :param definition: layer data definition
764
      :type definition: Schema
765
      :param filename: absolute path for shape files. 
766
      :type filename: string
767
      :param geometryType: geometry type for shape
768
      :type geometryType: string
769
      :return: new shape layer
770
      :rtype: Layer
771
  """
772
  return createLayer(
773
    definition, 
774
    "FilesystemExplorer", 
775
    "Shape", 
776
    shpFile=filename, 
777
    CRS=CRS,
778
    geometryType = geometryType
779
  )
780

    
781
def createTable(schema, servertype, tableType=None, **parameters):
782
  if tableType == None:
783
    tableType = servertype
784
    servertype = "FilesystemExplorer"
785

    
786
  try:
787
    application = ApplicationLocator.getManager()
788
    datamanager =  application.getDataManager()
789
    
790
    server_parameters = datamanager.createServerExplorerParameters(servertype)
791
    copyToDynObject(parameters, server_parameters)
792

    
793
    server = datamanager.openServerExplorer(servertype, server_parameters)
794
    
795
    store_parameters = server.getAddParameters(tableType)
796
    copyToDynObject(parameters, store_parameters)
797
    store_parameters.setDefaultFeatureType(schema())
798
    
799
    server.add(tableType, store_parameters, True)
800

    
801
    store = datamanager.openStore(tableType, store_parameters)
802
    
803
    return Table(store)
804
  
805
  except Throwable, ex:
806
    raise RuntimeException("Can't create table, "+ str(ex))
807
  
808
def createDBF(definition, DbfFile, CRS="wsg86"):
809
  """ 
810
  Create a new dbf document 
811
      
812
      :param definition: layer data definition
813
      :type definition: Schema
814
      :param DbfFile: absolute path for shape files. 
815
      :type DbfFile: string
816
      :return: new dbf
817
      :rtype: Table
818
  """
819
  return createTable(
820
    definition, 
821
    "FilesystemExplorer", 
822
    "DBF", 
823
    DbfFile=DbfFile, 
824
    CRS=CRS,
825
  )
826

    
827
#=====================#
828
# Documents Functions #
829
#=====================#  
830

    
831
def currentProject():
832
  """
833
  Return the current gvSIG proyect
834
    :return: Proyect
835
  """
836

    
837
  application = ApplicationLocator.getManager()
838
  project = application.getCurrentProject()
839
  return Project(project)
840

    
841
def currentDocument():
842
  """
843
  Return the current active document if it's a DocumentTable or DocumentView2D
844
  
845
    :return: Active document, None
846
  """
847

    
848
  application = ApplicationLocator.getManager()
849
  doc = application.getActiveDocument()
850
  
851
  if doc.getTypeName() == "project.document.table":
852
    return Table(doc)
853
  
854
  if doc.getTypeName() == "project.document.view2d": 
855
    return View(doc)  
856

    
857
  return None  
858
  
859
def currentTable():
860
  """
861
  Return the current active table document or None 
862
  
863
    :return: Table or None
864
  """  
865
  return Table(currentProject().getTable())
866
  
867
def currentView():
868
  """
869
  Return the current active view document or None 
870
  
871
    :return: View or None
872
  """
873

    
874
  return View(currentProject().getView())
875

    
876
def currentLayer():
877
  """ 
878
  Return current view active layer
879
  
880
    :return: gvSIG active layer
881
  """
882
  
883
  return currentView().getLayer()
884

    
885
#=====================#
886
# Simbology Functions #
887
#=====================#  
888
  
889
def simplePointSymbol(color):
890
  """
891
  Return simple point symbol using parameter color
892
  
893
    :param color: Color name
894
    :return: gvSIG point symbol
895
  """
896
  return MapContextLocator.getSymbolManager().createSymbol(Geometry.TYPES.POINT, color)
897

    
898
def simpleLineSymbol(color):
899
  """
900
  Return simple line symbol using parameter color
901
  
902
    :param color: Color name
903
    :return: gvSIG line symbol
904
  """
905
  return MapContextLocator.getSymbolManager().createSymbol(Geometry.TYPES.CURVE, color)
906

    
907
def simplePoligonSymbol(color):
908
  """
909
  Return simple poligon symbol using parameter color
910
  
911
    :param color: Color name
912
    :return: gvSIG poligon symbol
913
  """
914
  return MapContextLocator.getSymbolManager().createSymbol(Geometry.TYPES.SURFACE, color)
915
  
916

    
917
#=========================================#
918
# gvSIG Application Preferences Functions #
919
#=========================================#  
920

    
921
def getDataFolder():
922
  """
923
  Return gvSIG data folder. This folder is defined in application preferences
924
  If not defined return None
925
  """
926
  
927
  return Preferences.userRoot().node("gvsig.foldering").get('DataFolder', None)
928
  
929
def getProjectsFolder():
930
  """
931
  Return gvSIG projects folder. This folder is defined in application preferences.
932
  If not defined return None
933
  """
934
  
935
  return Preferences.userRoot().node("gvsig.foldering").get('ProjectsFolder', None)
936
  
937
def copyToDynObject(values, target):
938
  definition = target.getDynClass();
939
  fields = definition.getDynFields();
940
  for field in fields:
941
    name = field.getName()
942
    keys = values.keys()
943
    for k in keys:
944
      if k.lower() == name.lower():
945
        target.setDynValue(name, values[name])
946
        break#
947
# ====================================
948
#
949

    
950
def main():
951
  layer = currentLayer()
952
  schema = createSchema()
953
  schema.append("ID", "String", 50)
954
  schema.append("GEOMETRY", "Geometry")
955
  
956
  output = createLayer(
957
      schema, 
958
      "FilesystemExplorer", 
959
      "Shape", 
960
      shpFile="/tmp/pp.shp", 
961
      CRS="EPSG:23030", 
962
      geometryType=POINT
963
  )
964
  
965
  for feature in layer.features():
966
    point = feature.geometry().centroid()
967
    output.append(ID=feature.ID, GEOMETRY=point)
968
      
969
  output.commit() 
970
  
971
  currentView().addLayer(output())