.NET

Reply
Active Contributor
R.Gerritsen4967
Posts: 46
Registered: ‎07-31-2009
Message 1 of 7 (2,295 Views)
Accepted Solution

[VB.net] Calculate intersection between 2 lines

2295 Views, 6 Replies
11-19-2012 06:41 AM

Hi all,

 

I'm using AutoCAD 2013 x64 and VS2012 Express with ObjectARX 2013.

Now I want to calculate the (projected) intersection point of 2 (intersecting) lines in vb.net

 

After selecting the lines I have this code:

line1.IntersectWith(line2, Intersect.OnBothOperands, intpts, 0, 0)

 

In Visual studio express 2012 I get the following warning for the above line of code:

 

warning BC40000: 'Public Sub IntersectWith(entityPointer As Autodesk.AutoCAD.DatabaseServices.Entity, intersectType As Autodesk.AutoCAD.DatabaseServices.Intersect, points As Autodesk.AutoCAD.Geometry.Point3dCollection, thisGraphicSystemMarker As Long, otherGraphicSystemMarker As Long)' is obsolete: 'Use the overload taking IntPtr instead.'.


So, if I'm reading this correctly, this method is outdated and I should use an other method to calculate the intersection.

But I really don't know what 'Use the overload taking IntPtr instead' means.

 

I have searched on a lot of forums, but I can't seem to find an answer. All the answers I could find were essentially the same function.

 

One of the things I found is a function that contains this line of code:

Dim inters As Point3d = line1.IntersectWith(line2)(0)

This one looks almost the same, but doesn't give me the warning when I compile the code, but this method crashes AutoCAD when there is no intersection between the lines. This is despite a try catch block that surrounds the code.

 

Can anybody point me in the right direction?

For now I just want to use lines, but I need to expand the code so it will also work with circles, arcs and polylines.

 

*Expert Elite*
Jeff_M
Posts: 4,210
Registered: ‎07-22-2003
Message 2 of 7 (2,293 Views)

Re: [VB.net] Calculate intersection between 2 lines

11-19-2012 06:50 AM in reply to: R.Gerritsen4967

See THIS post.

 

IntPtr.Zero is needed in place of the 0's

Jeff_M, also a frequent Swamper
Active Contributor
R.Gerritsen4967
Posts: 46
Registered: ‎07-31-2009
Message 3 of 7 (2,286 Views)

Re: [VB.net] Calculate intersection between 2 lines

11-19-2012 07:05 AM in reply to: Jeff_M

Wow that was quick!!!

And it works too! Thanks a lot.

 

But can you(or anybody else) tell me what the difference is between the two lines of code I posted?

I mean, to my eye it is the same method, but why don't I get a warning on the second line of code?

 

The second line of code crashes my AutoCAD when the picked lines have no intersectionpoints.

Would it better to check if the lines are parallel before the intersection check?

That's what I have done now to avoid the crash, but I'm sure there is another (maybe better) way.

*Expert Elite*
Jeff_M
Posts: 4,210
Registered: ‎07-22-2003
Message 4 of 7 (2,269 Views)

Re: [VB.net] Calculate intersection between 2 lines

11-19-2012 10:04 AM in reply to: R.Gerritsen4967

Not sure about that line of code, as it should give an error at compile time. Unless there was, at one time, on overload method which only accepted the one argument (perhaps the old COM method allowed optional arguments?)

 

If you find a response which answers your question, please be sure to accept the actual post which helped you as the solution. This will help future searchers quickly find answers to their own questions. Thanks!

Jeff_M, also a frequent Swamper
*Expert Elite*
_gile
Posts: 2,077
Registered: ‎04-29-2006
Message 5 of 7 (2,234 Views)

Re: [VB.net] Calculate intersection between 2 lines

11-19-2012 11:12 PM in reply to: R.Gerritsen4967

Hi,

 

I think the second line of code uses the Autodesk.AutoCAD.Geometry.LinearEntity3d.IntersectWith() method instead of Autodesk.AutoCAD.DatabaseServices.Entity.IntersectWith() one.

Usiing the Autodesk.AutoCAD.Geometry.LinearEntity3d (or Entity2d) underlaying derived classes for geometry calculation is cheaper (it's the way the API internaly does).

 

The LinearEntity3d.IntersectWith() method return a Point3d array or null (Nothing) if there's none intersection. to avoid the exception, you have to check if the returned value is not null (Nothing), IOW if the lines are parallel (or colinear).

Gilles Chanteau
Active Contributor
R.Gerritsen4967
Posts: 46
Registered: ‎07-31-2009
Message 6 of 7 (2,226 Views)

Re: [VB.net] Calculate intersection between 2 lines

11-19-2012 11:51 PM in reply to: _gile

Hi _gile,

 

Thanks for your answer.

I have tried to check if the function returns nothing, but unfortunately that does not matter.

AutoCAD just crashes if the lines are parallel.

 

This is the function I was using:

    Function LinesIntersect(ln1 As Line, ln2 As Line) As Point3d
        Try
            Dim line1 As New Line3d(ln1.StartPoint, ln1.EndPoint)
            Dim line2 As New Line3d(ln2.StartPoint, ln2.EndPoint)
            Dim inters As Point3d = line1.IntersectWith(line2)(0) 'Acad crashes at this line of code
            If Not inters = Nothing Then
                GSIntersect = inters
            Else
                msgbox("parallel?")
            End If

        Catch ex As Exception
            Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
            Dim ed As Editor = doc.Editor

            ed.WriteMessage("Something went wrong:" & vbLf & vbLf & ex.ToString())
        End Try

    End Function

 I get a FATAL ERROR: Unhandled Access Violation....

AutoCAD just crashes before I can even check if the result is nothing.

 

What I'm trying to achieve is a function that returns a points3DCollection with the coordinates of all the intersections of the two objects I select (lines,polylines, arcs and circles)

*Expert Elite*
_gile
Posts: 2,077
Registered: ‎04-29-2006
Message 7 of 7 (2,214 Views)

Re: [VB.net] Calculate intersection between 2 lines

11-20-2012 04:43 AM in reply to: R.Gerritsen4967

Hi,

 

As I said, IntersectWith returns a point3d array or null (Nothing), so you have to check if the array is null before trying to get its first item.

If you want to make a function, it may return a nullable<Point3d> (Nullable(Of Point3d) instead of a Point3d because the Point3d structure is not nullable in case there's none intersection.

 

The following example retruns a Nullable(Of Point3d) (or null if none intersection):

		Private Function LinesIntersect(line1 As Line, line2 As Line) As Nullable(Of Point3d)
			Dim ls1 As New LineSegment3d(line1.StartPoint, line1.EndPoint)
			Dim ls2 As New LineSegment3d(line2.StartPoint, line2.EndPoint)
			Dim inters As Point3d() = ls1.IntersectWith(ls2)
			If inters Is Nothing Then
				Return Nothing
			Else
				Return inters(0)
			End If
End Function

Using example:

 

Dim nPt As Nullable(Of Point3d) = LinesIntersect(line1, line2)

If nPt.HasValue Then

    Dim pt As Point3d = nPt.Value

    '...

End If

Gilles Chanteau

You are not logged in.

Log into access your profile, ask and answer questions, share ideas and more. Haven't signed up yet? Register

Announcements
Are you familiar with the Autodesk Expert Elites? The Expert Elite program is made up of customers that help other customers by sharing knowledge and exemplifying an engaging style of collaboration. To learn more, please visit our Expert Elite website.

Need installation help?

Start with some of our most frequented solutions to get help installing your software.

Ask the Community