masterlong 发表于 2021-6-14 19:07:48

发个简单的小程序,预设两点执行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)
)

masterlong 发表于 2021-6-19 18:59:24

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)
)

另外说一句
因为这个程序是单独命令设置基点和终点
所以改变指定基点终点的顺序
其实没有意义
反而容易操作失误
如果是实时指定点坐标
那可能有一点点用
但是彻底颠覆操作顺序
我认为欠妥

magicheno 发表于 2021-6-29 21:18:09

(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)
)
)
)

masterlong 发表于 2021-6-15 16:39:19

这是特殊情况下的应用解决方案
并不适合常规场景的应用

首先
“复制”这个动作会非常频繁
但并不是一次“复制”接一次“复制”
而是“复制”与“复制”之间会有很多其它操作
其次复制对象并不固定
最后
“复制完成时”的视窗
我需要停留在复制对象所在的区域

masterlong 发表于 2021-6-14 19:13:51

现在经常会有多次的超远距离的复制操作
需要不停的缩放窗口
这个程序的目的
就是预设起点与终点
直接选择对象完成复制

cghdy 发表于 2021-6-15 09:37:07

这种情况用Ctrl+shift+C更方便吧

alexmai 发表于 2021-6-15 10:17:42

遇到这种情况,我用对齐命令 align ,只对齐1点,还有1个好处,可以用 ‘P 上次选择的内容重复移动

masterlong 发表于 2021-6-15 16:51:23

简单说
copy命令是先选择对象再选择基点终点
由于基点终点相隔非常远
复制的同时伴随了非常多的视窗缩放操作

而这个是先指定并记忆了基点终点再选择对象
因为基点终点相对固定
从而省略了大量的视窗缩放操作

panliang9 发表于 2021-6-16 08:59:20

非常有价值的程序,谢谢楼主分享。

999999 发表于 2021-6-16 09:39:07

非常好的创意,,谢谢楼主的分享

nijiea123 发表于 2021-6-16 19:30:52

哈哈 刚想说空了 自己写一个 结果发现有现成的 很不错 感谢分享

yoyoho 发表于 2021-6-16 19:58:32

谢谢! 楼主分享程序!!!!!!
页: [1] 2 3
查看完整版本: 发个简单的小程序,预设两点执行copy操作