[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