明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 445|回复: 6

[源码] 多段线pline添加及删除(批量)顶点源码分享

  [复制链接]
发表于 2024-8-2 17:32:53 | 显示全部楼层 |阅读模式
以下是我写的多段线添加顶点,删除顶点代码(支持批量删除),但有两个bug。
1、对于填充边界加减顶点后,填充不能跟随变动。
2、小比例图时加减点会失败。
处于添加模式时,线会被改为红色,为删除模式时,线会被改为青色。
高手可以自行处理以上2个问题。(本人能力有限)

  1. (defun stop ()
  2. (while (> (getvar "CMDACTIVE") 0) (command PAUSE))
  3. );end



  4. (vl-load-com)
  5. ;;多线加减顶点
  6. (defun C:dxdd (/ EN OBJ PT PP Alist ss-temp )
  7.   (setvar "cmdecho" 0)
  8.     (defun *ERROR* (msg) ;按ESC退出时执行
  9.       ;(princ "\n按ESC退出。")
  10.       (cond
  11.   ;;有设置A也正常退出出错
  12.   ((= dxdd-exit 100)
  13.    (progn
  14.      (princ "\n有设置A的,ESC正常退出。")
  15.      (setq color-n nil)
  16.      (setq dxdd-exit nil)
  17.      (stop)
  18.      ;(command "SELECT" enname "")
  19.      ;(command "change" (entlast) "" "p" "c" ss-color)
  20.      )
  21.    )
  22.   
  23.   ;;没有设置A的
  24.   ((= color-n 0)
  25.    (progn
  26.      (command "change" enname "" "" "p" "c" ss-color "")
  27.      (stop)
  28.      (princ "\n没有设置A的,按ESC退出。")
  29.      (setq color-n nil)
  30.      );progn
  31.    )
  32.   
  33.   
  34.   
  35.   ;;有设置A的
  36.   ((> color-n 0)
  37.    (progn
  38.      ;;恢复颜色
  39.      ;(princ (strcat "\n按esc重置次数:" (rtos color-n 2 0)))
  40.      (command "change" enname "" "" "p" "c" ss-color "")
  41.      (stop)
  42.      (princ "\n设置A的,按ESC退出。")
  43.      (setq color-n nil)
  44.      );progn
  45.    );
  46.   );cond
  47.       (setvar "cmdecho" 0)
  48.       (command "undo" "e")
  49.       (setvar "cmdecho" 1)
  50.       );error


  51.   (if (= color-n nil) (setq color-n 0))
  52.   (bz_o)
  53.   (if
  54.     (= dxdd nil)
  55.     (setq dxdd "add")
  56.     );if
  57.   ;;用于切换时改为自动模式
  58.   (if
  59.     (= dxdd-auto nil)
  60.     (setq dxdd-auto "N")
  61.     );if
  62.   ;;选对象提示
  63.   (if
  64.     (= dxdd "add")
  65.      (setq dxdd-alert "增加")
  66.      (setq dxdd-alert "批量删除")
  67.   )
  68.   ;;加减点提示
  69.   (if
  70.     (= dxdd "add")
  71.      (setq dxdd-alert-n "批量删除")
  72.      (setq dxdd-alert-n "增加")
  73.   )
  74.   (if
  75.     (= dxdd-auto "N")
  76.      (progn
  77.        (strcat "\n选择一条要" dxdd-alert "节点的多段线: ")
  78.        (setq EN (ssget ":S"))
  79.        (if EN
  80.    (progn
  81.      (command "undo" "be")
  82.      (princ "第一个")
  83.      ;;第一次运行提取颜色
  84.      (if (= color-n 0)
  85.      (progn
  86.      (setq enname (ssname EN 0))
  87.      (setq ss-color (assoc 62 (entget enname)))
  88.      (if (= ss-color nil)
  89.        (setq ss-color "bylayer")
  90.        (setq ss-color (rtos (cdr ss-color) 2 0))
  91.        )
  92.      );progn
  93.      );if
  94.      
  95.      (if (= dxdd "add")
  96.        (progn
  97.          ;;(princ "第一个红")
  98.          (command "change" enname "" "p" "c" "1" "")
  99.        )
  100.        (progn
  101.          ;;(princ "第一个青")
  102.          (command "change" enname "" "p" "c" "4" "")
  103.        )
  104.      )
  105.      (stop)
  106.      (command "SELECT" enname "")
  107.      (sssetfirst nil (ssadd enname))
  108.    ) ;progn
  109.    );if
  110.      ) ;progn
  111.      (progn
  112.        (command "undo" "be")
  113.        ;;(princ "第二个")

  114.        (command "SELECT" enname "")
  115.        ;;第一次运行提取颜色
  116.      (if (= color-n 0)
  117.      (progn
  118.      (setq ss-color (assoc 62 (entget enname )))
  119.      (if (= ss-color nil)
  120.        (setq ss-color "bylayer")
  121.        (setq ss-color (rtos (cdr ss-color) 2 0))
  122.        )
  123.      );progn
  124.      );if

  125.       

  126.        (if (= dxdd "add")
  127.    (progn
  128.      ;;(princ "第二个红")
  129.      (command "SELECT" enname "")
  130.      (command "change" (ssget "p") "" "p" "c" "1" "")
  131.    )
  132.    (progn
  133.      ;;(princ "第二个青")
  134.      (command "SELECT" enname "")
  135.      (command "change" (ssget "p") "" "p" "c" "4" "")
  136.    )
  137.        )
  138.      (stop)
  139.       
  140.        ;(setq EN (entlast))
  141.        (command "SELECT" enname "")
  142.      (sssetfirst nil (ssadd enname))

  143.        (setq dxdd-auto "N")
  144.      ) ;progn
  145.   ) ;if

  146.   
  147.   
  148.   (if (and enname
  149.            
  150.            ;(sssetfirst nil (ssadd enname))
  151.            (setq OBJ (vlax-ename->vla-object enname))
  152.            (or (= (vla-get-objectname OBJ) "AcDbPolyline")
  153.                (and (princ "\n所选的对象不是多段线。") nil)
  154.            )
  155.       )
  156.     (progn
  157.      
  158.     (initget "A")

  159.     (if
  160.       (= dxdd "add")
  161.       (progn
  162.     ;;加点的
  163.     (while
  164.       (setq PT (getpoint (strcat"\n请点取要"dxdd-alert"的节点或["dxdd-alert-n"(A)]: ")))
  165.       (cond
  166.   ((= PT "A")
  167.     (progn
  168.       (setq color-n (1+ color-n))
  169.       (if
  170.         (= dxdd "add")
  171.          (setq dxdd "del")
  172.          (setq dxdd "add")
  173.       )
  174.       (setq dxdd-auto "Y")
  175.       
  176.       (c:dxdd)
  177.       ;(command "undo" "e")
  178.       (exit)
  179.     );progn
  180.   );cond_A
  181.   ;;自动识别增删
  182.   ((/= PT nil)
  183.    (progn
  184.      (setq Alist (entget enname))
  185.      (setq PT (trans PT 1 0)
  186.      PP (vlax-curve-getclosestpointto OBJ PT);返回取得点在曲线上的最近点
  187.      )
  188.      
  189.      (cond
  190.       
  191.        ;;减加顶点
  192.         ((and (= dxdd "add")
  193.         (or
  194.         (< (distance pt (vlax-curve-getPointAtParam OBJ (fix (+ 1 (vlax-curve-getparamatpoint OBJ PP))))) 50)
  195.         (< (distance pt (vlax-curve-getPointAtParam OBJ (fix (+ 0.5 (vlax-curve-getparamatpoint OBJ PP))))) 50)
  196.         )
  197.         )
  198.          (progn
  199.      (princ (strcat "减顶点,两点距离:" (rtos (min
  200.                  (distance pt (vlax-curve-getPointAtParam OBJ (fix (+ 1 (vlax-curve-getparamatpoint OBJ PP)))))
  201.                  (distance pt (vlax-curve-getPointAtParam OBJ (fix (+ 0.5 (vlax-curve-getparamatpoint OBJ PP)))))
  202.                  )
  203.                  2 2)))
  204.      (setq pline-n (fix (+ 0.5 (vlax-curve-getparamatpoint OBJ PP))));;返回第N个顶点
  205.      (setq pt (vlax-curve-getpointatparam enname pline-n));;返回对应第N个顶点坐标,取消该条时,仅删除指定顶点。否则空选也删除。
  206.      (entmod (vl-remove (list 10 (car pt) (cadr pt)) Alist));;;移除表中该点表
  207.      );;progn
  208.          )

  209.         ;;增加顶点
  210.         ((= dxdd "add")
  211.          (progn
  212.      (princ "加顶点.")
  213.      (setq pline-n (fix (+ 1 (vlax-curve-getparamatpoint OBJ PP))));;返回第N个顶点
  214.      ;;(vlax-curve-getPointAtParam OBJ pline-n);;返回对应点坐标
  215.                  (vlax-invoke OBJ 'ADDVERTEX pline-n (list (car PT) (cadr PT)));;;pline线加点
  216.      );;progn
  217.          )

  218.         
  219.         ;;减加顶点
  220.          ((/= dxdd "add")
  221.          (progn
  222.      (princ "\n不等于ADD")
  223.      (setq pline-n (fix (+ 0.5 (vlax-curve-getparamatpoint OBJ PP))));;返回第N个顶点
  224.      (setq pt (vlax-curve-getpointatparam enname pline-n));;返回对应第N个顶点坐标,取消该条时,仅删除指定顶点。否则空选也删除。
  225.      (entmod (vl-remove (list 10 (car pt) (cadr pt)) Alist));;;移除表中该点表
  226.      );;progn
  227.          )
  228.       );;cond
  229.      
  230.      );progn
  231.    );cond_/=nil
  232.   );cond
  233.       
  234.       (initget "A")
  235.     );while
  236.     );progn


  237.       ;;批量删除点
  238.       (progn
  239.     (while
  240.       (setq PT (getpoint (strcat"\n请框选要删除的多段线顶点或["dxdd-alert-n"(A)]: ")))
  241.       (cond
  242.   ((= PT "A")
  243.     (progn
  244.       (setq color-n (1+ color-n))
  245.       (if
  246.         (= dxdd "add")
  247.          (setq dxdd "del")
  248.          (setq dxdd "add")
  249.       )
  250.       (setq dxdd-auto "Y")
  251.       
  252.       (c:dxdd)
  253.       ;(command "undo" "e")
  254.       (exit)
  255.     );progn
  256.   );cond_A
  257.   ((/= PT nil)
  258.    (progn
  259.      
  260.      (setq p1 PT
  261.      p3 (getcorner p1 "\n指定对角点或:")
  262.      ) ;选择框

  263.      (setq p1 (trans p1 1 0)
  264.      p3 (trans p3 1 0)
  265.      )
  266.      

  267.      (if p3
  268.        (progn
  269.          (setq p1x (min (car p1) (car p3))
  270.          p1y (min (cadr p1) (cadr p3))
  271.          p3x (max (car p1) (car p3))
  272.          p3y (max (cadr p1) (cadr p3))
  273.          )
  274.          ;(setq enname (ssname ss 0))
  275.          (setq Alist (entget enname))
  276.          (setq n 0) ;重复生成顶点次数
  277.          (setq m (cdr (assoc 90 Alist))) ;重复操作次数
  278.          ;;(setq OBJ (vlax-ename->vla-object enname))

  279.          (repeat m ;重复执行,执行的次数等于所选对象的个数
  280.      (setq n (+ n 1))
  281.      (setq pt  (vlax-curve-getpointatparam enname n)
  282.            ptx (car pt)
  283.            pty (cadr pt)
  284.      ) ;获取坐标
  285.      (if (and
  286.            (> ptx p1x)
  287.            (< ptx p3x)
  288.            (> pty p1y)
  289.            (< pty p3y)
  290.          )
  291.        (setq Alist (vl-remove (list 10 (car pt) (cadr pt))
  292.             Alist
  293.              )
  294.        )
  295.      ) ;if

  296.          ) ;repeat
  297.          ;;移除表中该点表
  298.          (entmod Alist)
  299.        ) ;progn
  300.      ) ;if


  301.    ) ;progn
  302.    );cond_/=nil
  303.   );cond
  304.       
  305.       (initget "A")
  306.     );while
  307.     );progn
  308.       );if






  309.       ;;;通用代码
  310.    
  311.     ;(princ (strcat "\n重置次数:" (rtos color-n 2 0)))
  312.     (if (= color-n 0)
  313.       ;;没有设置A的
  314.       (progn
  315.   ;;恢复颜色
  316.   (command "change" enname  "" "" "p" "c" ss-color "")
  317.   (stop)
  318.   (princ "\n没有设置A的,正常退出。")
  319.   
  320.   );progn
  321.       (progn
  322.   (princ "\n设置A的,正常退出。")
  323.   ;(princ (strcat "\n按esc重置次数:" (rtos color-n 2 0)))
  324.   ;(princ (strcat "\n最后颜色系:" ss-color))
  325.   (command "change" enname "" "" "p" "c" ss-color "")
  326.   (stop)
  327.   (setq dxdd-exit 100)
  328.   ;(princ (strcat "\n尾部结束重置次数:" (rtos color-n 2 0)))
  329.       
  330.   
  331.       );progn
  332.       );if
  333.       

  334.       (command "undo" "e")
  335.   
  336.       

  337.       
  338.     );progn
  339.   );if
  340.   ;(sssetfirst)
  341.   ;;程序退出处理
  342.   
  343.   
  344.   (setvar "cmdecho" 1)
  345.   (princ)
  346. );end



本帖子中包含更多资源

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

x

评分

参与人数 2明经币 +2 收起 理由
USER2128 + 1 赞一个!
bssurvey + 1 赞一个!

查看全部评分

发表于 2024-8-2 20:33:55 | 显示全部楼层
难道你想做拉伸填充?
发表于 2024-8-2 21:07:15 | 显示全部楼层
夹点就能添加删除,还要自己造个蹩脚的轮子?
 楼主| 发表于 2024-8-2 22:12:25 | 显示全部楼层

不是,只是想改pline,有时候刚好pline是填充用的。就想着一起动。要不然修改后,得重新手填一次。
 楼主| 发表于 2024-8-2 22:14:54 | 显示全部楼层
kozmosovia 发表于 2024-8-2 21:07
夹点就能添加删除,还要自己造个蹩脚的轮子?

你试一下就知道那个好用,那个难用了。
发表于 2024-8-3 08:41:02 | 显示全部楼层
只要是源码,哪怕是个四边形的轮子我也赞,试错也是一种进步
发表于 2024-8-31 15:37:10 | 显示全部楼层
谢谢楼主分享,下载收藏了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-23 20:21 , Processed in 0.485151 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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