从一个区块移动到另一个区块
我想看看这是否可行。具有许多动态块的图形,都具有许多属性。我很好奇是否有一个例程可以选择单个块-允许用户填写属性单击“确定”-然后移动到图形中的“下一个”块,直到完成。像这样的事情有可能发生吗? 您可以按块名称选择块,转到第一个或拾取的块并更改属性,选择顺序通常按创建顺序,您可以跳过已更改的块。李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个块的示例后进行更多操作 CAD块2。图纸
这是一个示例文件-文件中有3个块,每个块都有两个属性。我如何实现你的代码?
谢谢 如果需要的话,我可能会在我的快速属性调色板中调整它们。CTRL+SHIFT+P以启用它们,或在屏幕底部的任务栏中启用它们。
我怀疑李的Lisp程序,比加尔提到的,是以下内容http://www.lee-mac.com/dynamicblockcounter.html,如果需要轻松跟踪多个块的条件,这非常有用。
谢谢李!
相关:https://www.theswamp.org/index.php?topic=51947.0 我想知道在哪个论坛上回复,我决定在这里发布我的尝试:
; 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的代码做得更好。
谢谢你发帖。不幸的是,我没有说我也在Mac上使用ACAD,在谷歌搜索了一些之后,我意识到有些LISP例程将无法运行。我真的很感谢你花时间写这篇文章。我希望我能测试一下。
我相信李可以这样做,在你的Mac上工作。我猜想/记得Mac OS不支持visual lisp。
我希望如此!我在网上找到的
;; 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上确实管用,它确实管用,但我必须手动遍历整个图形,并选择我想要处理的所有块。它也比较老,我相信你或李(或其他人)能做的任何事情都会更加精简。非常感谢。 谢谢李和其他人,他们帮助我解决了这个问题,并为MAC找到了一个可行的解决方案。这太棒了。
页:
[1]
2