找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2525|回复: 15

[原创]:一组简便实用的编辑多义线的VLISP程序(函数)

[复制链接]
发表于 2003-9-16 11:16:30 | 显示全部楼层 |阅读模式

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

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

×
一组简便实用的编辑多义线的VLISP程序(函数)


  1. ;; By Richard L
  2. ;; Parker Hannifin Ltd (NZ).
  3. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  4. ;; 判断多义线是否3D多义线
  5. (defun is3dpline (ename)               
  6.   (setq obj (vlax-ename->vla-object ename))
  7.   (if (= (vla-get-objectname obj) "AcDb3dPolyline")
  8.     (setq 3d T)
  9.     (setq 3d nil)
  10.   )
  11.   3d
  12. )
  13. ;; 判断多义线是否闭合
  14. (defun isclosed (ename)           
  15.   (setq obj (vlax-ename->vla-object ename))
  16.   (vla-get-closed obj)
  17. )
  18. ;; 判断多义线是PLINE还是SPLINE
  19. (defun plineorspline (ename)               
  20.   (setq obj (vlax-ename->vla-object ename))
  21.   (cond
  22.     ((or (= (vla-get-objectname obj) "AcDbPolyline")
  23.          (= (vla-get-objectname obj) "AcDb3dPolyline"))
  24.       (setq pl T))
  25.     ((= (vla-get-objectname obj) "AcDbSpline")
  26.      (setq pl nil))
  27.     (T (alert "It is neither Polyline nor Spline! "))
  28.   )
  29.   pl
  30. )
  31. ;; 返回多义线的面积
  32. (defun getarea (ename)       
  33.   (setq obj (vlax-ename->vla-object ename))
  34.   (vla-get-area obj)
  35. );
  36. ; 返回多义线的各顶点
  37. (defun vertexs (ename / plist pp n)        
  38.   (setq obj (vlax-ename->vla-object ename))
  39.   (setq plist (vlax-safearray->list
  40.                 (vlax-variant-value
  41.                   (vla-get-coordinates obj))))
  42.   (setq n 0)
  43.   (repeat (/ (length plist) 2)
  44.     (setq pp (append pp (list (list (nth n plist)(nth (1+ n) plist)))))
  45.     (setq n (+ n 2))
  46.   )
  47.   pp
  48. )
  49. ;;判断多义线是否有圆弧(凸度/=0)的子段
  50. (defun checkarc (ename)                       
  51.   (setq obj (vlax-ename->vla-object ename))
  52.   (setq plist (vlax-safearray->list
  53.                 (vlax-variant-value
  54.                   (vla-get-coordinates obj))))
  55.   (setq n 0 bu nil)
  56.   (repeat (/ (length plist) 2)
  57.     (if (/= (vla-getbulge obj n) 0)
  58.       (setq bu T)
  59.      )
  60.     (setq n (+ n 1))
  61.   )
  62.   bu
  63. )
  64. ;; 返回多义线子段的数量
  65. (defun numbersofseg (ename)               
  66.   (setq obj (vlax-ename->vla-object ename))
  67.   (setq plist (vlax-safearray->list
  68.                 (vlax-variant-value
  69.                   (vla-get-coordinates obj))))
  70.   (1- (/ (length plist) 2))
  71. )
  72. ;; 返回多义线第n点的坐标
  73. (defun coodsofnumpoint (ename n)
  74.   (setq obj (vlax-ename->vla-object ename))
  75.   (setq plist (vlax-safearray->list
  76.                 (vlax-variant-value
  77.                   (vla-get-coordinates obj))))
  78.   (list (nth (* n 2) plist)(nth (1+ (* n 2)) plist))
  79. )
  80. ;; 返回多义线第n子段的端点坐标
  81. (defun coodsofsegbynum (obj n)               
  82.   (vlax-safearray->list
  83.               (vlax-variant-value
  84.                 (vla-get-coordinate obj 2)))
  85. )
  86. ;; 返回多义线所点击子段的端点坐标
  87. (defun coordsofsegbypick (ename p)               
  88.   (setq obj (vlax-ename->vla-object ename)
  89.          pp (vlax-curve-getclosestpointto obj (trans p 1 0))
  90.           n (fix (vlax-curve-getparamatpoint obj pp)))
  91.   (segcoord obj n)
  92. )
  93. ;;返回多义线第n个子段的长度
  94. (defun lengthofsegbynum (ename n)               
  95.   (setq obj (vlax-ename->vla-object ename))
  96.   (- (vlax-curve-getdistatparam obj (1+ n))
  97.      (vlax-curve-getdistatparam obj n))
  98. );
  99. ;; 返回多义线所点击子段的长度
  100. (defun lengthofseg (ename p)               
  101.   (setq obj (vlax-ename->vla-object ename)
  102.          pp (vlax-curve-getclosestpointto obj (trans p 1 0))
  103.           n (fix (vlax-curve-getparamatpoint obj pp)))
  104.   (- (vlax-curve-getdistatparam obj (1+ n))
  105.      (vlax-curve-getdistatparam obj n))
  106. )
  107. ;;返回多义线第n个子段的宽度
  108. (defun widthofsegbynum (ename n)               
  109.   (setq obj (vlax-ename->vla-object ename))
  110.   (vla-getwidth obj n 'ws 'wd)
  111.   (list ws wd)
  112. )
  113. ;; 返回多义线所点击子段的宽度
  114. (defun widthofsegbypick (ename p)               
  115.   (setq obj (vlax-ename->vla-object ename)
  116.          pp (vlax-curve-getclosestpointto obj (trans p 1 0))
  117.           n (fix (vlax-curve-getparamatpoint obj pp)))
  118.   (vlax-invoke-method obj 'getwidth n 'ws 'wd)
  119.   (list ws wd)
  120. );
  121. ;;COPY多义线所点击的子段
  122. (defun segmentcopy (ename p)               
  123.   (vl-cmdf "explode" ename "")
  124.   (vl-cmdf "copy" (ssget "c" (polar p (/ pi 4) 0.01)(polar p (* 1.25 pi) 0.01))
  125.                    "" p (getpoint "\nSecond point:") "")
  126.   (setq entl (entget (entlast)))
  127.   (vl-cmdf "undo" 2 "")
  128.   (entmake (cdr entl))
  129. )
  130. ;; OFFSET多义线所点击的子段
  131. (defun segmentoffset (ename p)                  
  132.   (setq oo (getdist "\nValue of offset:"))
  133.   (vl-cmdf "explode" ename "")
  134.   (vl-cmdf "offset" oo p
  135.    ; (ssname (ssget "c" (polar p (/ pi 4) 0.01)(polar p (* 1.25 pi) 0.01)) 0)
  136.       (getpoint "\nInput offset point:") "")
  137.   (setq entl (entget (entlast)))
  138.   (vl-cmdf "undo" 2 "")
  139.   (entmake (cdr entl))
  140. )
  141. ;;修改多义线第n个子段的凸度
  142. (defun bulgebynum (ename n)               
  143.   (setq obj (vlax-ename->vla-object ename))
  144.   (setq  bu (getreal "\nNew Bugle Value: "))
  145.   (vla-setbulge obj n bu)
  146. )
  147. ;; 修改多义线所点击子段的凸度
  148. (defun bulgebypick (ename p)               
  149.   (setq obj (vlax-ename->vla-object ename)
  150.          pp (vlax-curve-getclosestpointto obj (trans p 1 0))
  151.           n (fix (vlax-curve-getparamatpoint obj pp)))
  152.   (setq  bu (getreal "\nNew Bugle Value: "))
  153.   (vla-setbulge obj n bu)
  154. )
  155. ;; 给多义线添加顶点
  156. (defun addvertex (ename p)               
  157.   (setq obj (vlax-ename->vla-object ename)
  158.          pp (vlax-curve-getclosestpointto obj (trans p 1 0))
  159.           n (fix (vlax-curve-getparamatpoint obj pp))
  160.          pn (getpoint "\nPick a Point: ")
  161.          pn (list (car pn)(cadr pn))
  162.        newv (vlax-safearray-fill (vlax-make-safearray vlax-vbDouble '(0 . 1)) pn))
  163.   (vla-addvertex obj (1+ n) newv)
  164. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-7-23 11:03:03 | 显示全部楼层
謝謝,不錯的程序
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-7-25 16:23:18 | 显示全部楼层
(defun widthofsegbypick (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)))
(vlax-invoke-method obj 'getwidth n 'ws 'wd)
(list ws wd)
);


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

使用道具 举报

发表于 2004-7-25 17:42:26 | 显示全部楼层
是否闭合曲线

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2004-10-29 21:05:42 | 显示全部楼层
利用上面的函数写了个增加顶点的程序

  1. (vl-load-com)
  2. ;; 给多义线添加顶点
  3. (defun addvertex (ename p / obj pp n pn newv)
  4.   (setq        obj  (vlax-ename->vla-object ename)
  5.         pp   (vlax-curve-getclosestpointto obj (trans p 1 0))
  6.         n    (fix (vlax-curve-getparamatpoint obj pp))
  7.         pn   (list (car p) (cadr p))
  8.         newv (vlax-safearray-fill
  9.                (vlax-make-safearray vlax-vbDouble '(0 . 1))
  10.                pn
  11.              )
  12.   )
  13.   (vla-addvertex obj (1+ n) newv)
  14. )
  15. (defun c:tt (/ e p1 olderr myerr)
  16.   (defun myerr (msg)
  17.     (princ msg)
  18.     (vl-cmdf ".undo" "e")
  19.     (princ)
  20.   )
  21.   (setq        olderr        *error*
  22.         *error*        myerr
  23.   )
  24.   (vl-cmdf "undo" "be")
  25.   (if (setq e (entsel))
  26.     (while (setq p1 (getpoint "\nPick Point: "))
  27.       (addvertex (car e) p1)
  28.     )
  29.   )
  30.   (setq *error* olderr)
  31.   (vl-cmdf ".undo" "e")
  32.   (princ)
  33. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

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

使用道具 举报

发表于 2004-10-29 23:45:07 | 显示全部楼层
能不能请楼主说明一下怎么使用法,方便大家学习.
功能是什么?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-10-30 12:46:06 | 显示全部楼层
7楼: 里面有增加顶点的函数呀
8楼: 删除顶点的函数曾经贴过:
[PHP]
(defun c:test ()
  ;(vl-load-com)
  (setq p (getpoint "\npick point:"))
  (setq ent (ssname (ssget p) 0)
        obj (vlax-ename->vla-object ent))
  (setq pts (variant-value (vla-get-coordinates obj)))
  (setq nlist (vl-remove (car p)(vlax-safearray->list pts)))
  (setq nlist (vl-remove (cadr p) nlist))
  (setq narray (vlax-make-safearray
                    vlax-vbDouble
                 (cons 0 (1- (length nlist)))))
  (vla-put-coordinates obj (vlax-safearray-fill narray nlist))
  (princ)
)
[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-11-20 21:47:02 | 显示全部楼层
谢谢楼主,程序写得详尽,学到不少知识!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-11-21 15:17:12 | 显示全部楼层
重新又看了下:
;;COPY多义线所点击的子段
(defun segmentcopy (ename p)               
  (vl-cmdf "explode" ename "")
  (vl-cmdf "copy" (ssget "c" (polar p (/ pi 4) 0.01)(polar p (* 1.25 pi) 0.01))
                   "" p (getpoint "\nSecond point:") "")
  (setq entl (entget (entlast)))
  (vl-cmdf "undo" 2 "")
  (entmake (cdr entl))
)
;; OFFSET多义线所点击的子段
(defun segmentoffset (ename p)                  
  (setq oo (getdist "\nValue of offset:"))
  (vl-cmdf "explode" ename "")
  (vl-cmdf "offset" oo p
   ; (ssname (ssget "c" (polar p (/ pi 4) 0.01)(polar p (* 1.25 pi) 0.01)) 0)
      (getpoint "\nInput offset point:") "")
  (setq entl (entget (entlast)))
  (vl-cmdf "undo" 2 "")
  (entmake (cdr entl))
)

得到的是没宽度的线.
而且中间有输入点,那么(vl-cmdf "undo" 2 "")是不安全的.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-11-21 15:56:24 | 显示全部楼层
如果要一条线在与另一条线相交处断开,而且两条都是多义线,如何实现?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-11-21 16:24:22 | 显示全部楼层
最初由 wlz088 发布
[B]如果要一条线在与另一条线相交处断开,而且两条都是多义线,如何实现? [/B]

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-27 15:37 , Processed in 0.289644 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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