乐筑天下

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

[编程交流] 搜索块实体

[复制链接]

49

主题

177

帖子

130

银币

后起之秀

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

铜币
243
发表于 2022-7-5 23:05:00 | 显示全部楼层 |阅读模式
我有一个包含代表一个设备的一些行的块,旁边有一个数字(文本)作为该设备的索引。我将此块插入到绘图中。有时我需要使用Autolisp例程更改该块的某些属性(扩展数据)。然而,我也需要把这个数字从1号改为2号。我如何搜索块中的实体而不必分解它,找到我想要的(文本)并更改它?这对街区有可能吗?
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 23:13:14 | 显示全部楼层
您是在更改属性还是单个文本值之后?
 
你可以上传之前和之后的图像或绘图?
回复

使用道具 举报

49

主题

177

帖子

130

银币

后起之秀

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

铜币
243
发表于 2022-7-5 23:16:27 | 显示全部楼层
单个文本值,与属性无关。块只是一些非常简单的行(3~4),在它们旁边有一个简单的文本“1”,用作用户的索引。此dwg作为块插入到其他主dwg文件中。它必须始终作为块插入。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 23:23:35 | 显示全部楼层
所以你想在选择块中搜索一个特定的值,或者只是根据用户的输入更改所有文本值?
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 23:30:12 | 显示全部楼层
关在黑暗中
 
  1. (defun c:Test (/ doc ss in)
  2. ;;    Tharwat 11.May. 2014        ;;
  3. (if (and (/= (setq in (getstring t "\n Type a text to replace in block :")) "")
  4.           (princ "\n *** Select blocks ***")
  5.           (setq ss (ssget "_:L" '((0 . "INSERT"))))
  6.      )
  7.    (progn (vla-startundomark (setq doc (vla-get-activedocument (vlax-get-acad-object))))
  8.           ((lambda (x / sn en lst nm e el)
  9.              (while (setq sn (ssname ss (setq x (1+ x))))
  10.                (if (not (member (setq nm (cdr (assoc 2 (setq en (entget sn))))) lst))
  11.                  (progn (setq lst (cons nm lst))
  12.                         (setq e (tblobjname "BLOCK" nm))
  13.                         (while (setq e (entnext e))
  14.                           (if (wcmatch (cdr (assoc 0 (setq el (entget e)))) "*TEXT")
  15.                             (entmod (subst (cons 1 in) (assoc 1 el) el))
  16.                           )
  17.                         )
  18.                  )
  19.                )
  20.              )
  21.            )
  22.             -1
  23.           )
  24.           (vla-endundomark doc)
  25.           (vla-regen doc Acallviewports)
  26.    )
  27. )
  28. (princ)
  29. )(vl-load-com)
回复

使用道具 举报

56

主题

346

帖子

68

银币

中流砥柱

Rank: 25

铜币
512
发表于 2022-7-5 23:36:59 | 显示全部楼层
仅用于文本。
 
  1. (vl-load-com)
  2. (defun C:GZ ()
  3. (command "undo" "be")
  4. (setq        olderr        *error*                        ; Initialize variables
  5. *error*        chgterr
  6. )
  7.     (setvar "CMDECHO" 0)
  8.    (command "ucs" "w")
  9.   (setq *App (vlax-get-acad-object))
  10.   (setq *Doc (vla-get-ActiveDocument *APP))
  11.    (setq SS (nentsel "\nPlease pick the text: "))
  12.    (setq ENT (entget (car SS))
  13.          PT  (cadr SS)
  14.          PT11  PT
  15.      )
  16.     (setq ens1 (last SS))
  17.   (if  (not (equal PT ens1 0.1)  )              
  18.   (setq  ens (last (last SS))
  19.       mat (RevRefGeom ens)                     
  20.       PT11 (MCS2WCS mat PT11 )                  
  21.       obj (vlax-ename->vla-object ens)
  22.       name (vla-get-name obj)            
  23.    )
  24.    )
  25.   
  26.    (if (= (cdr (assoc 0 ENT)) "TEXT")
  27.        (progn
  28.        (entmake ENT)
  29. (setq ent1 (entlast))
  30. (setq el1  (entget ent1))
  31.      (setq  STR (cdr (assoc 1 ENT)))
  32.    
  33.   
  34.   (setq dq1 (setq dqb1 (assoc 72 el1)))
  35.   (setq dq2 (setq dqb2 (assoc 73 el1)))
  36.   (if (/= dq1 0)
  37.     (progn
  38.       (setq p11 (assoc 11 el1))       
  39.       (setq p11b '(0.0 0.0 0.0))
  40.       (setq el1 (subst (cons 11 p11b) p11 el1))
  41.       (setq dq 0)               
  42.       (setq el1 (subst (cons 72 dq) dqb1 el1))
  43.       (if (/= dq2 0)
  44.         (setq el1 (subst (cons 73 dq) dqb2 el1))
  45.       )                               
  46.       (entmod el1)               
  47.     )
  48.   )
  49.       
  50.       
  51.       
  52.        (setq LST '())
  53.        (setq LTT '())
  54.        (setq lls "")
  55.        (setq ijk nil)
  56.        (while (/= STR "")
  57.        (setq step 0)
  58.        (if (> (ascii (substr STR 1 1)) 159)
  59.          (progn
  60.            (setq STRI (substr STR 1 2))
  61.            (setq  LST  (cons STRI LST))
  62.            (setq  LST  (cons STRI LST))
  63.            
  64.            (setq  STR  (substr STR 3))
  65.          
  66.          (if (not ijk)
  67.           (progn
  68.           (setq lls (strcat lls STRI))
  69.           (entmod (setq el1 (subst (cons 1 lls)
  70.                              (assoc 1 el1)
  71.                              el1
  72.                       )
  73.             )
  74.     )  
  75.          
  76.         (if         (setq xx (CheckWidth ent1 PT11) )
  77.          (progn
  78.            (entdel ent1)  
  79.            (setq   strr  (getstring (strcat "\nPlease enter a new text:[" STRI "]"))
  80.                    LTT    (cons strr LTT)
  81.                    ijk      T
  82.            )
  83.         )
  84.         (setq  LTT  (cons STRI LTT))
  85.         )
  86.         ) ; progn
  87.        (setq  LTT  (cons STRI LTT))
  88.        )
  89.      
  90.      
  91.          )  ;(progn
  92.        (progn
  93.           (if (and (< (asj 2) 159)  (< (asj 3) 159)  (< (asj 4) 159)  (< (asj 5) 159)  (wcmatch (substr STR 1 5) "%%**") )
  94.      ;     (if        (wcmatch (substr STR 1 5) "%%**")
  95.      (if (wcmatch (substr STR 1 5) "%%[0-9][0-9][0-9]")
  96.             
  97.                  (setq STRI (substr STR 1 5)  
  98.                        STR  (substr STR 6)  
  99.                        step  5)
  100.                  (setq STRI (substr STR 1 3)
  101.                        STR  (substr STR 4)  )
  102.       )       
  103.                                     ;endif
  104.       (setq STRI (substr STR 1 1)  STR  (substr STR 2) )
  105.     )
  106.                              
  107.            (setq  LST  (cons STRI LST))
  108.            
  109.          (if (not ijk)
  110.           (progn
  111.           (setq lls (strcat lls STRI))
  112.           (entmod (setq el1 (subst (cons 1 lls)
  113.                              (assoc 1 el1)
  114.                              el1
  115.                       )
  116.             )
  117.     )  
  118.          
  119.         (if        (setq xx (CheckWidth ent1 PT11) )
  120.         (progn
  121.           (entdel ent1)
  122.           (setq   strr  (getstring (strcat "\nPlease enter a new text:[" STRI "]")))
  123.           (if (= step 5)
  124.             (progn
  125.             (if (= strr "1") (setq strr "%%129"))
  126.             (if (= strr "2") (setq strr "%%130"))
  127.             (if (= strr "3") (setq strr "%%160"))
  128.             (setq step 0)
  129.             )
  130.           )
  131.              (setq step 0)
  132.               (setq    LTT    (cons strr LTT)
  133.                        ijk     T
  134.           )
  135.          
  136.          )
  137.         (setq  LTT  (cons STRI LTT))
  138.         )
  139.         )
  140.        (setq  LTT  (cons STRI LTT))
  141.        )
  142.          )  ;progn
  143.         )   ; (if (> (ascii (substr STR 1 1)) 159)
  144.      (setq STRI "")
  145.        ) ; while
  146.      ;(entdel ent1)
  147.        (setq LTT (reverse LTT))
  148.        (setq LST (reverse LST))
  149.       
  150.        (setq ttx "")
  151.        (setq kkk 0)
  152.        (while (< kkk (length LTT))
  153.          (setq ttx (strcat ttx (nth kkk LTT)))      
  154.          (setq kkk (1+ kkk))
  155.        )
  156.        (entmod (subst (cons 1 ttx) (assoc 1 ENT) ENT))
  157.        (if  (not (equal PT ens1 0.1)  )         
  158.         (progn
  159.         (setq bbs (ssget "X" '((0 . "insert")) ))
  160.           (setq i 0)
  161.           (while (<  i (sslength bbs) )  
  162.             (setq nai (ssname bbs i))
  163.             (setq enn (entget nai))
  164.             (setq nam (cdr (assoc 2 enn)))
  165.             (if (= nam name)
  166.                (progn  (entdel nai) (entdel nai) )
  167.             )
  168.             (setq i ( 1+ i ) )
  169.           )
  170.            
  171.         ; (entdel ens)
  172.          ;(entdel ens)  
  173.        )
  174.        )
  175.        )     
  176.    )
  177. (setq *error* olderr)                        ; Restore old *error* handler
  178. (command "undo" "e")
  179. (command "ucs" "p")
  180.   
  181.    (princ)
  182.      
  183. ) ;
  184. (defun ASj (jj0 / asjj)
  185. (setq asjj (ascii (substr STR jj0 1)))  
  186. )
  187. (defun CheckWidth (textent selpt / );ll ur hbox)
  188. (command "ucs" "Object" textent)
  189. (setq selpt (trans selpt 0 1))
  190. (setq        ll   (car (textbox (entget textent)))
  191. ur   (cadr (textbox (entget textent)))
  192. wid  (abs (- (car ur) (car ll)))
  193. wid1 (abs (- (car selpt) (car ll)))
  194. hbox (/ (PickBoxSize) 2.0)
  195. )
  196. (command "ucs" "p")
  197. (if (> wid (- wid1 hbox))
  198.    T
  199.    nil
  200. )
  201. )
  202. ;;----------------------------------------
  203. (defun PickBoxSize (/ SS VS PB SWP SHP AR WSD PPDU BOX)
  204. (setq        SSc   (getvar "SCREENSIZE")        ; screen size in pixels
  205. VS   (getvar "VIEWSIZE")        ; screen height in drawing units
  206. PB   (getvar "pickbox")                ; get current pickbox size
  207. SWP  (car SSc)                        ; width of screen in pixels
  208. SHP  (cadr SSc)                        ; height of screen in pixels
  209. AR   (/ SWP SHP)                ; aspect ratio width/height
  210. WSD  (* VS AR)                        ; width of screen dwg units = ratio timesheight
  211. PPDU (/ WSD SWP)                ; pixels per drawing unit
  212. BOX  (/ (* VS (* 2 PB)) SHP)        ; drawing units per pixel
  213. )
  214. )
  215. ;;; This routine is from gile,I revised some places for a better algorithm.  
  216. ;;; Thanks a lot.                                   -highflybird 2009/2/22   
  217. ;;; =========================================================================
  218. ;;; RefGeom (gile)                                                           
  219. ;;; returns a list which first item is a 3x3 transformation matrix (rotation,
  220. ;;; scales, normal) and second item the object insertion point in its parent
  221. ;;; (xref, bloc or space)                                                   
  222. ;;; Argument : an ename                                                      
  223. ;;; =========================================================================
  224. (defun RefGeom (ename / Lst ang Nor mat Org Ins Ax Ay Sx Sy Sz)
  225. (setq        Lst (entget ename)                                                ; the name of entity
  226. Nor (cdr (assoc 210 Lst))                                       ; normal
  227. Sx  (cdr (assoc 41  Lst))                                       ; X scale factor
  228. Sy  (cdr (assoc 42  Lst))                                         ; Y scale factor
  229. Sz  (cdr (assoc 43  Lst))                                        ; Z scale factor
  230. Ang (cdr (assoc 50  Lst))                                       ; rotation angle
  231. Ax  (cos Ang)                                                   ; the value of cosine
  232. Ay  (sin Ang)                                                   ; the value of sine
  233. mat (mxm
  234.       (list
  235.         (trans '(1.0 0.0 0.0) 0 Nor T)                                ; transform X axis
  236.         (trans '(0.0 1.0 0.0) 0 Nor T)                                ; transform Y axis
  237.         (trans '(0.0 0.0 1.0) 0 Nor T)                                ; transform Z axis
  238.       )
  239.       (list
  240.         (list (* Ax Sx) (- (* Ay Sy)) 0.)                        ; multiple Scale Matrix and rotation Matrix
  241.         (list (* Ay Sx) (* Ax Sy)     0.)
  242.         (list 0.0       0.0           Sz)
  243.       )
  244.     )
  245. Org (cdr (assoc 10 (tblsearch "BLOCK" (cdr (assoc 2 Lst)))))        ; get the origin of the block
  246. Ins (trans (cdr (assoc 10 Lst)) Nor 0)                                ; transformate insertpoint
  247. )                                               
  248. (if (/= Org '(0.0 0.0 0.0))                                                ; if the origin isn't '(0 0 0)
  249.    (setq Ins (mapcar '- Ins (mxv mat Org)))                                ; then insertpoint needs a displacement
  250. )
  251. (setq mat (mapcar 'App2Last mat Ins)                                  ; to make a standard transformation matrix
  252.        mat (App2Last mat '(0.0 0.0 0.0 1.0))
  253. )
  254. )
  255. ;; RevRefGeom (gile)
  256. ;; RefGeom inverse function
  257. (defun RevRefGeom (ename / Data ang norm mat ins)
  258. (setq        Data (entget ename)
  259. ang  (- (cdr (assoc 50 Data)))
  260. norm (cdr (assoc 210 Data))
  261. mat  (mxm
  262.        (list (list (/ 1 (cdr (assoc 41 Data))) 0.0 0.0)
  263.              (list 0.0 (/ 1 (cdr (assoc 42 Data))) 0.0)
  264.              (list 0.0 0.0 (/ 1 (cdr (assoc 43 Data))))
  265.        )
  266.        (mxm
  267.          (list (list (cos ang) (- (sin ang)) 0.0)
  268.                (list (sin ang) (cos ang) 0.0)
  269.                '(0.0 0.0 1.0)
  270.          )
  271.          (mapcar (function (lambda (v) (trans v norm 0 T)))
  272.                  '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
  273.          )
  274.        )
  275.      )
  276. ins  (mapcar
  277.        '-
  278.        (cdr (assoc 10 (tblsearch "BLOCK" (cdr (assoc 2 Data)))))
  279.        (mxv mat (trans (cdr (assoc 10 Data)) norm 0))
  280.      )
  281. mat  (mapcar 'App2Last mat ins)
  282. mat  (App2Last mat '(0.0 0.0 0.0 1.0))
  283. )
  284. )
  285. ;;; Append a element to the last
  286. (defun App2Last (m v)
  287. (list (car m) (cadr m) (caddr m) v)
  288. )  
  289. ;;; VXV Returns the dot product of 2 vectors
  290. (defun vxv (v1 v2)
  291. (apply '+ (mapcar '* v1 v2))
  292. )
  293. ;;; TRP Transpose a matrix -Doug Wilson-
  294. (defun trp (m)
  295. (apply 'mapcar (cons 'list m))
  296. )
  297. ;;; MXV Apply a transformation matrix to a vector -Vladimir Nesterovsky-
  298. (defun mxv (m v)
  299. (mapcar '(lambda (r) (vxv r v)) m)
  300. )
  301. ;;; MXM Multiply two matrices -Vladimir Nesterovsky-
  302. (defun mxm (m q)
  303. (mapcar '(lambda (r) (mxv (trp q) r)) m)
  304. )
  305. ;;; MCS to WCS -- revised by highflybird
  306. (defun MCS2WCS (mat P / p1)
  307. (setq p1 (App2Last p 1))
  308. (list
  309.    (vxv (car mat) p1)
  310.    (vxv (cadr mat) p1)
  311.    (vxv (caddr mat) p1)
  312. )
  313. )
回复

使用道具 举报

49

主题

177

帖子

130

银币

后起之秀

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

铜币
243
发表于 2022-7-5 23:39:08 | 显示全部楼层
谢谢你们俩的帮助。然而,这些例程存在一个问题。当我拾取块时,文本将更改为该块的所有副本。我的目的是只更改我选择的块的文本。这会是一个问题吗?
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 23:46:58 | 显示全部楼层
 
那么,您想在块中的文本处拾取以更改其值?
回复

使用道具 举报

49

主题

177

帖子

130

银币

后起之秀

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

铜币
243
发表于 2022-7-5 23:52:01 | 显示全部楼层
是的,或多或少。确切地说,我想选择另一个带有文本的块,比如说,“2”,然后一些块带有“1”,最后我用“1”创建的选择集变成“2”。我不需要所有的代码。我只是想知道,当我在内存中存储“2”信息时,如何在块元素中更改“1”。
回复

使用道具 举报

4

主题

194

帖子

192

银币

初来乍到

Rank: 1

铜币
25
发表于 2022-7-5 23:55:28 | 显示全部楼层
MJLM,
 
您意识到您还需要更改块名称,除非您使用属性,否则不能有两个或多个具有相同名称和不同内容的块。。。。(您使用ACAD多久了?)
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-11 03:08 , Processed in 0.724664 second(s), 72 queries .

© 2020-2025 乐筑天下

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