发个简单的小程序,预设两点执行copy操作
本帖最后由 masterlong 于 2021-6-19 19:00 编辑;;CC2P```预设两点,作为2CC命令的起点与终点
;;2CC````以预设2点进行快速复制
(defun c:cc2p()
(princ "\nCC2P```预设两点,作为2CC命令的起点与终点 \n2CC````以预设2点进行快速复制")
(if (and
(setq p1 (getpoint "\n指定预设第1点 : "))
(princ " ok ")
(setq p2 (getpoint p1 "\n指定预设第2点 : "))
(princ " ok ")
)
(progn
(setq cc2p###2plist (list (u2w p1) (u2w p2)))
(princ "\n预设复制坐标已完成,可使用【2CC】命令进行快速复制")
)
)
(princ)
)
(defun c:2cc()
(princ "\nCC2P```预设两点,作为2CC命令的起点与终点 \n2CC````以预设2点进行快速复制")
(if cc2p###2plist
(if (setq ss (ssget))
(progn
;;以下为个人使用习惯,可屏蔽-----复制后对象形成“上一选择集”
(setq ent (entlast))
(command "copy" ss "" "non" (w2u (car cc2p###2plist))"non" (w2u (cadr cc2p###2plist)))
(princ "\n预设点快速复制已完成")
;;以下为个人使用习惯,可屏蔽-----复制后对象形成“上一选择集”
(setq ss (entbackss ent))
(if (null ss)
(setq ss (ssadd))
)
(oldss2act ss)
)
)
(progn
(c:cc2p)
(c:2cc)
)
)
(princ)
)
;999`````````````````````````````````````````````公共函数
;999公共函数
;;坐标WCS=>UCS
(defun w2u( pt )
(trans pt 0 1)
)
;999公共函数
;;坐标UCS=>WCS
(defun u2w( pt )
(trans pt 1 0)
)
;999公共函数
;;获取在图元 ent 之后产生的图元的选择集 ,ent不存在时返回nil
(defun entbackss ( ent / backss)
(if (and ent (entget ent))
(progn
(setq backss (ssadd))
(while (setq ent (entnext ent))
(if (not (member (cdr (assoc 0 (entget ent))) '("ATTRIB" "VERTEX" "SEQEND")))
(setq backss (ssadd ent backss))
)
)
(if (zerop (sslength backss))
(setq backss NIL)
)
backss
)
)
)
;999公共函数
;;一个已存在的选择集,设置成当前选择集
(defun oldss2act( oldss )
(sssetfirst Nil oldss);;将选择集设为夹点显示模式
(ssget "i")
(sssetfirst nil nil)
)
cj52000 发表于 2021-6-18 09:58
大师,按照你说的已经改了,如下图示,但是运行后提示如下
命令: cc2p
按你的需求应该是下面这样
(defun c:cc2p()
(princ "\nCC2P```预设两点,作为2CC命令的起点与终点 \n2CC````以预设2点进行快速复制")
(if (and
(setq p2 (getpoint "\n指定预设终点 : "))
(princ " ok ")
(setq p1 (getpoint p2 "\n指定预设基点 : "))
(princ " ok ")
)
(progn
(setq cc2p###2plist (list (u2w p1) (u2w p2)))
(princ "\n预设复制坐标已完成,可使用【2CC】命令进行快速复制")
)
)
(princ)
)
另外说一句
因为这个程序是单独命令设置基点和终点
所以改变指定基点终点的顺序
其实没有意义
反而容易操作失误
如果是实时指定点坐标
那可能有一点点用
但是彻底颠覆操作顺序
我认为欠妥
(defun c:tt5 ( / ent ss )
(if (setq ss (ssget))
(progn
(setq ent (entlast))
(command "copy" ss "" pause pause)
(command)
(setq ss (entbackss ent))
(if (null ss)
(setq ss (ssadd))
)
(oldss2act ss)
)
)
) 这是特殊情况下的应用解决方案
并不适合常规场景的应用
首先
“复制”这个动作会非常频繁
但并不是一次“复制”接一次“复制”
而是“复制”与“复制”之间会有很多其它操作
其次复制对象并不固定
最后
“复制完成时”的视窗
我需要停留在复制对象所在的区域 现在经常会有多次的超远距离的复制操作
需要不停的缩放窗口
这个程序的目的
就是预设起点与终点
直接选择对象完成复制
这种情况用Ctrl+shift+C更方便吧 遇到这种情况,我用对齐命令 align ,只对齐1点,还有1个好处,可以用 ‘P 上次选择的内容重复移动 简单说
copy命令是先选择对象再选择基点终点
由于基点终点相隔非常远
复制的同时伴随了非常多的视窗缩放操作
而这个是先指定并记忆了基点终点再选择对象
因为基点终点相对固定
从而省略了大量的视窗缩放操作 非常有价值的程序,谢谢楼主分享。 非常好的创意,,谢谢楼主的分享 哈哈 刚想说空了 自己写一个 结果发现有现成的 很不错 感谢分享 谢谢! 楼主分享程序!!!!!!