masterlong 发表于 2021-10-23 16:22:53

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

rotate在指定旋转角度时
必须要给出一个确定的值
不能通过右键取消
右键的功能是重复上次旋转角
而且无法通过lastpoint的变化来判断
最后是按了左键还是右键

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

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

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


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

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

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

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

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


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

masterlong 发表于 2021-10-23 20:48:17

移动复制旋转
acet工具里本身就有
不过做得稀烂

加个移动不难
但是完全没有必要
本身就不是高频操作
整合进去使用概率更低

ynhh 发表于 2021-10-23 17:18:32

论坛恢复是
值得高兴的事
谢谢大师的分享

bai2000 发表于 2021-10-23 17:40:10

楼主的代码不错,如果在加上个移动后复制旋转更好

xzd716 发表于 2021-10-23 19:22:12

实用功能,谢谢分享!

p-3-ianlcc 发表于 2021-10-24 00:38:32

功能很實用,謝謝樓主的分享!

czb203 发表于 2021-10-24 10:36:53


论坛恢复是
值得高兴的事

panliang9 发表于 2021-10-29 08:48:49

谢谢 “mastlong” 长老分享好东西!

znteo 发表于 2021-10-29 11:18:58

感谢分享:lol
页: [1] 2
查看完整版本: 贺论坛度假归来,源码放送:::多重旋转复制