TheSwamp
Code Red => AutoLISP (Vanilla / Visual) => XDRX-API => Topic started by: xdcad on April 08, 2024, 07:58:41 AM
-
1.
https://www.cadtutor.net/forum/topic/81777-lisp-that-automatically-rotates-my-block-perpendicular-to-a-polyline/#comment-632842
2.
https://www.cadtutor.net/forum/topic/70547-place-blocks-along-polyline-with-distances-from-a-list/#comment-566214
(defun c:xdtb_blkalnatdist (/ 9pt2 9pt3 9pt4 9pt5 9pt6 9pt8 9pt9 box dist dpt1 dpt2 e ecs ept height pts spt spt1 spt2 ss
ss1 v vec x xdir xdir1 ydir
)
(defun _align (e ss)
(mapcar
'(lambda (x)
(setq ecs (xdrx-getpropertyvalue x "ecs"))
(setq box (xdrx-entity-box x (cadr ecs))
9pt2 (xd::geom:get9pt box 2)
9pt8 (xd::geom:get9pt box 8)
9pt4 (xd::geom:get9pt box 4)
9pt6 (xd::geom:get9pt box 6)
9pt5 (xd::geom:get9pt box 5)
9pt3 (xd::geom:get9pt box 3)
9pt9 (xd::geom:get9pt box 9)
spt (xdrx-getpropertyvalue e "closestpointto" 9pt5)
xdir (xdrx-getpropertyvalue e "firstderiv" spt)
vec (xdrx-vector-normalize (mapcar
'-
9pt5
spt
)
)
ydir (xdrx-vector-perpvector xdir)
ydir (if (xdrx-vector-iscodirectional ydir vec)
ydir
(xdrx-vector-negate ydir)
)
ept (mapcar
'+
spt
(xdrx-vector-product ydir #xd-var-global-dist)
)
)
(if (= #mode "V")
(progn
(setq spt1 (xdrx-points-nearpt spt 9pt4 9pt6)
xdir1 (xdrx-vector-normalize (mapcar
'-
9pt9
9pt6
)
)
)
)
(progn
(setq spt1 (xdrx-points-nearpt spt 9pt2 9pt8)
xdir1 (xdrx-vector-normalize (mapcar
'-
9pt3
9pt2
)
)
)
)
)
(setq xdir1 (if (xdrx-vector-iscodirectional xdir1 xdir (/ pi 2.0))
xdir1
(xdrx-vector-negate xdir1)
)
)
(setq spt2 (mapcar
'+
spt1
xdir1
)
)
(setq dpt1 ept
dpt2 (mapcar
'+
dpt1
xdir
)
)
(xdrx-entity-align x spt1 spt2 dpt1 dpt2)
(setq box (xdrx-entity-box x (cadr (xdrx-getpropertyvalue x "ecs")))
dist (xdrx-getpropertyvalue box "distanceto" e)
)
(if (> (/ (abs (- dist #xd-var-global-dist)) #xd-var-global-dist) 0.05)
(progn
(xdrx-entity-align x dpt1 dpt2 dpt1 (xdrx-vector-negate (xdrx-vector-normalize (mapcar
'-
dpt2
dpt1
)
)
)
)
)
)
)
(xdrx-ss->ents ss)
)
)
(xd::doc:getdouble (xdrx-string-multilanguage "\n模糊搜索范围:" "\nFuzzy search range:")
"#xd-var-global-fuzz-range" (setq height (xd::doc:getpickboxheight))
)
(xd::doc:getdouble (xdrx-string-multilanguage "\n图块距多段线距离:"
"\nDistance between block and polyline:"
) "#xd-var-global-dist" (setq height (xd::doc:getpickboxheight))
)
(if (not (and
#mode
(= (type #mode) 'str)
)
)
(setq #mode "H")
)
(if (and
(xdrx-initget 0 "H V")
(setq v (getint (xdrx-string-formatex (xdrx-string-multilanguage "\n对齐方式[水平(H)/垂直(V)]<%s>:" "\nAlignment [Horizontal (H)/Vertical (V)]<%s>:")
#mode
)
)
)
)
(setq #mode v)
)
(if (setq ss (xdrx-ssget (xdrx-string-multilanguage "\n选择曲线对象<退出>:" "\nSelect Curve Objects<Exit>:")
'((0 . "*polyline"))
)
)
(progn
(mapcar
'(lambda (x)
(setq pts (xdrx-getpropertyvalue x "tobox" #xd-var-global-fuzz-range)
pts (xdrx-getsamplept pts height)
)
(if (setq ss1 (ssget "cp" pts '((0 . "insert"))))
(progn
(_align x ss1)
)
)
)
(xdrx-ss->ents ss)
)
)
)
(princ)
)