Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.app / org.gvsig.app.mainplugin / src / main / resources-plugin / scripting / scripts / validatelayer / validate_layer.py @ 47547

History | View | Annotate | Download (7.02 KB)

1
# encoding: utf-8
2

    
3
from gvsig import *
4
from org.gvsig.tools.swing.api.windowmanager import WindowManager
5
import StringIO
6
from gvsig.commonsdialog import *
7
from javax.swing.event import HyperlinkListener
8
from org.gvsig.fmap.geom import GeometryLocator
9
from org.gvsig.fmap.geom import Geometry
10
from org.gvsig.fmap.geom.primitive import NullGeometry
11
from org.gvsig.tools import ToolsLocator
12

    
13
class Cmdline(object):
14
  def __init__(self, line):
15
    self.parse(line)
16
    
17
  def parse(self,line):
18
    cmds = line.split(";")
19
    self.cmds = list()
20
    for cmd in cmds:
21
      cmd = cmd.strip()
22
      args = None
23
      n = cmd.find(":")
24
      if n> 0 :
25
        args = cmd[n+1:].strip()
26
        cmd = cmd[:n].strip()
27
      self.cmds.append((cmd,args))
28

    
29
  def execute(self):
30
    for cmd,args in self.cmds:
31
      method = getattr(self,cmd,None)
32
      try:
33
        if method!=None:
34
          method(args)
35
        else:
36
          self.call(cmd,args)
37
      except Exception, ex:
38
        print "Oopss algo fallo ejecutando ", cmd, args
39
        print str(ex)
40

    
41
def centerViewinPoint(view,center):
42
    env = view.getMap().getViewPort().getEnvelope();
43
    movX = center.getX()-env.getCenter(0);
44
    movY = center.getY()-env.getCenter(1);
45
    minx = env.getMinimum(0) + movX;
46
    miny = env.getMinimum(1) + movY;
47
    maxX = env.getMaximum(0) + movX;
48
    maxY = env.getMaximum(1) + movY;
49
    env = GeometryLocator.getGeometryManager().createEnvelope(
50
          minx, miny,
51
          maxX, maxY,
52
          Geometry.SUBTYPES.GEOM2D);
53
    view.getMap().getViewPort().setEnvelope(env);
54
    view.getMap().invalidate()
55

    
56

    
57
class MyHyperlinkListener(HyperlinkListener, Cmdline):
58
  def __init__(self,vista, capa, tabla_de_referencias):
59
    self.vista = vista
60
    self.capa = capa
61
    self.tabla_de_referencias = tabla_de_referencias
62
    
63
  def hyperlinkUpdate(self, h):
64
    if str(h.getEventType()) == "ACTIVATED":
65
      # Solo procesamos los eventos "ACTIVATED" que son los clicks sobre los enlaces
66
      # Recogemos la geometria que metimos en el enalce en WKT
67
      cmdline = h.getDescription()
68
      #print cmdline
69
      self.parse(cmdline)
70
      self.execute()
71

    
72
  def select(self,arg):
73
    ref = self.tabla_de_referencias.get(arg,None)
74
    self.capa.getSelection().select(ref)
75

    
76
  def clearSelection(self,arg):
77
    self.capa.getSelection().deselectAll()
78

    
79
  def center(self,arg):
80
    # Reconstruimos el punto a partir del WKT en arg
81
    manager = GeometryLocator.getGeometryManager()
82
    point = manager.createFrom(arg)
83
    # Y una vez lo tenemos centramos la vista en ese punto.
84
    centerViewinPoint(self.vista,point)
85

    
86
  def fixgeometry(self,arg):
87
    ref = self.tabla_de_referencias.get(arg,None)
88
    feature = ref.getFeature().getEditable()
89
    geom = feature.getDefaultGeometry()
90
    if geom.isValid():
91
      return
92
    fixedgeom = geom.makeValid()
93
    if fixedgeom != None:
94
      if isinstance(fixedgeom,NullGeometry) :
95
        fixedgeom = None
96
      feature.setDefaultGeometry(fixedgeom)
97
      store = self.capa().getDataStore()
98
      if not store.isEditing() :
99
        store.edit()
100
      store.update(feature)
101
    
102
  
103
def main(*args):
104
  validate(None)
105

    
106
def validate(taskStatus):
107
  layer = currentLayer()
108
  if layer == None:
109
    msgbox(u"Deberá seleccionar la capa que desea validar")
110
    return
111
  if taskStatus == None:
112
    taskStatusManager = ToolsLocator.getTaskStatusManager()
113
    taskStatus = taskStatusManager.createDefaultSimpleTaskStatus("validate")
114
    taskStatus.setAutoremove(True)
115
    
116
  output1 = StringIO.StringIO()  
117
  output2 = StringIO.StringIO()  
118
  output1.write("<ul>\n")
119
  output2.write("<ul>\n")
120
  contador=0
121
  tabla_de_referencias = dict()
122
  contador_problemas = 0
123
  contador_nulos = 0
124
  try:
125
    # A�adimos la barra de progreso a la barra de estado de gvSIG
126
    taskStatus.add()
127
    # Le indicamos cuantas iteraciones vamos a realizar
128
    taskStatus.setRangeOfValues(0,layer.features().getCount());
129
    for feature in layer.features():
130
      # En cada iteracion informamos a la barra de progreso de por donde vamos
131
      taskStatus.setCurValue(contador)
132
      geom = feature.geometry()
133
      if geom == None:
134
        contador_nulos += 1
135
        tabla_de_referencias[str(contador)]= feature().getReference()
136
        output2.write("<li>")
137
        output2.write('<a href="select: %s">%5.5d</a> %s<br>%s' % (
138
            contador, 
139
            contador, 
140
            feature.toString(),
141
            "Null geometry"
142
          )
143
        )          
144
        output2.write("</li>")
145
      else:
146
        vs = geom.getValidationStatus();
147
        if not vs.isValid() :
148
          tabla_de_referencias[str(contador)]= feature().getReference()
149
          contador_problemas += 1
150
          if vs.getStatusCode() == 1 : # Corrupta
151
            try:
152
              print contador, geom.getNumVertices(), geom.__class__
153
            except Exception,ex:
154
              print contador
155
              
156
          geom2 = geom.makeValid()
157
          if geom2 != None:
158
            canfix = '(<a href="fixgeometry: %s">Fix</a>)' % contador
159
          else:
160
            canfix = ""
161
          if vs.getProblemLocation()!=None:
162
            wktgeom = vs.getProblemLocation().convertToWKT()
163
          else:
164
            try:
165
              # Atrapamos los errores no vaya a ser que la geometria este tan da�ada que
166
              # nos falle el calculo de su centroide.
167
              wktgeom = feature.geometry().centroid().convertToWKT()
168
            except:
169
              wktgeom = None
170
          output1.write("<li>")
171
          if wktgeom == None:
172
            output1.write('<a href="select: %s">%5.5d</a> %s<br>%s %s' % (
173
                contador, 
174
                contador, 
175
                feature.toString(),
176
                vs.getMessage(),
177
                canfix
178
              )
179
            )
180
          else:
181
            output1.write('<a href="clearSelection; select: %s; center: %s">%5.5d</a> %s<br>%s %s' % (
182
                contador, 
183
                wktgeom,
184
                contador, 
185
                feature.toString(),
186
                vs.getMessage(),
187
                canfix
188
              )
189
            )
190
          output1.write("</li>")
191
      contador+=1
192
  finally:  
193
    # Al terminar
194
    # Le indicamos a la barra de progreso que ya hemos terminado
195
    taskStatus.terminate()
196
    # Y la eliminamos de la barra de estado de gvSIG.
197
    taskStatus.remove()
198
    
199
  output1.write("</ul>\n")
200
  output2.write("</ul>\n")
201
  
202
  if contador_problemas>0 or contador_nulos>0 :
203
    texto = "<p>Se ha detectado:<br><ul><li>%s geometrias con problemas</li><li>%s registros sin geometria.</li></ul></p>" % (
204
      contador_problemas,
205
      contador_nulos
206
    )
207
    if contador_problemas > 0:
208
      texto += "Geometrias con problemas:<br>"
209
      texto += output1.getvalue()
210
    if contador_nulos > 0:
211
      texto += "Registros sin geometrias:<br>"
212
      texto += output2.getvalue()
213
    application = ApplicationLocator.getManager()
214
    application.showTextDialog(
215
      WindowManager.MODE.TOOL, # TOOL o WINDOW segun nos interese.
216
      "Problems in layer "+layer.getName(),
217
      texto,
218
      MyHyperlinkListener(currentView(), layer, tabla_de_referencias)
219
    )
220
  else:
221
    msgbox("Layer "+layer.getName()+" is valid.")
222

    
223