正如我写的那样,我们以前有过这个话题。我喜欢Frerefill的版本,因为它简单,但也许我会试试Alan的版本。 嗨Mircea,
thanx,很抱歉,在我上次发帖之前,我没有看到你的回复。我会试试你的方法;OSNAP也是我的嫌疑犯。
拉尔夫 嗨Mircea,
基本上,你的代码是有效的。只是它在选择点之前停用了osnap,这不是很好。此外,它似乎不会重新激活osnap。看起来你的代码会询问osnap状态,然后会重新生成它,但我不完全明白怎么做。因此,我将其改为我更原始的方式,现在它似乎起作用了:
(defun c:TZP ( / OldOsm a b c s)
(princ "Select objects: ")
(if (and (setq s (ssget))
(setq a (getpoint "\nSelect item base point: "))
(setq b (getpoint "\nSelect target point: ")))
(progn
(setq c (list (car a) (cadr a) (caddr b)))
(COMMAND "_OSNAP" "")
(vl-cmdf "_move" s "" a c)
)
)
(COMMAND "_OSNAP" "_END,_INT,_MID,_CEN,_INS,_PER")
(princ)
) 似乎您错过了复制我的示例中的一些行-我将它们与每个操作的注释一起添加到您的代码中。OSNAP模式存储在OSMODE系统变量中:1、当前设置存储在局部变量中;第二,禁用该模式以不干扰命令调用;第三,恢复先前存储的状态。
请记住,在完成例程后恢复用户环境是一种非常好的编程实践。
(defun c:TZP ( / OldOsm a b c s)
(setq OldOsm (getvar "OSMODE")) ;retain current state of OSNAP mode
(princ "Select objects: ")
(if (and (setq s (ssget))
(setq a (getpoint "\nSelect item base point: "))
(setq b (getpoint "\nSelect target point: ")))
(progn
(setq c (list (car a) (cadr a) (caddr b)))
;(COMMAND "_OSNAP" "")
(setvar "OSMODE" 0) ;disable OSNAP mode
(vl-cmdf "_move" s "" a c)
)
)
(setvar "OSMODE" OldOsm) ;restore previous state of OSNAP mode
;(COMMAND "_OSNAP" "_END,_INT,_MID,_CEN,_INS,_PER")
(princ)
)
当做
米尔恰 @Randolph,你是对的,之前的代码中有一个错误-我现在修复了它。很抱歉给您带来不便。非常感谢。
当做
米尔恰 不要道歉,你帮了我很多!我同意恢复以前地位的方法更优雅。但另一方面,我有很多命令(命令“\u OSNAP”“\u END,\u INT,\u MID,\u CEN,\u PER,\u INS”)。这是因为我不是程序员,复制了我的acad。lsp来自多个地方。
顺便问一下:你介意在我的另一个帖子上唠叨一下吗
绕x、y、z轴旋转
总之,这似乎是一个问题。 如果决定切换到使用系统变量而不是命令调用,则可以通过汇总每个所需模式的值来设置当前模式:
None 0
Endpoint 1
Midpoint 2
Center 4
Node 8
Quadrant 16
Intersection 32
Insertion 64
Perpendicular 128
Tangent 256
Nearest 512
Apparent Intersection 2048
Extension 4096
Parallel 8192
例如:端点+中点+象限:OSMODE=1+2+16=19
当做
米尔恰
页:
1
[2]