明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 283|回复: 1

生成二维多段线?

[复制链接]
发表于 2023-6-26 21:30 | 显示全部楼层 |阅读模式
  1. (defun vxs (e / i v lst ppp)
  2.   (setq i 0)
  3.   (while
  4.     (setq v (vlax-curve-getpointatparam e (setq i (1+ i))))
  5.      (setq lst (cons v lst))
  6.   )
  7.   (setq ppp (reverse lst) )
  8. (append (list(vlax-curve-getpointatparam e 0)) ppp )
  9.   
  10.   )
  11. (vl-load-com)
  12. ;(vla-AddPolyline (vxs(car(entsel))))   (vla-addlightweightpolyline (vxs(car(entsel))))
  13. (setq plst nil)
  14. (setq plst (vxs(car(entsel))) )

  15. (setq plst1 (apply 'append
  16.                    (append plst (list (car plst)))
  17.             ) )
  18. (setq points
  19.        (vlax-make-safearray
  20.          vlax-vbdouble
  21.          (cons 0 (- (length plst1) 1))
  22.        )
  23. )
  24. (vlax-safearray-fill points plst1)


  25. (setq ms
  26.        (vla-get-ModelSpace
  27.          (vla-get-ActiveDocument
  28.            (vlax-get-acad-object)
  29.          )
  30.        )
  31. )

  32. (vla-AddPolyline   ms    points   )


 楼主| 发表于 2023-6-27 20:26 | 显示全部楼层
  1. ;求解二点距离子函数
  2. (defun mdist(pt0 pt1 / opt tpt)
  3. (setq x0 (nth 0 pt0) y0 (nth 1 pt0))
  4. (setq x1 (nth 0 pt1) y1 (nth 1 pt1))
  5. (setq dx (- x0 x1) dy (- y0 y1))
  6. (setq xddist (sqrt (+ (* dx dx) (* dy dy))))
  7. )
  8. ;-----------------------------

  9. (defun c:pladp( / addAn arcAn arcEP arcR arcSP cenPT code70 endpt
  10.                   fwjCE fwjCM fwjCS fwjSE i ii j jiaJ layli laynam
  11.                   midpt midptl npldat pldat repnum res sn ssp ssp1
  12.                   sspt startp startpt strin syscmd tmpels totalp entlt entth entco)
  13. (command "undo" "BE")
  14. (setq syscmd (getvar "cmdecho"))
  15. (setvar "cmdecho" 0)
  16. (prompt "\n多义线孤线段加点:")
  17. (setq sn (getreal "\n输入近似多段线的单位长度<1.0>: "))
  18. (if (= sn nil) (setq sn 1.0))
  19. (initget "1 2")
  20. (setq res (getkword "\n    请选择转换方式:1 按图层/2 人为选择(缺省为2):"))
  21. (if (= res nil) (setq res "2"))
  22.   (cond ((= res "1")
  23.        (setq laynam (getstring "\n    图层名:"))
  24.        (setq layli (cons 8 laynam))
  25.        (setq ssp (ssget "X" (list (cons 8 laynam) (cons  0  "POLYLINE"))))
  26.        (setq ssp1 (ssget "X" (list (cons 8 laynam) (cons  0  "LWPOLYLINE"))))
  27.        (setq i 0)
  28.        (repeat (sslength ssp1) (ssadd (ssname  ssp1 i) ssp) (setq i (1+ i))))
  29.       ((= res "2")
  30.        (prompt "\n    请选择需转换的实体(可窗选,自动过滤出多义线实体):")                                    
  31.        (setq ssp (ssget '((-4 . "<OR") (0 . "LWPOLYLINE") (0 . "POLYLINE") (-4 . "OR>"))))
  32.       )                                             
  33.   );cond
  34. (princ "\n        ...正在转换...")
  35. (command "layer" "m" "df-point" "")
  36. (command "ERASE" (ssget "x" '((8 . "df-point") (0 . "POINT"))))
  37. (while ssp
  38.       (setq i 0 )
  39.       (repeat (sslength ssp)
  40.          (setq  npldat nil chanyn nil j 0)
  41.          (setq pldat (entget (ssname ssp i) '("*")))
  42.          (print (cdr (assoc 5 pldat)))
  43.          (setq code70 (cdr (assoc 70 pldat)))
  44.          (while (and (< j (length pldat))  (= (cdr (assoc 0 pldat)) "LWPOLYLINE"))
  45.               (if (= (car (nth j pldat)) 42) (/= (cdr (nth j pldat)) 0.0) (progn (setq chanyn T) (setq j (length pldat)))  )
  46.           )
  47.          (cond ( (and (= (cdr (assoc 0 pldat)) "LWPOLYLINE")  chanyn)
  48.                 (setq startpt (assoc 10 pldat))
  49.                 (setq endpt (assoc 10 (reverse pldat)))
  50.                 (setq npldat nil)
  51.                 (setq j 0 totalp 0)
  52.                 (while (< j (length pldat))
  53.                  (if (and (= (car (nth j pldat)) 10)  (= (car (nth (+ j 3) pldat)) 42) (/= (cdr (nth (+ j 3) pldat)) 0.0) )
  54.                    (progn
  55.                     (setq midptl (list (nth j pldat) '(40 . 0.0) '(41 . 0.0) '(42 . 0.0)))
  56.                     (setq totalp (1+ totalp))
  57.                     (setq npldat (append npldat midptl))
  58.                     (setq arcSP (cdr (nth j pldat)))
  59.                     (setq arcEP (cdr (nth (+ j 4) pldat)))                        
  60.                     (if  (and (> (abs (- (/ code70 2.0) (fix (/ code70 2.0)))) 0.49) (= (car (nth (+ j 4) pldat)) 210))
  61.                         (setq arcEP (cdr (assoc 10 pldat)))  );if
  62.                     (setq arcAn (* (atan (cdr (nth (+ j 3) pldat))) 2))
  63.                     (setq strin (/ (mdist arcSP arcEP) 2))
  64.                     (setq arcR (/ strin (sin arcAn)))
  65.                     (setq fwjSE (angle arcSP arcEP))
  66.                     (setq cenPT (polar arcSP (+ fwjSE (- (/ pi 2.0) arcAn)) arcR))
  67.                     (setq fwjCS (angle cenPT arcSP))
  68.                     (setq fwjCE (angle cenPT arcEP))
  69.                     (setq jiaJ (abs (- fwjCE fwjCS)))
  70.                     (if (and (> fwjCE fwjCS) (< (cdr (nth (+ j 3) pldat)) 0)) (setq jiaj (- (* pi 2.0) jiaj)))
  71.                     (if (and (< fwjCE fwjCS) (> (cdr (nth (+ j 3) pldat)) 0)) (setq jiaj (- (* pi 2.0) jiaj)))
  72.                     (setq addAn  (/ sn arcR))
  73.                     (setq fwjCM (+ fwjCS addAn))
  74.                     (setq repnum (fix (abs (/ jiaj addAn))))                    
  75.                     (if  (and (< (abs (- (/ code70 2.0) (fix (/ code70 2.0)))) 0.001) (= (car (nth (+ j 4) pldat)) 210))
  76.                          (progn
  77.                             (setq repnum 0)
  78.                             (setq npldat (append npldat (list (nth j pldat))))
  79.                             (setq totalp (1+ totalp))
  80.                           )
  81.                          (repeat repnum
  82.                            (setq midpt (polar cenPT fwjCM (abs arcR)))
  83.                            (setq midptl (list (cons '10 midpt) '(40 . 0.0) '(41 . 0.0) '(42 . 0.0)))
  84.                            (setq totalp (1+ totalp))
  85.                            (setq npldat (append npldat midptl))
  86.                            (setq fwjCM (+ fwjCM addAn)));r
  87.                      );if
  88.                      (setq j (+ 3 j))
  89.                    );pr
  90.                  (progn (setq npldat (append npldat (list (nth j pldat))))
  91.                  (if (= (car (nth j pldat)) 10) (setq totalp (1+ totalp))    ))
  92.                  );if
  93.                  (setq j (1+ j))
  94.                 );wh
  95.                 (setq npldat (subst  (cons 90 totalp) (assoc 90 npldat) npldat))
  96.                 (entmod npldat)
  97.                );cond-1
  98.          ((= (cdr (assoc 0 pldat)) "POLYLINE")
  99.            (if (or (= code70 2) (= code70 3) (= code70 4) (= code70 5)
  100.                    (= code70 130) (= code70 131) (= code70 132) (= code70 133))
  101.                    (progn      
  102.            (getplp (ssname ssp i))
  103.            ;(command "pedit" (ssname ssp i) "D" "")
  104.            ;(setq tmpels (entget (ssname ssp i)))
  105.            ;(setq startp (assoc 10 tmpels))
  106.            ;(setq endpt (assoc 10 (reverse tmpels)))
  107.            (setq startp (cons 10 (car plpt)))
  108.            (setq endpt (cons 10 (last plpt)))
  109.            (command "layer" "s" "df-point" "")
  110.            (if (> (mdist (car plpt) (last plpt)) (* sn 2.0)) (command "measure" (ssname ssp i) sn) (command "measure" (ssname ssp i) (/ (mdist (car plpt) (last plpt)) 3.0)))           
  111.            (setq sspt nil)
  112.            (setq sspt (ssget "x" '((8 . "df-point") (0 . "POINT"))))
  113.                    (if (= (setq entlt (cdr (assoc 6 pldat))) nil) (setq entlt "bylayer") )
  114.                    (if (= (setq entth (cdr (assoc 39 pldat))) nil) (setq entth 0) )
  115.                    (if (= (setq entco (cdr (assoc 62 pldat))) nil) (setq entco "bylayer") )
  116.                    (command "clayer" (cdr (assoc 8 pldat)) "color" entco "celtype" entlt "thickness" entth)
  117.                  (entmake pldat)
  118.                  (setq ii (1- (sslength sspt)))
  119.                  (if (< (abs (- (/ code70 2.0) (fix (/ code70 2.0)) ))  0.01) (entmake (list '(0 . "VERTEX") startp)))
  120.                  (repeat (sslength sspt)
  121.                          (setq tmpels (assoc 10 (entget (ssname sspt ii))))
  122.                          (entmake (list '(0 . "VERTEX") tmpels))   
  123.                          (setq ii (1- ii))    );r
  124.                   (if (< (abs (- (/ code70 2.0) (fix (/ code70 2.0))))  0.01) (entmake (list '(0 . "VERTEX") endpt)))
  125.                   (entmake (list '(0 . "SEQEND")))
  126.                   (command "_.erase" sspt "")
  127.                   (entdel  (ssname ssp i))
  128.                   (command "pedit" (entlast) "d" "")
  129.          ));pr;if                  
  130.          );cond-2  
  131.          );cond
  132.       (setq i (1+ i))
  133.       );r
  134. (setq ssp nil)
  135. );wh
  136. ;(command "undo" "E")
  137. (setvar "cmdecho" syscmd)
  138. (princ)
  139. )


您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-29 00:21 , Processed in 0.393920 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表