找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 941|回复: 6

[每日一码] 操作多段线某一段的工具(复制、亮显、偏移...)

[复制链接]

已领礼包: 20个

财富等级: 恭喜发财

发表于 2021-1-27 16:08:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 marting 于 2021-1-27 16:09 编辑

1. 偏移某段

  1. (defun c:ofsegs        (/          ofdist   ent            pline    normal   elevat
  2.                  params          points   side            closest  par      bulge
  3.                  p1          p2           arc_data
  4.                 )
  5.   (vl-load-com)
  6.   (or *acdoc*
  7.       (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object)))
  8.   )
  9.   (initget 6 "Par")
  10.   (if (setq
  11.         ofdist
  12.          (getdist
  13.            (strcat "\nSpécifiez la distance de décalage ou [Par] <"
  14.                    (if (< (getvar "OFFSETDIST") 0)
  15.                      "par"
  16.                      (rtos (getvar "OFFSETDIST"))
  17.                    )
  18.                    ">: "
  19.            )
  20.          )
  21.       )
  22.     (if        (= ofdist "Par")
  23.       (setvar "OFFSETDIST" -1)
  24.       (setvar "OFFSETDIST" ofdist)
  25.     )
  26.     (setq ofdist (getvar "OFFSETDIST"))
  27.   )
  28.   (if (and (setq ent (entsel "\nSélectionnez un segment à décaler: "))
  29.            (setq pline (vlax-ename->vla-object (car ent)))
  30.            (= (vla-get-ObjectName pline) "AcDbPolyline")
  31.            (setq normal (vlax-get pline 'Normal))
  32.            (setq elevat (vla-get-Elevation pline))
  33.       )
  34.     (progn
  35.       (setq params (cons (fix (vlax-curve-getParamAtPoint
  36.                                 pline
  37.                                 (trans (osnap (cadr ent) "_nea") 1 0)
  38.                               )
  39.                          )
  40.                          params
  41.                    )
  42.       )
  43.       (HighlightSegment pline (car params))
  44.       (while
  45.         (setq ent
  46.                (entsel "\nSélectionnez le segment suivant ou <Quitter>: "
  47.                )
  48.         )
  49.          (if (equal (vlax-ename->vla-object (car ent)) pline)
  50.            (progn
  51.              (setq par          (fix (vlax-curve-getParamAtPoint
  52.                                  pline
  53.                                  (trans (osnap (cadr ent) "_nea") 1 0)
  54.                                )
  55.                           )
  56.                    params (if (member par params)
  57.                             (vl-remove par params)
  58.                             (cons par params)
  59.                           )
  60.              )
  61.              (redraw)
  62.              (foreach p params (HighlightSegment pline p))
  63.            )
  64.          )
  65.       )
  66.       (if (setq
  67.             side (GetPointAboutPlane
  68.                    normal
  69.                    (trans (list 0 0 elevat) normal 0)
  70.                    (if (minusp (getvar "OFFSETDIST"))
  71.                      "\nSpécifiez une valeur pour \"Par le point\": "
  72.                      "\nSpécifiez un point sur le c?té à décaler: "
  73.                    )
  74.                  )
  75.           )
  76.         (progn
  77.           (redraw)
  78.           (vla-StartUndoMark *acdoc*)
  79.           (setq        closest        (vlax-curve-getClosestPointTo pline side T)
  80.                 par        (vlax-curve-getParamAtPoint pline closest)
  81.           )
  82.           (if (minusp (getvar "OFFSETDIST"))
  83.             (setq ofdist (distance side closest))
  84.           )
  85.           (cond
  86.             ((equal closest (vlax-curve-getStartPoint pline) 1e-9)
  87.              (setq side (trans side 0 normal))
  88.             )
  89.             ((equal closest (vlax-curve-getEndPoint pline) 1e-9)
  90.              (setq par        (- par 1)
  91.                    side        (trans side 0 normal)
  92.              )
  93.             )
  94.             ((= (fix par) par)
  95.              (setq side
  96.                     (polar
  97.                       (trans closest 0 normal)
  98.                       ((if
  99.                          (clockwise-p
  100.                            (trans
  101.                              (vlax-curve-getPointAtParam pline (- par 0.1))
  102.                              0
  103.                              normal
  104.                            )
  105.                            (trans closest 0 normal)
  106.                            (trans
  107.                              (vlax-curve-getPointAtParam pline (+ par 0.1))
  108.                              0
  109.                              normal
  110.                            )
  111.                          )
  112.                           +
  113.                           -
  114.                        )
  115.                         (angle '(0 0 0)
  116.                                (trans (vlax-curve-getFirstDeriv pline par)
  117.                                       0
  118.                                       normal
  119.                                       T
  120.                                )
  121.                         )
  122.                         (/ pi 2)
  123.                       )
  124.                       ofdist
  125.                     )
  126.              )
  127.             )
  128.             (T
  129.              (setq par        (fix par)
  130.                    side        (trans side 0 normal)
  131.              )
  132.             )
  133.           )
  134.           (setq        bulge (vla-getBulge pline (fix par))
  135.                 p1    (trans (vlax-curve-getPointAtParam pline (fix par))
  136.                              0
  137.                              normal
  138.                       )
  139.                 p2    (trans (vlax-curve-getPointAtParam pline (1+ (fix par)))
  140.                              0
  141.                              normal
  142.                       )
  143.           )
  144.           (if (zerop bulge)
  145.             (if        (clockwise-p side p2 p1)
  146.               (setq ofdist (- ofdist))
  147.             )
  148.             (progn
  149.               (setq arc_data (PolyArc-data bulge p1 p2))
  150.               (if (minusp bulge)
  151.                 (if (< (cadr arc_data)
  152.                        (distance (car arc_data) side)
  153.                     )
  154.                   (setq ofdist (- ofdist))
  155.                 )
  156.                 (if (< (distance (car arc_data) side)
  157.                        (cadr arc_data)
  158.                     )
  159.                   (setq ofdist (- ofdist))
  160.                 )
  161.               )
  162.             )
  163.           )
  164.           (mapcar
  165.             (function
  166.               (lambda (p)
  167.                 (vl-catch-all-apply 'vla-Offset (list p ofdist))
  168.                 (vla-delete p)
  169.               )
  170.             )
  171.             (Copysegments pline params)
  172.           )
  173.           (vla-EndUndoMark *acdoc*)
  174.         )
  175.       )
  176.     )
  177.     (princ "\nEntité non valide.")
  178.   )
  179.   (princ)
  180. )


2. 复制多段线的某段

  1. ;;================================================================;;

  2. ;; COPSEGS (gile) 26/03/08
  3. ;; Copie les segments de polyligne sélectionnés.

  4. (defun c:copsegs (/ ent pl par lst)
  5.   (vl-load-com)
  6.   (if (and (setq ent (entsel "\nSélectionnez un segment à copier: "))
  7.            (setq pl (vlax-ename->vla-object (car ent)))
  8.            (= (vla-get-ObjectName pl) "AcDbPolyline")
  9.       )
  10.     (progn
  11.       (setq par        (fix (vlax-curve-getParamAtPoint
  12.                        pl
  13.                        (trans (osnap (cadr ent) "_nea") 1 0)
  14.                      )
  15.                 )
  16.             lst        (cons par lst)
  17.       )
  18.       (HighlightSegment pl par)
  19.       (while
  20.         (setq ent
  21.                (entsel "\nSélectionnez le segment suivant ou <Quitter>: "
  22.                )
  23.         )
  24.          (if (equal (vlax-ename->vla-object (car ent)) pl)
  25.            (progn
  26.              (setq par (fix (vlax-curve-getParamAtPoint
  27.                               pl
  28.                               (trans (osnap (cadr ent) "_nea") 1 0)
  29.                             )
  30.                        )
  31.                    lst (if (member par lst)
  32.                          (vl-remove par lst)
  33.                          (cons par lst)
  34.                        )
  35.              )
  36.              (redraw)
  37.              (foreach p lst (HighlightSegment pl p))
  38.            )
  39.          )
  40.       )
  41.       (setq lst (vl-sort lst '<))
  42.       (if (setq from (getpoint "\nSpécifiez le point de base: "))
  43.         (while (and
  44.                  (setq to (vl-catch-all-apply
  45.                             'getpoint
  46.                             (list from "\nSpécifiez le deuxième point: ")
  47.                           )
  48.                  )
  49.                  (listp to)
  50.                )
  51.           (mapcar (function (lambda (p)
  52.                               (vla-move        p
  53.                                         (vlax-3d-point (trans from 1 0))
  54.                                         (vlax-3d-point (trans to 1 0))
  55.                               )
  56.                             )
  57.                   )
  58.                   (CopySegments pl lst)
  59.           )
  60.         )
  61.       )
  62.       (redraw)
  63.     )
  64.     (princ "\nEntité non valide.")
  65.   )
  66.   (princ)
  67. )


拷贝某段函数:

  1. ;;================================================================;;


  2. ;; CopySegments
  3. ;; Copie des segments de polyligne
  4. ;; Les segments sont copiés à la même place et conservent leurs propriétés
  5. ;; Les segments jointifs sont unis en une polyligne unique
  6. ;;
  7. ;; Arguments
  8. ;; pline : la polyligne source (vla-object)
  9. ;; params ; la liste des indices des segment à copier
  10. ;;
  11. ;; Retour
  12. ;; la liste des polylignes créées

  13. (defun CopySegments (pline params / nor space tmp copy ret)
  14.   (vl-load-com)
  15.   (or *acdoc*
  16.       (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object)))
  17.   )
  18.   (setq        params (vl-sort params '<)
  19.         nor    (vlax-get pline 'Normal)
  20.         space  (vla-ObjectIDToObject *acdoc* (vla-get-OwnerID pline))
  21.   )
  22.   (while params
  23.     (setq tmp         (cons (car params) tmp)
  24.           params (cdr params)
  25.     )
  26.     (if        (and (zerop (car tmp))
  27.              (= (- (vlax-curve-getEndParam pline) 1) (last params))
  28.              (equal (vlax-curve-getStartPoint pline)
  29.                     (vlax-curve-getEndPoint pline)
  30.                     1e-9
  31.              )
  32.         )
  33.       (progn
  34.         (setq params (reverse params)
  35.               tmp    (cons (car params) tmp)
  36.               params (cdr params)
  37.         )
  38.         (while (= (car params) (1- (car tmp)))
  39.           (setq        tmp    (cons (car params) tmp)
  40.                 params (cdr params)
  41.           )
  42.         )
  43.         (setq tmp    (reverse tmp)
  44.               params (reverse params)
  45.         )
  46.       )
  47.     )
  48.     (while (= (car params) (1+ (car tmp)))
  49.       (setq tmp           (cons (car params) tmp)
  50.             params (cdr params)
  51.       )
  52.     )
  53.     (setq tmp (reverse (cons (1+ (car tmp)) tmp)))
  54.     (setq
  55.       pts
  56.        (vl-remove
  57.          nil
  58.          (mapcar
  59.            (function
  60.              (lambda (pa / pt)
  61.                (if (setq pt (vlax-curve-getPointAtParam pline pa))
  62.                  ((lambda (p)
  63.                     (list (car p) (cadr p))
  64.                   )
  65.                    (trans pt 0 nor)
  66.                  )
  67.                )
  68.              )
  69.            )
  70.            tmp
  71.          )
  72.        )
  73.     )
  74.     (setq copy
  75.            (vlax-invoke
  76.              space
  77.              'addLightWeightPolyline
  78.              (apply 'append pts)
  79.            )
  80.     )
  81.     (foreach p (cdr (reverse tmp))
  82.       (vla-setBulge
  83.         copy
  84.         (vl-position p tmp)
  85.         (vla-getBulge pline p)
  86.       )
  87.       (vla-getWidth pline p 'swid 'ewid)
  88.       (vla-setWidth copy (vl-position p tmp) swid ewid)
  89.     )
  90.     (foreach prop '(Elevation            Layer            Linetype
  91.                     LinetypeGeneration                    LinetypeScale
  92.                     Lineweight            Normal            Thickness
  93.                     TrueColor
  94.                    )
  95.       (if (vlax-property-available-p pline prop)
  96.         (vlax-put copy prop (vlax-get pline prop))
  97.       )
  98.     )
  99.     (setq tmp nil
  100.           ret (cons copy ret)
  101.     )
  102.   )
  103. )



亮显某段的函数:
游客,本帖隐藏的内容需要积分高于 30 才可浏览,您当前积分为 0

其他函数:
  1. ;;================================================================;;

  2. ;;; Clockwise-p
  3. ;;; Retourne T si les points p1 p2 et p3 tournent dans le sens horaire

  4. (defun clockwise-p (p1 p2 p3)
  5.   (< (sin (- (angle p1 p3) (angle p1 p2))) -1e-14)
  6. )

  7. ;;================================================================;;

  8. ;;; Polyarc-data
  9. ;;; Retourne la liste des données d'un arc de polyligne (centre rayon angle).

  10. (defun polyarc-data (bu p1 p2 / ang rad cen area cg)
  11.   (setq        ang (* 2 (atan bu))
  12.         rad (/ (distance p1 p2)
  13.                (* 2 (sin ang))
  14.             )
  15.         cen (polar p1
  16.                    (+ (angle p1 p2) (- (/ pi 2) ang))
  17.                    rad
  18.             )
  19.   )
  20.   (list cen (abs rad) ang)
  21. )

  22. ;;================================================================;;

  23. ;; GETPOINTABOUTPLANE
  24. ;; Retourne le point d'intersection de la perpendiculaire à la vue courante passant
  25. ;; par le point saisi par l'utilsateur et le plan défini par sa normale et un point.
  26. ;;
  27. ;; Arguments
  28. ;; nor : le vecteur normal du plan d'intersection
  29. ;; org : un point sur le plan d'intersection (SCG)
  30. ;; msg : le message d'invite ou ""
  31. ;;
  32. ;; Retour : les coordonnées (SCG) du point d'intersection ou nil

  33. (defun GetPointAboutPlane (nor org msg / p1 p2 sc)
  34.   (if (and (setq p1 (getpoint msg))
  35.            (setq p1 (trans p1 1 0))
  36.            (setq p2 (trans p1 0 2))
  37.            (setq p2 (trans (list (car p2) (cadr p2) (1+ (caddr p2))) 2 0))
  38.            (/= 0
  39.                (setq sc (apply '+ (mapcar '* nor (mapcar '- p2 p1))))
  40.            )
  41.       )
  42.     (mapcar
  43.       (function
  44.         (lambda        (x1 x2)
  45.           (+ (*        (/ (apply '+ (mapcar '* nor (mapcar '- p1 org))) sc)
  46.                 (- x1 x2)
  47.              )
  48.              x1
  49.           )
  50.         )
  51.       )
  52.       p1
  53.       p2
  54.     )
  55.   )
  56. )



论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 5592个

财富等级: 富甲天下

发表于 2021-1-27 16:54:19 | 显示全部楼层
好程序!
感谢楼主分享!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2021-1-30 20:46:51 | 显示全部楼层
感谢@,大牛啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 201个

财富等级: 日进斗金

发表于 2021-1-31 00:02:03 | 显示全部楼层
好东西先收藏
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2021-4-5 12:42:07 | 显示全部楼层
缺乏定义函数,2006无法运行
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2021-4-5 19:29:25 | 显示全部楼层
cad2005 完美运行,谢谢分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2022-11-12 14:02:04 | 显示全部楼层
好东西,必须支持一下,感谢感谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-6-14 19:43 , Processed in 0.377253 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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