MTE20112 发表于 2022-7-5 17:16:25

从一个区块移动到另一个区块

我想看看这是否可行。具有许多动态块的图形,都具有许多属性。我很好奇是否有一个例程可以选择单个块-允许用户填写属性单击“确定”-然后移动到图形中的“下一个”块,直到完成。
 
像这样的事情有可能发生吗?

BIGAL 发表于 2022-7-5 17:22:54

您可以按块名称选择块,转到第一个或拾取的块并更改属性,选择顺序通常按创建顺序,您可以跳过已更改的块。李mac有一个动态块更新程序,所以首先来看一下。
 

; get all blocks of the same name
(setq blk (entget (car (entsel "Pick a block"))))
(setq blkname (cdr (assoc 2 blk)))
(setq ss (ssget "X" (list (cons 0 "INsert")(cons 2 blkname))))
(alert (strcat "You have " (rtos (sslength ss) 2 0) " blocks called " blkname))

 
如果没有示例dwg,则无法在一个具有3个块的示例后进行更多操作

MTE20112 发表于 2022-7-5 17:33:18

CAD块2。图纸
 
这是一个示例文件-文件中有3个块,每个块都有两个属性。我如何实现你的代码?
 
谢谢

Dadgad 发表于 2022-7-5 17:38:25

如果需要的话,我可能会在我的快速属性调色板中调整它们。CTRL+SHIFT+P以启用它们,或在屏幕底部的任务栏中启用它们。
 
我怀疑李的Lisp程序,比加尔提到的,是以下内容http://www.lee-mac.com/dynamicblockcounter.html,如果需要轻松跟踪多个块的条件,这非常有用。
 
谢谢李!

Lee Mac 发表于 2022-7-5 17:45:05

相关:https://www.theswamp.org/index.php?topic=51947.0

Grrr 发表于 2022-7-5 17:50:45

我想知道在哪个论坛上回复,我决定在这里发布我的尝试:

; Grrr
; Upon selecting an attributed, dynamic block
; user is prompted to change every attribute value, on every block with the same name, located on the current tab:
(defun C:test ( / *error* SysVarLst e enx o sUndo EffName SSX i en SSX-Lst BlksLst TempSS ll ur str b c att)
(setvar 'errno 0) (sssetfirst nil nil)

(defun *error* ( msg )
        (sssetfirst nil nil)
        (if sUndo (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object))))
        (if c (vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) "_.undo")); if the user reached till this point
        (if SysVarLst (mapcar '(lambda ( n v / ) (setvar n v)) (mapcar 'car SysVarLst) (mapcar 'cadr SysVarLst)))
        (if
                (or
                        (not (member msg '("Function cancelled" "quit / exit abort")))
                        (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
                )
                (princ (strcat "\nError: " msg))
        )
        (princ)
)

(setq SysVarLst
        (mapcar (function (lambda ( a b / ) (list a (getvar a) b)))
                (list "CLIPROMPTLINES" "CMDECHO" "BLIPMODE" "NOMUTT")
                (list 3 0 0 0)
        )
)

(setq sUndo (vla-StartUndoMark (vla-get-ActiveDocument (vlax-get-acad-object))))
(mapcar '(lambda ( n v / ) (setvar n v)) (mapcar 'car SysVarLst) (mapcar 'caddr SysVarLst))

(while (/= (getvar 'errno) 52) ; enclose in a loop, until we have the correct entity
        (setq e (car (entsel "\nSelect attributed dynamic block: ")))
        (cond
                ((= (getvar 'errno) 7)
                        (princ "\nMissed, try again!"); non-nil return - stay in loop
                        (setvar 'errno 0); restore the 'errno' variable
                )
                ((not (= (type e) 'ENAME)); user pressed enter
                        (princ "\nUser pressed enter, exiting.")
                        (setvar 'errno 52); exit loop
                        (setq e nil enx nil o nil); don't proceed with the routine
                )
                ((/= (cdr (assoc 0 (entget e))) "INSERT")
                        (princ "\nYou must select a block!"); non-nil return - stay in loop
                )
                ((= (vlax-get (vlax-ename->vla-object e) 'IsDynamicBlock) :vlax-false)
                        (princ "\nThe selected block is not dynamic! "); non-nil return - stay in loop
                )
                ((or (/= (cdr (assoc 66 (entget e))) 1) (= (vlax-get (vlax-ename->vla-object e) 'HasAttributes) :vlax-false))
                        (princ "\nThe selected block is not attributed! "); non-nil return - stay in loop
                )
                (T
                        (setq enx (entget e))
                        (setq o (vlax-ename->vla-object e))
                        (setvar 'errno 52); we got the correct entity - exit loop
                )
        ); cond
); while

(if (and e enx o)
        (progn
                (setq EffName (vlax-get o 'EffectiveName))
                (setq SSX (ssget "_X" (list (assoc 0 enx)(cons 410 (getvar 'ctab)))))
                (repeat (setq i (sslength SSX))
                        (setq en (ssname SSX (setq i (1- i))))
                        (setq SSX-Lst (cons en SSX-Lst))
                ); repeat
                (if SSX-Lst
                        (progn
                                (setq BlksLst
                                        (vl-remove-if-not (function (lambda (x) (eq (vlax-get x 'EffectiveName) EffName)))
                                        (mapcar 'vlax-ename->vla-object SSX-Lst))
                                )
                                (setq TempSS (ssadd))
                                (foreach b BlksLst
                                        (vla-GetBoundingBox b 'll 'ur)
                                        (vla-ZoomWindow (vlax-get-acad-object) ll ur); zoom to it
                                        (ssadd (vlax-vla-object->ename b) TempSS)
                                        (sssetfirst nil TempSS); grip it
                                        (foreach att (vlax-safearray->list (vlax-variant-value (vla-GetAttributes b)))
                                                (setq str
                                                        (getstring t (strcat "\nInput value for the \"" (vla-get-TagString att) "\" tag
                                                        \n < \"" (vla-get-TextString att) "\" > or press ENTER to skip :"))
                                                )
                                                (if (/= str "") (vlax-put att 'TextString str))
                                        )
                                        (vla-update b); update the block, necessary?
                                        (if (not c) (setq c (length BlksLst)))
                                        (princ (strcat "\nMoving on to the next block, " (itoa (setq c (1- c))) " remaining!"))
                                        (sssetfirst nil nil); ungrip it
                                        (ssdel (vlax-vla-object->ename b) TempSS)
                                ); foreach
                        ); progn
                       
                ); if SSX-Lst
                (princ "\nCongratulations, you are done!")
                (vla-ZoomExtents (vlax-get-acad-object)); not sure how to restore the zoom to the original state
                (vla-Regen (vla-get-ActiveDocument (vlax-get-acad-object)) acActiveViewport)
        ); progn
); if (and e enx o)

(mapcar '(lambda ( n v / ) (setvar n v)) (mapcar 'car SysVarLst) (mapcar 'cadr SysVarLst))
(if sUndo (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object))))

(princ)
);| defun |; (vl-load-com) (princ)

 
更新的代码。
 
出现了几个问题:
在调用例程之前,是否可以恢复原始的“zoomwindow”状态?
有什么意见吗?如何在*error*defun内正确设置“undo”操作和UndoMark?
 
写这篇文章很有趣,也许LM的代码做得更好。

MTE20112 发表于 2022-7-5 17:54:59

 
谢谢你发帖。不幸的是,我没有说我也在Mac上使用ACAD,在谷歌搜索了一些之后,我意识到有些LISP例程将无法运行。我真的很感谢你花时间写这篇文章。我希望我能测试一下。

Grrr 发表于 2022-7-5 18:03:55

 
我相信李可以这样做,在你的Mac上工作。我猜想/记得Mac OS不支持visual lisp。

MTE20112 发表于 2022-7-5 18:06:48

 
我希望如此!我在网上找到的
;; Formerly TIP 1011: ME.LSP (C)1994, Gary Goode
;; (I've changed the name to DD.LSP and changed the defun to DD, B.K.)

;This program will let you pick and edit multi text and attributes
;by window, pick or crossing using dialog boxes.
;-----------------------------------------------------------------
(defun C:DD (/ A B C D E F G H J K L M )      
(graphscr)
(setvar "BLIPMODE" 0)
(setvar "CMDECHO" 0)
(setvar "HIGHLIGHT" 1)
(prompt "\nMulti-Edit is loaded ...")
(setq A (ssget) B (sslength A) C 0)                  
(while (< C B) (setq D (ssname A C) E (entget D))
   (setq F (car E))
   (setq G (cdr E))
   (setq H (car G))
   (setq J (cdr H))
   (setq K "TEXT")
   (setq L "INSERT")
   (setq M "DIMENSION")
   (if (= J K)(command ".ddedit" D ""))   
   (if (= J L)(command ".ddatte" D ))
   (if (= J M)(prompt "\n You picked a dimension, I only do text or attributes ..."))(terpri)
(setq C (1+ C)))
(princ)
); end me.lsp
 
这在MAC上确实管用,它确实管用,但我必须手动遍历整个图形,并选择我想要处理的所有块。它也比较老,我相信你或李(或其他人)能做的任何事情都会更加精简。非常感谢。

MTE20112 发表于 2022-7-5 18:13:27

谢谢李和其他人,他们帮助我解决了这个问题,并为MAC找到了一个可行的解决方案。这太棒了。
页: [1] 2
查看完整版本: 从一个区块移动到另一个区块