Author Topic: [XDrX-PlugIn(132)] Place blocks along a polyline and specify a distance  (Read 132 times)

0 Members and 1 Guest are viewing this topic.

xdcad

  • Swamp Rat
  • Posts: 504
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

Code: [Select]
(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)
)
The code I wrote uses XDRX-API,which can be downloaded from github.com and is updated at any time.
===================================
https://github.com/xdcad
https://sourceforge.net/projects/xdrx-api-zip/
http://bbs.xdcad.net