【程序讨论】关于模仿天正自由复制的方法
多年来一直有个想法。想去模仿并扩展天正的“自由复制”命令。使其完全取代COPY命令。但由于自身水平有限,且GRREAD函数不支持捕捉,而模拟捕捉点又会捕捉自身。所以久久未能成行。
今XD上有“裸奔的花猫”网友提出用GRVECS模仿实体来解决捕捉自身问题,看到些许希望,但仍不甚满意。
特来求助于大家,看是否还有其他办法实现。
我先发个不带捕捉的自由复制程序演示,让大家先了解下该程序的功能。(DEFUN C:T1 nil
(SETQ SS (SSGET ":L") PT (getpoint))
(setq size (* (getvar "viewsize") 2))
(command "_.copy" SS "" "0,0" "@")
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)(setvar "cmdecho" 0)
(PRINC "\n 指定插入点或A旋转s上下镜像D左右镜像+放大一倍-缩小一倍T改基点")
(while PT
(setq BB (grread T 5 1))
(cond
((= (car BB) 5) (SETQ PT1 (CADR BB)) (redRaw)
(GRVECS
(LIST -1 PT (mapcar '+ (LIST size 0 0) PT)
-1 PT (mapcar '-PT(LIST size 0 0))
-1 PT (mapcar '-PT(LIST0 size 0))
-1 PT (mapcar '+ (LIST0 size 0) PT)
)
)
(COMMAND "MOVE" SS"" PT PT1)(SETQ PT PT1)
)
((= (car BB) 3) (SETQ PT NIL))
((member BB '((2 97)(2 65)))
(COMMAND "ROTATE" SS "" PT1 90)
)
((member BB '((2 115)(2 83)))
(COMMAND "mirror" SS "" PT1 (mapcar '- pt1 '(1 0)) "Y")
)
((member BB '((2 100)(2 68)))
(COMMAND "mirror" SS "" PT1 (mapcar '- pt1 '(0 1)) "Y")
)
((member BB '((2 43)(2 61)))
(COMMAND "scale" SS "" PT1 "2")
)
((member BB '((2 116)(2 84)))
(setvar "osmode" oldos)(redRaw)
(setq pt (getpoint))
(setvar "osmode" 0)
)
((equal BB '(2 45))
(COMMAND "scale" SS "" PT1 "0.5")
)
)
)
(setvar "osmode" oldos)(redRaw)(princ)
) 本帖最后由 wowan1314 于 2013-6-20 13:46 编辑
再来发个带捕捉的“山寨自由复制”。 大家可看到模拟的捕捉会捕捉到自身而导致无法正确运行。(DEFUN C:T2 nil
(SETQ SS (SSGET ":L") PT (getpoint))
(setq size (* (getvar "viewsize") 2))
(command "_.copy" SS "" "0,0" "@")
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)(setvar "cmdecho" 0)
(PRINC "\n 指定插入点或A旋转s上下镜像D左右镜像+放大一倍-缩小一倍T改基点")
(while PT
(setq BB (grread T 5 1))
(cond
((= (car BB) 5) (SETQ PT1 (CADR BB)) (redRaw)
(if
(setq
nearpt (osnap PT1 "_END,_MID,INT")
) ; 取得最近的捕捉点
(PROGN
(setq g2 nearpt)
(setq h (/ (getvar "viewsize")
(cadr (getvar "screensize"))
)
d (getvar "pickbox")
lst (list (* d h) (* (- d 0.5) h) (* (+ d 0.5) h))
ptx (car g2)
pty (cadr g2)
)
(foreach x lst
(setqptt1 (list (- ptx x) (- pty x))
ptt2 (list (+ ptx x) (- pty x))
ptt3 (list (+ ptx x) (+ pty x))
ptt4 (list (- ptx x) (+ pty x))
)
(grvecs (list 2 ptt1 ptt2 ptt2 ptt3 ptt3 ptt4 ptt4 ptt1))
)
)
)
(GRVECS
(LIST -1 PT (mapcar '+ (LIST size 0 0) PT)
-1 PT (mapcar '-PT(LIST size 0 0))
-1 PT (mapcar '-PT(LIST0 size 0))
-1 PT (mapcar '+ (LIST0 size 0) PT)
)
)
(COMMAND "MOVE" SS"" PT PT1)(SETQ PT PT1)
)
((= (car BB) 3) (SETQ PT NIL))
((member BB '((2 97)(2 65)))
(COMMAND "ROTATE" SS "" PT1 90)
)
((member BB '((2 115)(2 83)))
(COMMAND "mirror" SS "" PT1 (mapcar '- pt1 '(1 0)) "Y")
)
((member BB '((2 100)(2 68)))
(COMMAND "mirror" SS "" PT1 (mapcar '- pt1 '(0 1)) "Y")
)
((member BB '((2 43)(2 61)))
(COMMAND "scale" SS "" PT1 "2")
)
((member BB '((2 116)(2 84)))
(setvar "osmode" oldos)(redRaw)
(setq pt (getpoint))
(setvar "osmode" 0)
)
((equal BB '(2 45))
(COMMAND "scale" SS "" PT1 "0.5")
)
)
)
(setvar "osmode" oldos)(redRaw)(princ)
) 本帖最后由 wowan1314 于 2013-6-20 13:52 编辑
如何让模拟的捕捉,不去捕捉我要复制的实体呢?
我开始想到的是方案1、(模拟捕捉的时候同时选择实体,如果选择到的实体是要复制的实体中的一部分则不去模拟捕捉)
此方案估计不行,因为通过点获取实体,如果基点选到复制的实体上,那么估计就选不到其他实体了。也就无法捕捉了。
wowan1314 发表于 2013-6-20 13:48 static/image/common/back.gif
如何让模拟的捕捉,不去捕捉我要复制的实体呢?
我开始想到的是方案1、(模拟捕捉的时候同时选择实体,如 ...
【Gu_xl】【源码分享】自定义带捕捉的grread函数 本帖最后由 wowan1314 于 2013-6-20 14:42 编辑
Gu_xl 发表于 2013-6-20 14:02 static/image/common/back.gif
【Gu_xl】【源码分享】自定义带捕捉的grread函数
大意了! 一直没细看G版的这个帖子,想当然的以为就是模拟了捕捉而已。
原来也考虑了这方面的问题。。。。。
很好的方法! 直接利用函数太卡了。 我试着融入进我的代码中看看。 想不捕捉到自己,只要将复制的选择集在计算捕捉的时候隐藏就行了,但是确实会很卡,可考虑用.net的jig。天正的自由复制是很好的,我编出来之后还是选择用回天正的了,只是天正这个对于物体对齐还不是很方便 好东西 就是一直在闪 还不支持极轴 这么多年了 希望大师能优化出来 高飞鸟的jig函数 xinxirong 发表于 2018-9-22 08:59
高飞鸟的jig函数
大神能整合一下吗
页:
[1]
2