乐筑天下

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

[编程交流] 定位并突出显示特定位置

[复制链接]

16

主题

119

帖子

109

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
82
发表于 2022-7-6 07:38:09 | 显示全部楼层 |阅读模式
大家好。
 
我想知道这里有没有海报可以帮忙。我必须提前说,我的lisp技能确实非常有限。
 
我知道内置的AutoCAD find命令,我可以找到许多可以查找和缩放特定文本的Lisp,但我正在寻找更专用于特定任务的东西。
 
下面的lisp“LocatePart.lsp”帮助我根据用户输入的文本字符串查找并高亮显示特定块(块名“PartTag”)中特定属性标记(标记名“PART”)的所有实例。
lisp在找到的每个相关属性文本字符串处绘制一个圆环。
 
这很好,但如果不是在每个找到的点绘制一个甜甜圈,而是从每个找到的属性到原点0,0,0绘制一条线,则更容易看到结果
 
如果没有lisp知识,我不确定这是否快速简单。
 
  1. (defun c:LocatePart (/ usrprtnm prtfound enttyp blknm lccosnapm lccentcolr)
  2. (setq lccosnapm  (getvar "OSMODE"))
  3. ;(setq lccentcolr (getvar "CECOLOR"))
  4. ;(setvar "CECOLOR" "1")
  5. (setvar "OSMODE" 0)
  6. (setvar "cmdecho" 0)
  7. (getuserprtnum)
  8. (findprtnm)
  9. ;(setvar "CECOLOR" lccentcolr)
  10. (setvar "OSMODE" lccosnapm)
  11. (prin1)
  12. ;(setvar "cmdecho" 1)
  13. )
  14. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  15. ; GETUSERPRTNUM - Get Part number from user
  16. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  17. (defun getuserprtnum ()
  18. (setq usrprtnm (getstring "\nEnter Partnumber to locate : "))
  19. (while (= "" usrprtnm)
  20.      (setq usrprtnm (getstring "\nIncorrect input,
  21.                      enter again (ctrl-c to exit) : "))
  22. )     
  23. )
  24. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  25. ;  FINDATT - Find attributes in drawing
  26. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  27. (defun findprtnm ()
  28. (setq ctprblk 0)        ;part assembly counter
  29. (setq prtfound 0)        ;reset search counter
  30. (setq e (entnext))
  31. (progn (prompt "\nSeraching unit assembly ... ")
  32.   (while e
  33.     (setq enttyp (cdr (assoc 0 (entget e))))
  34.     (setq blknm (cdr (assoc 2 (entget e))))
  35.      (if
  36.        (and
  37.          (equal enttyp "INSERT")
  38.   (equal blknm "PartTag")
  39.          ;(equal (cdr (assoc 66 (entget e))) 1)
  40.        ) ;and
  41.         (updprtnmprop e)
  42.      ) ;if
  43.       (setq e (entnext e))
  44.    ) ;while
  45. ) ;progn
  46. ;report search status
  47. (cond ((= prtfound 0)
  48.         (princ (strcase usrprtnm))
  49.         (princ " NOT found !")
  50.         (prin1))
  51.        ((/= prtfound 0)
  52.         (princ prtfound)
  53.         (princ " ")
  54.         (princ (strcase usrprtnm))
  55.         (princ " found")
  56.         (prin1))
  57. ) ;cond
  58. ) ;defun findprtnm
  59. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  60. ;  UPDPRTNMPROP - Compare Part number, change color if found
  61. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  62. (defun updprtnmprop (e / blkscle insertpt dndia nx ny dnpt)
  63.   (setq blkscle (cdr (assoc 41 (entget e))))
  64.   ;(princ blkscle)
  65.   (setq insertpt (cdr (assoc 10 (entget e))))
  66.   
  67.   (while (not (equal (cdr (assoc 0 (entget e))) "SEQEND"))
  68.       (if
  69.         (and
  70.            (equal (cdr (assoc 0 (entget e))) "ATTRIB")
  71.            (equal (cdr (assoc 2 (entget e))) "PART")
  72.         ) ;and
  73.                   (progn
  74.                      (setq partnm (strcase (cdr (assoc 1 (entget e)))))
  75.                      ;(princ partnm)
  76.                      (if (= (strcase usrprtnm) (strcase partnm))
  77.                        ;(princ "\nPart name : ")
  78.                 ;(princ partnm)
  79.                          (progn
  80.                            ;(princ insertpt)
  81.                            (setq dnind (* 1.0 (abs blkscle)))
  82.                            (setq dndia (* 3.5 (abs blkscle)))
  83.                            (setq ny (cadr insertpt))
  84.                            (setq ofstx (* (abs blkscle) 6.5))
  85.                            (setq nx (+ (car insertpt) ofstx))
  86.                            ;(princ nx)
  87.                            (setq dnpt (list nx ny))
  88.                     ;(princ dndia)
  89.                     (command "donut" 0  dndia dnpt "")
  90.                            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  91.                     ;change color
  92.                     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  93.                            ;(setq ed (entget e))
  94.                            ;; 62 - color property
  95.                            ;(setq ed (subst (cons 62 1) (assoc 62 ed) ed))
  96.                            ;(entmod ed)
  97.                     ;(entupd e)
  98.                             ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  99.                     ;; counter ++
  100.                     (setq prtfound (+ prtfound 1))
  101.                     ;(princ prtfound)
  102.                           ) ;progn
  103.                      )        ;if                                                                                       
  104.                    ) ;progn
  105.       ) ;if
  106.       (setq e (entnext e))
  107.   ) ;while
  108.   
  109. ) ;defun updprtnmprop

 
我附上图纸“TagSystemExample.dwg”以供参考。
 
我想我正在尝试实现类似于此lisp的功能,即查找块并绘制到原点的直线,如此处所示:-
 
http://autocadtips.wordpress.com/2011/12/20/autolisp-find-blocks-mark-them/
 
如有任何帮助或建议,我们将不胜感激。
标记系统示例。图纸
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 08:15:50 | 显示全部楼层
这适用于文本、多行文字或属性:
 
  1. (defun c:myfind ( / ent enx inc sel str )
  2.    (if (setq sel
  3.            (ssget "_X"
  4.                (list
  5.                   '(-4 . "<OR")
  6.                       '(0 . "TEXT,MTEXT")
  7.                       '(-4 . "<AND") '(0 . "INSERT") '(66 . 1) '(-4 . "AND>")
  8.                   '(-4 . "OR>")
  9.                    (if (= 1 (getvar 'cvport))
  10.                        (cons 410 (getvar 'ctab))
  11.                       '(410 . "Model")
  12.                    )
  13.                )
  14.            )
  15.        )
  16.        (if (/= "" (setq str (strcase (getstring t "\nFind What?: "))))
  17.            (progn
  18.                (repeat (setq inc (sslength sel))
  19.                    (if (= "INSERT" (cdr (assoc 0 (setq enx (entget (setq ent (ssname sel (setq inc (1- inc)))))))))
  20.                        (while (= "ATTRIB" (cdr (assoc 0 (setq enx (entget (setq ent (entnext ent)))))))
  21.                            (if (= str (strcase (cdr (assoc 1 (reverse enx)))))
  22.                                (entmake (list '(0 . "LINE") (assoc 10 enx) '(11 0.0 0.0 0.0)))
  23.                            )
  24.                        )
  25.                        (if (= str (strcase (cdr (assoc 1 enx))))
  26.                            (entmake (list '(0 . "LINE") (assoc 10 enx) '(11 0.0 0.0 0.0)))
  27.                        )
  28.                    )
  29.                )
  30.            )
  31.        )
  32.        (princ "\nNo Text, MText or Attributes found in this Layout.")
  33.    )
  34.    (princ)
  35. )

 
“Find”字符串不区分大小写。
回复

使用道具 举报

16

主题

119

帖子

109

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
82
发表于 2022-7-6 08:34:17 | 显示全部楼层
李,你太棒了。
这正是我想要的。
 
不仅是你的编码能力,而且你如此乐于帮助这里的人们的方式确实令人钦佩。
 
非常感谢。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 08:40:07 | 显示全部楼层
谢谢你,马尼拉·沃尔夫,你已经掌握了完成这项任务的大部分代码,但我认为最好提供一个通用的多用途程序;很高兴这有帮助。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-10 04:35 , Processed in 0.457381 second(s), 60 queries .

© 2020-2025 乐筑天下

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