在布局选项卡中的现有块上方插入新块
我只是一个初学者,但有很大的愿望和目标。我正在寻找一种一次将修订块添加到多个布局选项卡(单个. dwg文件)的方法。每个项目,我们在一个. dwg文件中以2D设计我们的产品。AutoCAD 2013。
我们将布局选项卡用于模型空间中对象的多个视图,(每个布局选项卡上都有项目标题块,但每个布局选项卡都有自己的修订块集。)
我们将修订块“堆叠”在Y方向,请参阅第一个截图)
在项目中,有时所有布局选项卡都需要相同的修订描述。例如,用于构建的问题、P. E.注释、As Built...等。这以前是通过插入修订块、编辑属性、复制基点、切换到每个布局选项卡并粘贴在现有RevBlk上方来完成的。
因此,我们希望能够使用对话框或excel将修订块插入每个布局选项卡。
简单地(希望)解释:例程会找到具有最大Y值的修订块(RevBlk)(因为我们将修订块“堆叠”在Y方向,请参阅示例)并在其上方插入一个新的修订块(RevBlk)。块的高度(Y方向)是.1271,因此新的RevBlk需要它的插入点@0,.1271,0相对于具有最高Y值的现有RevBlk。请参阅第一个屏幕截图:
我们的布局选项卡标签遵循以下顺序:
遵循该编号顺序,这些是可能的,但不那么频繁:
如果我们可以控制从对话框中插入新修订,那就太好了:
(例程需要检测哪些选项卡可用?)
我很抱歉它看起来的样子,我知道如何制作一个的唯一方法是在Excel的VBA
这个例程将是其他序列的子部分,但我需要在它变得更大之前从这里开始。
所以我希望这个较小的任务能帮助我完成更大的努力。
***
我在几个地方寻求帮助,但无济于事。
这是不是太雄心勃勃了?
也许我可以把它拼凑起来?
1.在所有布局选项卡中找到特定块的插入点。(块名称永远不会改变:RevBlk)
2.
在所有布局选项卡中,在另一个RevBlk+.1271的最大Y值处3.Insert相同的块(RevBlk,它将已经加载到绘图中)。
绊倒我的部分是“跨越所有布局选项卡”
如果没有可用的代码解决方案;示例、教程、类似情况的链接,任何东西都有帮助。
**** Hidden Message ***** 欢迎来到TheSwamp。。下面是一个没有用户输入的快速示例,说明如何复制和增加每个布局选项卡上的修订块值。我添加了注释,以便您可以从中学习。
(defun c:revs ;; Localized variables & functions
(/ _dxf _copy _getattval _setattval blks co o rev ss)
(vl-load-com)
;;
(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)
) 哇,罗恩,太好了!而且效果非常好
Ron,当我运行它时:它将在现有块上放置一个新块(RevBlk),但也将放置#。#是布局选项卡的数量
因此,如果有6个布局选项卡,将插入6个块。我正在学习/筛选它,以找到发生这种情况的地方<谢谢你的欢迎,我在这里潜伏了一段时间,现在是我更多参与的时候了。我对尽可能多地学习感到兴奋。 请原谅这可能是一个愚蠢的问题,但是您是否考虑过简单地使用图纸集管理器(SSM)自定义特性,用字段填充您的属性化标题栏等?干杯 我的新朋友们,我有一些坏消息。
我被告知我将被解雇。我要完成我目前的设计/工程项目,大约2周后,我需要找到一个新的雇主。
因此,我暂时无法在这个项目上投入太多精力(如果有的话)。如果你对这个项目感兴趣,请订阅它。
至于这个项目线程,我将创建我在OP中引用的DCL,然后我们可以从那里开始?
感谢您迄今为止的帮助。我不会放弃这个项目,但我不能像我希望的那样在接下来的几周内投入时间。
我知道我会回到这个项目中来,我觉得这个项目太多才多艺,太有用了,不能让它就这样结束。
我希望能尽快回来发布。 很抱歉听到这个消息 这是非常不幸的。祝你求职好运。
页:
[1]