[GRASS-SVN] r45287 - grass/trunk/gui/wxpython/gui_modules
svn_grass at osgeo.org
svn_grass at osgeo.org
Tue Feb 1 18:21:26 EST 2011
Author: martinl
Date: 2011-02-01 15:21:26 -0800 (Tue, 01 Feb 2011)
New Revision: 45287
Modified:
grass/trunk/gui/wxpython/gui_modules/wxvdriver.py
Log:
wxGUI/vdigit: re-implement check for duplicates
Modified: grass/trunk/gui/wxpython/gui_modules/wxvdriver.py
===================================================================
--- grass/trunk/gui/wxpython/gui_modules/wxvdriver.py 2011-02-01 23:19:05 UTC (rev 45286)
+++ grass/trunk/gui/wxpython/gui_modules/wxvdriver.py 2011-02-01 23:21:26 UTC (rev 45287)
@@ -223,7 +223,7 @@
if self._isSelected(robj.fid):
pdc = self.dcTmp
if self.settings['highlightDupl']['enabled'] and self._isDuplicated(robj.fid):
- pen = wx.Pen(self.settings['highlightDupl'], self.settings['lineWidth'], wx.SOLID)
+ pen = wx.Pen(self.settings['highlightDupl']['color'], self.settings['lineWidth'], wx.SOLID)
else:
pen = wx.Pen(self.settings['highlight'], self.settings['lineWidth'], wx.SOLID)
@@ -387,10 +387,16 @@
return False
+ def _isDuplicated(self, line):
+ """!Check for already marked duplicates
+
+ \param line feature id
- def _isDuplicated(self, featId):
- return False
-
+ \return True line already marked as duplicated
+ \return False not duplicated
+ """
+ return line in self.selected['idsDupl']
+
def _getRegionBox(self):
"""!Get bound_box() from current region
@@ -445,7 +451,7 @@
def _getSelectType(self):
"""!Get type(s) to be selected
- Used by SelectLinesByBox() and SelectLinesByPoint()
+ Used by SelectLinesByBox() and SelectLineByPoint()
"""
ftype = 0
for feature in (('point', GV_POINT),
@@ -519,6 +525,7 @@
flist = poList.contents
nlines = flist.n_values
+ Debug.msg(1, "DisplayDriver.SelectLinesByBox() num = %d", nlines)
for i in range(nlines):
line = flist.value[i]
if UserSettings.Get(group = 'vdigit', key = 'selectInside',
@@ -540,12 +547,12 @@
if not self._isSelected(line):
selected.append(line)
else:
- del selected[line]
+ selected.remove(line)
Vect_destroy_line_struct(poBbox)
Vect_destroy_list(poList)
- return len(selected)
+ return nlines
def SelectLineByPoint(self, point, poMapInfo = None):
"""!Select vector feature by given point in given
@@ -566,7 +573,7 @@
if not poMapInfo:
return None
-
+
if thisMapInfo:
self._drawSelected = True
# select by ids
@@ -579,22 +586,23 @@
poFound = Vect_new_list()
- line_nearest = Vect_find_line_list(poMapInfo, point[0], point[1], 0,
+ lineNearest = Vect_find_line_list(poMapInfo, point[0], point[1], 0,
self._getSelectType(), self.GetThreshold(), self.is3D,
None, poFound)
+ Debug.msg(1, "DisplayDriver.SelectLineByPoint() found = %d", lineNearest)
- if line_nearest > 0:
- if not self._isSelected(line_nearest):
- selected.append(line_nearest)
+ if lineNearest > 0:
+ if not self._isSelected(lineNearest):
+ selected.append(lineNearest)
else:
- del selected[line_nearest]
+ selected.remove(lineNearest)
px = c_double()
py = c_double()
pz = c_double()
- if not self._validLine(line_nearest):
+ if not self._validLine(lineNearest):
return None
- ftype = Vect_read_line(poMapInfo, self.poPoints, self.poCats, line_nearest)
+ ftype = Vect_read_line(poMapInfo, self.poPoints, self.poCats, lineNearest)
Vect_line_distance (self.poPoints, point[0], point[1], 0.0, self.is3D,
byref(px), byref(py), byref(pz),
None, None, None)
@@ -604,15 +612,15 @@
found = poFound.contents
for i in range(found.n_values):
line = found.value[i]
- if line != line_nearest:
+ if line != lineNearest:
selected.append(line)
- self.getDuplicates()
+ self.GetDuplicates()
for i in range(found.n_values):
line = found.value[i]
- if line != line_nearest and not self._isDuplicated(line):
- del selected[line]
+ if line != lineNearest and not self._isDuplicated(line):
+ selected.remove(line)
Vect_destroy_list(poFound)
@@ -621,7 +629,7 @@
# only one features selected
self._drawSegments = True
- return { 'line' : line_nearest,
+ return { 'line' : lineNearest,
'point' : (px.value, py.value, pz.value) }
def _listToIList(self, plist):
@@ -899,4 +907,79 @@
return value * res
return value
+
+ def GetDuplicates(self):
+ """!Return ids of (selected) duplicated vector features
+ """
+ if not self.poMapInfo:
+ return
+ ids = dict()
+ APoints = Vect_new_line_struct()
+ BPoints = Vect_new_line_struct()
+
+ self.selected['idsDupl'] = list()
+
+ for i in range(len(self.selected['ids'])):
+ line1 = self.selected['ids'][i]
+ if self._isDuplicated(line1):
+ continue
+
+ Vect_read_line(self.poMapInfo, APoints, None, line1)
+
+ for line2 in self.selected['ids']:
+ if line1 == line2 or self._isDuplicated(line2):
+ continue
+
+ Vect_read_line(self.poMapInfo, BPoints, None, line2)
+
+ if Vect_line_check_duplicate(APoints, BPoints, WITHOUT_Z):
+ if not ids.has_key(i):
+ ids[i] = list()
+ ids[i].append((line1, self._getCatString(line1)))
+ self.selected['idsDupl'].append(line1)
+
+ ids[i].append((line2, self._getCatString(line2)))
+ self.selected['idsDupl'].append(line2)
+
+ Vect_destroy_line_struct(APoints)
+ Vect_destroy_line_struct(BPoints)
+
+ return ids
+
+ def _getCatString(self, line):
+ Vect_read_line(self.poMapInfo, None, self.poCats, line)
+
+ cats = self.poCats.contents
+ catsDict = dict()
+ for i in range(cats.n_cats):
+ layer = cats.field[i]
+ if not catsDict.has_key(layer):
+ catsDict[layer] = list()
+ catsDict[layer].append(cats.cat[i])
+
+ catsStr = ''
+ for l, c in catsDict.iteritems():
+ catsStr = '%d: (%s)' % (l, ','.join(map(str, c)))
+
+ return catsStr
+
+ def UnSelect(self, lines):
+ """!Unselect vector features
+
+ @param lines list of feature id(s)
+ """
+ checkForDupl = False
+
+ for line in lines:
+ if self._isSelected(line):
+ self.selected['ids'].remove(line)
+ if self.settings['highlightDupl']['enabled'] and self._isDuplicated(line):
+ checkForDupl = True
+
+ if checkForDupl:
+ self.GetDuplicates()
+
+ return len(self.selected['ids'])
+
+
More information about the grass-commit
mailing list