乐筑天下

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

[编程交流] 需要LISP程序来选择al

[复制链接]

5

主题

14

帖子

9

银币

初来乍到

Rank: 1

铜币
25
发表于 2022-7-5 18:27:44 | 显示全部楼层 |阅读模式
嘿,伙计们,我相信有人能很快回答这个问题,所以我没有花太多时间寻找答案,我找不到。
 
基本上,当我从别人那里“清理”一幅画时,我必须删除很多东西。所以我使用QSELECT抓取层中的所有内容,然后删除它。
这个过程需要很长时间,我必须为我不需要的每一层反复做。如果有很多层,那么在qselect中查找它们可能会很单调。
 
所以基本上,我想要一个LISP程序,我只需要键入命令,例如,SALL,或其他什么,然后程序运行。它让我点击任何一个对象,然后立即选择与我点击的对象位于同一层的每个对象,当然包括我点击的对象。
 
我有一个类似的程序,用于删除层中的每个项目,但我不希望它自动删除所有内容。我需要在删除之前查看所选内容。所以我只想点击一个对象,让该层的每个对象都被选中。
 
知道什么节目吗?
 
谢谢
回复

使用道具 举报

0

主题

269

帖子

279

银币

限制会员

铜币
-4
发表于 2022-7-5 18:33:43 | 显示全部楼层
这是一个“Q&D”Lisp程序。
 
  1. (defun c:SALL ()
  2. (setq TargEnt (car (entsel "\nSelect object on layer to select: ")))
  3. (setq TargLayer (assoc 8 (entget TargEnt)))
  4. (sssetfirst nil (ssget "_X" (list TargLayer)))
  5. (princ)
  6. )
回复

使用道具 举报

5

主题

14

帖子

9

银币

初来乍到

Rank: 1

铜币
25
发表于 2022-7-5 18:36:11 | 显示全部楼层
嘿,太棒了!
 
我忘了提我有acad 2002。但效果一样。
 
由于它很小,您介意解释一下该代码在为我的lisping研究做什么吗?
 
否则,再次感谢,这将很好。
回复

使用道具 举报

0

主题

269

帖子

279

银币

限制会员

铜币
-4
发表于 2022-7-5 18:38:42 | 显示全部楼层
好的,但我主要是从参考手册中抄下来的,因为没有太多的逻辑。
 
 
  1. (defun c:SALL ()
  2.   ;;define a function named "sall"
  3.   (setq TargEnt (car (entsel "\nSelect object on layer to select: ")))
  4. ;;prompt user to select object, entsel stores pick pint & entity name
  5. ;; 'car' extracts name, set it to variable 'Targent'
  6. [left](setq TargLayer (assoc 8 (entget TargEnt)))[/left]
  7. ;;extract layer name of entity using 'entget' to retrieve entity data
  8. [left];;'assoc' to extract portion of data pair, '8' is the layer name group code [/left]
  9. [left](sssetfirst nil (ssget "_X" (list TargLayer)))
  10. ;;ssget used to select all items (the 'x' option) having same layer name
  11. [left];;sssetfirst used to grip & highlight items
  12. (princ)
  13. )[/left]
  14. [/left]
回复

使用道具 举报

5

主题

14

帖子

9

银币

初来乍到

Rank: 1

铜币
25
发表于 2022-7-5 18:40:44 | 显示全部楼层
谢谢你的提示。
 
我将该代码与另一个称为TLEN的lisp相结合,该lisp给出了连接线的长度。
现在,当我需要测量这个东西时,我所做的就是键入命令,然后单击一个对象。它会自动选择层中的所有内容,然后对其进行测量。
很好,这个过程过去需要很长时间,连接线,使用测量工具QSELECT,进行广义猜测。现在需要几秒钟,而且非常准确!
回复

使用道具 举报

63

主题

242

帖子

181

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
319
发表于 2022-7-5 18:44:14 | 显示全部楼层
  1. (defun c:LL2(/)
  2. (princ"click object belong to a layer to copy or move all objects layer")
  3. (setq myobjectsbylayer (ssget "X" (list (cons 8 (cdr (assoc 8 (entget (car (entsel)))))))))
  4. (initget "Copy Move")
  5. (setq x(getkword"\n hit inter for copy with base point or type <M> for move >"))
  6. (if(not x)
  7.     (progn
  8.       (setq mypoint (getpoint "Specify base point or press Enter for 0,0: "))
  9.         (if (not mypoint) (setq mypoint (list 0 0)))
  10.         (command "copybase" mypoint myobjectsbylayer "")
  11.       )
  12.     )
  13.   
  14.   (if(= x "Move")
  15.     (progn
  16.     (setq mypoint (getpoint "Specify base point "))
  17.     (command"move"myobjectsbylayer"" mypoint)
  18.       )
  19.     )
  20. )
回复

使用道具 举报

CAB

29

主题

781

帖子

430

银币

中流砥柱

Rank: 25

铜币
526
发表于 2022-7-5 18:48:37 | 显示全部楼层
如果要一次选择多个图层。
  1. ;;=============================================================
  2. ;;     Sel.lsp by Charles Alan Butler
  3. ;;            Copyright 2004
  4. ;;   by Precision Drafting & Design All Rights Reserved.
  5. ;;
  6. ;;    Version 1.0 Beta  July 23,2004
  7. ;;    Version 1.1 Beta  July 13,2005
  8. ;;
  9. ;;   Creates a selection set of objects on a layer(s)
  10. ;;   User picks objects to determine the layer(s)
  11. ;;   Then User selects objects for ss or presses enter to
  12. ;;   get all objects on the selected layer(s)
  13. ;;   You may select the selection set before starting this
  14. ;;   routine. Then select the layers to keep in the set
  15. ;;=============================================================
  16. (defun c:sel (/ ent lay ss lay:lst lay:prompt ss:first ent:lst)
  17. ;;  get anything already selected
  18. (setq ss:first (cadr(ssgetfirst))
  19.        ss (ssadd))
  20. ;;  Get user selected layers
  21. (if ss:first
  22.    (setq lay:prompt "\nSelect the object to choose layers to keep.")
  23.    (setq lay:prompt "\nSelect object for layer filter.")
  24. )
  25. (while (setq ent (entsel lay:prompt))
  26.    (setq ent:lst (cons (car ent) ent:lst))
  27.    (setq lay:lst
  28.           (cons (setq lay (cdr(assoc 8 (entget (car ent))))) lay:lst))
  29.    (prompt (strcat "\n*-* Selected Layer -> " lay))
  30. )
  31. ;;  Un HighLite the entities
  32. (and ent:lst (mapcar '(lambda (x) (redraw x 4)) ent:lst))
  33. (if (> (length lay:lst) 0); got layers to work with
  34.    (progn
  35.      (setq lay "")
  36.      (setq lay:lst (vl-sort lay:lst '<)) ; removes douplicates
  37.      (foreach itm  lay:lst ; combine lay names into one , del string
  38.        (setq lay (strcat lay itm ",")))
  39.      (setq lay (substr lay 1 (1- (strlen lay)))); remove the last ,
  40.      (if ss:first ; ALREADY GOT SELECTION SET
  41.        (while (setq ent (ssname ss:first 0))
  42.          (if (member (cdr(assoc 8 (entget ent))) lay:lst)
  43.            (ssadd (ssname ss:first 0) ss)
  44.          )
  45.          (ssdel (ssname ss:first 0) ss:first)
  46.        )
  47.        (progn ; else get a selection set to work with
  48.          (prompt (strcat "\nOK >>--> Select objects for Selection set or "
  49.                          "ENTER for All objects on layer(s) " lay))
  50.          ;;  get objects using filter with user select
  51.          (if (null (setq ss (ssget (list (cons 8 lay)))))
  52.            ;; or get ALL objects using filter
  53.            (setq ss (ssget "_X" (list (cons 8 lay)(cons 410 (getvar "ctab")))))
  54.          )
  55.        )
  56.      )
  57.      (if (> (sslength ss) 0)
  58.        (progn
  59.          (prompt (strcat "\n" (itoa (sslength ss))
  60.                      " Object(s) selected on layer(s) " lay
  61.                      "\nStart an ACAD command."))
  62.          (sssetfirst nil ss)
  63.        )
  64.        (prompt "\n***  Nothing Selected  ***")
  65.      )
  66.    )
  67. )
  68. (princ)
  69. )
  70. (prompt "\nSelect on Layer loaded, Enter Sel to run.")
  71. (princ)
回复

使用道具 举报

21

主题

155

帖子

135

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-5 18:50:56 | 显示全部楼层
是否可以修改为也有一个(princ“\n items selected”)?
 
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 18:54:18 | 显示全部楼层
  1. (setq ss  (ssget "_X" (list TargLayer)))
  2. (alert (strcat "Items selected " (sslength SS)))
  3. (sssetfirst nil ss)
回复

使用道具 举报

21

主题

155

帖子

135

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-5 18:58:54 | 显示全部楼层
 
我想我一定是把它粘贴到错误的地方了,我得到了“错误:错误的参数类型:stringp 78”
 
我尝试的是:
 
  1. (defun c:SALL ()
  2.    (setq TargEnt (car (entsel "\nSelect object on layer to select: ")))
  3. (setq TargLayer (assoc 8 (entget TargEnt)))
  4. (setq ss  (ssget "_X" (list TargLayer)))
  5. (alert (strcat "Items selected " (sslength SS)))
  6. (sssetfirst nil ss)
  7. (princ)
  8. )
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-12 19:44 , Processed in 0.468376 second(s), 72 queries .

© 2020-2025 乐筑天下

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