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

History | View | Annotate | Download (26.9 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.mapcontext import MapContextLocator
51
from org.gvsig.fmap.mapcontext.layers import FLayers
52
from org.gvsig.fmap.dal import DALLocator, DataTypes
53
from org.gvsig.fmap.dal.feature import EditableFeature,  EditableFeatureType, FeatureQueryOrder
54
from org.gvsig.fmap.dal.feature.impl import DefaultEditableFeature
55

    
56
from org.gvsig.tools import ToolsLocator
57

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

    
60
import thread
61
import random
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
    if name == None:
109
      try:
110
        activeDocument = self.getActiveDocument()
111
        if activeDocument == None:
112
            return None
113
        if isinstance(activeDocument, ViewDocument):
114
            return View(activeDocument)
115
      except Exception, ex:
116
        raise Exception("%s"%repr(ex))
117
    else:
118
      views = self.getViews()
119
      if len(views) >0:
120
        for view in views:
121
          if name == view.getName():
122
            return View(view)
123

    
124
    return None
125
    
126
  def getTable(self, name=None):
127
    """
128
    Return active Table Document, or Table Document called 'name'  or None
129
    
130
      :param name: Table Document name
131
      :type name: string
132
    """
133
    if name == None:
134
      try:
135
        activeDocument = self.getActiveDocument()
136
        if activeDocument == None:
137
            return None
138
        if isinstance(activeDocument, TableDocument):
139
            return 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
            return Table(table)
148
            
149
    return None
150
    
151
    
152
  def getProjectionCode(self):
153
    return self.getProjection().getFullCode()
154

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

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

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

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

    
235
class LayersIterator(object):
236

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

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

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

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

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

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

    
370
class __DefaultTable__(WrapperToJava):
371
  def __init__(self,document, data):
372
    self.data = Store(data)
373
    WrapperToJava.__init__(self,document)
374
    self.selection = None
375

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

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

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

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

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

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

    
480

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

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

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

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

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

    
586
class Schema(WrapperToJava):
587
  """
588
  Layer feature definition
589
  """
590

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

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

    
660
  def __getitem__(self, name):
661
    return self.getAttributeDescriptor(name)
662

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

    
693
      
694
#=====================#
695
# Vectorial Functions #
696
#=====================#
697

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

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

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

    
741
    mapcontextmanager = application.getMapContextManager()
742

    
743
    server_parameters = datamanager.createServerExplorerParameters(servertype)
744
    copyToDynObject(parameters, server_parameters)
745

    
746
    server = datamanager.openServerExplorer(servertype, server_parameters)
747

    
748
    store_parameters = server.getAddParameters(layertype)
749
    copyToDynObject(parameters, store_parameters)
750
    store_parameters.setDefaultFeatureType(schema())
751

    
752
    server.add(layertype, store_parameters, True)
753

    
754
    store = datamanager.openStore(layertype, store_parameters)
755

    
756
    layer = mapcontextmanager.createLayer(store.getName(), store)
757

    
758
    return Layer(layer)
759
  except Throwable, ex:
760
    raise RuntimeException("Can't create layer, "+ str(ex))
761

    
762
def loadShapeFile(shpFile, CRS="wgs86"):
763
    """
764
    Add existing shape file to the view
765
    Return Layer
766
      :param shpFile: absolute file path
767
      :type: shpFile: string
768
      :param CRS: projection code
769
      :type CRS: string
770
      :return: the shape
771
      :type return: Layer
772
    """
773
    layer = loadLayer('Shape', shpFile=shpFile, CRS=CRS)
774
    currentView().addLayer(layer)
775
    return Layer(layer)
776
    
777
def loadLayer(layerType, **parameters):
778
    try:
779
        application = ApplicationLocator.getManager()
780
        datamanager =  application.getDataManager()
781
        mapcontextmanager = application.getMapContextManager()
782
        store_parameters = datamanager.createStoreParameters(layerType)
783
        copyToDynObject(parameters, store_parameters)
784
        store = datamanager.openStore(layerType, store_parameters)
785
        layer = mapcontextmanager.createLayer(store.getName(), store)
786
        return layer
787
    except Throwable, ex:
788
        raise RuntimeException("Can't load layer, "+ str(ex))  
789
    
790
def createShape(definition, filename, geometryType, CRS="wgs86"):
791
  """ 
792
  Create a new shape layer 
793
      
794
      :param definition: layer data definition
795
      :type definition: Schema
796
      :param filename: absolute path for shape files. 
797
      :type filename: string
798
      :param geometryType: geometry type for shape
799
      :type geometryType: string
800
      :return: new shape layer
801
      :rtype: Layer
802
  """
803
  return createLayer(
804
    definition, 
805
    "FilesystemExplorer", 
806
    "Shape", 
807
    shpFile=filename, 
808
    CRS=CRS,
809
    geometryType = geometryType
810
  )
811

    
812
def createTable(schema, servertype, tableType=None, **parameters):
813
  if tableType == None:
814
    tableType = servertype
815
    servertype = "FilesystemExplorer"
816

    
817
  try:
818
    application = ApplicationLocator.getManager()
819
    datamanager =  application.getDataManager()
820
    
821
    server_parameters = datamanager.createServerExplorerParameters(servertype)
822
    copyToDynObject(parameters, server_parameters)
823

    
824
    server = datamanager.openServerExplorer(servertype, server_parameters)
825
    
826
    store_parameters = server.getAddParameters(tableType)
827
    copyToDynObject(parameters, store_parameters)
828
    store_parameters.setDefaultFeatureType(schema())
829
    
830
    server.add(tableType, store_parameters, True)
831

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

    
858
#=====================#
859
# Documents Functions #
860
#=====================#  
861

    
862
def currentProject():
863
  """
864
  Return the current gvSIG proyect
865
    :return: Proyect
866
  """
867

    
868
  application = ApplicationLocator.getManager()
869
  project = application.getCurrentProject()
870
  return Project(project)
871

    
872
def currentDocument(documentClass = None):
873
  """
874
  Return the current active document if it's a DocumentTable or DocumentView2D
875
  
876
    :return: Active document, None
877
  """
878

    
879
  application = ApplicationLocator.getManager()
880
  
881
  if documentClass == None:
882
    doc = application.getActiveDocument()
883
  else:
884
    doc = application.getActiveDocument(documentClass)
885
  if isinstance(doc, TableDocument): #doc.getTypeName() == "project.document.table":
886
    return Table(doc)
887
  if isinstance(doc, ViewDocument): #doc.getTypeName() == "project.document.view2d": 
888
    return View(doc)  
889

    
890
  return None  
891
  
892
def currentTable():
893
  """
894
  Return the current active table document or None 
895
  
896
    :return: Table or None
897
  """  
898
  return currentDocument(TableDocument)
899
  
900
def currentView():
901
  """
902
  Return the current active view document or None 
903
  
904
    :return: View or None
905
  """ 
906
  return currentDocument(ViewDocument)
907

    
908
def currentLayer():
909
  """ 
910
  Return current view active layer
911
  
912
    :return: gvSIG active layer
913
  """
914
  
915
  return currentView().getLayer()
916

    
917
#=====================#
918
# Simbology Functions #
919
#=====================#  
920
  
921
def simplePointSymbol(color=None):
922
  """
923
  Return simple point symbol using parameter color. If no color use a ramdom color
924
  
925
    :param color: Java awt Color
926
    :return: gvSIG point symbol
927
  """
928
  if not isinstance(color, Color):
929
      color = getColor()
930
      
931
  return MapContextLocator.getSymbolManager().createSymbol(Geometry.TYPES.POINT, color)
932

    
933
def simpleLineSymbol(color=None):
934
  """
935
  Return simple line symbol using parameter color. If no color use a ramdom color
936
  
937
    :param color: Java awt Color
938
    :return: gvSIG line symbol
939
  """
940
  if not isinstance(color, Color):
941
      color = getColor()
942
      
943
  return MapContextLocator.getSymbolManager().createSymbol(Geometry.TYPES.CURVE, color)
944

    
945
def simplePolygonSymbol(color = None):
946
  """
947
  Return simple polygon symbol using parameter color. If no color use a ramdom color.
948
  
949
    :param color: Java awt Color
950
    :return: gvSIG poligon symbol
951
  """
952
  if not isinstance(color, Color):
953
      color = getColor()
954
  
955
  return MapContextLocator.getSymbolManager().createSymbol(Geometry.TYPES.SURFACE, color)
956
  
957

    
958
#=========================================#
959
# gvSIG Application Preferences Functions #
960
#=========================================#  
961

    
962
def getDataFolder():
963
  """
964
  Return gvSIG data folder. This folder is defined in application preferences
965
  If not defined return None
966
  """
967
  
968
  return Preferences.userRoot().node("gvsig.foldering").get('DataFolder', None)
969
  
970
def getProjectsFolder():
971
  """
972
  Return gvSIG projects folder. This folder is defined in application preferences.
973
  If not defined return None
974
  """
975
  
976
  return Preferences.userRoot().node("gvsig.foldering").get('ProjectsFolder', None)
977

    
978

    
979
def getColor():
980
  if MapContextLocator.getSymbolManager().isDefaultSymbolFillColorAleatory():
981
    color = Color(random.randint(0-255), 
982
              random.randint(0-255), 
983
              random.randint(0-255)
984
            )
985
  else:
986
    color = MapContextLocator.getSymbolManager().getSymbolPreferences().getDefaultSymbolFillColor()
987
  return color  
988
  
989
#================#
990
# OTHER          #
991
#================#
992
def copyToDynObject(values, target):
993
  definition = target.getDynClass();
994
  fields = definition.getDynFields();
995
  for field in fields:
996
    name = field.getName()
997
    keys = values.keys()
998
    for k in keys:
999
      if k.lower() == name.lower():
1000
        target.setDynValue(name, values[name])
1001
        break
1002
# ====================================
1003
#
1004

    
1005
def main():
1006
  layer = currentLayer()
1007
  schema = createSchema()
1008
  schema.append("ID", "String", 50)
1009
  schema.append("GEOMETRY", "Geometry")
1010
  
1011
  output = createLayer(
1012
      schema, 
1013
      "FilesystemExplorer", 
1014
      "Shape", 
1015
      shpFile="/tmp/pp.shp", 
1016
      CRS="EPSG:23030", 
1017
      geometryType=POINT
1018
  )
1019
  
1020
  for feature in layer.features():
1021
    point = feature.geometry().centroid()
1022
    output.append(ID=feature.ID, GEOMETRY=point)
1023
      
1024
  output.commit() 
1025
  
1026
  currentView().addLayer(output())