在exis上方插入新的RevBlock
我们正在寻找一种方法,一次修改多个布局选项卡(单个.dwg文件)。我们在一个2D中设计我们的产品。dwg文件。我们将布局选项卡用于模型空间中对象的多个视图(每个布局选项卡上都有项目标题栏,但每个布局选项卡都有自己的一组修订块)
我们在Y方向“堆叠”修订块,请参见第一个屏幕截图)
在项目中,有时所有布局选项卡都需要相同的修订说明。例如,施工问题、体育评论、竣工。。。等等。这之前是通过插入RevBlk、编辑属性、复制基点、切换到每个布局选项卡并粘贴到现有RevBlk上方来完成的。
因此,我们希望能够使用对话框或excel将修订块插入每个布局选项卡。
简单解释(希望如此):例程将找到Y值最大的修订块(RevBlk)(因为我们在Y方向“堆叠”修订块,请参见示例),并在其上方插入一个新的修订块(RevBlk)。块的高度(Y方向)为。1271,所以新的RevBlk需要它的插入点@0,。1271,0相对于具有最高Y值的现有RevBlk。请参见第一个屏幕截图:
http://i.imgur.com/2BWu22E.png
我们的布局选项卡标签遵循以下顺序:
http://i.imgur.com/izH8jcA.png
按照编号顺序,这些是可能的,但不太频繁:
http://i.imgur.com/MZZ4eSo.png
如果我们可以从对话框中控制新修订的插入,那就太好了:
(例程需要检测哪些选项卡可用?)
我很抱歉它看起来的样子,我知道如何制作一个的唯一方法是在Excel的VBA中
http://i.imgur.com/FWNAtgO.png
此外,我有一个更宏伟的愿景,在Excel中定义项目参数,然后将适当的块(从块库)插入新的。dwg文件。
所以我希望这项较小的任务将帮助我进行更大的努力。
插入NewRevBlocks。图纸 这是否过于雄心勃勃?
也许我们可以把它拼凑起来?
1.在所有布局选项卡中查找特定块的插入点。(块名称永远不会更改RevBlk)
2、提示用户输入新的属性值。在另一个RevBlk+的最大Y值处插入相同的块(RevBlk将已加载到图形中)。1271,跨越所有布局选项卡。
让我大吃一惊的是“跨越所有布局选项卡”
我认为这会让我们开始走这条路。
如果没有可用的代码解决方案;链接到示例、教程、类似情况,任何内容都会有所帮助。我一直在搜索google,cadtutor,autodesk论坛,the Swarm,只是想寻求帮助。 发布用于施工。
关于dcl的第2部分,与excell之间的通信可能会更好
; changes to issued for construction
; by Aalan H
(vl-load-com)
; 1.Get current date in mm/dd/yy format.
(defun ddmmyy (/ x today)
(setvar "cmdecho" 0)
(setq x (getvar "CDATE")) ; get current date
(setq today ( rtos x 2 4)) ; convert to a string
(setq date (strcat (substr today 7 2) "." (substr today 5 2) "." (substr today 3 2) ))
)
(setq oldtag1 "DRAWING_STATUS") ;attribute tag name
(setq newstr1 "ISSUED FOR CONSTRUCTION")
(setq oldtag2 "REV_NO");attribute tag name
(setq newstr2 "0")
(setq ss1 (ssget "x"'((0 . "INSERT") (2 . "DA1DRTXT"))))
(setq inc (sslength ss1))
(repeat inc
(foreach att (vlax-invoke (vlax-ename->vla-object (ssname SS1 (setq inc (1- inc)) )) 'getattributes)
(if (= oldtag1 (strcase (vla-get-tagstring att)))
(vla-put-textstring att newstr1)
) ; end if
(if (= oldtag2 (strcase (vla-get-tagstring att)))
(vla-put-textstring att newstr2)
) ; end if
) ; end for
) ;end repeat
(setq oldtag1 "REV-NO")
(setq newstr1 "0")
(ddmmyy)
(setq oldtag2 "DATE") ; attribute tags
(setq newstr2 date)
(setq oldtag3 "AMENDMENT")
(setq newstr3 "ISSUED FOR CONSTRUCTION")
; revtable is block name
(setq ss2 (ssget "x"'((0 . "INSERT") (2 . "REVTABLE"))))
(setq inc (sslength ss2))
(repeat inc
(foreach att (vlax-invoke (vlax-ename->vla-object (ssname ss2 (setq inc (1- inc)))) 'getattributes)
(if (= oldtag1 (strcase (vla-get-tagstring att)))
(vla-put-textstring att newstr1)
)
(if (= oldtag2 (strcase (vla-get-tagstring att)))
(vla-put-textstring att newstr2)
)
(if (= oldtag3 (strcase (vla-get-tagstring att)))
(vla-put-textstring att newstr3)
)
)
)
(setq ss1 nil)
; (setq ss2 nil)
(princ)
代码看起来很有趣 作为起点,我将添加两个额外属性(可以设置为不可见),第一个属性记录每个布局名称,以便可以获得现有布局的列表(使用“ctab”变量),第二个属性将注册块插入点Y值,以便可以找到最高值(插入点是块占位符选项)。在完整的Autocad中使用LISP可能要容易得多,但在LT中,我可以使用“attext”命令从所有布局中的块中提取数据,然后在excel中,将该列表排序和组织成某种顺序以便在数据表单中使用要容易得多(至少对我来说更容易),然后,可以使用在excel单元格中创建的脚本插入新块,并将其粘贴到Autocad命令行中; 我的0.05美元,如果你插入一个rev块,其中有多行,但与空白信息,然后你只需检查,看看那里有一个空行,并填写,它的外观都完成了。你可以根据属性的创建顺序来检查属性,而不是使用标签。这样做的好处是你几乎不需要知道关于块的任何信息,基本上只需要知道块的名称。按照原来的帖子,虽然它创建了线工作以及一些额外的工作。 是否有一个实例表明一个或多个布局选项卡上的工作表不会被加速?
看来你已经准备好了DCL,你能把它贴在这里吗?它节省了我们很多时间从头开始创建一个
[编辑]哎呀,对话框不是在DCL中发布的,不是吗? 是的,事实上,对项目的任何给定更改更有可能不会影响所有图纸。它可能影响1张纸或除1张外的所有纸。这就是为什么我想在对话框示例中使用洋红色的选项。
我在TheSwamp得到了Ronjonp的一些帮助:
它将在所有布局选项卡上的上一个RevBlock上方插入另一个RevBlock。因此,这是朝着正确方向迈出的一大步。
(defun c:revs ;; Localized variables & functions
(/ _dxf _copy _getattval _setattval blks co o rev ss)
(vl-load-com)
;; < / Helper functions
(defun _dxf (code ename)
(if (and ename (= (type ename) 'ename))
(cdr (assoc code (entget ename '("*"))))
)
)
(defun _getattval (block tag / att out)
(foreach att (vlax-invoke block 'getattributes)
(if (eq (strcase tag) (strcase (vla-get-tagstring att)))
(setq out (vla-get-textstring att))
)
)
out
)
(defun _setattval (block tag value / att out)
(foreach att (vlax-invoke block 'getattributes)
(if (eq (strcase tag) (strcase (vla-get-tagstring att)))
(setq out (vla-put-textstring att value))
)
)
out
)
(defun _copy (obj from to / out)
(cond ((setq out (vlax-invoke obj 'copy)) (vlax-invoke out 'move from to) (vla-update out) out))
)
;; Helper functions \ >
;;
;; Foreach paperspace tab
(foreach tab (layoutlist)
;; If we find 'revblk'(s) on that tab
(if (and (setq ss (ssget "_X" (list '(0 . "insert") (cons 410 tab) '(2 . "RevBlk"))))
;; Convert the selection set to a list
(setq ss (mapcar 'cadr (ssnamex ss)))
;; Sort the blocks by greatest Y value & grab the first item
(setq ss (car (vl-sort ss '(lambda (a b) (> (caddr (_dxf 10 a)) (caddr (_dxf 10 a)))))))
;; Add the first item ( greatest Y ) to a 'blks' list
(setq blks (cons ss blks))
)
;; Iterate the 'blks' list
(foreach blk blks
(if (and ;; Convert block from 'ename' to vla-object
(setq o (vlax-ename->vla-object blk))
;; Make a copy + 0.127148 in the Y
(setq co (_copy o '(0.0 0.0 0.0) '(0.0 0.127148 0.0)))
)
(progn ;; Check that the att value is a number
(or (and (setq rev (_getattval o "R#"))
(numberp (read rev))
;; Increment the value by 1
(setq rev (itoa (1+ (atoi rev))))
)
;; Or set it to 0
(setq rev "0")
)
;; Set new attribute values in the copied block
(_setattval co "R#" rev)
(_setattval co "REVl1" (strcat "DESCRIPTION FOR REV - " rev))
(_setattval co "REVB" "YODA")
(_setattval co "REVD" (menucmd "M=$(edtime,$(getvar,date),M\"/\"YY)"))
)
)
)
)
)
(princ)
)
然而,它似乎将#数量的块放置在现有修订块的上方。#看起来是布局选项卡的数量。 Pbe re dcl可能将布局视为dcl滚动列表,但将名称和当前修订位显示为点对。选择一个并启用单个编辑框。再多想一想,也许在列表框中布局Name current rev newrev,然后是一个更新按钮,这样你可以在实际做更改之前向上滚动并拥有它。第三位类似于第一次全部更新是更新范围。
您是否修改了ronjonp的原始代码?我很确定它不是那样写的。我建议你查一下TheSwamp的原始帖子
(defun c:revs ;; Localized variables & functions
(/ _dxf _copy _getattval _setattval blks co o rev ss)
(vl-load-com)
;; < / Helper functions
(defun _dxf (code ename)
(if (and ename (= (type ename) 'ename))
(cdr (assoc code (entget ename '("*"))))
)
)
(defun _getattval (block tag / att out)
(foreach att (vlax-invoke block 'getattributes)
(if (eq (strcase tag) (strcase (vla-get-tagstring att)))
(setq out (vla-get-textstring att))
)
)
out
)
(defun _setattval (block tag value / att out)
(foreach att (vlax-invoke block 'getattributes)
(if (eq (strcase tag) (strcase (vla-get-tagstring att)))
(setq out (vla-put-textstring att value))
)
)
out
)
(defun _copy (obj from to / out)
(cond ((setq out (vlax-invoke obj 'copy)) (vlax-invoke out 'move from to) (vla-update out) out))
)
;; Helper functions \ >
;;
;; Foreach paperspace tab
(foreach tab (layoutlist)
;; If we find 'revblk'(s) on that tab
(if (and (setq ss (ssget "_X" (list '(0 . "insert") (cons 410 tab) '(2 . "RevBlk"))))
;; Convert the selection set to a list
(setq ss (mapcar 'cadr (ssnamex ss)))
;; Sort the blocks by greatest Y value & grab the first item
(setq ss (car (vl-sort ss '(lambda (a b) (> (caddr (_dxf 10 a)) (caddr (_dxf 10 a)))))))
;; Add the first item ( greatest Y ) to a 'blks' list
;(setq blks (cons ss blks))
)
;; Iterate the 'blks' list
;;(foreach blk blks
(if (and ;; Convert block from 'ename' to vla-object
(setq o (vlax-ename->vla-object ss))
;; Make a copy + 0.127148 in the Y
(setq co (_copy o '(0.0 0.0 0.0) '(0.0 0.127148 0.0)))
)
(progn ;; Check that the att value is a number
(or (and (setq rev (_getattval o "R#"))
(numberp (read rev))
;; Increment the value by 1
(setq rev (itoa (1+ (atoi rev))))
)
;; Or set it to 0
(setq rev "0")
)
;; Set new attribute values in the copied block
(_setattval co "R#" rev)
(_setattval co "REVl1" (strcat "DESCRIPTION FOR REV - " rev))
(_setattval co "REVB" "YODA")
(_setattval co "REVD" (menucmd "M=$(edtime,$(getvar,date),M\"/\"YY)"))
)
)
)
)
)
(princ)
)
这将解决“在所有选项卡上插入新修订”的问题
至于另一件事。。。。。。好DCL和所有。。。。。
页:
[1]
2