乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 107|回复: 19

[编程交流] 基于位置选择对象

[复制链接]

1

主题

10

帖子

9

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 14:42:36 | 显示全部楼层 |阅读模式
我在autocad中有一个模型,我想让autolisp选择一组由相对于WCS的位置或自定义UCS定义的块,然后将它们相对于当前UCS旋转90度。我试图使用SSGET来选择块,但我似乎无法正确地获得语法。例如,我希望能够让autocad选择其基点位于Z>0的所有对象。
 
我能够在filters和qselect中定义选择集,但我看不出有任何方法可以让autocad通过命令提示符运行这些函数,从而使这些工作徒劳无功。
任何帮助都将不胜感激。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 14:47:49 | 显示全部楼层
也许:
 
  1. (defun c:selObj (/ ss ent)
  2. (if (setq ss (ssget "X" (list (cons 0 "INSERT")
  3.                                (if (getvar "CTAB")(cons 410 (getvar "CTAB"))
  4.                                  (cons 67 (- 1 (getvar "TILEMODE")))))))
  5.    (progn
  6.      (foreach ent (mapcar 'cadr (ssnamex ss))
  7.        (if (not (> (cadddr (assoc 10 (entget ent))) 0))
  8.          (ssdel ent ss)))
  9.      (if (not (zerop (sslength ss)))
  10.        (command "_rotate" ss "" pause pause)))
  11.    (princ "\n<!> No Blocks Found <!>"))
  12. (princ))
回复

使用道具 举报

1

主题

10

帖子

9

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 14:51:31 | 显示全部楼层
哇,这正是我需要它做的。非常感谢你的帮助!
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 14:54:00 | 显示全部楼层
没有问题,
 
如果你对代码有任何问题,就大声说出来
 
回复

使用道具 举报

1

主题

10

帖子

9

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 14:56:13 | 显示全部楼层
我修改了每个轴的代码,将CADDRR更改为CADDR和CADR,以便在必要时对每个轴使用它。我注意到,如果一个块被一个函数移动,比如说,在z轴下方,再次运行代码仍然会选择该块,即使其z位置现在为负。我是否遗漏了一些可以清除列表并让其重新扫描以确定哪些块符合要选择的标准的内容?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 14:59:22 | 显示全部楼层
我不太明白-选择集是局部的,因此在函数完成时设置为零。
回复

使用道具 举报

1

主题

10

帖子

9

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 15:02:08 | 显示全部楼层
我正在制作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)
)
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:07:55 | 显示全部楼层
好的,试试这个-我已经对代码中可能出现的错误进行了注释:
 
  1. (defun c:yellowr  (/ oldosn ss)  ;;  Make sure you localise the variables!
  2. (setq oldosn (getvar "osmode"))
  3. (setvar "osmode" 0)
  4. (yellowucs)  ; Shouldn't need (c:xxx), just (xxx)
  5. (if (setq ss (ssget "X"
  6.                      (list (cons 0 "INSERT")
  7.                            (if (getvar "CTAB")
  8.                              (cons 410 (getvar "CTAB"))
  9.                              (cons 67 (- 1 (getvar "TILEMODE")))))))
  10.    (progn
  11.      (foreach ent  (mapcar 'cadr (ssnamex ss))
  12.        (if (not (< (cadddr (assoc 10 (entget ent))) -10)) ;; Z value less than -10
  13.          (ssdel ent ss)))
  14.      (if (not (zerop (sslength ss)))
  15.        (repeat 9
  16.          (command "_rotate" ss "" '(0 0 0) -10))))  ; Don't feel the need for variable "pt1"
  17.    (princ "\n<!> No Blocks Found <!>"))
  18. (setvar "osmode" oldosn)
  19. (princ))  ; Make sure you exit cleanly
  20. (defun c:oranger  (/ oldosn ss)
  21. (setq oldosn (getvar "osmode"))
  22. (setvar "osmode" 0)
  23. (orangeucs)
  24. (if (setq ss (ssget "X"
  25.                      (list (cons 0 "INSERT")
  26.                            (if (getvar "CTAB")
  27.                              (cons 410 (getvar "CTAB"))
  28.                              (cons 67 (- 1 (getvar "TILEMODE")))))))
  29.    (progn
  30.      (foreach ent  (mapcar 'cadr (ssnamex ss))
  31.        (if (not (> (cadddr (assoc 10 (entget ent))) 10)) ;; Z value greater than 10
  32.          (ssdel ent ss)))
  33.      (if (not (zerop (sslength ss)))
  34.        (repeat 9
  35.          (command "_rotate" ss "" '(0 0 0) -10))))
  36.    (princ "\n<!> No Blocks Found <!>"))
  37. (setvar "osmode" oldosn)
  38. (princ))
  39. (defun c:redr  (/ oldosn ss)
  40. (setq oldosn (getvar "osmode"))
  41. (setvar "osmode" 0)
  42. (reducs)
  43. (if (setq ss (ssget "X"
  44.                      (list (cons 0 "INSERT")
  45.                            (if (getvar "CTAB")
  46.                              (cons 410 (getvar "CTAB"))
  47.                              (cons 67 (- 1 (getvar "TILEMODE")))))))
  48.    (progn
  49.      (foreach ent  (mapcar 'cadr (ssnamex ss))
  50.        (if (not (< (caddr (assoc 10 (entget ent))) -10)) ;; Y value less than -10
  51.          (ssdel ent ss)))
  52.      (if (not (zerop (sslength ss)))
  53.        (repeat 9
  54.          (command "_rotate" ss "" '(0 0 0) -10))))
  55.    (princ "\n<!> No Blocks Found <!>"))
  56. (setvar "osmode" oldosn)
  57. (princ))
  58. (defun c:purpler  (/ oldosn ss)
  59. (setq oldosn (getvar "osmode"))
  60. (setvar "osmode" 0)
  61. (purpleucs)
  62. (if (setq ss (ssget "X"
  63.                      (list (cons 0 "INSERT")
  64.                            (if (getvar "CTAB")
  65.                              (cons 410 (getvar "CTAB"))
  66.                              (cons 67 (- 1 (getvar "TILEMODE")))))))
  67.    (progn
  68.      (foreach ent  (mapcar 'cadr (ssnamex ss))
  69.        (if (not (> (caddr (assoc 10 (entget ent))) 10)) ;; Y value greater than 10
  70.          (ssdel ent ss)))
  71.      (if (not (zerop (sslength ss)))
  72.        (repeat 9
  73.          (command "_rotate" ss "" '(0 0 0) -10))))
  74.    (princ "\n<!> No Blocks Found <!>"))
  75. (setvar "osmode" oldosn)
  76. (princ))

确保本地化变量,以便在程序完成时将其设置为零。
 
您在每个代码中都使用了“ss”,因此这可能会导致问题。
 
此外,请记住添加“princ”以干净地退出。
 
让我知道你进展如何。
 
回复

使用道具 举报

1

主题

10

帖子

9

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 15:08:27 | 显示全部楼层
我试过了,但还是走错了路。但它似乎并没有始终如一地做到这一点。对于每个函数,如果它是我尝试的第一个函数,那么它就可以工作,但一旦我开始一个接一个地做几件事情,事情就会发生故障。有没有办法把autocad文件本身发送给你?它对于论坛限制来说太大了。
UCS。lsp
旋转lsp
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:11:17 | 显示全部楼层
我会用这个:
 
如果每种颜色都在做相同的事情,则不需要为每种颜色都使用新的ucs函数-只有一个函数需要一个参数。
 
此外,变量ss未定位在第一个函数中。
 
还有一件事,为什么会重复?为什么不旋转90度呢?
旋转lsp
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-6-3 10:10 , Processed in 1.148621 second(s), 79 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表