明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2228|回复: 13

[源码] 贺论坛度假归来,源码放送:::多重旋转复制

[复制链接]
发表于 2021-10-23 16:22:53 | 显示全部楼层 |阅读模式
rotate在指定旋转角度时
必须要给出一个确定的值
不能通过右键取消
右键的功能是重复上次旋转角
而且无法通过lastpoint的变化来判断
最后是按了左键还是右键

虽然“旋转复制”这个功能用得不多
但是不能右键取消
始终是我的一个缺憾
论坛休假期间在QQ群里讨论时
灵光一闪解决了这个难题

解决方法其实也很简单
在正式指定旋转角度以前
先进行一次0度旋转
迫使“上次旋转角”归0
角度输入完成后
检测特定临时线的旋转角
来判断用户输入的是左键还是右键

源码在二楼
已加入出错处理
未添加对UCS的支持
有需要的可以自行修改


想实现右键取消其实有几种方法
但都不算完美

grread函数
主要是不能直接支持捕捉、正交等
有模拟的函数可用
但速度方面差强人意

getangle函数
单纯用于获取角度
可以添加关键字
缺少动态拖放的效果

借助其它动态拖放函数库
比如acet、高大侠的dyn函数库
其中acet代码编写简单
实操体验非常好
唯一不支持极轴追踪

高大侠的函数也非常不错
比国外同类函数强
应用需要一定的编程功底
缺点是CAD版本只支持到2014


"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2021-10-23 16:25:08 | 显示全部楼层
(defun c:co_ro_main()
        (defun err()
                (setvar "cmdecho" 0)
                (command "undo" "g")
                (setq oldosmode (getvar "osmode"))
                (setq olderr *error* )
                       
           (defun *error*(msg)       
                        (princ)
                        (setvar "cmdecho" 0)
                        (if (and tmpline (entget tmpline)) (command "erase" tmpline ""))
                        (if pick (command "erase" ss ""))
                       
                        (command "undo" "e")
                        (setvar "osmode" oldosmode)
                        (setq *error* olderr)
           (princ)
           )
       
           (defun no_err()
                   (setvar "cmdecho" 0)
                   (setq *error* olderr)
                   (command "undo" "e")
                (princ)
           )
       
        (princ)
        )
        (err)
       

        (setq pick NIL)
        (princ "\n多重旋转复制,选择对象...")
        (if (and
                                (setq ss (ssget))
                                (princ (strcat "已选择 " (itoa (sslength ss)) " 个图元"))
                                (setq 0pt (getpoint "\n指定旋转基点 : "))
                                (princ "ok 即将复制")
                                (entmake (list '(0 . "line") (cons 10 0pt) (cons 11 (polar 0pt 0 1)) (cons 62 256)))
                                (setq tmpline (entlast))
                )
                (progn
                        (command "rotate" ss "" "non" 0pt 0)                                ;;这一句的目的是让默认旋转角归0
                       
                        (setq loop T  num 0)
                        (while loop
                                        (command "ROTATE" "P" tmpline "" "non" 0pt "c")                ;;改用ro'c模式,提高流畅度。注意此时tmpline不再旋转,旋转的是它的副本。
                                        (princ "\n指定旋转角度 : ")
                                        (command PAUSE)
                                        (setq pick T)
                                        (entdel tmpline)
                                        (setq tmpline (entlast))
                                        (setq p11 (cdr (assoc 11 (entget tmpline))))
                                        (setq tmpjiao (angle 0pt p11))                        ;;tmpline副本的实际角度
                                       
                                        (if (equal tmpjiao 0 0.000001)
                                                (progn
                                                        (command "erase" ss tmpline "")
                                                        (princ (strcat "\n右键退出,共完成 " (itoa num) " 次旋转复制"))
                                                        (setq loop NIL)
                                                )
                                                (progn
                                                        (entdel (entlast))                                        ;;删除tmpline副本---因为它已经旋转过了
                                                        (setq num (1+ num))
                                                        (princ (strcat "第 " (itoa num) " 次复制"))
                                                       
                                                        (entmake (list '(0 . "line") (cons 10 0pt) (cons 11 (polar 0pt 0 1)) (cons 62 256)))
                                                        (setq tmpline (entlast))
                                                        (command "rotate" ss "" "non" 0pt 0)                ;;这一句的目的是让默认旋转角归0
                                                        (setq pick NIL)
                                                )
                                        )
                        )
                )
        )
        (no_err)
(princ)
)

评分

参与人数 1明经币 +1 收起 理由
bssurvey + 1 很给力!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-10-23 20:48:17 | 显示全部楼层
移动复制旋转
acet工具里本身就有
不过做得稀烂

加个移动不难
但是完全没有必要
本身就不是高频操作
整合进去使用概率更低
发表于 2021-10-23 17:18:32 | 显示全部楼层
论坛恢复是
值得高兴的事
谢谢大师的分享
发表于 2021-10-23 17:40:10 | 显示全部楼层
楼主的代码不错,如果在加上个移动后复制旋转更好
发表于 2021-10-23 19:22:12 来自手机 | 显示全部楼层
实用功能,谢谢分享!
发表于 2021-10-24 00:38:32 | 显示全部楼层
功能很實用,謝謝樓主的分享!
发表于 2021-10-24 10:36:53 | 显示全部楼层

论坛恢复是
值得高兴的事
发表于 2021-10-29 08:48:49 | 显示全部楼层
谢谢 “mastlong” 长老分享好东西!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 23:32 , Processed in 0.190948 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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