乐筑天下

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

[编程交流] 获取插入名称以获取乐趣

[复制链接]

46

主题

161

帖子

104

银币

后起之秀

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

铜币
242
发表于 2022-7-5 17:27:23 | 显示全部楼层 |阅读模式
我的目标是返回带有ssget函数块名的列表的函数:
例子:
  1. "block1,block2,xref1,xref2,dynblock1,*A1dynblock1,*A2dynblock1"

有人能验证我的lisp例程吗?
主要功能:
  1. ;bit
  2. ;0 - all
  3. ;1 - without "blocks"
  4. ;2 - without dynamic blocks
  5. ;4 - without xrefs
  6. ;(PZ:GetInsertNames (ssget '((0 . "INSERT"))) (+ 2 4))
  7. (defun PZ:GetInsertNames ( ss bit / sl enl res)
  8. ;remove objs from ss that are not insert - just in case
  9. (setq
  10.    sl
  11.    (vl-remove-if-not
  12.      '(lambda (_1)
  13.        (eq (cdr (assoc 0 (entget (vlax-vla-object->ename _1)))) "INSERT")
  14.      )
  15.      (cd:SSX_Convert ss 1)
  16.    )
  17. )
  18. ;remove blocks
  19. (if (= 1 (logand bit 1))
  20.    (setq
  21.      sl
  22.      (vl-remove-if
  23.        '(lambda (_1)
  24.          (and
  25.            (= (vlax-property-available-p _1 'Path) nil)
  26.            (= (vlax-get-property _1 'IsDynamicBlock) :vlax-false)
  27.          )
  28.        )
  29.        sl
  30.      )
  31.    )
  32. )
  33. ;remove dynamic blocks
  34. (if (= 2 (logand bit 2))
  35.    (setq
  36.      sl
  37.      (vl-remove-if
  38.        '(lambda (_1)
  39.          (= (vla-get-IsDynamicBlock _1) :vlax-true)
  40.        )
  41.        sl
  42.      )
  43.    )
  44. )
  45. ;remove xrefs
  46. (if (= 4 (logand bit 4))
  47.    (setq
  48.      sl
  49.      (vl-remove-if
  50.        '(lambda (_1)
  51.          (= (vlax-property-available-p _1 'Path) T)
  52.        )
  53.        sl
  54.      )
  55.    )
  56. )
  57. (setq sl (mapcar 'vlax-vla-object->ename sl))
  58. (setq enl (mapcar 'LM:al-effectivename sl))
  59. (if (= 0 (logand bit 2))
  60.    (foreach _n sl
  61.      (if (= (vla-get-IsDynamicBlock (vlax-ename->vla-object _n)) :vlax-true)
  62.        (setq enl(LM:ListUnion (cd:BLK_GetDynBlockNames (LM:al-effectivename _n)) enl))
  63.      )
  64.    )
  65. )
  66. (setq res (cd:STR_ReParse (LM:Unique enl)","))
  67. res
  68. )

子程式
  1. (defun LM:al-effectivename ( ent / blk rep )
  2.    (if (wcmatch (setq blk (cdr (assoc 2 (entget ent)))) "`**")
  3.        (if
  4.            (and
  5.                (setq rep
  6.                    (cdadr
  7.                        (assoc -3
  8.                            (entget
  9.                                (cdr
  10.                                    (assoc 330
  11.                                        (entget
  12.                                            (tblobjname "block" blk)
  13.                                        )
  14.                                    )
  15.                                )
  16.                               '("AcDbBlockRepBTag")
  17.                            )
  18.                        )
  19.                    )
  20.                )
  21.                (setq rep (handent (cdr (assoc 1005 rep))))
  22.            )
  23.            (setq blk (cdr (assoc 2 (entget rep))))
  24.        )
  25.    )
  26.    blk
  27. )
  28. ; =========================================================================================== ;
  29. ; Lista nazw blokow (*U) zaleznych od bloku dynamicznego /                                    ;
  30. ; List of the blocks name (*U) which depends on a dynamic block                               ;
  31. ;  Name [sTR] - nazwa bloku / block name                                                      ;
  32. ; ------------------------------------------------------------------------------------------- ;
  33. ; (cd:BLK_GetDynBlockNames "NazwaBloku")                                                      ;
  34. ; =========================================================================================== ;
  35. (defun cd:BLK_GetDynBlockNames (Name / res n xd)
  36. (setq res (list Name))
  37. (vlax-for % (cd:ACX_Blocks)
  38.    (if (wcmatch (setq n (vla-get-name %)) "`*U*")
  39.      (if
  40.        (setq xd
  41.          (cd:XDT_GetXData
  42.            (vlax-vla-object->ename %)
  43.            "AcDbBlockRepBTag"
  44.          )
  45.        )
  46.        (if
  47.          (=
  48.            (strcase Name)
  49.            (strcase
  50.              (cdr
  51.                (assoc 2
  52.                  (entget
  53.                    (handent
  54.                      (cdr (assoc 1005 (cdr xd)))
  55.                    )
  56.                  )
  57.                )
  58.              )
  59.            )
  60.          )
  61.          (setq res (cons n res))
  62.        )
  63.      )
  64.    )
  65. )
  66. (reverse res)
  67. )
  68. ; =========================================================================================== ;
  69. ; Lista odnosnikow zewnetrznych / List of external references                                 ;
  70. ; =========================================================================================== ;
  71. (defun cd:BLK_GetXrefs (/ res)
  72. (vlax-for % (cd:ACX_Blocks)
  73.    (if (= (vla-get-IsXref %) :vlax-true)
  74.      (setq res (cons (vla-get-name %) res))
  75.    )
  76. )
  77. res
  78. )
  79. ; =========================================================================================== ;
  80. ; Czyta dane dodatkowe XDATA / Reads additional data XDATA                                    ;
  81. ;  Ename [ENAME]   - nazwa entycji / entity name                                              ;
  82. ;  App   [sTR/nil] - nil = dla wszystkich aplikacji / for all applications                    ;
  83. ;                    STR = dla aplikacji App / for App application                            ;
  84. ; ------------------------------------------------------------------------------------------- ;
  85. ; (cd:XDT_GetXData (car (entsel)) "CADPL")                                                    ;
  86. ; =========================================================================================== ;
  87. (defun cd:XDT_GetXData (Ename App)
  88. (if App
  89.    (cadr (assoc -3 (entget Ename (list App))))
  90.    (cdr (assoc -3 (entget Ename (list "*"))))
  91. )
  92. )
  93. ;;---------------------=={ List Union }==---------------------;;
  94. ;;                                                            ;;
  95. ;;  Returns a list expressing the union of two lists          ;;
  96. ;;------------------------------------------------------------;;
  97. ;;  Author: Lee Mac, Copyright © 2011 - www.lee-mac.com       ;;
  98. ;;------------------------------------------------------------;;
  99. ;;  Arguments:                                                ;;
  100. ;;  l1,l2 - Lists for which to return the union               ;;
  101. ;;------------------------------------------------------------;;
  102. ;;  Returns:  A list of all distinct items in the two lists   ;;
  103. ;;------------------------------------------------------------;;
  104. ;_$ (LM:ListUnion '(1 2 3 4 5) '(2 4 6 )
  105. ;(1 2 3 4 5 6
  106. (defun LM:ListUnion ( l1 l2 / x l )
  107. (setq l1 (append l1 l2))
  108. (while (setq x (car l1)) (setq l (cons x l) l1 (vl-remove x l1)))
  109. (reverse l)
  110. )
  111. ; =========================================================================================== ;
  112. ; Zmienia PICKSET na liste obiektow / Convert PICKSET to list of objects                      ;
  113. ;  Ss   [PICKSET] - zbior wskazan / selection sets                                            ;
  114. ;  Mode [iNT]     - typ zwracanych obiektow / type of returned objects                        ;
  115. ;                   0 = ENAME, 1 = VLA-OBJECT, 2 = SAFEARRAY                                  ;
  116. ; ------------------------------------------------------------------------------------------- ;
  117. ; (cd:SSX_Convert (ssget) 1)                                                                  ;
  118. ; =========================================================================================== ;
  119. (defun cd:SSX_Convert (Ss Mode / n res)
  120. (if
  121.    (and
  122.      (member Mode (list 0 1 2))
  123.      (not
  124.        (minusp
  125.          (setq n
  126.            (if Ss (1- (sslength Ss)) -1)
  127.          )
  128.        )
  129.      )
  130.    )
  131.    (progn
  132.      (while (>= n 0)
  133.        (setq res
  134.          (cons
  135.            (if (zerop Mode)
  136.              (ssname Ss n)
  137.              (vlax-ename->vla-object (ssname Ss n))
  138.            )
  139.            res
  140.          )
  141.              n (1- n)
  142.        )
  143.      )
  144.      (if (= Mode 2)
  145.        (vlax-safearray-fill
  146.          (vlax-make-safearray 9
  147.            (cons 0 (1- (length res)))
  148.          ) res
  149.        )
  150.        res
  151.      )
  152.    )
  153. )
  154. )
  155. ; =========================================================================================== ;
  156. ; Laczy liste lancuchow w lancuch z separatorem /                                             ;
  157. ; Combines a list of strings in the string with the separator                                 ;
  158. ;  Lst [list] - lista lancuchow / list of strings                                             ;
  159. ;  Sep [sTR]  - separator / separator                                                         ;
  160. ; ------------------------------------------------------------------------------------------- ;
  161. ; (cd:STR_ReParse '("OLE2FRAME" "IMAGE" "HATCH") ",")                                         ;
  162. ; =========================================================================================== ;
  163. (defun cd:STR_ReParse (Lst Sep / res)
  164. (setq res (car Lst))
  165. (foreach % (cdr Lst)
  166.    (setq res (strcat res Sep %))
  167. )
  168. res
  169. )
  170. ;; Unique  -  Lee Mac
  171. ;; Returns a list with duplicate elements removed.
  172. ;; (LM:Unique '("A" "B" "B" "B" "C" "C" "D" "E" "E" "E" "E"))
  173. ;;  =>  ("A" "B" "C" "D" "E")
  174. (defun LM:Unique ( l / x r )
  175.    (while l
  176.        (setq x (car l)
  177.              l (vl-remove x (cdr l))
  178.              r (cons x r)
  179.        )
  180.    )
  181.    (reverse r)
  182. )
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:42:43 | 显示全部楼层
??  试试这个
 
  1. (setq lst (list "block1,block2,xref1,xref2,dynblock1,*A1dynblock1,*A2dynblock1"))
  2. (setq ss (ssget '((0 . "INSERT")(cons 2 lst)) ))
回复

使用道具 举报

46

主题

161

帖子

104

银币

后起之秀

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

铜币
242
发表于 2022-7-5 18:09:32 | 显示全部楼层
在你的帖子之前,我为ssget添加了“逃避通配符”,但为什么你不想尝试lst呢?
我的函数的结果是字符串:
  1. "block1,block2,xref1,xref2,dynblock1,`*A1dynblock1,`*A2dynblock1"

 
 
 
编辑。
我知道为什么在第一篇文章中我写了列表,但我应该写字符串
无论如何,字符串是我函数的结果
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:15:01 | 显示全部楼层
你想实现这样的目标吗?
回复

使用道具 举报

46

主题

161

帖子

104

银币

后起之秀

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

铜币
242
发表于 2022-7-5 18:30:45 | 显示全部楼层
 
这是我目标的一部分,如果你看看我的子程序,你会发现这个函数
我的目标是具有匿名引用/外部参照插入的简单块/动态块的名称。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 03:34 , Processed in 0.447530 second(s), 62 queries .

© 2020-2025 乐筑天下

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