找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 979|回复: 6

[原创]:一个可以改变多义线顶点的LISP小程序

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

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

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

×
一个可以改变多义线顶点的LISP小程序

;;By Richard Liang
;;to move vertex of polyline
(defun c:test ()
  (vl-load-com)
  (setq p (getpoint "\nPick Point to move: ")
       pe (getpoint p "\nPick Destination Point: ")
      obj (vlax-ename->vla-object (ssname (ssget p) 0))
       pp (vlax-curve-getclosestpointto obj (trans p 1 0))
        n (fix (vlax-curve-getparamatpoint obj pp))
      pts (variant-value (vla-get-coordinates obj))
    nlist (reverse (vlax-safearray->list pts)))
  (setq pts (variant-value (vla-get-coordinates obj)))
  (vlax-safearray-put-element pts (* n 2)(car pe))
  (vlax-safearray-put-element pts (1+ (* n 2))(cadr pe))
  (setq nlist (vlax-safearray->list pts))
  (setq narray (vlax-make-safearray
                 vlax-vbDouble
                 (cons 0 (1- (length nlist)))))
  (vla-put-coordinates obj (vlax-safearray-fill narray nlist))
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-12-9 15:52:41 | 显示全部楼层

  1. (defun C:TT (/ P PE OBJ PP N PTS OBJ1)
  2.   (vl-load-com)
  3.   (setq        P   (getpoint "\nPick Point to move: ")
  4.         PE  (getpoint P "\nPick Destination Point: ")
  5.         OBJ (vlax-ename->vla-object (setq OBJ1 (ssname (ssget P) 0)))
  6.         PP  (vlax-curve-getclosestpointto OBJ (trans P 1 0))
  7.         N   (fix (vlax-curve-getparamatpoint OBJ PP))
  8.         PTS (variant-value (vla-get-coordinates OBJ))
  9.   )
  10.   (if (= "LWPOLYLINE" (cdr (assoc 0 (entget OBJ1))))
  11.     (progn
  12.       (vlax-safearray-put-element PTS (* N 2) (car PE))
  13.       (vlax-safearray-put-element PTS (1+ (* N 2)) (cadr PE))
  14.     )
  15.     (progn
  16.       (vlax-safearray-put-element PTS (* N 3) (car PE))
  17.       (vlax-safearray-put-element PTS (1+ (* N 3)) (cadr PE))
  18.       (vlax-safearray-put-element PTS (+ (* N 3) 2) (last PE))
  19.     )
  20.   )
  21.   (vla-put-coordinates OBJ PTS)
  22. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-12-10 05:32:39 | 显示全部楼层
2楼倒ti xing了我, 清除重复部分简化如下:

(defun c:test ()
  (vl-load-com)
  (setq        p     (getpoint "\nPick Point to move: ")
        pe    (getpoint p "\nPick Destination Point: ")
        obj   (vlax-ename->vla-object (ssname (ssget p) 0))
        pp    (vlax-curve-getclosestpointto obj (trans p 1 0))
        n     (fix (vlax-curve-getparamatpoint obj pp))
        pts   (variant-value (vla-get-coordinates obj)))
  (vlax-safearray-put-element pts (* n 2) (car pe))
  (vlax-safearray-put-element pts (1+ (* n 2)) (cadr pe))
  (vla-put-coordinates obj pts)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2003-12-10 16:26:56 | 显示全部楼层
最初由 wkai 发布
[B]用 夹点 移动不是很好么?
为什么要写这个程序呢? [/B]


对于某一操作, AutoCAD不仅提供了命令行, 菜单还提供了 AutoLISP, VBA等为什么呢? 就是为了用户自动化和二次开发.
对一般性操作而言, 使用夹点或PEDIT即可.但在某些场合下需使用程序来激发AUTOCAD作某一动作.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-10 17:13:47 | 显示全部楼层
最初由 lsjjm 发布
[B]
但在某些场合下需使用程序来激发AUTOCAD作某一动作 [/B]

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

使用道具 举报

发表于 2004-1-21 21:22:30 | 显示全部楼层
不用vla也很能简短

  1. (defun x@chpt ();(e frompt topt)
  2.   (setq e (car(setq el (entsel))) frompt (osnap (cadr el) "end") topt (getpoint frompt "\n顶点移动到:"))
  3.   (setq en (entget e)
  4.         frompt (list (car frompt)(cadr frompt))
  5.         pt (car (member (cons 10 frompt) (entget e)))
  6.         en (subst (cons 10 (list (car topt)(cadr topt))) pt en))
  7.   (entmod en)
  8. )


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-18 22:52 , Processed in 0.422848 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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