Explorar o código

wxGUI/vdigit: implement break lines

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@45268 15284696-431f-4ddb-bdfa-cd5b030d7da7
Martin Landa %!s(int64=14) %!d(string=hai) anos
pai
achega
ee79ed9145
Modificáronse 1 ficheiros con 75 adicións e 4 borrados
  1. 75 4
      gui/wxpython/gui_modules/wxvdigit.py

+ 75 - 4
gui/wxpython/gui_modules/wxvdigit.py

@@ -233,10 +233,80 @@ class IVDigit:
         else:
             return NO_SNAP
     
-    def _breakLineAtIntersection(self):
-        """!@todo
+    def _breakLineAtIntersection(self, line, pointsLine, changeset):
+        """!Break given line at intersection
+
+        \param line line id
+        \param pointsLine line geometry
+        \param changeset id
+  
+        \return number of modified lines
         """
-        pass
+        if not self._checkMap():
+            return -1
+        
+        if not Vect_line_alive(self.poMapInfo, line):
+            return 0
+        
+        if not pointsLine:
+            if Vect_read_line(self.poMapInfo, self.poPoints, None, line) < 0:
+                self._error.ReadLine(line)
+                return -1
+            points = self.poPoints
+        else:
+            points = pointsLine
+        
+        listLine  = Vect_new_list()
+        listRef   = Vect_new_list()
+        listBreak = Vect_new_list()
+    
+        pointsCheck = Vect_new_line_struct()
+    
+        lineBox = bound_box()
+        # find all relevant lines
+        Vect_get_line_box(self.poMapInfo, line, byref(lineBox))
+        Vect_select_lines_by_box(self.poMapInfo, byref(lineBox),
+                                 GV_LINES, listLine)
+    
+        # check for intersection
+        Vect_list_append(listBreak, line)
+        Vect_list_append(listRef, line)
+        for i in range(listLine.contents.n_values):
+            lineBreak = listLine.contents.value[i]
+            if lineBreak == line:
+		continue
+            
+            ltype = Vect_read_line(self.poMapInfo, pointsCheck, None, lineBreak)
+            if not (ltype & GV_LINES):
+                continue
+            
+            if Vect_line_check_intersection(self.poPoints, pointsCheck,
+                                            WITHOUT_Z):
+                Vect_list_append(listBreak, lineBreak)
+        
+        nlines = Vect_get_num_lines(self.poMapInfo)
+        
+        for i in range(listBreak.contents.n_values):
+            self._addActionToChangeset(changeset, listBreak.contents.value[i], add = False)
+        
+        ret = Vect_break_lines_list(self.poMapInfo, listBreak, listRef,
+                                    GV_LINES, None)
+        
+        for i in range(listBreak.contents.n_values):
+            if Vect_line_alive(self.poMapInfo, listBreak.contents.value[i]):
+                self._removeActionFromChangeset(changeset, listBreak.contents.value[i],
+                                                add = False)
+        
+        for line in range(nlines + 1, Vect_get_num_lines(self.poMapInfo) + 1):
+            self._addActionToChangeset(changeset, line, add = True)
+        
+        Vect_destroy_line_struct(pointsCheck)
+
+        Vect_destroy_list(listLine)
+        Vect_destroy_list(listBreak)
+        Vect_destroy_list(listRef)
+        
+        return ret
     
     def _addActionsBefore(self):
         """!Register action before operation
@@ -1280,7 +1350,8 @@ class IVDigit:
             Vect_destroy_line_struct(bpoints)
         
         # register changeset
-        self._addActionToChangeset(len(self.changesets), newline, add = True)
+        changeset = len(self.changesets)
+        self._addActionToChangeset(changeset, newline, add = True)
         
         # break at intersection
         if self._settings['breakLines']: