Still only works for perpendicular to a line for now, but now the Elevation is where the lines meet. Tested with the line and poly commands. Had to use cal to calculate the intersection of a line & a plane. Can that be done with lisp?
Code:
; (load "PerpEnt.lsp") (PerpEnt) ;
; ^P(or PerpEnt (load "PerpEnt.lsp"));(PerpEnt)
(defun PerpEnt (/ *error* pt ent el pt1 pt2 pt3 pt4 pt5 pt6 el0 ent2 el2 cmd)
;(defun PerpEnt (/ *error* pt ent el el0 el2)
(load "flattensup.lsp")
(or cal (arxload "geomcal"))
(defun *error* (msg)
(entmod el)
(cond ((not msg)) ; Normal exit
((member msg '("Function cancelled" "quit / exit abort"))) ; <esc> or (quit)
((princ (strcat "\n** Error: " msg " ** "))) ; Fatal error, display it
)
(princ)
)
(setq ent (entsel)
pt (cadr ent)
ent (car ent)
el (entget ent)
pt1 (assoc 10 el)
pt3 (cdr (reverse pt1))
pt3 (append (list(getvar 'ELEVATION)) pt3)
pt3 (reverse pt3)
pt2 (assoc 11 el)
pt4 (cdr (reverse pt2))
pt4 (append (list(getvar 'ELEVATION)) pt4)
pt4 (reverse pt4)
pt1 (cdr pt1)
pt2 (cdr pt2)
el0 (subst pt3 (assoc 10 el) el)
el0 (subst pt4 (assoc 11 el0) el0)
pt3 (cdr pt3)
pt4 (cdr pt4)
)
(entmod el0)
(vl-cmdf "PER" pt)
(setq ent2 (entlast)
el2 (entget ent2)
)
(entmod el)
(if (= "LINE" (cdr(assoc 0 el2)))
(progn
(setq pt3 (cdr(assoc 10 el2))
pt4 (cdr(assoc 11 el2))
pt5 (reverse(append (list 1111.1)(cdr(reverse pt4))))
cmd (getvar 'cmdnames)
)
(setq pt6 (c:cal "ilp(pt1,pt2,pt3,pt4,pt5)")
pt6 (append (list 11) pt6)
el2 (subst pt6 (assoc 11 el2) el2)
)
(entmod el2)
(command cmd)
)
)
(while (= 1 (logand 1 (getvar 'cmdactive))) ; PAUSE while command is active
(vl-cmdf PAUSE)
);while
(princ)
)