基于位置选择对象
我在autocad中有一个模型,我想让autolisp选择一组由相对于WCS的位置或自定义UCS定义的块,然后将它们相对于当前UCS旋转90度。我试图使用SSGET来选择块,但我似乎无法正确地获得语法。例如,我希望能够让autocad选择其基点位于Z>0的所有对象。我能够在filters和qselect中定义选择集,但我看不出有任何方法可以让autocad通过命令提示符运行这些函数,从而使这些工作徒劳无功。
任何帮助都将不胜感激。 也许:
(defun c:selObj (/ ss ent)
(if (setq ss (ssget "X" (list (cons 0 "INSERT")
(if (getvar "CTAB")(cons 410 (getvar "CTAB"))
(cons 67 (- 1 (getvar "TILEMODE")))))))
(progn
(foreach ent (mapcar 'cadr (ssnamex ss))
(if (not (> (cadddr (assoc 10 (entget ent))) 0))
(ssdel ent ss)))
(if (not (zerop (sslength ss)))
(command "_rotate" ss "" pause pause)))
(princ "\n<!> No Blocks Found <!>"))
(princ))
哇,这正是我需要它做的。非常感谢你的帮助! 没有问题,
如果你对代码有任何问题,就大声说出来
李 我修改了每个轴的代码,将CADDRR更改为CADDR和CADR,以便在必要时对每个轴使用它。我注意到,如果一个块被一个函数移动,比如说,在z轴下方,再次运行代码仍然会选择该块,即使其z位置现在为负。我是否遗漏了一些可以清除列表并让其重新扫描以确定哪些块符合要选择的标准的内容? 我不太明白-选择集是局部的,因此在函数完成时设置为零。 我正在制作rubiks立方体的动画,我正在编写旋转边的命令。基本上,我加载了两个lisp文件,然后手动运行每个命令。运行oranger函数会旋转z轴(立方体的橙色一侧)上高于10的所有块,然后我运行redr,它会旋转y轴(立方体的红色一侧)上低于-10的块。如果我再次运行oranger,它会选择与oranger第一次运行时相同的块集,即使redr切换了块。这对立方体意味着,由于某些原因,一些不再位于橙色面上的块仍在被选择,而橙色面上的其他块则没有。确实被选中的块最终会在静止的块之间滑动。以下是我的选择和旋转代码。c:COLORucs命令调用另一个函数,该函数仅建立ucs,以便在正确的平面中发生旋转。
再次感谢您的帮助!
-乔恩
(defun c:黄色()
(setq oldosn(getvar“osmode”))
(setvar“osmode”0)
(c:yellowucs)
(setq pt1(列表0)
(如果(setq ss(ssget“X”(列表(cons 0“插入”)
(if(getvar“CTAB”)(cons 410(getvar“CTAB”))
(cons 67(-1(getvar“TILEMODE”аа)ааа)аа)
(程序
(foreach ent(mapcar’cadr(ssnamex ss))
(如果没有)(
(ssdel ent ss)))
(if(not(zerop(sslength ss)))
(重复9
(命令“_rotate”ss”“pt1-10)
)
)
)
(princ“\n未找到块”))
(setvar“osmode”oldosn)
)
(defun c:橙色()
(setq oldosn(getvar“osmode”))
(setvar“osmode”0)
(c:orangeucs)
(setq pt1(列表0)
(如果(setq ss(ssget“X”(列表(cons 0“插入”)
(if(getvar“CTAB”)(cons 410(getvar“CTAB”))
(cons 67(-1(getvar“TILEMODE”аа)ааа)аа)
(程序
(foreach ent(mapcar’cadr(ssnamex ss))
(如果(不是(>(CADDR(assoc 10(entget ent)))10))
(ssdel ent ss)))
(if(not(zerop(sslength ss)))
(重复9
(命令“_rotate”ss”“pt1-10)
)
)
)
(princ“\n未找到块”))
(setvar“osmode”oldosn)
)
(定义c:redr()
(setq oldosn(getvar“osmode”))
(setvar“osmode”0)
(c:减少)
(setq pt1(列表0)
(如果(setq ss(ssget“X”(列表(cons 0“插入”)
(if(getvar“CTAB”)(cons 410(getvar“CTAB”))
(cons 67(-1(getvar“TILEMODE”аа)ааа)аа)
(程序
(foreach ent(mapcar’cadr(ssnamex ss))
(如果(不是(
(ssdel ent ss)))
(if(not(zerop(sslength ss)))
(重复9
(命令“_rotate”ss”“pt1-10)
)
)
)
(princ“\n未找到块”))
(setvar“osmode”oldosn)
)
(defun c:紫色()
(setq oldosn(getvar“osmode”))
(setvar“osmode”0)
(c:紫色)
(setq pt1(列表0)
(如果(setq ss(ssget“X”(列表(cons 0“插入”)
(if(getvar“CTAB”)(cons 410(getvar“CTAB”))
(cons 67(-1(getvar“TILEMODE”аа)ааа)аа)
(程序
(foreach ent(mapcar’cadr(ssnamex ss))
(如果(不是(>(caddr(assoc 10(entget ent)))10))
(ssdel ent ss)))
(if(not(zerop(sslength ss)))
(重复9
(命令“_rotate”ss”“pt1-10)
)
)
)
(princ“\n未找到块”))
(setvar“osmode”oldosn)
) 好的,试试这个-我已经对代码中可能出现的错误进行了注释:
(defun c:yellowr(/ oldosn ss);;Make sure you localise the variables!
(setq oldosn (getvar "osmode"))
(setvar "osmode" 0)
(yellowucs); Shouldn't need (c:xxx), just (xxx)
(if (setq ss (ssget "X"
(list (cons 0 "INSERT")
(if (getvar "CTAB")
(cons 410 (getvar "CTAB"))
(cons 67 (- 1 (getvar "TILEMODE")))))))
(progn
(foreach ent(mapcar 'cadr (ssnamex ss))
(if (not (< (cadddr (assoc 10 (entget ent))) -10)) ;; Z value less than -10
(ssdel ent ss)))
(if (not (zerop (sslength ss)))
(repeat 9
(command "_rotate" ss "" '(0 0 0) -10)))); Don't feel the need for variable "pt1"
(princ "\n<!> No Blocks Found <!>"))
(setvar "osmode" oldosn)
(princ)); Make sure you exit cleanly
(defun c:oranger(/ oldosn ss)
(setq oldosn (getvar "osmode"))
(setvar "osmode" 0)
(orangeucs)
(if (setq ss (ssget "X"
(list (cons 0 "INSERT")
(if (getvar "CTAB")
(cons 410 (getvar "CTAB"))
(cons 67 (- 1 (getvar "TILEMODE")))))))
(progn
(foreach ent(mapcar 'cadr (ssnamex ss))
(if (not (> (cadddr (assoc 10 (entget ent))) 10)) ;; Z value greater than 10
(ssdel ent ss)))
(if (not (zerop (sslength ss)))
(repeat 9
(command "_rotate" ss "" '(0 0 0) -10))))
(princ "\n<!> No Blocks Found <!>"))
(setvar "osmode" oldosn)
(princ))
(defun c:redr(/ oldosn ss)
(setq oldosn (getvar "osmode"))
(setvar "osmode" 0)
(reducs)
(if (setq ss (ssget "X"
(list (cons 0 "INSERT")
(if (getvar "CTAB")
(cons 410 (getvar "CTAB"))
(cons 67 (- 1 (getvar "TILEMODE")))))))
(progn
(foreach ent(mapcar 'cadr (ssnamex ss))
(if (not (< (caddr (assoc 10 (entget ent))) -10)) ;; Y value less than -10
(ssdel ent ss)))
(if (not (zerop (sslength ss)))
(repeat 9
(command "_rotate" ss "" '(0 0 0) -10))))
(princ "\n<!> No Blocks Found <!>"))
(setvar "osmode" oldosn)
(princ))
(defun c:purpler(/ oldosn ss)
(setq oldosn (getvar "osmode"))
(setvar "osmode" 0)
(purpleucs)
(if (setq ss (ssget "X"
(list (cons 0 "INSERT")
(if (getvar "CTAB")
(cons 410 (getvar "CTAB"))
(cons 67 (- 1 (getvar "TILEMODE")))))))
(progn
(foreach ent(mapcar 'cadr (ssnamex ss))
(if (not (> (caddr (assoc 10 (entget ent))) 10)) ;; Y value greater than 10
(ssdel ent ss)))
(if (not (zerop (sslength ss)))
(repeat 9
(command "_rotate" ss "" '(0 0 0) -10))))
(princ "\n<!> No Blocks Found <!>"))
(setvar "osmode" oldosn)
(princ))
确保本地化变量,以便在程序完成时将其设置为零。
您在每个代码中都使用了“ss”,因此这可能会导致问题。
此外,请记住添加“princ”以干净地退出。
让我知道你进展如何。
李 我试过了,但还是走错了路。但它似乎并没有始终如一地做到这一点。对于每个函数,如果它是我尝试的第一个函数,那么它就可以工作,但一旦我开始一个接一个地做几件事情,事情就会发生故障。有没有办法把autocad文件本身发送给你?它对于论坛限制来说太大了。
UCS。lsp
旋转lsp 我会用这个:
如果每种颜色都在做相同的事情,则不需要为每种颜色都使用新的ucs函数-只有一个函数需要一个参数。
此外,变量ss未定位在第一个函数中。
还有一件事,为什么会重复?为什么不旋转90度呢?
旋转lsp
页:
[1]
2