info:
http://www.bricsys.com/common/support/forumthread.jsp?id=18314
- (defun c:perpl (/ from_object from_point first_derivative line_angle loop perp_line grread_result end_point str)
- (setvar "CMDECHO" 0)
- (setq old_osmode (getvar "osmode"))
- (if (and (setq from_object (entsel "\nSelect curve at point to start the perpendicular line."))
- ; select
- (setvar "osmode" 0)
- (setq from_point (cadr from_object)) ; get the point part
- (setq from_object (car from_object)) ; get the entity part
- (setq from_point (vlax-curve-getclosestpointto from_object from_point))
- ; adjust point to be on the entity
- (not (vl-catch-all-error-p
- (setq first_derivative (vl-catch-all-apply
- 'vlax-curve-getFirstDeriv
- (list from_object (vlax-curve-getParamAtPoint from_object from_point))
- )
- )
- )
- ) ; get the first derivative
- )
- (progn
- (entmake (list '(0 . "LINE") (cons 10 from_point) (cons 11 from_point)))
- ; create initial line
- (setq perp_line (entlast) ; store the initial line
- line_angle (angle '(0 0 0) first_derivative) ; get the slope
- loop T ; loop
- )
- ; (princ "\nSpecify line length: ")
- (while (and (setq grread_result (grread T 12 0)) ; control cursor, no error on ESC, normal crosshairs
- (/= (car grread_result) 3) ; 3 = point selected
- loop ; loop is active
- )
- (cond
- ((= (car grread_result) 5) ; mouse action
- (setq end_point (polar from_point
- (if (minusp (sin (- (angle from_point (cadr grread_result)) line_angle)))
- (- line_angle (/ pi 2))
- (+ line_angle (/ pi 2))
- )
- (distance from_point (cadr grread_result))
- )
- ) ; calculate end point
- (entmod (subst (cons 11 (trans end_point 1 0)) (assoc 11 (entget perp_line)) (entget perp_line)))
- ; modify the line
- )
- )
- )
- )
- )
- (setvar "osmode" old_osmode)
- (princ)
- )
|