李的代码要简洁得多,但我想到的是(另一个ActiveX示例-LoL):
- (defun c:FOO ( / *error* oldNomutt ss elev acDoc startElev endElev lp hp flag len space)
- (vl-load-com)
- (defun *error* (msg)
- (and oldNomutt (setvar 'nomutt oldNomutt))
- (vla-endundomark acDoc)
- (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))
- (prompt "\nSelect 3D polylines to mark elevation: ")
- (and (setq oldNomutt (getvar 'nomutt)) (setvar 'nomutt 1))
- (if (and (setq ss (ssget "_:L" '((0 . "POLYLINE"))))
- (setvar 'nomutt oldNomutt)
- (setq elev (getreal "\nEnter elevation: ")))
- (progn
- (vla-startundomark
- (setq acDoc (vla-get-activedocument (vlax-get-acad-object))))
- (vlax-for x (setq ss (vla-get-activeselectionset acDoc))
- (setq startElev (last (vlax-curve-getstartpoint x)))
- (setq endElev (last (vlax-curve-getendpoint x)))
- (cond ((< startElev endElev)
- (setq lp startElev)
- (setq hp endElev)
- (setq flag T))
- ((> startElev endElev)
- (setq lp endElev)
- (setq hp startElev))
- ((= startElev endElev)
- (prompt "\n** Flat polylines not accepted ** ")
- (redraw (vlax-vla-object->ename x) 3)
- (quit)))
- (setq len (vla-get-length x))
- (vla-put-color
- (vla-addpoint
- (cond (space)
- ((setq space (vla-get-modelspace acDoc))))
- (vlax-3d-point
- (cond (flag
- (vlax-curve-getpointatdist
- x
- (/ (- elev lp)
- (/ (abs (- hp lp)) len))))
- ((vlax-curve-getpointatdist
- x
- (- len
- (/ (- elev lp)
- (/ (abs (- hp lp)) len))))))))
- acred))
- (vla-endundomark acDoc)
- (vla-delete ss))
- (cond (ss (prompt "\n** Invalid input: No elevation ** "))
- ((prompt "\n** No 3D polylines selected ** "))))
- (princ))
|