コード例 #1
0
    def houDoBooleanOperation(self, prim, previousPrim, listOfDividedPrims, crack, volumeNode, sweepingNode):
        logging.debug("Start method houDoBooleanOperation, class PrimDivided")
        global epsilon
        logging.debug("This prim: %s", str(prim))
        logging.debug("Previous prim: %s", str(previousPrim))
        if previousPrim in listOfDividedPrims.keys():
            edgeToValidate = GeoMath.getSharedEdges(
                listOfDividedPrims[previousPrim].pointsOutside,
                [list(po.point().position()) for po in prim.vertices()],
                1,
            )
            if not edgeToValidate:
                self.prim = None
                logging.error("No edge to validate")
                logging.debug(
                    "Start method houDoBooleanOperation, class PrimDivided. State: No edge to valide in prim %s",
                    str(prim.number()),
                )
                return False
            edgeToValidate = edgeToValidate[0]
        else:
            edgeToValidate = GeoMath.getSharedEdgesPrims(previousPrim, prim, 1)[0]
            if not edgeToValidate:
                logging.error("No edge to validate")
                logging.debug(
                    "Start method houDoBooleanOperation, class PrimDivided. State: No edge to valide in prim %s",
                    str(prim.number()),
                )
                self.prim = None
                return False

        logging.debug("Edge to validate: %s", str(edgeToValidate))
        edgeToValidate = [list(edgeToValidate[0]), list(edgeToValidate[1])]

        firstPointCrack = crack[prim][0]
        lastPointCrack = crack[prim][len(crack[prim]) - 1]
        matched = False
        # Points ordered by prim
        points = [list(p.point().position()) for p in prim.vertices()]
        edgeFirst = GeoMath.getEdgeWithPointInPrim(prim, firstPointCrack)
        edgeFirst = [list(edgeFirst[0]), list(edgeFirst[1])]
        # Put the edge in clockwise direction
        if GeoMath.determineDirEdge(edgeFirst, prim, True):
            curEdge = [firstPointCrack, edgeFirst[1]]
        else:
            curEdge = [firstPointCrack, edgeFirst[0]]
        index = 0
        logging.debug("Points: %s", str(points))
        logging.debug("Current edge: %s", str(curEdge))
        count = 0
        while points[index] != curEdge[1]:
            count += 1
            if count == 10:
                logging.error("First edge not found")
                logging.debug("End method houDoBooleanOperation, class PrimDivided. State: first edge not found")
                return
            index += 1
        nextIndex = (index + 1) % len(points)
        nextEdge = [curEdge[1], points[nextIndex]]
        edgeLast = GeoMath.getEdgeWithPointInPrim(prim, lastPointCrack)
        edgeLast = [list(edgeLast[0]), list(edgeLast[1])]
        if not GeoMath.determineDirEdge(edgeLast, prim, True):
            edgeLast = [list(edgeLast[1]), list(edgeLast[0])]
        pointsDisplaced = []

        # Normal iteration over points
        count = 0
        logging.debug("Last edge where the 'to validate edge' lies: %s", str(edgeLast))
        self.pointsOutside = []
        logging.debug("Normal iteration over points")
        while len(GeoMath.getSharedEdges(curEdge, edgeLast, 1)) == 0:
            logging.debug("Current edge: %s", str(curEdge))
            count += 1
            if count == 10:
                logging.error("Last edge not found")
                logging.debug("End method houDoBooleanOperation, class PrimDivided. State: Last edge not found")
                return
            # Calcule the displacement
            vecDis = self.calculateDisplacement(curEdge, nextEdge)
            pointDisplaced = self.applyDisplacement(curEdge[1], vecDis)
            # Add displace point
            pointsDisplaced.append(pointDisplaced)
            self.pointsOutside.append(curEdge[1])
            if len(GeoMath.getSharedEdges(curEdge, edgeToValidate, 1)) > 0:
                matched = True
            curEdge = [curEdge[1], points[nextIndex]]
            nextIndex = (nextIndex + 1) % len(points)
            nextEdge = [nextEdge[1], points[nextIndex]]
        logging.debug("Ha salido del segundo bucle con: %s", str(curEdge))
        curEdge = [curEdge[0], lastPointCrack]
        # Last comprovation
        if not matched and (len(GeoMath.getSharedEdges(curEdge, edgeToValidate, 1)) > 0):
            logging.debug("Final comprovation edge: %s", str(curEdge))
            matched = True
        if not matched:
            logging.debug("Not matched at normal iteration over points, trying in inverse mode")
            # Do inverse
            # Put the edge in not clockwise direction
            if GeoMath.determineDirEdge(edgeFirst, prim, False):
                curEdge = [firstPointCrack, edgeFirst[1]]
            else:
                curEdge = [firstPointCrack, edgeFirst[0]]
            index = 0
            count = 0
            while points[index] != curEdge[1]:
                count += 1
                if count == 10:
                    logging.error("First edge not found")
                    logging.debug("End method houDoBooleanOperation, class PrimDivided. State: Last edge not found")
                    return
                index += 1
            nextIndex = index - 1
            if nextIndex < 0:
                nextIndex = len(points) - 1
            nextEdge = [curEdge[1], points[nextIndex]]
            edgeLast = GeoMath.getEdgeWithPointInPrim(prim, lastPointCrack)
            if not GeoMath.determineDirEdge(edgeLast, prim, False):
                edgeLast = [list(edgeLast[1]), list(edgeLast[0])]
            pointsDisplaced = []
            self.pointsOutside = []
            # Inverse iteration over points
            count = 0
            logging.debug("Inverse iteration over points")
            while len(GeoMath.getSharedEdges(curEdge, edgeLast, 1)) == 0:
                count += 1
                if count == 10:
                    logging.error("Last edge not found")
                    logging.debug("End method houDoBooleanOperation, class PrimDivided. State: Last edge not found")
                    return
                # Calcule the displacement
                vecDis = self.calculateDisplacement(curEdge, nextEdge)
                pointDisplaced = self.applyDisplacement(curEdge[1], vecDis)
                pointsDisplaced.append(pointDisplaced)
                self.pointsOutside.append(curEdge[1])
                if len(GeoMath.getSharedEdges(curEdge, edgeToValidate, 1)) > 0:
                    matched = True
                curEdge = [curEdge[1], points[nextIndex]]
                nextIndex = nextIndex - 1
                if nextIndex < 0:
                    nextIndex = len(points) - 1
                nextEdge = [nextEdge[1], points[nextIndex]]
            curEdge = [curEdge[0], lastPointCrack]
            # Last comprovation
            if not matched and (len(GeoMath.getSharedEdges(curEdge, edgeToValidate, 1)) > 0):
                logging.debug("Final comprovation edge: %s", str(curEdge))
                matched = True
        if not matched:
            logging.error("Validate edge not found at primitive")
        # Add the extrem points
        self.pointsOutside.insert(0, firstPointCrack)
        self.pointsOutside.append(lastPointCrack)
        # Now we have a structure with the points in correct order, with the edge that was broken and
        # with applied displacement for each point. Not firstCrackPoint either lastCrackPoint added.
        curveNode = sweepingNode.createNode("curve", "crack_pattern_" + str(prim.number()))
        # curveNode.setNextInput(volumeNode)
        pointsString = ""
        for point in crack[prim]:
            pointsString = pointsString + str(point[0]) + "," + str(point[1]) + "," + str(point[2]) + " "
        # Now we add the displacement point to close the prim
        pointsDisplaced.reverse()
        for point in pointsDisplaced:
            pointsString = pointsString + str(point[0]) + "," + str(point[1]) + "," + str(point[2]) + " "

        curveNode.parm("coords").set(pointsString)
        curveNode.moveToGoodPosition()
        curveNode.parm("close").set(True)
        extrudeNode = sweepingNode.createNode("extrude", "extrude_" + str(prim.number()))

        extrudeNode.setNextInput(curveNode)

        largeOfGeo = extrudeNode.geometry().boundingBox().sizevec().length()
        extrudeNode.parm("depthxlate").set(-largeOfGeo / 2 - 0.5)
        extrudeNode.parm("depthscale").set(largeOfGeo + 1)

        # Associate part B with crack line volume
        # extrudeNode.setNextInput(crackNode)

        cookieNode = sweepingNode.createNode("cookie", "cookie_" + str(prim.number()))

        cookieNode.parm("dojitter").set(True)
        cookieNode.parm("jitteramount").set(0.001)
        cookieNode.parm("seed").set(3)
        cookieNode.parm("boolop").set("other")
        cookieNode.parm("insideB").set(True)
        cookieNode.parm("outsideB").set(True)
        cookieNode.setNextInput(extrudeNode)
        # Associate part B with volume
        cookieNode.setNextInput(volumeNode)
        cookieNode.parm("groupB").set("__" + str(prim.number()))
        cookieNode.parm("createGroup").set(True)
        cookieNode.parm("insideAGroup").set("Ain")
        cookieNode.parm("insideBGroup").set(self.nameGroupBroken)
        cookieNode.parm("outsideAGroup").set("Aout")
        cookieNode.parm("outsideBGroup").set(self.nameGroupNotBroken)
        cookieNode.parm("overlapAGroup").set("Aover")
        cookieNode.parm("overlapBGroup").set("Bover")

        # Delete the unwanted groups
        deleteNode = sweepingNode.createNode("delete", "unwantedGroups_" + str(prim.number()))
        deleteNode.parm("group").set(self.nameGroupBroken + " Ain Aout Aover Bover")
        deleteNode.setNextInput(cookieNode)
        self.curveNode = curveNode
        self.extrudeNode = extrudeNode
        self.cookieNode = cookieNode
        self.deleteNode = deleteNode
        self.curveNode.moveToGoodPosition()
        self.extrudeNode.moveToGoodPosition()
        self.cookieNode.moveToGoodPosition()
        self.deleteNode.moveToGoodPosition()

        self.nodes.append(self.curveNode)
        self.nodes.append(self.extrudeNode)
        self.nodes.append(self.cookieNode)
        self.nodes.append(self.deleteNode)
        logging.debug("End method houDoBooleanOperation, class PrimDivided. State: good")
コード例 #2
0
    def houDoBooleanOperation(self, prim, previousPrim, listOfDividedPrims,
                              crack, volumeNode, sweepingNode):
        logging.debug("Start method houDoBooleanOperation, class PrimDivided")
        global epsilon
        logging.debug("This prim: %s", str(prim))
        logging.debug("Previous prim: %s", str(previousPrim))
        if (previousPrim in listOfDividedPrims.keys()):
            edgeToValidate = GeoMath.getSharedEdges(
                listOfDividedPrims[previousPrim].pointsOutside,
                [list(po.point().position()) for po in prim.vertices()], 1)
            if (not edgeToValidate):
                self.prim = None
                logging.error("No edge to validate")
                logging.debug(
                    "Start method houDoBooleanOperation, class PrimDivided. State: No edge to valide in prim %s",
                    str(prim.number()))
                return False
            edgeToValidate = edgeToValidate[0]
        else:
            edgeToValidate = GeoMath.getSharedEdgesPrims(
                previousPrim, prim, 1)[0]
            if (not edgeToValidate):
                logging.error("No edge to validate")
                logging.debug(
                    "Start method houDoBooleanOperation, class PrimDivided. State: No edge to valide in prim %s",
                    str(prim.number()))
                self.prim = None
                return False

        logging.debug("Edge to validate: %s", str(edgeToValidate))
        edgeToValidate = [list(edgeToValidate[0]), list(edgeToValidate[1])]

        firstPointCrack = crack[prim][0]
        lastPointCrack = crack[prim][len(crack[prim]) - 1]
        matched = False
        # Points ordered by prim
        points = [list(p.point().position()) for p in prim.vertices()]
        edgeFirst = GeoMath.getEdgeWithPointInPrim(prim, firstPointCrack)
        edgeFirst = [list(edgeFirst[0]), list(edgeFirst[1])]
        # Put the edge in clockwise direction
        if (GeoMath.determineDirEdge(edgeFirst, prim, True)):
            curEdge = [firstPointCrack, edgeFirst[1]]
        else:
            curEdge = [firstPointCrack, edgeFirst[0]]
        index = 0
        logging.debug("Points: %s", str(points))
        logging.debug("Current edge: %s", str(curEdge))
        count = 0
        while (points[index] != curEdge[1]):
            count += 1
            if (count == 10):
                logging.error("First edge not found")
                logging.debug(
                    "End method houDoBooleanOperation, class PrimDivided. State: first edge not found"
                )
                return
            index += 1
        nextIndex = (index + 1) % len(points)
        nextEdge = [curEdge[1], points[nextIndex]]
        edgeLast = GeoMath.getEdgeWithPointInPrim(prim, lastPointCrack)
        edgeLast = [list(edgeLast[0]), list(edgeLast[1])]
        if (not GeoMath.determineDirEdge(edgeLast, prim, True)):
            edgeLast = [list(edgeLast[1]), list(edgeLast[0])]
        pointsDisplaced = []

        # Normal iteration over points
        count = 0
        logging.debug("Last edge where the 'to validate edge' lies: %s",
                      str(edgeLast))
        self.pointsOutside = []
        logging.debug("Normal iteration over points")
        while (len(GeoMath.getSharedEdges(curEdge, edgeLast, 1)) == 0):
            logging.debug("Current edge: %s", str(curEdge))
            count += 1
            if (count == 10):
                logging.error("Last edge not found")
                logging.debug(
                    "End method houDoBooleanOperation, class PrimDivided. State: Last edge not found"
                )
                return
            # Calcule the displacement
            vecDis = self.calculateDisplacement(curEdge, nextEdge)
            pointDisplaced = self.applyDisplacement(curEdge[1], vecDis)
            # Add displace point
            pointsDisplaced.append(pointDisplaced)
            self.pointsOutside.append(curEdge[1])
            if (len(GeoMath.getSharedEdges(curEdge, edgeToValidate, 1)) > 0):
                matched = True
            curEdge = [curEdge[1], points[nextIndex]]
            nextIndex = (nextIndex + 1) % len(points)
            nextEdge = [nextEdge[1], points[nextIndex]]
        logging.debug("Ha salido del segundo bucle con: %s", str(curEdge))
        curEdge = [curEdge[0], lastPointCrack]
        # Last comprovation
        if (not matched and
            (len(GeoMath.getSharedEdges(curEdge, edgeToValidate, 1)) > 0)):
            logging.debug("Final comprovation edge: %s", str(curEdge))
            matched = True
        if (not matched):
            logging.debug(
                "Not matched at normal iteration over points, trying in inverse mode"
            )
            # Do inverse
            # Put the edge in not clockwise direction
            if (GeoMath.determineDirEdge(edgeFirst, prim, False)):
                curEdge = [firstPointCrack, edgeFirst[1]]
            else:
                curEdge = [firstPointCrack, edgeFirst[0]]
            index = 0
            count = 0
            while (points[index] != curEdge[1]):
                count += 1
                if (count == 10):
                    logging.error("First edge not found")
                    logging.debug(
                        "End method houDoBooleanOperation, class PrimDivided. State: Last edge not found"
                    )
                    return
                index += 1
            nextIndex = (index - 1)
            if (nextIndex < 0):
                nextIndex = (len(points) - 1)
            nextEdge = [curEdge[1], points[nextIndex]]
            edgeLast = GeoMath.getEdgeWithPointInPrim(prim, lastPointCrack)
            if (not GeoMath.determineDirEdge(edgeLast, prim, False)):
                edgeLast = [list(edgeLast[1]), list(edgeLast[0])]
            pointsDisplaced = []
            self.pointsOutside = []
            # Inverse iteration over points
            count = 0
            logging.debug("Inverse iteration over points")
            while (len(GeoMath.getSharedEdges(curEdge, edgeLast, 1)) == 0):
                count += 1
                if (count == 10):
                    logging.error("Last edge not found")
                    logging.debug(
                        "End method houDoBooleanOperation, class PrimDivided. State: Last edge not found"
                    )
                    return
                # Calcule the displacement
                vecDis = self.calculateDisplacement(curEdge, nextEdge)
                pointDisplaced = self.applyDisplacement(curEdge[1], vecDis)
                pointsDisplaced.append(pointDisplaced)
                self.pointsOutside.append(curEdge[1])
                if ((len(GeoMath.getSharedEdges(curEdge, edgeToValidate, 1)) >
                     0)):
                    matched = True
                curEdge = [curEdge[1], points[nextIndex]]
                nextIndex = (nextIndex - 1)
                if (nextIndex < 0):
                    nextIndex = len(points) - 1
                nextEdge = [nextEdge[1], points[nextIndex]]
            curEdge = [curEdge[0], lastPointCrack]
            # Last comprovation
            if (not matched and
                (len(GeoMath.getSharedEdges(curEdge, edgeToValidate, 1)) > 0)):
                logging.debug("Final comprovation edge: %s", str(curEdge))
                matched = True
        if (not matched):
            logging.error("Validate edge not found at primitive")
        # Add the extrem points
        self.pointsOutside.insert(0, firstPointCrack)
        self.pointsOutside.append(lastPointCrack)
        # Now we have a structure with the points in correct order, with the edge that was broken and
        # with applied displacement for each point. Not firstCrackPoint either lastCrackPoint added.
        curveNode = sweepingNode.createNode(
            'curve', 'crack_pattern_' + str(prim.number()))
        # curveNode.setNextInput(volumeNode)
        pointsString = ""
        for point in crack[prim]:
            pointsString = pointsString + str(point[0]) + "," + str(
                point[1]) + "," + str(point[2]) + " "
        # Now we add the displacement point to close the prim
        pointsDisplaced.reverse()
        for point in pointsDisplaced:
            pointsString = pointsString + str(point[0]) + "," + str(
                point[1]) + "," + str(point[2]) + " "

        curveNode.parm('coords').set(pointsString)
        curveNode.moveToGoodPosition()
        curveNode.parm('close').set(True)
        extrudeNode = sweepingNode.createNode('extrude',
                                              'extrude_' + str(prim.number()))

        extrudeNode.setNextInput(curveNode)

        largeOfGeo = extrudeNode.geometry().boundingBox().sizevec().length()
        extrudeNode.parm('depthxlate').set(-largeOfGeo / 2 - 0.5)
        extrudeNode.parm('depthscale').set(largeOfGeo + 1)

        # Associate part B with crack line volume
        # extrudeNode.setNextInput(crackNode)

        cookieNode = sweepingNode.createNode('cookie',
                                             'cookie_' + str(prim.number()))

        cookieNode.parm('dojitter').set(True)
        cookieNode.parm('jitteramount').set(0.001)
        cookieNode.parm('seed').set(3)
        cookieNode.parm('boolop').set('other')
        cookieNode.parm('insideB').set(True)
        cookieNode.parm('outsideB').set(True)
        cookieNode.setNextInput(extrudeNode)
        # Associate part B with volume
        cookieNode.setNextInput(volumeNode)
        cookieNode.parm('groupB').set("__" + str(prim.number()))
        cookieNode.parm('createGroup').set(True)
        cookieNode.parm('insideAGroup').set("Ain")
        cookieNode.parm('insideBGroup').set(self.nameGroupBroken)
        cookieNode.parm('outsideAGroup').set("Aout")
        cookieNode.parm('outsideBGroup').set(self.nameGroupNotBroken)
        cookieNode.parm('overlapAGroup').set("Aover")
        cookieNode.parm('overlapBGroup').set("Bover")

        # Delete the unwanted groups
        deleteNode = sweepingNode.createNode(
            'delete', 'unwantedGroups_' + str(prim.number()))
        deleteNode.parm('group').set(self.nameGroupBroken +
                                     ' Ain Aout Aover Bover')
        deleteNode.setNextInput(cookieNode)
        self.curveNode = curveNode
        self.extrudeNode = extrudeNode
        self.cookieNode = cookieNode
        self.deleteNode = deleteNode
        self.curveNode.moveToGoodPosition()
        self.extrudeNode.moveToGoodPosition()
        self.cookieNode.moveToGoodPosition()
        self.deleteNode.moveToGoodPosition()

        self.nodes.append(self.curveNode)
        self.nodes.append(self.extrudeNode)
        self.nodes.append(self.cookieNode)
        self.nodes.append(self.deleteNode)
        logging.debug(
            "End method houDoBooleanOperation, class PrimDivided. State: good")