Unable to get Intersection point between two 3d polyline in Autocad visual lisp

Unable to get Intersection point between two 3d polyline in Autocad visual lisp

nagamalliv
Enthusiast Enthusiast
1,138 Views
8 Replies
Message 1 of 9

Unable to get Intersection point between two 3d polyline in Autocad visual lisp

nagamalliv
Enthusiast
Enthusiast

Hi,

 

Unable to get intersection point of 3dpolylines in Autocad visual lisp/ .NET.

 

0 Likes
Accepted solutions (2)
1,139 Views
8 Replies
Replies (8)
Message 2 of 9

Alexander.Rivilis
Mentor
Mentor

Maybe you show your code?

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

0 Likes
Message 3 of 9

nagamalliv
Enthusiast
Enthusiast

(defun GetIntersectPoints
(sourName destName
/ sourObj destObj intPnts)
(setq sourObj (vlax-ename->vla-object sourName)
destObj (vlax-ename->vla-object destName)
intPnts (vlax-invoke-method sourObj 'intersectwith destObj acExtendThisentity)
);setq

(mapcar 'vlax-release-object (list sourObj destObj))
(setq intPnts (vlax-variant-value intPnts))
(if (/= (vlax-safearray-get-u-bound intPnts 1) -1)
(progn
(setq rawPoints (vlax-safearray->list intPnts)
coordInc 0
coordLen (length rawPoints)
intPnts '()
);setq

(while (< coordInc (- coordLen 2))
(setq intPnts (append intPnts (list (list (nth coordInc rawPoints) (nth (1+ coordInc) rawPoints))))
coordInc (+ coordInc 3)
);setq
);while

intPnts
);progn
nil
);if
);defun

0 Likes
Message 4 of 9

_gile
Consultant
Consultant

Hi,

 

The LISP code you posted works if the polylines 3d (or whatever kind of curves) do intersect.

 

Are you sure the polyline 3d you use for testing are truely intersecting?



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

0 Likes
Message 5 of 9

nagamalliv
Enthusiast
Enthusiast

In top view 3d polylines intersecting.

0 Likes
Message 6 of 9

_gile
Consultant
Consultant
Accepted solution

IntersectWith method do not return projected intersections.

If you want to get projected intersections, you have to "project" the polyline 3d segment onto the XY plane (i.e. convert 3d points into 2d points) before looking for intersections.

Here's an AutoLISP example:

 

(defun GetProjectIntersection (sourceName destName /
                               ;; sub functions
                               getProjectVertices getProjectedSegments
                               ;; local variables
                               sourceSegments destSegments intersPoint intersPoints)

  (defun getVertices (poly3d / elst points)
    (setq elst (entget (entnext poly3d)))
    (while (= "VERTEX" (cdr (assoc 0 elst)))
      (setq points  (cons (cdr (assoc 10 elst)) points)
            elst (entget (entnext (cdr (assoc -1 elst))))
      )
    )
    (reverse points)
  )

  (defun getProjectedSegments (vertices)
    (mapcar
      '(lambda (p1 p2)
         (list (list (car p1) (cadr p1)) (list (car p2) (cadr p2)))
       )
      vertices
      (cdr vertices)
    )
  )

  (setq sourceSegments (getProjectedSegments (getVertices sourceName))
        destSegments   (getProjectedSegments (getVertices destName))
  )
  (foreach sourceSegment sourceSegments
    (foreach destSegment destSegments
      (if (setq intersPoint
                 (inters (car sourceSegment)
                         (cadr sourceSegment)
                         (car destSegment)
                         (cadr destSegment)
                 )
          )
        (setq intersPoints (cons intersPoint intersPoints))
      )
    )
  )
  (reverse intersPoints)
)


Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

0 Likes
Message 7 of 9

nagamalliv
Enthusiast
Enthusiast

Working,Thank you so much Gilles Chanteau.

0 Likes
Message 8 of 9

nagamalliv
Enthusiast
Enthusiast

Now i have another problem with vlax-curve-getclosestpointto function not working for 3d polyline

0 Likes
Message 9 of 9

_gile
Consultant
Consultant
Accepted solution

If vlax-curve-getclosestpointto function doen't work as you expect (IMO, it works as described in the documentation), you can have a look to vlax-curveGetClosestPointToProjection as it seems to me you need 2d behavior with a 3d entity.

 

PS: you should have posted in the LISP forum.



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

0 Likes