Hello, I have a sketch with a spline and several planes intersecting it. Is there a way to get the points where the reference planes intersect the spline programmatically?
Maybe using 3D sketches?
Thank you in advance.
Hello, I have a sketch with a spline and several planes intersecting it. Is there a way to get the points where the reference planes intersect the spline programmatically?
Maybe using 3D sketches?
Thank you in advance.
if the points you are after fall on the intersecting planes then why not just sketch a point on each plane and apply the pierce relation to the 3D spline.
Just for the record, if you do want to do this programmatically, it is possible. But the answer is too long to give here.
In summary, you get a Curve object from the sketch spline.
Next you create a Surface object consisting of a single planar surface which represents the plane. You can use the Modeler object to create a temporary body which does not appear in the feature manager.
Finally you call ISurface.IntersectCurve2 to get the coordinates of the intersection.
I'm replying to the original post because both Simon Turner and Matthew Cempa gave me a similar response. Thank you for your answers.
The suggestion to use Planar Surfaces and the relative IntersectCurve2 is correct and works fine if we follow the example. Unfortunately I'm having problems when trying to change the plane orientation and with intersection points Z positions. Please see the following screens.
This is the result of the macro on a curve on a 2D sketch sitting at -0.640 m. The planar surface has been created with vRootPoint (0.0, 0.0, 0.0) and vNormal (1.0, 0.0, 0.0) as requested from 2017 SOLIDWORKS API Help - CreatePlanarSurface Method (IModeler). The macro automatically insert a 3D sketch with a line and a reference plane for visualization purposes only.
As you can see everything is ok except for the Z of the points (it's at 0.0 instead of -0.64).
What happens if we slightly rotate the normal?
The points are at the same position as before. I'm not sure if I'm doing something wrong or if it's supposed to work like that. Here are some snippets of code.
Retrieving curve and curve bounds:
Curve mCurve = (Curve)mSegment.GetCurve(); double sp, ep; bool closed, periodic; mCurve.GetEndParams(out sp, out ep, out closed, out periodic); double[] spt = (double[])mCurve.Evaluate(sp); double[] ept = (double[])mCurve.Evaluate(ep); double[] curveBounds = new double[6] { spt[0], spt[1], spt[2], ept[0], ept[1], ept[2] };
Creating planar surface:
Surface planarSurface = default(Surface); double[] vRootPoint = new double[3]; double[] vNormalPoint = new double[3]; vRootPoint[0] = 0.0; vRootPoint[1] = 0.0; vRootPoint[2] = 0.0; vNormalPoint[0] = 1.0; // 0.905 in second example vNormalPoint[1] = 0.0; // 0.0 in second example vNormalPoint[2] = 0.0; // 0.307 in second example planarSurface = (Surface)swModeler.CreatePlanarSurface((vRootPoint), (vNormalPoint));
Any help is appreciated. Thanks in advance.
I just got this to work by using the ModelToSketchTransform for the sketch that contains the spline.
Step 1: multiply the coordinates of the root point and vector of the plane by the ModelToSketchTransform matrix
Step 2: multiply the results of IntersectCurve2 by the inverse of that matrix
Here is a snippet from a VBA macro I used:
Dim myRootPoint(2) As Double
Dim vRootPoint As Variant
Dim myNormalPoint(2) As Double
Dim vNormalPoint As Variant
Dim myTran As MathTransform
Dim mPt As MathPoint
Dim vPt As MathVector
Dim myUtil As MathUtility
Dim mySketch As Sketch
Set myUtil = swApp.GetMathUtility
Set mySketch = mySeg.GetSketch
Set myTran = mySketch.ModelToSketchTransform
myRootPoint(0) = 0#
myRootPoint(1) = 0#
myRootPoint(2) = 0#
Set mPt = myUtil.CreatePoint(myRootPoint)
Set mPt = mPt.MultiplyTransform(myTran)
vRootPoint = mPt.ArrayData
myNormalPoint(0) = 1# ' 0.905 in second example
myNormalPoint(1) = 0# ' 0.0 in second example
myNormalPoint(2) = 0# ' 0.307 in second example
Set vPt = myUtil.CreateVector((myNormalPoint))
Set vPt = vPt.MultiplyTransform(myTran)
vNormalPoint = vPt.ArrayData
Set planarSurface = swModeler.CreatePlanarSurface((vRootPoint), (vNormalPoint))
......
If IsEmpty(pointArray) = False Then
Set myTran = mySketch.ModelToSketchTransform
Set myTran = myTran.Inverse
Part.ClearSelection2 True
Part.Insert3DSketch2 False
Part.SketchManager.AddToDB = True
For i = 0 To UBound(pointArray) - 2 Step 3
p(0) = pointArray(i)
p(1) = pointArray(i + 1)
p(2) = pointArray(i + 2)
Set mPt = myUtil.CreatePoint((p))
Set mPt = mPt.MultiplyTransform(myTran)
sa = mPt.ArrayData
Part.SketchManager.CreatePoint sa(0), sa(1), sa(2)
Next
Part.SketchManager.AddToDB = False
Part.ClearSelection2 True
Part.Insert3DSketch2 True
Part.ClearSelection2 True
End If
One thought is that if you are doing it in a sketch you could probably use add sketch relations to a point to be on each curve and that would be the intersection. Another approach is to create a surface body and use the IntersectCurve2 method. I'm surprised there is no plane intersection method for a sketch segment.