明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3775|回复: 11

请大家帮忙:在多义线上随便一位置添加一点

  [复制链接]
发表于 2003-12-8 09:46:00 | 显示全部楼层 |阅读模式
我想在多义线上随便一点就能添加一点。用CAD中的命令PEDIT太费事,
有没有好一点的方法,直接用鼠标一点就能在所点的位置添加一点。谢谢各位
请帮忙
发表于 2003-12-8 11:36:00 | 显示全部楼层
旧程序,期待改进。
(GET_POINTS ENT1)定义为获取ent1的点,返回((所有坐标列表)(最大坐标)(最小坐标))
  1. ;;;7/23/03
  2. ;;;复合线顶点编辑工具
  3. (defun C:PEDIT_EV (ANGLE1 ANGLE2 ANGLE3 DATA DATA_NEW DIST1 ENT1 MODIFY_MODE NUM1 POINT1 POINTS POINT_NUM1)
  4.   ;;选取一条多段线
  5.   (while (progn        (while (not (setq ENT1 (car (entsel "\n\t选择要编辑的多段线:")))))
  6.                 (not (wcmatch (cdr (assoc '0 (entget ENT1))) "*POLYLINE"))
  7.          )
  8.     (princ "\n\t选择的不是多段线。")
  9.   )
  10.   (setq MODIFY_MODE "Add")
  11.   (while (/= MODIFY_MODE "eXit")
  12.     (princ (strcat "\n\tAdd增加点/Del删除点/Move移动点/eXit退出<"
  13.                    (cond ((= "Move" MODIFY_MODE) "Move移动点")
  14.                          ((= "Add" MODIFY_MODE) "Add增加点")
  15.                          ((= "Del" MODIFY_MODE) "Del删除点")
  16.                    )
  17.                    ">:"
  18.            )
  19.     )
  20.     (setq DATA (grread NIL))
  21.     (cond ((= 2 (car DATA))
  22.            (cond ((= 120 (cadr DATA)) (setq MODIFY_MODE "eXit"))
  23.                  ((or (= 65 (cadr DATA)) (= 97 (cadr DATA))) (setq MODIFY_MODE "Add"))
  24.                  ((or (= 68 (cadr DATA)) (= 100 (cadr DATA))) (setq MODIFY_MODE "Del"))
  25.                  ((or (= 77 (cadr DATA)) (= 109 (cadr DATA))) (setq MODIFY_MODE "Move"))
  26.            )
  27.           )
  28.           ((= 3 (car DATA))
  29.            ;;与线上点最小距离
  30.            (setq POINT1 (mapcar '* (cadr DATA) (list 1 1)))
  31.            (setq POINTS (car (GET_POINTS ENT1)))
  32.            (setq DIST1 (distance POINT1 (car POINTS))) ;与线上点最小距离
  33.            (setq POINT_NUM1 0)                          ;与线上点最小距离的点序号
  34.            (setq NUM1 0)
  35.            (foreach TEMP POINTS
  36.              (if (> DIST1 (distance TEMP POINT1))
  37.                (progn (setq DIST1 (distance TEMP POINT1)) (setq POINT_NUM1 NUM1))
  38.              )
  39.              (setq NUM1 (1+ NUM1))
  40.            )
  41.            ;;进行处理
  42.            (setq DATA (entget ENT1))
  43.            (setq DATA_NEW (list))
  44.            (setq NUM1 0)
  45.            (foreach TEMP DATA
  46.              (if (and (= 10 (car TEMP)) (= NUM1 POINT_NUM1))
  47.                (cond ;;增加点
  48.                      ((= "Add" MODIFY_MODE)
  49.                       ;;angle1        前角
  50.                       ;;angle2        后角
  51.                       (if (= 0 POINT_NUM1)
  52.                         (setq ANGLE1 (angle (nth (+ POINT_NUM1 1) POINTS) (nth POINT_NUM1 POINTS))) ;延长角的角度
  53.                         (setq ANGLE1 (angle (nth POINT_NUM1 POINTS) (nth (- POINT_NUM1 1) POINTS)))
  54.                       )
  55.                       (if (= (- (length POINTS) 1) POINT_NUM1)
  56.                         (setq ANGLE2 (angle (nth (- POINT_NUM1 1) POINTS) (nth POINT_NUM1 POINTS))) ;延长角的角度
  57.                         (setq ANGLE2 (angle (nth POINT_NUM1 POINTS) (nth (+ POINT_NUM1 1) POINTS)))
  58.                       )
  59.                       (setq ANGLE3 (angle (nth POINT_NUM1 POINTS) POINT1)) ;
  60.                       (setq ANGLE1 (- ANGLE1 ANGLE3))
  61.                       (setq ANGLE2 (- ANGLE3 ANGLE2))
  62.                       (if (< ANGLE1 0)
  63.                         (setq ANGLE1 (+ ANGLE1 pi pi))
  64.                       )
  65.                       (if (< ANGLE2 0)
  66.                         (setq ANGLE2 (+ ANGLE2 pi pi))
  67.                       )
  68.                       (if (or (and (< ANGLE1 ANGLE2) (< (+ ANGLE1 ANGLE2) (+ pi pi))) ;内角时小于360度且前角小于后角
  69.                               (and (> ANGLE1 ANGLE2) (> (+ ANGLE1 ANGLE2) (+ pi pi))) ;外角时大于360度且前角大于后角
  70.                           )
  71.                         ;;条件为真时加在最近点前面
  72.                         (setq DATA_NEW (append DATA_NEW
  73.                                                (list (append (list 10) POINT1))
  74.                                                (list (assoc '40 DATA) (assoc '41 DATA) (assoc '42 DATA))
  75.                                                (list TEMP)
  76.                                        )
  77.                         )
  78.                         ;;条件为假时加在最近点后面
  79.                         (setq DATA_NEW (append DATA_NEW
  80.                                                (list TEMP)
  81.                                                (list (assoc '40 DATA) (assoc '41 DATA) (assoc '42 DATA))
  82.                                                (list (append (list 10) POINT1))
  83.                                        )
  84.                         )
  85.                       )
  86.                      )
  87.                      ;;移动点
  88.                      ((= "Move" MODIFY_MODE) (setq DATA_NEW (append DATA_NEW (list (append (list 10) POINT1)))))
  89.                      ;;删除点
  90.                      ;;就不用处理
  91.                )
  92.                (setq DATA_NEW (append DATA_NEW (list TEMP)))
  93.              )
  94.              (if (= 10 (car TEMP))
  95.                (setq NUM1 (1+ NUM1))
  96.              )
  97.            )
  98.            (if (not (entmod DATA_NEW))
  99.              (*ERROR* "不能更新实体数据!")
  100.            )
  101.           )
  102.           ((= 12 (car DATA)) (setq MODIFY_MODE "eXit"))
  103.     )
  104.   )
  105.   (princ)
  106. )
发表于 2003-12-8 11:53:00 | 显示全部楼层
  1. (defun c:jd (/ ent p obj n pp pn newv)
  2.   (if (setq ent (entsel "\n点取pline:"))
  3.     (progn
  4.       (setq p (cadr ent))
  5.       (setq obj (vlax-ename->vla-object (car ent)))
  6.       (setq pp (vlax-curve-getclosestpointto obj (trans p 1 0)))
  7.       (setq n (fix (vlax-curve-getparamatpoint obj pp)))
  8.       (setq pn p)
  9.       (while (setq pn (getpoint pn "\n输入要加点的位置: "))
  10.           (command "undo" "be")
  11.           (setq pn (trans pn 1 (car ent)))
  12.           (setq pn (list (car pn) (cadr pn)))
  13.           (setq        newv (vlax-safearray-fill
  14.                        (vlax-make-safearray vlax-vbDouble '(0 . 1))
  15.                        pn
  16.                      )
  17.           )
  18.           (vla-addvertex obj (1+ n) newv)
  19.           (command "undo" "e")
  20.        
  21.       )

  22.     )
  23.   )
  24.   (princ)
  25. )


简单的功能单的PLINE加点:)
发表于 2003-12-8 12:19:00 | 显示全部楼层
楼上的程序码好象在哪见过, 如果不是你写的最好注明...
 楼主| 发表于 2003-12-8 12:36:00 | 显示全部楼层
谢谢。我试了一下luoyaya 的程序,但出现如下错误,我想问一下,是否需要设置CAD环境中的什么才能用这些VLAX函数
no function definition: VLAX-ENAME->VLA-OBJECT
发表于 2003-12-8 12:41:00 | 显示全部楼层
加一行: (vl-load-com)
 楼主| 发表于 2003-12-8 12:52:00 | 显示全部楼层
我觉得这个是不是又添加了一条多义线啊,我想加完点后仍然是一条很正常的多义线,可以吗
发表于 2003-12-8 13:10:00 | 显示全部楼层
先加载(vl-load-com)
发表于 2003-12-8 15:52:00 | 显示全部楼层
shicai发表于2003-12-8 12:19:00楼上的程序码好象在哪见过, 如果不是你写的最好注明...




好像是出自
;; By Richard L
;; Parker Hannifin Ltd (NZ).

;; 給多義線添加頂點
(defun ADDVERTEX (ENAME P)
  (setq        OBJ  (vlax-ename->vla-object ENAME)
        PP   (vlax-curve-getclosestpointto OBJ (trans P 1 0))
        N    (fix (vlax-curve-getparamatpoint OBJ PP))
        PN   (getpoint "\nPick a Point: ")
        PN   (list (car PN) (cadr PN))
        NEWV (vlax-safearray-fill
               (vlax-make-safearray vlax-vbdouble '(0 . 1))
               PN
             )
  )
  (vla-addvertex OBJ (1+ N) NEWV)
)
发表于 2003-12-9 15:21:00 | 显示全部楼层
龙龙仔发表于2003-12-8 15:52:00以下是引用shicai在2003-12-8 12:19:32的发言:
楼上的程序码好象在哪见过, 如果不是你写的最好注明...




好像是出自
;; By Richard L
;; Parker Hannifin Ltd (NZ).

;; 給多義線添加頂點
(defun ADDVERTEX (ENAME P)
   (s...
[/quote]


不好意思,今天才看到,是的,是用了这个函数改了一下:),当时忘了写上~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-27 08:23 , Processed in 0.206191 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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