Exemple #1
0
    def traverse(self, iter):
        winner = None
        winnerOrientation = False
        it = AdjacencyIterator(iter)
        ## case of TVertex
        vertex = self.next_vertex
        if type(vertex) is TVertex:
            mate = vertex.get_mate(self.current_edge)
            winner = find_matching_vertex(mate.id, it)
            winnerOrientation = not it.is_incoming if not it.is_end else False
        ## case of NonTVertex
        else:
            for nat in NATURES:
                if (self.current_edge.nature & nat):
                    for ve in it:
                        if (ve.nature & nat):
                            if winner is not None:
                                return None
                            winner = ve
                            winnerOrientation = not it.is_incoming
                    break

        if winner is not None and winner.time_stamp != self.timestamp:
            connexl = 0.0
            _cit = pyChainSilhouetteGenericIterator(False, False)
            _cit.begin = winner
            _cit.current_edge = winner
            _cit.orientation = winnerOrientation
            _cit.init()

            while (not _cit.is_end
                   ) and _cit.object.time_stamp != self.timestamp:
                connexl += _cit.object.length_2d
                _cit.increment()
                if _cit.is_begin: break

            if connexl > self._length:
                return None

        return winner
Exemple #2
0
    def traverse(self, iter):
        winner = None
        found = False

        for ve in AdjacencyIterator(iter):
            if self.current_edge.id == ve.id:
                found = True
                continue
            winner = ve

        if not found:
            # This is a fatal error condition: self.current_edge must be found
            # among the edges seen by the AdjacencyIterator [bug T35695].
            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
Exemple #3
0
 def traverse(self, iter):
     it = AdjacencyIterator(iter)
     # case of TVertex
     vertex = self.next_vertex
     if type(vertex) is TVertex:
         mate = vertex.get_mate(self.current_edge)
         return find_matching_vertex(mate.id, it)
     # case of NonTVertex
     winner = None
     for i, nat in enumerate(NATURES):
         if (nat & self.current_edge.nature):
             for ve in it:
                 ve_nat = ve.nature
                 if (ve_nat & nat):
                     # search for matches in previous natures. if match -> break
                     if nat != ve_nat and nature_in_preceding(ve_nat, index=i):
                         break
                     # a second match must be an error
                     if winner is not None:
                         return None
                     # assign winner
                     winner = ve
             return winner
Exemple #4
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.MATERIAL_BOUNDARY, Nature.EDGE_MARK,
             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
Exemple #5
0
    def traverse(self, iter):
        winner = None
        winnerOrientation = False

        #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
                    winnerOrientation = not it.is_incoming
                    break
                it.increment()
        else:
            ## case of NonTVertex
            natures = [
                Nature.SILHOUETTE, Nature.BORDER, Nature.CREASE,
                Nature.MATERIAL_BOUNDARY, Nature.EDGE_MARK,
                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
                            winnerOrientation = not it.is_incoming
                        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(False, False)
                    _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(False, False)
                _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