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.

Categories: API∕Macros

Last comment By: Simon Turner   Thu, 23 Nov 2017 11:45:21 GMT
Re: Sketch / reference planes intersection

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.

By: Matthew Cempa  Wed, 15 Nov 2017 19:30:43 GMT
Re: Sketch / reference planes intersection

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.

By: Newell Voss  Wed, 15 Nov 2017 19:58:50 GMT
Re: Sketch / reference planes intersection

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.

By: Simon Turner  Wed, 15 Nov 2017 20:12:42 GMT
Re: Sketch / reference planes intersection

Thank you for your answer. Unfortunately I need to know beforehand how many intersections are there. Plus with this method I can't be sure that multiple points don't get constrained to the same coordinates.

By: Marco Maso  Wed, 22 Nov 2017 08:43:49 GMT
Re: Sketch / reference planes 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.

By: Marco Maso  Wed, 22 Nov 2017 09:59:36 GMT
Re: Sketch / reference planes intersection

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)


        Part.SketchManager.AddToDB = False

        Part.ClearSelection2 True

        Part.Insert3DSketch2 True

        Part.ClearSelection2 True

    End If

By: Simon Turner  Thu, 23 Nov 2017 11:45:21 GMT
You are not authorized to view this page No results found! Suggestions: Check spelling, try a different search, or browse topics below.