vitalgg
发表于 2024-6-21 11:32:36
本帖最后由 vitalgg 于 2024-6-21 11:34 编辑
https://gitee.com/atlisp/atlisp-lib/blob/main/src/ui/dyndraw.lsp
https://atlisp.cn/static/videos/funlib/ui@dyndraw.mp4
lijiao
发表于 2024-6-21 11:34:17
你纠结的是"但是如何规避在移动的过程中取消命令,把在(0 0)插入的图元清除掉呢?"
要解决这个问题是比较麻烦,可以给你一个思路:
1.生成图元后,立即把图元的句柄保存到词典当中,然后再进行拖拽图元,拖拽结束后删除保存的词典数据
2.定义一个命令反应器,命令结束后执行
3.在反应器的回调函数中,根据词典中的句柄找到图元,然后删除图元和词典
自贡黄明儒
发表于 2024-6-21 16:00:08
本帖最后由 自贡黄明儒 于 2024-6-21 16:15 编辑
dcl1214 发表于 2024-6-21 09:45
用了vl-catch-all-apply以后就不会生成在坐标上了
试了下,你这方法不行,回车照样产生对象。
(defun C:t1 (/ PT SS)
(setq ss (ssget))
(setq pt (getpoint "\n >基点:"))
(VL-CATCH-ALL-APPLY 'vl-cmdf (list "_.copy" ss "" pt pause))
(princ)
)
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不选第二点的错误。一步一个坑啊。。。
dcl1214
发表于 2024-6-22 11:02:38
自贡黄明儒 发表于 2024-6-21 16:00
试了下,你这方法不行,回车照样产生对象。
用vl-catch-all-apply的目的是捕捉错误,一旦捕捉到了错误,立刻将图元删除,自然不会遗留在图纸上了
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 基点点)进行删除多余的点。
你有种再说一遍
发表于 2024-6-22 19:08:47
因为你还在用command,有vla-move之类的
gzcsun
发表于 2024-6-22 20:21:02
本帖最后由 gzcsun 于 2024-6-22 20:23 编辑
(VL-CATCH-ALL-APPLY 'vl-cmdf
其本上是 nil 的:lol
自贡黄明儒
发表于 2024-6-22 21:39:40
liuxinkai 发表于 2024-6-22 18:02
大神,我研究了某插件,知道原理了,但是对最主要的一步看不懂,他们是这么实现的,以复制出来图元进行复 ...
是的。
lastpiont是pause产生的点。比较前后两点就行了。
yanshengjiang
发表于 2025-1-13 15:59:39
lijiao 发表于 2024-6-21 08:52
尝试一下这个函数(acet-ss-drag-move ss pt])
百度都没搞清楚这个acet函数有什么用 害