Example #1
0
 def traverse(self, iter):
     winner = None
     winnerOrientation = 0
     #print(self.current_edge.id.first, self.current_edge.id.second)
     it = AdjacencyIterator(iter)
     tvertex = self.next_vertex
     if type(tvertex) is TVertex:
         mateVE = tvertex.get_mate(self.current_edge)
         while not it.is_end:
             ve = it.object
             if ve.id == mateVE.id:
                 winner = ve
                 if not it.is_incoming:
                     winnerOrientation = 1
                 else:
                     winnerOrientation = 0
                 break
             it.increment()
     else:
         ## case of NonTVertex
         natures = [
             Nature.SILHOUETTE, Nature.BORDER, Nature.CREASE,
             Nature.SUGGESTIVE_CONTOUR, Nature.VALLEY, Nature.RIDGE
         ]
         for nat in natures:
             if (self.current_edge.nature & nat) != 0:
                 count = 0
                 while not it.is_end:
                     ve = it.object
                     if (ve.nature & nat) != 0:
                         count = count + 1
                         winner = ve
                         if not it.is_incoming:
                             winnerOrientation = 1
                         else:
                             winnerOrientation = 0
                     it.increment()
                 if count != 1:
                     winner = None
                 break
     if winner is not None:
         # check whether this edge was part of the selection
         if winner.time_stamp != CF.get_time_stamp():
             #print("---", winner.id.first, winner.id.second)
             # nw let's compute the length of this connex non selected part:
             connexl = 0
             _cit = pyChainSilhouetteGenericIterator(0, 0)
             _cit.begin = winner
             _cit.current_edge = winner
             _cit.orientation = winnerOrientation
             _cit.init()
             while _cit.is_end == 0 and _cit.object.time_stamp != CF.get_time_stamp(
             ):
                 ve = _cit.object
                 #print("-------- --------", ve.id.first, ve.id.second)
                 connexl = connexl + ve.length_2d
                 _cit.increment()
             if connexl > self._length:
                 winner = None
     return winner
Example #2
0
 def checkViewEdge(self, ve, orientation):
     if orientation != 0:
         vertex = ve.second_svertex()
     else:
         vertex = ve.first_svertex()
     it = AdjacencyIterator(vertex, 1, 1)
     while not it.is_end:
         ave = it.object
         if self._isExternalContour(ave):
             return 1
         it.increment()
     print("pyExternlContourChainingIterator : didn't find next edge")
     return 0
Example #3
0
    def traverse(self, iter):
        winner = None
        it = AdjacencyIterator(iter)
        while not it.is_end:
            ve = it.object
            if self._isExternalContour(ve):
                if ve.time_stamp == CF.get_time_stamp():
                    winner = ve
            it.increment()

        self._nEdges = self._nEdges + 1
        if winner is None:
            orient = 1
            it = AdjacencyIterator(iter)
            while not it.is_end:
                ve = it.object
                if it.is_incoming:
                    orient = 0
                good = self.checkViewEdge(ve, orient)
                if good != 0:
                    winner = ve
                it.increment()
        return winner
Example #4
0
 def traverse(self, iter):
     winner = None
     it = AdjacencyIterator(iter)
     while not it.is_end:
         ve = it.object
         if ve.id == self.current_edge.id:
             it.increment()
             continue
         winner = ve
         it.increment()
     if winner is None:
         winner = self.current_edge
     if winner.chaining_time_stamp == self._timeStamp:
         return None
     return winner
Example #5
0
 def traverse(self, iter):
     winner = None
     it = AdjacencyIterator(iter)
     tvertex = self.next_vertex
     if type(tvertex) is TVertex:
         mateVE = tvertex.get_mate(self.current_edge)
         while not it.is_end:
             ve = it.object
             if ve.id == mateVE.id:
                 winner = ve
                 break
             it.increment()
     else:
         ## case of NonTVertex
         natures = [
             Nature.SILHOUETTE, Nature.BORDER, Nature.CREASE,
             Nature.SUGGESTIVE_CONTOUR, Nature.VALLEY, Nature.RIDGE
         ]
         for i in range(len(natures)):
             currentNature = self.current_edge.nature
             if (natures[i] & currentNature) != 0:
                 count = 0
                 while not it.is_end:
                     visitNext = 0
                     oNature = it.object.nature
                     ve = it.object
                     if ve.id == self.current_edge.id:
                         it.increment()
                         continue
                     if (oNature & natures[i]) != 0:
                         if (natures[i] != oNature) != 0:
                             for j in range(i):
                                 if (natures[j] & oNature) != 0:
                                     visitNext = 1
                                     break
                             if visitNext != 0:
                                 break
                         count = count + 1
                         winner = ve
                     it.increment()
                 if count != 1:
                     winner = None
                 break
     if winner is None:
         winner = self.current_edge
     if winner.chaining_time_stamp == self._timeStamp:
         winner = None
     return winner
Example #6
0
 def findOrientation(self, tv, ve):
     mateVE = tv.get_mate(ve)
     if ve.qi != 0 or mateVE.qi != 0:
         ait = AdjacencyIterator(tv, 1, 0)
         winner = None
         incoming = True
         while not ait.is_end:
             ave = ait.object
             if ave.id != ve.id and ave.id != mateVE.id:
                 winner = ait.object
                 if not ait.isIncoming():  # FIXME
                     incoming = False
                     break
             ait.increment()
         if winner is not None:
             if not incoming:
                 direction = self._Get2dDirection(winner.last_fedge)
             else:
                 direction = self._Get2dDirection(winner.first_fedge)
             return direction
     return None
Example #7
0
 def traverse(self, iter):
     winner = None
     found = False
     it = AdjacencyIterator(iter)
     while not it.is_end:
         ve = it.object
         if ve.id == self.current_edge.id:
             found = True
             it.increment()
             continue
         winner = ve
         it.increment()
     if not found:
         # This is a fatal error condition: self.current_edge must be found
         # among the edges seen by the AdjacencyIterator [bug #35695].
         if bpy.app.debug_freestyle:
             print('pySketchyChainingIterator: current edge not found')
         return None
     if winner is None:
         winner = self.current_edge
     if winner.chaining_time_stamp == self._timeStamp:
         return None
     return winner
Example #8
0
 def traverse(self, iter):
     winner = None
     it = AdjacencyIterator(iter)
     tvertex = self.next_vertex
     if type(tvertex) is TVertex:
         mateVE = tvertex.get_mate(self.current_edge)
         while not it.is_end:
             ve = it.object
             feB = self.current_edge.last_fedge
             feA = ve.first_fedge
             vB = feB.second_svertex
             vA = feA.first_svertex
             if vA.id.first == vB.id.first:
                 winner = ve
                 break
             feA = self.current_edge.first_fedge
             feB = ve.last_fedge
             vB = feB.second_svertex
             vA = feA.first_svertex
             if vA.id.first == vB.id.first:
                 winner = ve
                 break
             feA = self.current_edge.last_fedge
             feB = ve.last_fedge
             vB = feB.second_svertex
             vA = feA.second_svertex
             if vA.id.first == vB.id.first:
                 winner = ve
                 break
             feA = self.current_edge.first_fedge
             feB = ve.first_fedge
             vB = feB.first_svertex
             vA = feA.first_svertex
             if vA.id.first == vB.id.first:
                 winner = ve
                 break
             it.increment()
     else:
         ## case of NonTVertex
         natures = [
             Nature.SILHOUETTE, Nature.BORDER, Nature.CREASE,
             Nature.SUGGESTIVE_CONTOUR, Nature.VALLEY, Nature.RIDGE
         ]
         for i in range(len(natures)):
             currentNature = self.current_edge.nature
             if (natures[i] & currentNature) != 0:
                 count = 0
                 while not it.is_end:
                     visitNext = 0
                     oNature = it.object.nature
                     if (oNature & natures[i]) != 0:
                         if natures[i] != oNature:
                             for j in range(i):
                                 if (natures[j] & oNature) != 0:
                                     visitNext = 1
                                     break
                             if visitNext != 0:
                                 break
                         count = count + 1
                         winner = it.object
                     it.increment()
                 if count != 1:
                     winner = None
                 break
     return winner
Example #9
0
    def traverse(self, iter):
        winner = None
        winnerOrientation = 0
        print(self.current_edge.id.first, self.current_edge.id.second)
        it = AdjacencyIterator(iter)
        tvertex = self.next_vertex
        if type(tvertex) is TVertex:
            mateVE = tvertex.get_mate(self.current_edge)
            while not it.is_end:
                ve = it.object
                if ve.id == mateVE.id:
                    winner = ve
                    if not it.is_incoming:
                        winnerOrientation = 1
                    else:
                        winnerOrientation = 0
                    break
                it.increment()
        else:
            ## case of NonTVertex
            natures = [
                Nature.SILHOUETTE, Nature.BORDER, Nature.CREASE,
                Nature.SUGGESTIVE_CONTOUR, Nature.VALLEY, Nature.RIDGE
            ]
            for nat in natures:
                if (self.current_edge.nature & nat) != 0:
                    count = 0
                    while not it.is_end:
                        ve = it.object
                        if (ve.nature & nat) != 0:
                            count = count + 1
                            winner = ve
                            if not it.is_incoming:
                                winnerOrientation = 1
                            else:
                                winnerOrientation = 0
                        it.increment()
                    if count != 1:
                        winner = None
                    break
        if winner is not None:
            # check whether this edge was part of the selection
            if winner.qi != 0:
                #print("---", winner.id.first, winner.id.second)
                # if not, let's check whether it's short enough with
                # respect to the chain made without staying in the selection
                #------------------------------------------------------------
                # Did we compute the prospective chain length already ?
                if self._length == 0:
                    #if not, let's do it
                    _it = pyChainSilhouetteGenericIterator(0, 0)
                    _it.begin = winner
                    _it.current_edge = winner
                    _it.orientation = winnerOrientation
                    _it.init()
                    while not _it.is_end:
                        ve = _it.object
                        #print("--------", ve.id.first, ve.id.second)
                        self._length = self._length + ve.length_2d
                        _it.increment()
                        if _it.is_begin:
                            break
                    _it.begin = winner
                    _it.current_edge = winner
                    _it.orientation = winnerOrientation
                    if not _it.is_begin:
                        _it.decrement()
                        while (not _it.is_end) and (not _it.is_begin):
                            ve = _it.object
                            #print("--------", ve.id.first, ve.id.second)
                            self._length = self._length + ve.length_2d
                            _it.decrement()

                # let's do the comparison:
                # nw let's compute the length of this connex non selected part:
                connexl = 0
                _cit = pyChainSilhouetteGenericIterator(0, 0)
                _cit.begin = winner
                _cit.current_edge = winner
                _cit.orientation = winnerOrientation
                _cit.init()
                while not _cit.is_end and _cit.object.qi != 0:
                    ve = _cit.object
                    #print("-------- --------", ve.id.first, ve.id.second)
                    connexl = connexl + ve.length_2d
                    _cit.increment()
                if (connexl > self._percent * self._length) or (
                        connexl > self._absLength):
                    winner = None
        return winner