找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2769|回复: 5

[LISP函数]:多义线添加顶点

[复制链接]

已领礼包: 12个

财富等级: 恭喜发财

发表于 2005-12-30 04:21:03 | 显示全部楼层 |阅读模式

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

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

×
[PHP];;;功能:多义线添加顶点
;;;用法:(Add_Vertex <多义线ename>  <点pt> <凸度bulge>)
;;;如果点pt在多义线上,则添加该点作为多义线的一个顶点,并保持该点处的曲率不变;
;;;如果点pt不在多义线上,则添加该点作为多义线的最后一个顶点,并使新加子段的凸度为bulge。
(defun Add_Vertex (ename pt bulge / obj n dm d1 d2 pcen v plist)
  (setq obj (vlax-ename->vla-object ename))
  (if (vlax-curve-getParamAtPoint obj pt)
    (progn
  (setq n (fix (vlax-curve-getParamAtPoint obj pt)))
  (setq dm (vlax-curve-getDistAtPoint obj pt))
  (setq d1 (vlax-curve-getDistAtParam obj n))
  (setq d2 (vlax-curve-getDistAtParam obj (1+ n)))
  (setq v (vlax-curve-getsecondderiv obj n))
  (if (zerop (vla-getbulge obj n))
    (vla-AddVertex obj (1+ n) (ax:2DPoint pt))
    (progn
      (if (> (vla-getbulge obj n) 0)
        (setq pcen (mapcar '+ (vlax-safearray->list (vlax-variant-value (vla-get-Coordinate obj n))) v))
        (setq pcen (mapcar '- (vlax-safearray->list (vlax-variant-value (vla-get-Coordinate obj n))) v))
      )
      (setq ang2m
            (* 0.25
               (- (angle pcen (vlax-safearray->list (vlax-variant-value(vla-get-Coordinate obj (1+ n)))))
                  (angle pcen pt)
               )
            )
            angm1
            (* 0.25
               (- (angle pcen pt)
                  (angle pcen (vlax-safearray->list (vlax-variant-value(vla-get-Coordinate obj n))))
               )
            )
      )
      (vla-AddVertex obj (1+ n) (ax:2DPoint pt))
      (vla-SetBulge obj n (/ (sin angm1) (cos angm1)))
      (vla-SetBulge obj (1+ n) (/ (sin ang2m) (cos ang2m)))
    )
  )
  )
  (progn
    (setq plist        (vlax-safearray->list
                  (vlax-variant-value
                    (vla-get-coordinates obj)
                  )
                )
    )
    (vla-AddVertex obj (/ (length plist) 2) (ax:2DPoint pt))
    (vla-SetBulge obj (1- (/ (length plist) 2)) bulge)
    )
  )
  (vla-update obj)
  (princ)
)

(defun ax:2DPoint (pt)
  (vlax-make-variant
    (vlax-safearray-fill
      (vlax-make-safearray vlax-vbdouble '(0 . 1))
      (list (car pt) (cadr pt))
    )
  )
)
[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-3-21 08:54:07 | 显示全部楼层
怎么不能用呀?给点提示
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 12个

财富等级: 恭喜发财

 楼主| 发表于 2006-5-20 01:10:30 | 显示全部楼层
这是函数,并非命令,看清楚了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-8-1 13:56:07 | 显示全部楼层
选择增加的点不在多义线上时,可不可以把这个新增的点放在选中的那一段多线段两个顶点之间?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-4-29 16:05:25 | 显示全部楼层
我也写了一个,看看

  1.   [FONT=courier new]
  2. ;;;--------------------------------------------------------
  3. ;;;函数: c:adv
  4. ;;;--------------------------------------------------------
  5. ;;;来源:            作者: caddog
  6. ;;;编制时间:2007.3
  7. ;;;功能:     添加多段线的顶点
  8. ;;;语法:     
  9. ;;;参数      
  10. ;;;返回值:   
  11. ;;;备注  :   学习VBA看到ADDVERTEX,试着写了一个看看,没考虑弧
  12. ;;;--------------------------------------------------------
  13. (DEFUN C:ad (/        2dp ename n obj        p pp ss1 ss2 t1        var2dp StartWidth
  14.               endWidth)
  15.   (SETQ SS1 (ENTSEL "\n请选择一条多段线:"))
  16.   (SETQ ENAME (CAR SS1))
  17.   (SETQ OBJ (VLAX-ENAME->VLA-OBJECT ENAME))
  18.   ;;如果是多段线则处理
  19.   (IF (WCMATCH (VLA-GET-OBJECTNAME obj) "LWPOLYLINE,AcDbPolyline") ;_ 结束wcmatch
  20.     (PROGN
  21.       ;;显示多段线的夹点,便于用户查看       
  22.       (SETQ ss2 (SSADD ENAME))
  23.       (SSSETFIRST NIL ss2)
  24.       ;;提示用户选择插入点
  25.       (SETQ P (GETPOINT "\n请选择插入点:"))
  26.       ;;当点P有值时循环
  27.       (WHILE p
  28.         ;;确定用户所指定的插入点的位置,是在哪个顶点之后
  29.         (SETQ PP (VLAX-CURVE-GETCLOSESTPOINTTO OBJ (TRANS P 1 0)))
  30.         (SETQ N (+ (FIX (VLAX-CURVE-GETPARAMATPOINT OBJ PP)) 1))
  31.         ;;取插入点外原来的起始宽度和终止宽度
  32.         ;;试着用PEDIT命令添加顶点,观察加入点后宽度的变化可知
  33.         ;;新加入顶点的起始/终止宽度均为原来的的终止宽度
  34.         (VLA-GETWIDTH obj (- n 1) 'StartWidth 'endWidth)
  35.         ;;创建安全数组,并将点取的坐标赋给它.注意ADDVERTEX方法只接受二维点
  36.         (SETQ 2DP (VLAX-MAKE-SAFEARRAY VLAX-VBDOUBLE '(0 . 1)))
  37.         (VLAX-SAFEARRAY-FILL 2DP (LIST (CAR P) (CADR P)))
  38.         ;;转换安全数组为变体
  39.         (SETQ VAR2DP (VLAX-MAKE-VARIANT 2DP))
  40.         ;;调用ACTIVEX方法添加顶点
  41.         (VLA-ADDVERTEX OBJ N VAR2DP)
  42.         ;;调整宽度
  43.         (VLA-SETWIDTH obj n endWidth endWidth)

  44.         (SETQ P (GETPOINT "\n请选择插入点:"))
  45.       ) ;_end while
  46.       (PRINC)
  47.       (SSSETFIRST NIL) ;_取消夹取的状态
  48.     ) ;_end progn
  49.     (PROGN
  50.       (PRINC "\n您选择的不是多段线!")
  51.       (PRINC)
  52.     ) ;_end else progn
  53.   ) ;_end if
  54.   (princ)
  55. ) ;_end defun
  56.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-6-11 16:49:05 | 显示全部楼层
怎么用呀?给点提示
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 07:06 , Processed in 0.394126 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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