找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1144|回复: 3

[LISP函数]:动态添加多段线顶点

[复制链接]
发表于 2007-11-30 09:22:34 | 显示全部楼层 |阅读模式

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

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

×

  1.   [FONT=courier new]
  2. ;;;--------------------------------------------------------
  3. ;;;函数: c:add
  4. ;;;--------------------------------------------------------
  5. ;;;来源:            作者: caddog
  6. ;;;编制时间:2007.3修改时间2007.11.23
  7. ;;;功能:     添加多段线的顶点
  8. ;;;语法:     
  9. ;;;参数      
  10. ;;;返回值:   
  11. ;;;备注  :   学习VBA看到ADDVERTEX,试着写了一个看看
  12. ;;;         在2007.11.23加入了动态显示欲加点位的功能,使
  13. ;;;         加点更直观。编写中借用了XDCAD上《鼠标移动动态显示》
  14. ;;;         函数。作者的名字没能记下来,深表歉意
  15. ;;;         3DPOINT->2DPOINT函数取自CAD教程
  16. ;;;         可惜不支持捕捉!不知有没有办法解决,请高手指教:)
  17. ;;;--------------------------------------------------------
  18. (DEFUN C:add (/               2dp        ename         n          obj           p
  19.               pp       ss1        ss2         t1          var2dp   StartWidth
  20.               endWidth         LOOP_ID         N_OLD          N_OLD1   N_OLD2
  21.                        OLDERR         PP1          PTVER1   PTVER2
  22.              )
  23.   (SETQ        olderr        *error*
  24.         *error*        err_adv
  25.   ) ;_ 结束setq
  26.   (COMMAND "_.undo" "_begin")

  27.   (SETQ SS1 (ENTSEL "\n请选择一条多段线:"))
  28.   (SETQ ENAME (CAR SS1))
  29.   (SETQ OBJ (VLAX-ENAME->VLA-OBJECT ENAME))
  30.   ;;如果是多段线则处理
  31.   (IF (WCMATCH (VLA-GET-OBJECTNAME obj) "LWPOLYLINE,AcDbPolyline") ; _
  32.                                         ; 结束wcmatch
  33.     (PROGN
  34.       ;;显示多段线的夹点,便于用户查看       
  35.       (SETQ ss2 (SSADD ENAME))
  36.       (SSSETFIRST NIL ss2)
  37.       ;;提示用户选择插入点
  38.       ;;(SETQ P (GETPOINT "\n请选择插入点:"))

  39.       (SETQ LOOP_ID T
  40.             objLine1 nil
  41.             p t
  42.             n_old1 nil
  43.             n_old2 nil
  44.       )

  45.       (while p
  46.         (WHILE LOOP_ID
  47.           (SETQ vptent (GRREAD T (+ 4 8) 0))
  48.           (COND
  49.             ((AND vptent (= (CAR vptent) 5))
  50.              (PROGN
  51.                (setq pp1 (cadr vptent))

  52.                ;;确定用户所指定的插入点的位置,是在哪个顶点之后
  53.                (SETQ PP        (VLAX-CURVE-GETCLOSESTPOINTTO
  54.                           OBJ
  55.                           (TRANS pp1 1 0)
  56.                         )
  57.                )
  58.                (SETQ N (+ (FIX (VLAX-CURVE-GETPARAMATPOINT OBJ PP)) 1))
  59.                (if (/= n n_old)
  60.                  (SETQ ptVer1 (vlax-curve-getPointAtParam obj (- n 1))
  61.                        ptVer2 (vlax-curve-getPointAtParam obj n)
  62.                        n_old1 n
  63.                  )
  64.                )
  65.                (if (not ptVer1)
  66.                  (setq ptVer1 ptVer2)
  67.                )
  68.                (if (not ptVer2)
  69.                  (setq ptVer2 ptVer1)
  70.                )
  71.                (if (not objLine1);_如果没有直线对象,则建立之
  72.                  (progn
  73.                    (setq objLine1 (VLA-ADDLINE
  74.                                     (model-space)
  75.                                     (VLAX-3D-POINT ptVer1)
  76.                                     (VLAX-3D-POINT pp1)
  77.                                   )
  78.                          objLine2 (VLA-ADDLINE
  79.                                     (model-space)
  80.                                     (VLAX-3D-POINT ptVer2)
  81.                                     (VLAX-3D-POINT pp1)
  82.                                   )
  83.                    )

  84.                  ) ;_end progn

  85.                ) ;_end if objLine
  86.                (if (/= n n_old2)
  87.                  (progn
  88.                    (VLA-PUT-ENDPOINT objLine1 (VLAX-3D-POINT (3DPOINT->2DPOINT pp1)))
  89.                    (vla-put-StartPoint objLine1 (VLAX-3D-POINT (3DPOINT->2DPOINT ptVer1)))
  90.                    (VLA-PUT-ENDPOINT objLine2 (VLAX-3D-POINT (3DPOINT->2DPOINT pp1)))
  91.                    (vla-put-StartPoint objLine2 (VLAX-3D-POINT (3DPOINT->2DPOINT ptVer2)))
  92.                    (setq n_old2 n)
  93.                  )
  94.                  (progn
  95.                    (VLA-PUT-ENDPOINT objLine1 (VLAX-3D-POINT (3DPOINT->2DPOINT pp1)))
  96.                    (VLA-PUT-ENDPOINT objLine2 (VLAX-3D-POINT (3DPOINT->2DPOINT pp1)))
  97.                  )
  98.                )



  99.              ) ;_ 结束progn
  100.             )
  101.             ((= 3 (CAR vptent)) ;_按下鼠标左键,选定了点
  102.              (progn
  103.                (SETQ p (cadr vptent))
  104. ;;;               ;;确定用户所指定的插入点的位置,是在哪个顶点之后
  105. ;;;               (SETQ
  106. ;;;                 PP (VLAX-CURVE-GETCLOSESTPOINTTO OBJ (TRANS P 1 0))
  107. ;;;               )
  108. ;;;               (SETQ N (+ (FIX (VLAX-CURVE-GETPARAMATPOINT OBJ PP)) 1))
  109. ;;;               ;;取插入点外原来的起始宽度和终止宽度
  110. ;;;               ;;试着用PEDIT命令添加顶点,观察加入点后宽度的变化可知
  111. ;;;               ;;新加入顶点的起始/终止宽度均为原来的的终止宽度
  112.                (VLA-GETWIDTH obj (- n 1) 'StartWidth 'endWidth)
  113.                ;; 创建安全数组,并将点取的坐标赋给它.注意ADDVERTEX方法只接受二维点
  114.                (SETQ 2DP (VLAX-MAKE-SAFEARRAY VLAX-VBDOUBLE '(0 . 1)))
  115.                (VLAX-SAFEARRAY-FILL 2DP (LIST (CAR P) (CADR P)))
  116.                ;;转换安全数组为变体
  117.                (SETQ VAR2DP (VLAX-MAKE-VARIANT 2DP))
  118.                ;;调用ACTIVEX方法添加顶点
  119.                (VLA-ADDVERTEX OBJ N VAR2DP)
  120.                ;;调整宽度
  121.                (VLA-SETWIDTH obj n endWidth endWidth)
  122.              ) ;_end progn
  123.             )
  124.             (T
  125.              (PROGN
  126.                (SETQ LOOP_ID NIL
  127.                      p nil
  128.                )
  129.                ;;
  130.              ) ;_ 结束progn

  131.             )
  132.           ) ;_ 结束cond
  133.         ) ;_ 结束while
  134.       ) ;_end while p
  135.       (if objLine1  ;_如果有直线对象则删除之
  136.         (progn (VLA-DELETE objLine1)
  137.                (VLA-DELETE objLine2)
  138.         )
  139.       ) ;_end if objline1

  140.       (PRINC)
  141.       (SSSETFIRST NIL) ;_取消夹取的状态
  142.     ) ;_end progn
  143.     (PROGN
  144.       (PRINC "\n您选择的不是多段线!")
  145.       (PRINC)
  146.     ) ;_end else progn
  147.   ) ;_end if
  148.   (COMMAND "_.undo" "_end")
  149.   (SETQ *error* olderr)

  150.   (PRINC)
  151. ) ;_end defun

  152. ;;错误处理,用以在用户按下了ESC键后取消所有的修改并删除指示线。
  153. (DEFUN err_adv (s)

  154.       (if OBJLINE1 ;_若生成了指示线且未删除则删除掉
  155.           (progn (vla-delete OBJLINE1)
  156.                  (vla-delete OBJLINE2)
  157.           )
  158.         )
  159.       
  160.       (princ "\t *取消操作*")

  161.   (SETQ *error* olderr)
  162. ) ;_ 结束defun

  163. ;;; 函数: 3dPoint->2dPoint                                       
  164. ;;;--------------------------------------------------
  165. ;;; 说明:本函数有一个参数,表示一个三维点                       
  166. ;;;                (由三个整数或实数组成的表), 函数将它               
  167. ;;;                转换为二维点(由两个实数组成的表)。               
  168. ;;;                本函数并不检查参数 3dpt,而是                       
  169. ;;;                总认为它是一个有效点。                               
  170. ;;;---------------------------------------------------
  171. ;;; 要添加的功能:加上一些参数检查功能,                       
  172. ;;;       这样即使传给它空值或不是三维点的值,               
  173. ;;;       函数也不会导致程序崩溃。                               
  174. ;;;----------------------------------------------------
  175. (DEFUN 3dPoint->2dPoint         (3dpt)
  176.   (LIST (FLOAT (CAR 3dpt)) (FLOAT (CADR 3dpt)))

  177.   ) ;_ 结束defun
  178.   [/FONT]



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

已领礼包: 1449个

财富等级: 财源广进

发表于 2013-8-17 22:53:57 | 显示全部楼层
命令:
请选择一条多段线:     *取消操作*,
不知道怎么用不了,请楼主看看
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-30 14:49:28 | 显示全部楼层
请试试将这一句放在程序最前面看看能否解决:(vl-load-com)

点评

加了(vl-load-com),测试未能成功. 指令: ADD 请选择一条多段线: *取消操作* 在AUTOCAD2011下测试!  详情 回复 发表于 2013-8-30 18:37
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 9056个

财富等级: 富甲天下

发表于 2013-8-30 18:37:13 | 显示全部楼层
caddog 发表于 2013-8-30 14:49
请试试将这一句放在程序最前面看看能否解决:(vl-load-com)

加了(vl-load-com),测试未能成功.
指令: ADD
请选择一条多段线:    *取消操作*

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-25 13:19 , Processed in 0.396703 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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