[Bf-extensions-cvs] [60e45801] master: Curve Tools 2: move to release T65825

Spivak Vladimir cwolf3d noreply at git.blender.org
Fri Sep 13 15:04:37 CEST 2019


Commit: 60e4580191805ace935fae06bf62ccd0037065b7
Author: Spivak Vladimir (cwolf3d)
Date:   Fri Sep 13 16:03:12 2019 +0300
Branches: master
https://developer.blender.org/rBA60e4580191805ace935fae06bf62ccd0037065b7

Curve Tools 2: move to release T65825

===================================================================

A	curve_tools/CurveIntersections.py
A	curve_tools/Curves.py
A	curve_tools/Math.py
A	curve_tools/Operators.py
A	curve_tools/PathFinder.py
A	curve_tools/Properties.py
A	curve_tools/ShowCurveResolution.py
A	curve_tools/Surfaces.py
A	curve_tools/Util.py
A	curve_tools/__init__.py
A	curve_tools/auto_loft.py
A	curve_tools/cad.py
A	curve_tools/curve_outline.py
A	curve_tools/curve_remove_doubles.py
A	curve_tools/exports.py
A	curve_tools/internal.py
A	curve_tools/toolpath.py

===================================================================

diff --git a/curve_tools/CurveIntersections.py b/curve_tools/CurveIntersections.py
new file mode 100644
index 00000000..06254701
--- /dev/null
+++ b/curve_tools/CurveIntersections.py
@@ -0,0 +1,830 @@
+import bpy
+from . import Math
+from . import Curves
+from . import Util
+
+from mathutils import Vector
+
+algoPOV = None
+algoDIR = None
+
+
+class BezierSegmentIntersectionPoint:
+    def __init__(self, segment, parameter, intersectionPoint):
+        self.segment = segment
+        self.parameter = parameter
+        self.intersectionPoint = intersectionPoint
+
+
+class BezierSegmentsIntersector:
+    def __init__(self, segment1, segment2, worldMatrix1, worldMatrix2):
+        self.segment1 = segment1
+        self.segment2 = segment2
+        self.worldMatrix1 = worldMatrix1
+        self.worldMatrix2 = worldMatrix2
+
+    def CalcFirstIntersection(self, nrSamples1, nrSamples2):
+        algorithm = bpy.context.scene.curvetools.IntersectCurvesAlgorithm
+
+        if algorithm == '3D':
+            return self.CalcFirstRealIntersection3D(nrSamples1, nrSamples2)
+
+        if algorithm == 'From View':
+            global algoDIR
+            if algoDIR is not None:
+                return self.CalcFirstRealIntersectionFromViewDIR(nrSamples1, nrSamples2)
+
+            global algoPOV
+            if algoPOV is not None:
+                return self.CalcFirstRealIntersectionFromViewPOV(nrSamples1, nrSamples2)
+
+        return None
+
+    def CalcFirstIntersection3D(self, nrSamples1, nrSamples2):
+        fltNrSamples1 = float(nrSamples1)
+        fltNrSamples2 = float(nrSamples2)
+
+        limitDistance = bpy.context.scene.curvetools.LimitDistance
+
+        for iSample1 in range(nrSamples1):
+            segPar10 = float(iSample1) / fltNrSamples1
+            segPar11 = float(iSample1 + 1) / fltNrSamples1
+            P0 = self.worldMatrix1 @ self.segment1.CalcPoint(parameter=segPar10)
+            P1 = self.worldMatrix1 @ self.segment1.CalcPoint(parameter=segPar11)
+
+            for iSample2 in range(nrSamples2):
+                segPar20 = float(iSample2) / fltNrSamples2
+                segPar21 = float(iSample2 + 1) / fltNrSamples2
+                Q0 = self.worldMatrix2 @ self.segment2.CalcPoint(parameter=segPar20)
+                Q1 = self.worldMatrix2 @ self.segment2.CalcPoint(parameter=segPar21)
+
+                intersectionPointData = Math.CalcIntersectionPointLineSegments(P0, P1, Q0, Q1, limitDistance)
+                if intersectionPointData is None:
+                    continue
+
+                intersectionSegment1Parameter = segPar10 + (intersectionPointData[0] / fltNrSamples1)
+                intersectionPoint1 = BezierSegmentIntersectionPoint(self.segment1,
+                                                                    intersectionSegment1Parameter,
+                                                                    intersectionPointData[2])
+
+                intersectionSegment2Parameter = segPar20 + (intersectionPointData[1] / fltNrSamples2)
+                intersectionPoint2 = BezierSegmentIntersectionPoint(self.segment2,
+                                                                    intersectionSegment2Parameter,
+                                                                    intersectionPointData[3])
+
+                return [intersectionPoint1, intersectionPoint2]
+
+        return None
+
+    def CalcFirstRealIntersection3D(self, nrSamples1, nrSamples2):
+        fltNrSamples1 = float(nrSamples1)
+        fltNrSamples2 = float(nrSamples2)
+
+        limitDistance = bpy.context.scene.curvetools.LimitDistance
+
+        for iSample1 in range(nrSamples1):
+            segPar10 = float(iSample1) / fltNrSamples1
+            segPar11 = float(iSample1 + 1) / fltNrSamples1
+            P0 = self.worldMatrix1 @ self.segment1.CalcPoint(parameter=segPar10)
+            P1 = self.worldMatrix1 @ self.segment1.CalcPoint(parameter=segPar11)
+
+            for iSample2 in range(nrSamples2):
+                segPar20 = float(iSample2) / fltNrSamples2
+                segPar21 = float(iSample2 + 1) / fltNrSamples2
+                Q0 = self.worldMatrix2 @ self.segment2.CalcPoint(parameter=segPar20)
+                Q1 = self.worldMatrix2 @ self.segment2.CalcPoint(parameter=segPar21)
+
+                intersectionPointData = Math.CalcIntersectionPointLineSegments(P0, P1, Q0, Q1, limitDistance)
+                if intersectionPointData is None:
+                    continue
+
+                # intersection point can't be an existing point
+                intersectionSegment1Parameter = segPar10 + (intersectionPointData[0] / (fltNrSamples1))
+                worldPoint1 = self.worldMatrix1 @ self.segment1.CalcPoint(parameter=intersectionSegment1Parameter)
+                if (Math.IsSamePoint(P0, worldPoint1, limitDistance)) or \
+                   (Math.IsSamePoint(P1, worldPoint1, limitDistance)):
+
+                    intersectionPoint1 = None
+                else:
+                    intersectionPoint1 = BezierSegmentIntersectionPoint(self.segment1,
+                                                                        intersectionSegment1Parameter,
+                                                                        worldPoint1)
+
+                intersectionSegment2Parameter = segPar20 + (intersectionPointData[1] / (fltNrSamples2))
+                worldPoint2 = self.worldMatrix2 @ self.segment2.CalcPoint(parameter=intersectionSegment2Parameter)
+                if (Math.IsSamePoint(Q0, worldPoint2, limitDistance)) or \
+                   (Math.IsSamePoint(Q1, worldPoint2, limitDistance)):
+
+                    intersectionPoint2 = None
+                else:
+                    intersectionPoint2 = BezierSegmentIntersectionPoint(self.segment2,
+                                                                        intersectionSegment2Parameter,
+                                                                        worldPoint2)
+
+                return [intersectionPoint1, intersectionPoint2]
+
+        return None
+
+    def CalcFirstIntersectionFromViewDIR(self, nrSamples1, nrSamples2):
+        global algoDIR
+
+        fltNrSamples1 = float(nrSamples1)
+        fltNrSamples2 = float(nrSamples2)
+
+        for iSample1 in range(nrSamples1):
+            segPar10 = float(iSample1) / fltNrSamples1
+            segPar11 = float(iSample1 + 1) / fltNrSamples1
+            P0 = self.worldMatrix1 @ self.segment1.CalcPoint(parameter=segPar10)
+            P1 = self.worldMatrix1 @ self.segment1.CalcPoint(parameter=segPar11)
+
+            for iSample2 in range(nrSamples2):
+                segPar20 = float(iSample2) / fltNrSamples2
+                segPar21 = float(iSample2 + 1) / fltNrSamples2
+                Q0 = self.worldMatrix2 @ self.segment2.CalcPoint(parameter=segPar20)
+                Q1 = self.worldMatrix2 @ self.segment2.CalcPoint(parameter=segPar21)
+
+                intersectionPointData = Math.CalcIntersectionPointsLineSegmentsDIR(P0, P1, Q0, Q1, algoDIR)
+                if intersectionPointData is None:
+                    continue
+
+                intersectionSegment1Parameter = segPar10 + (intersectionPointData[0] / fltNrSamples1)
+                worldPoint1 = self.worldMatrix1 @ self.segment1.CalcPoint(parameter=intersectionSegment1Parameter)
+                intersectionPoint1 = BezierSegmentIntersectionPoint(self.segment1,
+                                                                    intersectionSegment1Parameter,
+                                                                    worldPoint1)
+
+                intersectionSegment2Parameter = segPar20 + (intersectionPointData[1] / fltNrSamples2)
+                worldPoint2 = self.worldMatrix2 @ self.segment2.CalcPoint(parameter=intersectionSegment2Parameter)
+                intersectionPoint2 = BezierSegmentIntersectionPoint(self.segment2,
+                                                                    intersectionSegment2Parameter,
+                                                                    worldPoint2)
+
+                return [intersectionPoint1, intersectionPoint2]
+
+        return None
+
+    def CalcFirstRealIntersectionFromViewDIR(self, nrSamples1, nrSamples2):
+        global algoDIR
+
+        fltNrSamples1 = float(nrSamples1)
+        fltNrSamples2 = float(nrSamples2)
+
+        limitDistance = bpy.context.scene.curvetools.LimitDistance
+
+        for iSample1 in range(nrSamples1):
+            segPar10 = float(iSample1) / fltNrSamples1
+            segPar11 = float(iSample1 + 1) / fltNrSamples1
+            P0 = self.worldMatrix1 @ self.segment1.CalcPoint(parameter=segPar10)
+            P1 = self.worldMatrix1 @ self.segment1.CalcPoint(parameter=segPar11)
+
+            for iSample2 in range(nrSamples2):
+                segPar20 = float(iSample2) / fltNrSamples2
+                segPar21 = float(iSample2 + 1) / fltNrSamples2
+                Q0 = self.worldMatrix2 @ self.segment2.CalcPoint(parameter=segPar20)
+                Q1 = self.worldMatrix2 @ self.segment2.CalcPoint(parameter=segPar21)
+
+                intersectionPointData = Math.CalcIntersectionPointsLineSegmentsDIR(P0, P1, Q0, Q1, algoDIR)
+                if intersectionPointData is None:
+                    continue
+
+                # intersection point can't be an existing point
+                intersectionSegment1Parameter = segPar10 + (intersectionPointData[0] / (fltNrSamples1))
+                worldPoint1 = self.worldMatrix1 @ self.segment1.CalcPoint(parameter=intersectionSegment1Parameter)
+                if (Math.IsSamePoint(P0, worldPoint1, limitDistance)) or \
+                   (Math.IsSamePoint(P1, worldPoint1, limitDistance)):
+
+                    intersectionPoint1 = None
+                else:
+                    intersectionPoint1 = BezierSegmentIntersectionPoint(self.segment1,
+                                                                        intersectionSegment1Parameter,
+                                                                        worldPoint1)
+
+                intersectionSegment2Parameter = segPar20 + (intersectionPointData[1] / (fltNrSamples2))
+                

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list