明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: liuxinkai

[讨论] 移动效果

[复制链接]
发表于 2024-6-21 11:32:36 | 显示全部楼层
本帖最后由 vitalgg 于 2024-6-21 11:34 编辑

https://gitee.com/atlisp/atlisp-lib/blob/main/src/ui/dyndraw.lsp



发表于 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)
)



本帖子中包含更多资源

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

x
 楼主| 发表于 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不选第二点的错误。一步一个坑啊。。。
发表于 2024-6-22 11:02:38 | 显示全部楼层
自贡黄明儒 发表于 2024-6-21 16:00
试了下,你这方法不行,回车照样产生对象。

用vl-catch-all-apply的目的是捕捉错误,一旦捕捉到了错误,立刻将图元删除,自然不会遗留在图纸上了
 楼主| 发表于 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-x  2y-y)的情况【(command PAUSE)中断,没有选取了点的情况)】
                    (PROGN (清除复制出来的图元) (setq 基点点  nil))
                    (PROGN (基点点改为转换出来的坐标的点));如果是选取了点,那么除非特殊情况,否则基点坐标不等于坐标差值。重新定义新的基点坐标,进行下一轮操作
                  最后(ENTDEL 基点点)进行删除多余的点。

发表于 2024-6-22 19:08:47 | 显示全部楼层
因为你还在用command,有vla-move之类的
发表于 2024-6-22 20:21:02 | 显示全部楼层
本帖最后由 gzcsun 于 2024-6-22 20:23 编辑

(VL-CATCH-ALL-APPLY 'vl-cmdf
其本上是 nil 的
发表于 2024-6-22 21:39:40 | 显示全部楼层
liuxinkai 发表于 2024-6-22 18:02
大神,我研究了某插件,知道原理了,但是对最主要的一步看不懂,他们是这么实现的,以复制出来图元进行复 ...

是的。
lastpiont是pause产生的点。比较前后两点就行了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-9-28 23:29 , Processed in 0.183786 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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