明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2522|回复: 17

[多段线]动态多段线加点

[复制链接]
发表于 2023-11-30 14:45:31 | 显示全部楼层 |阅读模式
最近工作中需要给多段线加顶点,在网上收集到一个非常简洁的代码
大佬原地址http://bbs.xdcad.net/thread-626400-1-1.html

本帖子中包含更多资源

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

x
发表于 2023-11-30 17:37:27 | 显示全部楼层
本帖最后由 kucha007 于 2023-12-1 10:21 编辑

心血来潮改了一下,支持重多段线,支持已有点减点。弧段还有点问题
  1. (defun C:AD (/ *error* K:DivLst4N K:AddRduPT4PLine en)
  2.     (progn ;基础函数
  3.       (defun *error* (x) ;出错函数
  4.         (sssetfirst nil nil);取消选择集亮显
  5.       )
  6.       ;将表拆分为两个表list 前N项 剩下的项)
  7.       (Defun K:DivLst4N (Lst N / LstN)
  8.           (repeat N
  9.               (setq LstN (cons (car Lst) LstN))
  10.               (setq Lst (cdr Lst))
  11.           )
  12.           (list (reverse LstN) Lst)
  13.       )
  14.       ;多段线加减点
  15.       (defun K:AddRduPT4PLine (en / Base IsClsd VxtNum VxtLst PT TgtPT Index Num)
  16.         (if
  17.           (and
  18.               (setq obj (vlax-ename->vla-object en))
  19.               (or
  20.                 (and
  21.                   (eq (vlax-get obj "ObjectName") "AcDbPolyline");轻多段线
  22.                   (setq Base 2);XY
  23.                 )
  24.                 (and
  25.                   (eq (vlax-get obj "ObjectName") "AcDb2dPolyline");重多段线
  26.                   (setq Base 3);XYZ
  27.                 )
  28.               )
  29.               (setq IsClsd (vlax-curve-isClosed obj);是否闭合
  30.                     VxtNum (vlax-curve-getEndParam obj);终点参数
  31.                     VxtLst (vlax-get obj "Coordinates");多段线顶点坐标(不含Z)
  32.               )
  33.           )
  34.           (progn
  35.               (sssetfirst nil (ssadd en));亮显对象
  36.               (while (setq PT (getpoint "\n→请指定目标点:"))
  37.                   (setq PT    (trans PT 1 0);转为WCS坐标
  38.                         TgtPT (vlax-curve-getClosestPointTo obj PT);曲线上的最近点
  39.                         Index (vlax-curve-getParamAtPoint obj TgtPT);最近点的位置
  40.                   )
  41.                   (if (not (eq Index (fix Index)));目标点在线上不存在
  42.                       (progn
  43.                           (setq Num  (* Base (1+ (fix Index)))) ;点的位置
  44.                           (if (eq Base 2)
  45.                               (setq PT (reverse (cdr (reverse PT))));去掉Z值
  46.                           )
  47.                           (setq VxtLst (K:DivLst4N VxtLst Num)
  48.                                 VxtLst (append (car VxtLst) PT (cadr VxtLst))
  49.                           )
  50.                           (if (not (vl-catch-all-apply  'vlax-put (list obj "Coordinates" VxtLst)) )
  51.                               (princ "\n——★★★ 成功:已添加所选点到多段线上! ★★★——")
  52.                           )
  53.                           (vla-Update obj);更新对象
  54.                       )
  55.                       (if
  56.                         (and
  57.                           (equal PT TgtPT 0.01);目标点在线上
  58.                           (or
  59.                               (and
  60.                                   IsClsd ;闭合
  61.                                   (>  (length VxtLst) (* Base 3));不少于三个点
  62.                               )
  63.                               (and
  64.                                   (not IsClsd) ;不闭合
  65.                                   (>  (length VxtLst) (* Base 2));不少于两个点
  66.                               )
  67.                           )
  68.                         )
  69.                         (progn
  70.                             (setq Num (* Base (fix Index)))
  71.                             (setq VxtLst (K:DivLst4N VxtLst Num)
  72.                                   VxtLst (append (car VxtLst) (if (eq 2 Base)(cddr (cadr VxtLst))(cdddr (cadr VxtLst))))
  73.                             )
  74.                             (if (not (vl-catch-all-apply  'vlax-put (list obj "Coordinates" VxtLst)) )
  75.                                 (princ "\n——★★★ 成功:已移除在线上的所选点! ★★★——")
  76.                             )
  77.                             (vla-Update obj);更新对象
  78.                         )
  79.                         (princ "\n——★★★ 失败:多段线无法再减点! ★★★——")
  80.                       )
  81.                   )
  82.               )
  83.               (sssetfirst nil);取消对象亮显
  84.           )
  85.         )
  86.       )
  87.     )
  88.     (if (last (ssgetfirst))(sssetfirst nil nil));非空选取消选择集亮显
  89.     (while
  90.       (not
  91.         (and
  92.           (setq en (car (entsel "\n→请点选多段线:")))
  93.           (wcmatch (Cdr (Assoc 0 (Entget en))) "*POLYLINE") ;多段线
  94.         )
  95.       )
  96.       (princ "\n——★★★ 失败:请点选多段线! ★★★——")
  97.     );选择多段线
  98.     (K:AddRduPT4PLine en)
  99.     (princ)
  100. )

评分

参与人数 1明经币 +1 收起 理由
qazxswk + 1 这个不错

查看全部评分

回复 支持 3 反对 0

使用道具 举报

发表于 2023-12-1 10:43:16 | 显示全部楼层
谢谢两位大佬的工具。各有特色。还发现一个不同点,楼主的在线外加点是指定加在哪段线上,需要每次选择,每次操作多一次但是能完全按照自己的要求,kucha007 的在线外加点是对最近的那段线加点,简单智能,但有可能加的那段并不是想加的那段。拿个矩形来测试容易发现。
发表于 2023-11-30 23:23:40 | 显示全部楼层
常常会用到加点的,感谢分享,收藏先!
 楼主| 发表于 2023-12-1 09:06:58 | 显示全部楼层
kucha007 发表于 2023-11-30 17:37
心血来潮改了一下

我这个可以加点并且挪动位置,老师您这个是只能在线上加点
发表于 2023-12-1 09:17:29 | 显示全部楼层
222808 发表于 2023-12-1 09:06
我这个可以加点并且挪动位置,老师您这个是只能在线上加点

你那个也不能挪吧?
 楼主| 发表于 2023-12-1 09:22:45 | 显示全部楼层
kucha007 发表于 2023-12-1 09:17
你那个也不能挪吧?

我这个是可以的,只是说他不亮显,您可以加载试一下,我这边使用时可以把添加的点选择位置。您那个添加的点只能在线上。
发表于 2023-12-1 09:37:30 | 显示全部楼层
具体使用的场景?
 楼主| 发表于 2023-12-1 09:42:39 | 显示全部楼层
aws 发表于 2023-12-1 09:37
具体使用的场景?

就是方便加点并挪动位置,就是高版本自带的添加顶点
发表于 2023-12-1 10:22:14 | 显示全部楼层
222808 发表于 2023-12-1 09:22
我这个是可以的,只是说他不亮显,您可以加载试一下,我这边使用时可以把添加的点选择位置。您那个添加的 ...

更新了,可以再试试.支持加减点,支持轻重多段线
 楼主| 发表于 2023-12-1 10:30:27 | 显示全部楼层
kucha007 发表于 2023-12-1 10:22
更新了,可以再试试.支持加减点,支持轻重多段线

CAD2016使用您更新后的代码,只提示“请选择多段线”,但后续就没有了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 08:40 , Processed in 0.285647 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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