liuxinkai 发表于 2024-6-21 08:22:32

移动效果

如何实现如源泉递增复制文字的效果:从原来的图元生成一个新的图元,并跟随鼠标移动到新的位置(cad移动的效果)。
《AUTOCAD完全应用指南》上有个例子,(command "insert" blkname '(0 0)1 1 0 dwgnum name ssca)(commnad "move" (entlast) "" '(0 0) pause),即先生成图元到(0 0)点,然后用command move配合pause以实现效果。但是如何规避在移动的过程中取消命令,把在(0 0)插入的图元清除掉呢?

liuxinkai 发表于 2024-6-22 18:02:23

自贡黄明儒 发表于 2024-6-21 16:00
试了下,你这方法不行,回车照样产生对象。



大神,我研究了某插件,知道原理了,但是对最主要的一步看不懂,他们是这么实现的,以复制出来图元进行复制为例:
选取图元>>图元
复制图元>>复制出来的图元
选取move的基点坐标>>基点坐标,比如(x y)
根据选取的基点生成基点点>>基点点

                  (command "._move")
                  (command 复制出来的图元)
                  (command 基点点);基点点和图元一块复制
                  (command "")
                  (command "non")
                  (command 基点坐标)
                  (command PAUSE);等待输入要移动到的坐标点
;;;下面这一句看不懂,太精妙
                  (setq 转换出来的坐标(TRANS (CDR (ASSOC 10 (ENTGET 基点点))) 0 1))

;;;上面这一句,如果 (command PAUSE)选取了点,那么转换出来的坐标=选取点的坐标;如果(command PAUSE)没有选取点,即我们中断了程序,那么转换出来的坐标=(2x,2y)。以下通过判断转换出来的坐标,进行移动或者删除图元。

                  (setq 坐标差值(MAPCAR '- 转换出来的坐标基点坐标));计算转换出来的坐标和基点坐标的差值,
                  (if (EQUALD 基点坐标 坐标差值);如果计算差值相等,即(x y)=(2x-x2y-y)的情况【(command PAUSE)中断,没有选取了点的情况)】
                  (PROGN (清除复制出来的图元) (setq 基点点nil))
                  (PROGN (基点点改为转换出来的坐标的点));如果是选取了点,那么除非特殊情况,否则基点坐标不等于坐标差值。重新定义新的基点坐标,进行下一轮操作
                  最后(ENTDEL 基点点)进行删除多余的点。

sniper1111 发表于 2024-6-21 11:17:21

sniper1111 发表于 2024-6-21 11:02
我最近也在研究es如何取消。没有找到合适的方法。听说老迈可以,但我没找到

                        (while tool
                                (setq gr (vl-catch-all-apply 'grread '(t 7 0)));;;获取grread参数。
                                (if (vl-catch-all-error-p gr)        ;判断gr是否有错误。
                                        (progn
                                                (vl-cmdf "UNDO" "b" "y")
                                                (setq tool nil)
                                        )


判断有误就回撤一步,或者删除图元也行

liuxinkai 发表于 2024-6-22 10:16:03

sniper1111 发表于 2024-6-21 11:17
(while tool
                                (setq gr (vl-catch-all-apply 'grread '(t 7 0)));;;获取grread参数。
                                (if (v ...

(defun C:asd()
(setq catchit (vl-catch-all-apply 'fuzhiyidong nil))
(if (vl-catch-all-error-p catchit)
    (princ "出错了")
    )
)
(defun fuzhiyidong();以复制圆演示
(setq yuanneirong (Vlax-Ename->Vla-Object (car (entsel))));得到原来的圆
(setq fuzhi_nr(Vlax-Invoke-Method yuanneirong 'Copy));复制出新的圆
(setq fuzhi_pt (Vlax-Get yuanneirong 'Center));原来圆的坐标
(command "move" (entlast) "" fuzhi_pt pause);移动
)

试了一下,如果在 (setq yuanneirong (Vlax-Ename->Vla-Object (car (entsel))))这一步不去选圆,vl-catch-all-apply是可以捕捉到的错误的。但是不能捕捉到(command "move" (entlast) "" fuzhi_pt pause)这个move不选第二点的错误。一步一个坑啊。。。

sniper1111 发表于 2024-6-21 08:40:04

你可以尝试一下while+grread ,论坛里很多就搜grread

liuxinkai 发表于 2024-6-21 08:44:17

sniper1111 发表于 2024-6-21 08:40
你可以尝试一下while+grread ,论坛里很多就搜grread

其实纠结的是能否省去先生成这一步,grread是不是也是有这个问题?比如文字,生成那一下是不是得给个坐标,中间取消了,是不是文字就生成在那个坐标上了?

lijiao 发表于 2024-6-21 08:52:27

尝试一下这个函数(acet-ss-drag-move ss pt ])

liuxinkai 发表于 2024-6-21 08:58:11

lijiao 发表于 2024-6-21 08:52
尝试一下这个函数(acet-ss-drag-move ss pt])

大神,从哪儿找的这个函数啊,我的几个文档中都没搜到。分享下呗。

自贡黄明儒 发表于 2024-6-21 09:00:52

liuxinkai 发表于 2024-6-21 08:58
大神,从哪儿找的这个函数啊,我的几个文档中都没搜到。分享下呗。

这是ET中的函数,早期的版本不主动安装ET
最后生成的对象,删除就行。

dcl1214 发表于 2024-6-21 09:45:43

liuxinkai 发表于 2024-6-21 08:44
其实纠结的是能否省去先生成这一步,grread是不是也是有这个问题?比如文字,生成那一下是不是得给个坐标 ...

用了vl-catch-all-apply以后就不会生成在坐标上了

sniper1111 发表于 2024-6-21 11:02:08

liuxinkai 发表于 2024-6-21 08:44
其实纠结的是能否省去先生成这一步,grread是不是也是有这个问题?比如文字,生成那一下是不是得给个坐标 ...

我最近也在研究es如何取消。没有找到合适的方法。听说老迈可以,但我没找到

liuxinkai 发表于 2024-6-21 11:21:56

sniper1111 发表于 2024-6-21 11:17
(while tool
                                (setq gr (vl-catch-all-apply 'grread '(t 7 0)));;;获取grread参数。
                                (if (v ...

抽空学习一下,感谢
页: [1] 2 3
查看完整版本: 移动效果