乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 94|回复: 9

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

[复制链接]

4

主题

14

帖子

1

银币

初来乍到

Rank: 1

铜币
30
发表于 2003-12-8 09:46:00 | 显示全部楼层 |阅读模式
我想在多义线上随便一点就能添加一点。用CAD中的命令PEDIT太费事,
有没有好一点的方法,直接用鼠标一点就能在所点的位置添加一点。谢谢各位
请帮忙
回复

使用道具 举报

21

主题

216

帖子

9

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
305
发表于 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.            )
  14.     )
  15.     (setq DATA (grread NIL))
  16.     (cond ((= 2 (car DATA))
  17.            (cond ((= 120 (cadr DATA)) (setq MODIFY_MODE "eXit"))
  18.                  ((or (= 65 (cadr DATA)) (= 97 (cadr DATA))) (setq MODIFY_MODE "Add"))
  19.                  ((or (= 68 (cadr DATA)) (= 100 (cadr DATA))) (setq MODIFY_MODE "Del"))
  20.                  ((or (= 77 (cadr DATA)) (= 109 (cadr DATA))) (setq MODIFY_MODE "Move"))
  21.            )
  22.           )
  23.           ((= 3 (car DATA))
  24.            ;;与线上点最小距离
  25.            (setq POINT1 (mapcar '* (cadr DATA) (list 1 1)))
  26.            (setq POINTS (car (GET_POINTS ENT1)))
  27.            (setq DIST1 (distance POINT1 (car POINTS))) ;与线上点最小距离
  28.            (setq POINT_NUM1 0)                          ;与线上点最小距离的点序号
  29.            (setq NUM1 0)
  30.            (foreach TEMP POINTS
  31.              (if (> DIST1 (distance TEMP POINT1))
  32.                (progn (setq DIST1 (distance TEMP POINT1)) (setq POINT_NUM1 NUM1))
  33.              )
  34.              (setq NUM1 (1+ NUM1))
  35.            )
  36.            ;;进行处理
  37.            (setq DATA (entget ENT1))
  38.            (setq DATA_NEW (list))
  39.            (setq NUM1 0)
  40.            (foreach TEMP DATA
  41.              (if (and (= 10 (car TEMP)) (= NUM1 POINT_NUM1))
  42.                (cond ;;增加点
  43.                      ((= "Add" MODIFY_MODE)
  44.                       ;;angle1        前角
  45.                       ;;angle2        后角
  46.                       (if (= 0 POINT_NUM1)
  47.                         (setq ANGLE1 (angle (nth (+ POINT_NUM1 1) POINTS) (nth POINT_NUM1 POINTS))) ;延长角的角度
  48.                         (setq ANGLE1 (angle (nth POINT_NUM1 POINTS) (nth (- POINT_NUM1 1) POINTS)))
  49.                       )
  50.                       (if (= (- (length POINTS) 1) POINT_NUM1)
  51.                         (setq ANGLE2 (angle (nth (- POINT_NUM1 1) POINTS) (nth POINT_NUM1 POINTS))) ;延长角的角度
  52.                         (setq ANGLE2 (angle (nth POINT_NUM1 POINTS) (nth (+ POINT_NUM1 1) POINTS)))
  53.                       )
  54.                       (setq ANGLE3 (angle (nth POINT_NUM1 POINTS) POINT1)) ;
  55.                       (setq ANGLE1 (- ANGLE1 ANGLE3))
  56.                       (setq ANGLE2 (- ANGLE3 ANGLE2))
  57.                       (if ( ANGLE1 ANGLE2) (> (+ ANGLE1 ANGLE2) (+ pi pi))) ;外角时大于360度且前角大于后角
  58.                           )
  59.                         ;;条件为真时加在最近点前面
  60.                         (setq DATA_NEW (append DATA_NEW
  61.                                                (list (append (list 10) POINT1))
  62.                                                (list (assoc '40 DATA) (assoc '41 DATA) (assoc '42 DATA))
  63.                                                (list TEMP)
  64.                                        )
  65.                         )
  66.                         ;;条件为假时加在最近点后面
  67.                         (setq DATA_NEW (append DATA_NEW
  68.                                                (list TEMP)
  69.                                                (list (assoc '40 DATA) (assoc '41 DATA) (assoc '42 DATA))
  70.                                                (list (append (list 10) POINT1))
  71.                                        )
  72.                         )
  73.                       )
  74.                      )
  75.                      ;;移动点
  76.                      ((= "Move" MODIFY_MODE) (setq DATA_NEW (append DATA_NEW (list (append (list 10) POINT1)))))
  77.                      ;;删除点
  78.                      ;;就不用处理
  79.                )
  80.                (setq DATA_NEW (append DATA_NEW (list TEMP)))
  81.              )
  82.              (if (= 10 (car TEMP))
  83.                (setq NUM1 (1+ NUM1))
  84.              )
  85.            )
  86.            (if (not (entmod DATA_NEW))
  87.              (*ERROR* "不能更新实体数据!")
  88.            )
  89.           )
  90.           ((= 12 (car DATA)) (setq MODIFY_MODE "eXit"))
  91.     )
  92.   )
  93.   (princ)
  94. )
回复

使用道具 举报

8

主题

35

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
67
发表于 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加点:)
回复

使用道具 举报

25

主题

61

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
161
发表于 2003-12-8 12:19:00 | 显示全部楼层
楼上的程序码好象在哪见过, 如果不是你写的最好注明...
回复

使用道具 举报

4

主题

14

帖子

1

银币

初来乍到

Rank: 1

铜币
30
发表于 2003-12-8 12:36:00 | 显示全部楼层
谢谢。我试了一下luoyaya 的程序,但出现如下错误,我想问一下,是否需要设置CAD环境中的什么才能用这些VLAX函数
no function definition: VLAX-ENAME->VLA-OBJECT
回复

使用道具 举报

25

主题

61

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
161
发表于 2003-12-8 12:41:00 | 显示全部楼层
加一行: (vl-load-com)
回复

使用道具 举报

4

主题

14

帖子

1

银币

初来乍到

Rank: 1

铜币
30
发表于 2003-12-8 12:52:00 | 显示全部楼层
我觉得这个是不是又添加了一条多义线啊,我想加完点后仍然是一条很正常的多义线,可以吗
回复

使用道具 举报

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3177
发表于 2003-12-8 13:10:00 | 显示全部楼层
先加载(vl-load-com)
回复

使用道具 举报

29

主题

1152

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1268
发表于 2003-12-8 15:52: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)
)
回复

使用道具 举报

8

主题

35

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
67
发表于 2003-12-9 15:21:00 | 显示全部楼层


好像是出自
;; By Richard L
;; Parker Hannifin Ltd (NZ).
;; 給多義線添加頂點
(defun ADDVERTEX (ENAME P)
   (s...
[/quote]
不好意思,今天才看到,是的,是用了这个函数改了一下:),当时忘了写上~~~
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-7 13:34 , Processed in 0.687108 second(s), 83 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表