Intersection Functions

Here I present a set of functions which involve retrieving a list of all points of intersection between either two VLA-Objects, a Selection Set / list of VLA-Objects, or between objects found in two Selection Sets / lists of VLA-Objects.

Each of the following functions is essentially a wrapper for the Visual LISP intersectwith method; consequently, the functions will only accept objects for which this method is applicable.

Intersections

Function Syntax (LM:intersections <ob1> <ob2> <mod>)
Current Version 1.0
Donate
Arguments
Symbol Type Description
ob1 , ob2 VLA-Object VLA-Objects for which to retrieve points of intersection
mod Integer acextendoption enumeration of the intersectwith method
Returns
Type Description
List A list of all points of intersection between the two objects for the given intersection mode

Function Description

This function will return a list of 3D WCS points of intersection between two supplied objects, or nil if the objects do not intersect under the specified intersection mode.

The function requires two VLA-Object arguments and a third acextendoption enumeration argument as required by the intersectwith method to determine the intersection mode.

The mod parameter may be one of the following symbols:

Mode Intersection Behaviour
acextendnone Do not extend either object
acextendthisentity Extend obj1 to meet obj2
acextendotherentity Extend obj2 to meet obj1
acextendboth Extend both objects

The image below demonstrates the effect of the intersection mode parameter on the point returned by this function; in the following diagram, the object parameters supplied to the function are labelled and the point returned by the function is shown in red:

Intersection Modes
Select all
;; Intersections  -  Lee Mac
;; Returns a list of all points of intersection between two objects
;; for the given intersection mode.
;; ob1,ob2 - [vla] VLA-Objects
;;     mod - [int] acextendoption enum of intersectwith method

(defun LM:intersections ( ob1 ob2 mod / lst rtn )
    (if (and (vlax-method-applicable-p ob1 'intersectwith)
             (vlax-method-applicable-p ob2 'intersectwith)
             (setq lst (vlax-invoke ob1 'intersectwith ob2 mod))
        )
        (repeat (/ (length lst) 3)
            (setq rtn (cons (list (car lst) (cadr lst) (caddr lst)) rtn)
                  lst (cdddr lst)
            )
        )
    )
    (reverse rtn)
)

Test Program

The following example program will prompt the user to select two objects in the drawing and will then generate AutoCAD Points at every point of intersection (if any exist) between the two selected objects.

Select all
(defun c:inter ( / obj1 obj2 )    
    (if (and (setq obj1 (car (entsel "\nSelect 1st Object: ")))
             (setq obj2 (car (entsel "\nSelect 2nd Object: ")))
        )
        (foreach pnt (LM:intersections (vlax-ename->vla-object obj1) (vlax-ename->vla-object obj2) acextendnone)
            (entmake (list '(0 . "POINT") (cons 10 pnt)))
        )
    )
    (princ)
)
(vl-load-com) (princ)

Intersections in Set

Function Syntax (LM:intersectionsinset <sel>)
Current Version 1.0
Donate
Arguments
Symbol Type Description
sel Selection Set Selection Set of objects for which to return points of intersection
Returns
Type Description
List A list of all points of intersection between all objects in the Selection Set

Function Description

This function will return a list of all points of intersection between all objects in a given Selection Set.

When called with a valid Selection Set argument, this function will iterate over every object in the set and will call the above LM:Intersections function with mode parameter set to acextendnone for every object pair combination, returning all points of intersection between all possible pairs of objects in the set.

Intersections in Set
Select all
;; Intersections in Set  -  Lee Mac
;; Returns a list of all points of intersection between all objects in a supplied selection set.
;; sel - [sel] Selection Set

(defun LM:intersectionsinset ( sel / id1 id2 ob1 ob2 rtn )
    (repeat (setq id1 (sslength sel))
        (setq ob1 (vlax-ename->vla-object (ssname sel (setq id1 (1- id1)))))
        (repeat (setq id2 id1)
            (setq ob2 (vlax-ename->vla-object (ssname sel (setq id2 (1- id2))))
                  rtn (cons (LM:intersections ob1 ob2 acextendnone) rtn)
            )
        )
    )
    (apply 'append (reverse rtn))
)

Test Program

As demonstrated by the above animation, the following example program will prompt the user for a selection of objects and will then generate AutoCAD Points at every point of intersection between all objects in the selection.

Select all
(defun c:interset ( / sel )
    (if (setq sel (ssget))
        (foreach pnt (LM:intersectionsinset sel)
            (entmake (list '(0 . "POINT") (cons 10 pnt)))
        )
    )
    (princ)
)
(vl-load-com) (princ)

Intersections in Object List

Function Syntax (LM:intersectionsinobjlist <lst>)
Current Version 1.0
Donate
Arguments
Symbol Type Description
lst List List of VLA-Objects for which to return points of intersection
Returns
Type Description
List A list of all points of intersection between all objects in the list

Function Description

This function will return a list of all points of intersection between all objects in a list of VLA-Objects.

The function has identical behaviour to the above LM:IntersectionsInSet function, however, will accept a list of VLA-Objects as an argument in lieu of a Selection Set.

Select all
;; Intersections in Object List  -  Lee Mac
;; Returns a list of all points of intersection between all objects in a list of VLA-Objects.
;; lst - [lst] List of VLA-Objects

(defun LM:intersectionsinobjlist ( lst / ob1 rtn )
    (while (setq ob1 (car lst))
        (foreach ob2 (setq lst (cdr lst))
            (setq rtn (cons (LM:intersections ob1 ob2 acextendnone) rtn))
        )
    )
    (apply 'append (reverse rtn))
)

Intersections Between Sets

Function Syntax (LM:intersectionsbetweensets <ss1> <ss2>)
Current Version 1.0
Donate
Arguments
Symbol Type Description
ss1, ss2 Selection Set Selection Sets for which to return points of intersection
Returns
Type Description
List A list of all points of intersection between objects in each set

Function Description

This function will return a list of all points of intersection between objects in each supplied Selection Set.

Note that this functionality differs from that exhibited by the above LM:IntersectionsInSet function in that this function will test for intersections between objects from one set and objects from another, and will not return points of intersection between objects residing within the same set.

This behaviour is illustrated by the following demonstration in which intersection points between objects in each set (green / cyan) are displayed, however, points of intersection between objects of the same set are ignored.

Intersections Between Sets
Select all
;; Intersections Between Sets  -  Lee Mac
;; Returns a list of all points of intersection between objects in two selection sets.
;; ss1,ss2 - [sel] Selection sets

(defun LM:intersectionsbetweensets ( ss1 ss2 / id1 id2 ob1 ob2 rtn )
    (repeat (setq id1 (sslength ss1))
        (setq ob1 (vlax-ename->vla-object (ssname ss1 (setq id1 (1- id1)))))
        (repeat (setq id2 (sslength ss2))
            (setq ob2 (vlax-ename->vla-object (ssname ss2 (setq id2 (1- id2))))
                  rtn (cons (LM:intersections ob1 ob2 acextendnone) rtn)
            )
        )
    )
    (apply 'append (reverse rtn))
)

Test Program

As demonstrated by the above animation, the following example program will prompt the user to make two selections and will then generate AutoCAD Point at all points of intersection between the sets.

Select all
(defun c:intersets ( / ss1 ss2 )
    (if (and (setq ss1 (ssget))
             (setq ss2 (ssget))
        )
        (foreach pnt (LM:intersectionsbetweensets ss1 ss2)
            (entmake (list '(0 . "POINT") (cons 10 pnt)))
        )
    )
    (princ)
)
(vl-load-com) (princ)

Intersections Between Object Lists

Function Syntax (LM:intersectionsbetweenobjlists <ol1> <ol2>)
Current Version 1.0
Donate
Arguments
Symbol Type Description
ol1, ol2 List Lists of VLA-Objects for which to return points of intersection
Returns
Type Description
List A list of all points of intersection between objects in each list

Function Description

This function has identical behaviour to the above LM:IntersectionsBetweenSets function, however, will accept two lists of VLA-Objects as arguments in place of Selection Sets.

Select all
;; Intersections Between Object Lists  -  Lee Mac
;; Returns a list of all points of intersection between objects in two lists of VLA-Objects.
;; ol1,ol2 - [lst] Lists of VLA-Objects

(defun LM:intersectionsbetweenobjlists ( ol1 ol2 / rtn )
    (foreach ob1 ol1
        (foreach ob2 ol2
            (setq rtn (cons (LM:intersections ob1 ob2 acextendnone) rtn))
        )
    )
    (apply 'append (reverse rtn))
)

textsize

increase · reset · decrease

Designed & Created by Lee Mac © 2010