动态块提取到表
你好我正在尝试编写一个LISP例程,将图形中许多特定动态块的特定属性制成表格。我设法找到了下面的代码(多亏了Fixo?和HMSilva),它被修改为只识别外部参照块。如何删除对此进行测试的逻辑?我已经确定了测试这种情况的代码(IsXref),但如何消除这种情况我一直没有找到。
最后,我想在表中包括每个块的起点和终点的坐标。
;| http://www.cadtutor.net/forum/showthread.php?83991-Populate-Table
Original by Oleg Fateev
Modified by hms 2014/11/14
as a 'demo' to JCprog
http://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/extract-attributes-from-a-specific-block-and-write-to-table/m-p/5399759#U5399759
|;
(defun C:CLIST (/ a1 a2 a3 acapp acsp adoc atable attdata atts col headers pt row title)
(or adoc
(setq adoc (vla-get-activedocument (setq acapp (vlax-get-acad-object))))
)
(or acsp
(setq acsp (vla-get-block (vla-get-activelayout adoc)))
)
(vlax-for blk (vla-get-blocks adoc)
(if (= (vla-get-IsXref blk) :vlax-true) ;<-***
(vlax-for x blk
(if (and (= (vla-get-ObjectName x) "AcDbBlockReference")
(wcmatch (vla-get-EffectiveName x) "*|Duct")
)
(progn
(setq atts (vlax-invoke x 'getattributes))
(foreach att atts
(cond ((wcmatch (vla-get-tagstring att) "DUCT_START")
(setq a1 (vla-get-textstring att))
)
((wcmatch (vla-get-tagstring att) "DUCT_END")
(setq a2 (vla-get-textstring att))
)
((wcmatch (vla-get-tagstring att) "DUCTTYPE")
(setq a3 (vla-get-textstring att))
)
)
)
(setq attdata (cons (list a1 a2 a3) attdata))
)
)
)
)
(if (setq pt (getpoint "\nSpecify table location:"))
(progn
(setq atable
(vla-addtable
acsp
(vlax-3d-point pt)
(+ 2 (length attdata))
3
(/ (getvar 'dimtxt) 2)
(* (getvar 'dimtxt) 4)
)
)
(vla-put-regeneratetablesuppressed atable :vlax-true)
(setq col 0)
(foreach wid (list 10.0 10.0)
(vla-setcolumnwidth atable col wid)
(setq col (1+ col))
)
(vla-put-horzcellmargin atable 0.3)
(vla-put-vertcellmargin atable 0.3)
(vla-setTextheight atable 1 2.0)
(vla-setTextheight atable 2 1.4)
(vla-setTextheight atable 4 1.4)
(setq title "DUCTS")
(vla-setText atable 0 0 title)
(vla-setcelltextheight atable 0 0 2.0)
(vla-SetCellAlignment atable 0 0 acMiddleCenter)
(setq headers (list "START" "END" "TYPE"))
(setq row 1
col 0
)
(repeat (length headers)
(vla-SetCellAlignment atable row col acMiddleCenter)
(vla-setcelltextheight atable row col 1.4)
(vla-setText atable row col (car headers))
(setq headers (cdr headers))
(setq col (1+ col))
)
(setq row 2)
(foreach record attdata
(setq col 0)
(foreach item record
(vla-setText atable row col item)
(vla-SetCellAlignment atable row col acMiddleCenter)
(vla-setcelltextheight atable row col 1.4)
(setq col (1+ col))
)
(setq row (1+ row))
)
(vla-put-regeneratetablesuppressed atable :vlax-false)
(vla-put-height atable (+ (* (vla-get-rows atable) 2.2) 4.1))
(vla-update atable)
)
)
(princ)
)
(prompt "\n\t---\tStart command with CLIST\t---\n")
(prin1)
(or (vl-load-com))
(princ) 你好
感谢您的输入,但我要做的更多的是从动态块中提取数据。
Spaj,请清楚解释一个块及其坐标,如表所示,以及何时添加减号或加号。 嗨Tharwat
抱歉给你带来了困惑。附件是一个示例。简单地说,在AutoCAD中生成的余词需要进行转置,即X成为Y值,Y成为X值,但符号相反。
管道示例1。图纸
这是由于SA中的非标准测量坐标系是向南的,角度测量是逆时针的,坐标系引用Y然后X。AutoCAD中的最佳折衷方案是在第三象限笛卡尔坐标系中工作(其中X和Y值为-ve)。这允许正确的方向和坐标值的正确顺序,但缺点是这些值的符号不正确。因此,所有引用的同词都需要转置和签名。 你好
您可能知道如何消除逻辑来检查块是否为附加代码中的外部参照吗?
; dwg index to a table
; by Alan H NOV 2013
(defun AH:dwgindex (/ doc objtable ss1 lay ans ans2 plotabs ss1 tag2 tag3 list1 list2 curlayout colwidth numcolumns numrows INC rowheight )
(vl-load-com)
(setq curlayout (getvar "ctab"))
(if (= curlayout "Model")
(progn
(Alert "You need to be in a layout for this option")
(exit)
) ; end progn
) ; end if model
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(setq curspace (vla-get-paperspace doc))
(setq pt1 (vlax-3d-point (getpoint "\nPick point for top left hand of table: ")))
; read values from title blocks
(setq bname "DA1DRTXT")
(setq tag2 "DRG_NO") ;attribute tag name
(setq tag3 "WORKS_DESCRIPTION") ;attribute tag name
(setq ss1 (ssget "x" (list (cons 0 "INSERT") (cons 2 bname))))
(if (= ss1 nil) ; for xxx jobs
(progn
(setq bname "XXXX_TITLE")
(setq ss1 (ssget "x" (list (cons 0 "INSERT") (cons 2 bname))))
)
)
(setq INC (sslength ss1))
(repeat INC
(foreach att (vlax-invoke (vlax-ename->vla-object (ssname SS1 (SETQ INC (- INC 1)) )) 'getattributes)
(if (= tag2 (strcase (vla-get-tagstring att)))
(progn
(setq ans (vla-get-textstring att))
(if (/= ans NIL)
(setq list1 (cons ans list1))
) ; if
); end progn
) ; end if
(if (= tag3 (strcase (vla-get-tagstring att)))
(progn
(setq ans2 (vla-get-textstring att))
(if (/= ans2 NIL)
(setq list2 (cons ans2 list2))
) ; end if
) ; end progn
) ; end if tag3
) ; end foreach
) ; end repeat
(setvar 'ctab curlayout)
(command "Zoom" "E")
(command "regen")
(reverse list1)
;(reverse list2)
; now do table
(setq numrows (+ 2 (sslength ss1)))
(setq numcolumns 2)
(setq rowheight 0.2)
(setq colwidth 150)
(setq objtable (vla-addtable curspace pt1 numrows numcolumns rowheight colwidth))
(vla-settext objtable 0 0 "DRAWING REGISTER")
(vla-settext objtable 1 0 "DRAWING NUMBER")
(vla-settext objtable 1 1 "DRAWING TITLE")
(SETQ X 0)
(SETQ Y 2)
(REPEAT (sslength ss1)
(vla-settext objtable Y 0 (NTH X LIST1))
(vla-settext objtable Y 1 (NTH X LIST2))
(vla-setrowheight objtable y 7)
(SETQ X (+ X 1))
(SETQ Y (+ Y 1))
)
(vla-setcolumnwidth objtable 0 55)
(vla-setcolumnwidth objtable 1 170)
(command "_zoom" "e")
); end AH defun
(AH:dwgindex)
(princ)
只要变量是局部的,or函数的用途是什么? 嗨,李
谢谢,成功了。我把注释去掉了if语句和相应的括号,但没有去掉管道!管道的意义是什么?
不幸的是,我现在有一个ActiveX服务器返回了一个错误:参数不是
代码其余部分中的可选项。 你好,Marko
谢谢你的投入,但这似乎不起作用。例程无法识别指定的块。
包含管道字符的表格名称(即图层、块、线型等)是与外部参照相关的项目,管道左侧的内容等于从中派生的外部参照的名称。
你能发布你当前修改过的代码吗?
啊哈,如果你能理解这些细微差别,这会有所帮助。
当然
CList_管道。LSP
页:
[1]
2