大家好!
我最近在这里创建了这个例程,希望与大家分享!
到目前为止,我有它与ACAD点工作,并有一个单独的副本与Civil 3D点工作。
-
- ;Created by B. Hippe
- ;October 2011
- ;Select points you wish to snap to.
- ;Click button to start.
- ;Hover mouse over the selected points in the order you wish to have them drawn.
- [color="red"](vl-load-com)[/color]
- (defun c:AutoPL ()
- (setq *ModSpc (vlax-get-property (setq *ActDoc (vlax-get-property (setq *acad (vlax-get-acad-object)) 'ActiveDocument)) 'ModelSpace))
- (princ "\nSelect Point Objects:")
- (setq ss (ssget '(( 0 . "POINT"))))
- (setq sslen (sslength ss))
- (setq drawn nil)
- (setq junk (getpoint "\nClick to Start:"))
- (setq done nil)
- (while
- (and (= 5 (car (setq pnt (grread T 1 0)))) (= done nil))
- (setq ep (is_nearest ss (nth 1 pnt)))
- (cond
- ((= drawn nil)(progn
- (setq drawn (list (car ep)))
- (drx (vlax-safearray->list (vlax-variant-value (vlax-get-Property (vlax-ename->vla-object (car ep)) 'Coordinates))))))
- ((= (length drawn) 1)(if (not (is_drawn (car ep)))
- (progn
- (setq drawn (cons (car ep) drawn))
- (drx (vlax-safearray->list (vlax-variant-value (vlax-get-Property (vlax-ename->vla-object (car ep)) 'Coordinates)))))))
- ((>= (length drawn) 2)(if (not (is_drawn (car ep)))
- (progn
- (setq drawn (cons (car ep) drawn))
- (drx (vlax-safearray->list (vlax-variant-value (vlax-get-Property (vlax-ename->vla-object (car ep)) 'Coordinates)))))))
- )
- (if (= sslen (length drawn))
- (setq done T))
- )
- (setq pl-obj (vlax-invoke-method *ModSpc 'Addpolyline (pl->var (drawn->pntlist))))
- (princ)
- )
- ;Returns a list (entity . distance) of the closest entity (point) to the givin point
- ;Closest being the 2D distance
- (defun is_nearest (ss opnt)
- (setq ss-len (sslength ss))
- (setq li '(0))
- (setq n 0)
- (repeat ss-len
- (setq ent (ssname ss n))
- (setq pnt (vlax-safearray->list (vlax-variant-value (vlax-get-property (vlax-ename->vla-object ent) 'Coordinates))))
- (setq dist (distance (list (nth 0 opnt)(nth 1 opnt))(list (nth 0 pnt)(nth 1 pnt))))
- (setq pair (cons ent dist))
- (setq li (cons pair li))
- (setq n (1+ n))
- )
- (setq li (cdr (reverse li)))
- (setq li (vl-sort li (function (lambda (x y) (< (cdr x)(cdr y))))))
- (setq near-pair (nth 0 li))
- )
- ;graphically draws an X at a givin point
- (defun drx (ctr)
- (setq vs (getvar "viewsize"))
- (setq xs (/ vs 20))
- (setq xs2 (/ xs 2))
- (setq cor1 (polar ctr (* pi 0.25) xs2))
- (setq cor2 (polar ctr (* pi 0.75) xs2))
- (setq cor3 (polar ctr (* pi 1.25) xs2))
- (setq cor4 (polar ctr (* pi 1.75) xs2))
- (grdraw ctr cor1 2 0)
- (grdraw ctr cor2 2 0)
- (grdraw ctr cor3 2 0)
- (grdraw ctr cor4 2 0)
- )
- ;Determines if a givin entity is a member of the "drawn" list
- (defun is_drawn (ent)
- (/= nil (member ent drawn)))
- ;create a list of coordinates for each entity in the list "drawn"
- (defun drawn->pntlist ()
- (setq plist (mapcar '(lambda (ent) (vlax-safearray->list (vlax-variant-value (vlax-get-Property (vlax-ename->vla-object ent) 'Coordinates)))) drawn))
- (setq li '("x"))
- (setq n 0)
- (repeat (length plist)
- (setq p (nth n plist))
- (setq li (cons (nth 2 p) li))
- (setq li (cons (nth 1 p) li))
- (setq li (cons (nth 0 p) li))
- (setq n (1+ n))
- )
- (setq li (reverse (cdr (reverse li))))
- )
- ;Givin a point list returns the list in variant form
- (defun PL->VAR ( pl / pl ub sa var)
- (setq ub (- (length [color=red]pl[/color]) 1))
- (setq sa (vlax-make-safearray vlax-vbdouble (cons 0 ub)))
- (setq var (vlax-make-variant (setq sa (vlax-safearray-fill sa pl))))
- )
*请注意,我没有包括任何错误捕捉。我认为这个例程可以改进,添加功能、错误捕捉等等。对想法、评论和批评持开放态度。(如果有人想创建这个命令的一个很酷的动画,那也太酷了!)
当做
Hippe013 |