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

History | View | Annotate | Download (27.2 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
"""
27
This module contains classes and functions to manage gvSIG Project, 
28
gvSIG DocumentView, gvSIG TableDocument and Layers.
29
"""
30

    
31
__author__ = """Antonio Carrasco Valero
32
Model Driven Development sl and Antonio Carrasco Valero
33
<carrasco@modeldd.org>
34
Victor Acevedo Royer <vacevedor@gvsig.com>, <vacevedor@gmail.com>
35
"""
36

    
37
__docformat__ = 'plaintext'
38

    
39
from java.awt import Color
40

    
41
from java.lang import RuntimeException
42
from java.lang import Throwable
43

    
44
from java.util.prefs import Preferences
45

    
46
from org.gvsig.app import ApplicationLocator
47
from org.gvsig.app.project.documents.view import ViewDocument 
48
from org.gvsig.app.project.documents.table import TableDocument
49

    
50
from org.gvsig.fmap.crs import CRSFactory
51

    
52
from org.gvsig.fmap.mapcontext import MapContextLocator
53
from org.gvsig.fmap.mapcontext.layers import FLayers
54

    
55
from org.gvsig.fmap.dal import DALLocator, DataTypes
56
from org.gvsig.fmap.dal.feature import EditableFeature,  EditableFeatureType, FeatureQueryOrder
57
from org.gvsig.fmap.dal.feature.impl import DefaultEditableFeature
58

    
59
from org.gvsig.fmap.geom import Geometry
60

    
61
from org.gvsig.tools import ToolsLocator
62

    
63
import thread
64
import random
65

    
66

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

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

    
91
  def __call__(self):
92
    return self._javaobj
93

    
94
  def __getattr__(self,name):
95
    return getattr(self._javaobj,name)
96

    
97
class Project(WrapperToJava):
98
  """
99
  Represents a gvSIG project
100
  """
101
  def __init__(self, project):
102
    WrapperToJava.__init__(self, project)
103
  
104
  def getView(self, name=None):
105
    """
106
    Return active view, or view called 'name'  or None
107
    
108
      :param name: view name
109
      :type name: string
110
    """
111
    if name == None:
112
      try:
113
        activeDocument = self.getActiveDocument()
114
        if activeDocument == None:
115
            return None
116
        if isinstance(activeDocument, ViewDocument):
117
            return View(activeDocument)
118
      except Exception, ex:
119
        raise Exception("%s"%repr(ex))
120
    else:
121
      views = self.getViews()
122
      if len(views) >0:
123
        for view in views:
124
          if name == view.getName():
125
            return View(view)
126

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

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

    
230
  def __len__(self):
231
    return self.getLayersCount()
232

    
233
  def __getitem__(self, index):
234
    return self.getLayer(index)
235

    
236
  def __iter__(self):
237
    return LayersIterator(self)
238

    
239
class LayersIterator(object):
240

    
241
  def __init__(self,layers):
242
    self.__layers = layers
243
    self.__index = -1
244

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

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

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

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

    
368
  def getSelection(self):
369
    """
370
    Return layer feature selected set
371
    """
372
    return FeatureSet(self().getSelection())
373

    
374
class __DefaultTable__(WrapperToJava):
375
  def __init__(self,document, data):
376
    self.data = Store(data)
377
    WrapperToJava.__init__(self,document)
378
    self.selection = None
379

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

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

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

    
460
  def deselect(self, selection):
461
    """
462
    Remove features in the features selection set
463
    """
464
    if isinstance(selection,Feature) or isinstance(selection, FeatureSet):
465
      self.data.getSelection().deselect(selection._javaobj)
466
    else:
467
      self.data.getSelection().deselect(selection)
468

    
469
  def isSelected(feature):
470
    """
471
    Returns if feature is selected
472
    """
473
    if isinstance(feature, Feature):
474
      self.data.getSelection().deselect(feature._javaobj)
475
    else:
476
      self.data.getSelection().deselect(feature)
477

    
478
  def getProjectionCode(self):
479
    """
480
    Return layer projection code
481
    """
482
    return self.getProjection().getFullCode()
483

    
484

    
485
class Table(__DefaultTable__):
486
  """
487
  Represents gvsig layer document
488
  """
489
  def __init__(self,table):
490
    __DefaultTable__.__init__(self, table, table.getStore())
491

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

    
526
  def __init__(self,iterator):
527
    WrapperToJava.__init__(self,iterator)
528

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

    
542
  def geometry(self):
543
    """
544
    Return feature default geometry
545
    """
546
    return self.getDefaultGeometry()
547
   
548
  def getValues(self):
549
    """
550
    Return dictionary with name value attributes
551
    """
552
    descriptor = self.getType()
553
    items = dict()
554
    for attr in descriptor.getAttributeDescriptors():
555
      name = attr.getName()
556
      value = self.get(attr.getName())
557
      items[name] = value
558
    return items 
559
  
560
  def edit(self):
561
    """
562
    Return editable feature
563
    """
564
    if not isinstance(self._javaobj, EditableFeature):
565
      self.featureNoEditable = self._javaobj
566
      self._javaobj = self._javaobj.getEditable()
567
  
568
  def __getitem__(self,key):
569
    return self.get(key)
570
  
571
  def __getattr__(self,name):
572
    #
573
    #FIX console error when try to introspect feature object
574
    if name in ('__methods__'):
575
        return dict()
576
    elif name in ('__members__'):
577
        return self.getValues().keys()
578
    elif name == '__dict__':
579
        return self.getValues()      
580
        
581
    try:
582
      v = getattr(self._javaobj, name, None)
583
      if v == None:
584
        v = self().get(name)        
585
      return v
586
    except Throwable, ex:
587
      raise RuntimeException("Can't access to attribute %s of feature (%s)" % (name, str(ex)))    
588

    
589
class Schema(WrapperToJava):
590
  """
591
  Layer feature definition
592
  """
593

    
594
  def __init__(self, featureType):
595
    WrapperToJava.__init__(self,featureType)
596
    self.featureTypeNoEditable = None
597
  
598
  def append(self, name, type, size=None, default=None, precision=4):
599
    """
600
    Adds property to feature properties definition.
601
    
602
        :param name: Feature property name
603
        :type name: String
604
        :param type: Feature property type
605
        :type name: String
606
        :param size: Feature property size
607
        :type size: int
608
        :param default: Feature property default value
609
        :return: new atribute
610

611
    """
612
    if not isinstance(self._javaobj, EditableFeatureType):
613
      self.modify()
614
      #self.featureTypeNoEditable = self._javaobj
615
      #self._javaobj = self._javaobj.getEditable()
616
    
617
    if isinstance(type, str):
618
      try:
619
        application = ApplicationLocator.getManager()
620
        datamanager =  application.getDataManager()
621
        dataTypes = application.getDataTypesManager()
622
        type = dataTypes.getType(type) #dataType constant value from string
623
      except:
624
        raise RuntimeError(
625
            "Feature Property 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
    if isinstance(type, int):
634
      try:
635
        type = dataTypes.get(type)
636
      except:
637
        raise RuntimeError(
638
            "Data type (%s) is not valid.  name=%s, type=%s, size=%s, default=%s)" % (
639
                type, 
640
                name, 
641
                type, 
642
                size, 
643
                default
644
            )
645
        )
646
      
647
    attribute = self.add(name, type.getType())
648
 
649
    if size != None: 
650
      attribute.setSize(size)
651
    
652
    if default != None:
653
      attribute.setDefaultValue(default)
654
      
655
    if precision != None and type.getType() in (DataTypes.DOUBLE, DataTypes.FLOAT):
656
      attribute.setPrecision(precision)
657
    
658
    if type.getType() == DataTypes.GEOMETRY and self.getDefaultGeometryAttributeName()==None:
659
      self.setDefaultGeometryAttributeName(name)
660
    
661
    return attribute
662

    
663
  def __getitem__(self, name):
664
    return self.getAttributeDescriptor(name)
665

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

    
696
      
697
#=====================#
698
# Vectorial Functions #
699
#=====================#
700

    
701
def createSchema(schema = None):
702
  """
703
  Return empty layer definition
704
  """
705
  if schema != None:
706
    s = schema.getCopy()
707
    s.modify()
708
    return s
709
    
710
  application = ApplicationLocator.getManager()
711
  datamanager =  application.getDataManager()
712
  return Schema(datamanager.createFeatureType())
713

    
714
def createLayer(schema, servertype, layertype=None, **parameters):
715
  """ 
716
  Create a new layer and return it 
717
  
718
      :param schema: layer data definition
719
      :type schema: Schema
720
      :param servertype: 
721
      :type servertype: string
722
      :return: new layer
723
      :rtype: Layer
724
      :raise: RuntimeException
725
  
726
  """
727
  if layertype == None:
728
    layertype = servertype
729
    servertype = "FilesystemExplorer"
730

    
731
  if layertype == "Shape" :
732
    if schema.get("GEOMETRY",None) == None:
733
      raise RuntimeException("Shape need a field named GEOMETRY in the schema")
734
  
735
  #parameters["geometryType"] = getGeometryType(parameters["geometryType"])
736
    
737
  if parameters["geometryType"] == None:
738
    raise RuntimeException("Invalid geometry type for new layer")
739
      
740
  try:
741
    application = ApplicationLocator.getManager()
742
    datamanager =  application.getDataManager()
743

    
744
    mapcontextmanager = application.getMapContextManager()
745

    
746
    server_parameters = datamanager.createServerExplorerParameters(servertype)
747
    copyToDynObject(parameters, server_parameters)
748

    
749
    server = datamanager.openServerExplorer(servertype, server_parameters)
750

    
751
    store_parameters = server.getAddParameters(layertype)
752
    copyToDynObject(parameters, store_parameters)
753
    store_parameters.setDefaultFeatureType(schema())
754

    
755
    server.add(layertype, store_parameters, True)
756

    
757
    store = datamanager.openStore(layertype, store_parameters)
758

    
759
    layer = mapcontextmanager.createLayer(store.getName(), store)
760

    
761
    return Layer(layer)
762
  except Throwable, ex:
763
    raise RuntimeException("Can't create layer, "+ str(ex))
764

    
765
def loadShapeFile(shpFile, CRS="CRS:84"):
766
    """
767
    Add existing shape file to the view
768
    Return Layer
769
      :param shpFile: absolute file path
770
      :type: shpFile: string
771
      :param CRS: projection code
772
      :type CRS: string
773
      :return: the shape
774
      :type return: Layer
775
    """
776
    layer = loadLayer('Shape', shpFile=shpFile, CRS=CRS)
777
    currentView().addLayer(layer)
778
    #return currentView().getLayer(layer.getName())
779
    layer.setActive(True)
780
    return Layer(layer)
781
    
782
def loadLayer(layerType, **parameters):
783
    try:
784
        application = ApplicationLocator.getManager()
785
        datamanager =  application.getDataManager()
786
        mapcontextmanager = application.getMapContextManager()
787
        store_parameters = datamanager.createStoreParameters(layerType)
788
        copyToDynObject(parameters, store_parameters)
789
        store = datamanager.openStore(layerType, store_parameters)        
790
        layer = mapcontextmanager.createLayer(store.getName(), store)
791
    except Throwable, ex:
792
        raise RuntimeException("Can't load layer, "+ str(ex))  
793

    
794
    return layer
795
    
796
def createShape(definition, filename, geometryType, CRS="CRS:84"):
797
  """ 
798
  Create a new shape layer 
799
      
800
      :param definition: layer data definition
801
      :type definition: Schema
802
      :param filename: absolute path for shape files. 
803
      :type filename: string
804
      :param geometryType: geometry type for shape
805
      :type geometryType: string
806
      :return: new shape layer
807
      :rtype: Layer
808
  """
809
  return createLayer(
810
    definition, 
811
    "FilesystemExplorer", 
812
    "Shape", 
813
    shpFile=filename, 
814
    CRS=CRS,
815
    geometryType = geometryType
816
  )
817

    
818
def createTable(schema, servertype, tableType=None, **parameters):
819
  if tableType == None:
820
    tableType = servertype
821
    servertype = "FilesystemExplorer"
822

    
823
  try:
824
    application = ApplicationLocator.getManager()
825
    datamanager =  application.getDataManager()
826
    
827
    server_parameters = datamanager.createServerExplorerParameters(servertype)
828
    copyToDynObject(parameters, server_parameters)
829

    
830
    server = datamanager.openServerExplorer(servertype, server_parameters)
831
    
832
    store_parameters = server.getAddParameters(tableType)
833
    copyToDynObject(parameters, store_parameters)
834
    store_parameters.setDefaultFeatureType(schema())
835
    
836
    server.add(tableType, store_parameters, True)
837

    
838
    store = datamanager.openStore(tableType, store_parameters)
839
    
840
    return Table(store)
841
  
842
  except Throwable, ex:
843
    raise RuntimeException("Can't create table, "+ str(ex))
844
  
845
def createDBF(definition, DbfFile, CRS="wsg86"):
846
  """ 
847
  Create a new dbf document 
848
      
849
      :param definition: layer data definition
850
      :type definition: Schema
851
      :param DbfFile: absolute path for shape files. 
852
      :type DbfFile: string
853
      :return: new dbf
854
      :rtype: Table
855
  """
856
  return createTable(
857
    definition, 
858
    "FilesystemExplorer", 
859
    "DBF", 
860
    DbfFile=DbfFile, 
861
    CRS=CRS,
862
  )
863

    
864
#=====================#
865
# Documents Functions #
866
#=====================#  
867

    
868
def currentProject():
869
  """
870
  Return the current gvSIG proyect
871
    :return: Proyect
872
  """
873

    
874
  application = ApplicationLocator.getManager()
875
  project = application.getCurrentProject()
876
  return Project(project)
877

    
878
def currentDocument(documentClass = None):
879
  """
880
  Return the current active document if it's a DocumentTable or DocumentView2D
881
  
882
    :return: Active document, None
883
  """
884

    
885
  application = ApplicationLocator.getManager()
886
  
887
  if documentClass == None:
888
    doc = application.getActiveDocument()
889
  else:
890
    doc = application.getActiveDocument(documentClass)
891
  if isinstance(doc, TableDocument): #doc.getTypeName() == "project.document.table":
892
    return Table(doc)
893
  if isinstance(doc, ViewDocument): #doc.getTypeName() == "project.document.view2d": 
894
    return View(doc)  
895

    
896
  return None  
897
  
898
def currentTable():
899
  """
900
  Return the current active table document or None 
901
  
902
    :return: Table or None
903
  """  
904
  return currentDocument(TableDocument)
905
  
906
def currentView():
907
  """
908
  Return the current active view document or None 
909
  
910
    :return: View or None
911
  """ 
912
  return currentDocument(ViewDocument)
913

    
914
def currentLayer():
915
  """ 
916
  Return current view active layer
917
  
918
    :return: gvSIG active layer
919
  """
920
  try:
921
    return currentView().getLayer()
922
  except:
923
    return None
924

    
925
#=====================#
926
# Simbology Functions #
927
#=====================#  
928
  
929
def simplePointSymbol(color=None):
930
  """
931
  Return simple point symbol using parameter color. If no color use a ramdom color
932
  
933
    :param color: Java awt Color
934
    :return: gvSIG point symbol
935
  """
936
  if not isinstance(color, Color):
937
      color = getColor()
938
      
939
  return MapContextLocator.getSymbolManager().createSymbol(Geometry.TYPES.POINT, color)
940

    
941
def simpleLineSymbol(color=None):
942
  """
943
  Return simple line symbol using parameter color. If no color use a ramdom color
944
  
945
    :param color: Java awt Color
946
    :return: gvSIG line symbol
947
  """
948
  if not isinstance(color, Color):
949
      color = getColor()
950
      
951
  return MapContextLocator.getSymbolManager().createSymbol(Geometry.TYPES.CURVE, color)
952

    
953
def simplePolygonSymbol(color = None):
954
  """
955
  Return simple polygon symbol using parameter color. If no color use a ramdom color.
956
  
957
    :param color: Java awt Color
958
    :return: gvSIG poligon symbol
959
  """
960
  if not isinstance(color, Color):
961
      color = getColor()
962
  
963
  return MapContextLocator.getSymbolManager().createSymbol(Geometry.TYPES.SURFACE, color)
964
  
965

    
966
#=========================================#
967
# gvSIG Application Preferences Functions #
968
#=========================================#  
969

    
970
def getDataFolder():
971
  """
972
  Return gvSIG data folder. This folder is defined in application preferences
973
  If not defined return None
974
  """
975
  
976
  return Preferences.userRoot().node("gvsig.foldering").get('DataFolder', None)
977
  
978
def getProjectsFolder():
979
  """
980
  Return gvSIG projects folder. This folder is defined in application preferences.
981
  If not defined return None
982
  """
983
  
984
  return Preferences.userRoot().node("gvsig.foldering").get('ProjectsFolder', None)
985

    
986

    
987
def getColor():
988
  if MapContextLocator.getSymbolManager().isDefaultSymbolFillColorAleatory():
989
    color = Color(random.randint(0-255), 
990
              random.randint(0-255), 
991
              random.randint(0-255)
992
            )
993
  else:
994
    color = MapContextLocator.getSymbolManager().getSymbolPreferences().getDefaultSymbolFillColor()
995
  return color  
996
  
997
#================#
998
# OTHER          #
999
#================#
1000

    
1001
def getCRS(crs):
1002
  """
1003
  Return Projection from string code (i.e. CRS:84) if exist.
1004
  """
1005
  try:
1006
    return CRSFactory.getCRS(crs)
1007
  except:
1008
    return None
1009

    
1010
def copyToDynObject(values, target):
1011
  definition = target.getDynClass();
1012
  fields = definition.getDynFields();
1013
  for field in fields:
1014
    name = field.getName()
1015
    keys = values.keys()
1016
    for k in keys:
1017
      if k.lower() == name.lower():
1018
        target.setDynValue(name, values[name])
1019
        break
1020
# ====================================
1021
#
1022

    
1023
def main():
1024
  layer = currentLayer()
1025
  schema = createSchema()
1026
  schema.append("ID", "String", 50)
1027
  schema.append("GEOMETRY", "Geometry")
1028
  
1029
  output = createLayer(
1030
      schema, 
1031
      "FilesystemExplorer", 
1032
      "Shape", 
1033
      shpFile="/tmp/pp.shp", 
1034
      CRS="EPSG:23030", 
1035
      geometryType=POINT
1036
  )
1037
  
1038
  for feature in layer.features():
1039
    point = feature.geometry().centroid()
1040
    output.append(ID=feature.ID, GEOMETRY=point)
1041
      
1042
  output.commit() 
1043
  
1044
  currentView().addLayer(output())