Bill Tillman 发表于 2022-7-5 15:26:30

标题的表格样式文本(&H)

我需要一种方法来准确、快速地计算AutoCAD文件中的对象,我们的主要负责人李·Mac有一个很好的例子,叫做TCount,很适合这个例子。这里有一些额外的功能,我可以为扩展它提供一些建议。
[列表=1]
[*]我计算的细节是一个块,它是一个圆心有一条水平线的圆。块包含两个属性,顶部是零件的标记#,这一个是我要查找的目标,底部属性是图纸编号。目前对页码不感兴趣,因此我想知道是否有方法可以省略数据表中显示的这些实例。
[*]TABLESTYLE命令对于将字体设置为我想要的大小和颜色很有用,但标题字段标题中的文本相当通用。我想知道除了在创建表格后手动编辑文本之外,是否还有其他方法可以更改文本。使用LISP代码可以,或者能够在TABLESTYLE窗口中设置所需的文本也可以。
[/列表]

Bill Tillman 发表于 2022-7-5 15:33:23

快进半个小时,我确实找到了改变数据表中文本的变量。这很酷。现在要了解如何绕过每个块的第二个属性。。。
 
再快进45分钟,披萨送到了,现在我得到了第三栏。

BIGAL 发表于 2022-7-5 15:41:30

看看这个
 

; 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 tomkinson jobs
(progn
(setq bname "COGG_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)

Bill Tillman 发表于 2022-7-5 15:43:47

嘿,比格尔,谢谢你的代码示例。我现在正在看。但当我尝试时,它在这一行失败了:

BIGAL 发表于 2022-7-5 15:49:04

您是否更改了块名(setq bname“DA1DRTXT”)和标记名,它们都是硬编码的,以满足我的需要。这更多的是一个例子,你需要分拆和改变,以适应你的情况。

Bill Tillman 发表于 2022-7-5 15:54:09

嘿,比格尔,是的,我发现这就是我测试代码时遇到的问题。我将变量bname的值更改为我正在测试的块的名称,它起了作用,但没有得到我想要的结果。我正在研究李·麦克的TCOUNT代码,因为我认为它更多的是一个简单的文本搜索。我遇到的问题是,计算文本的代码也计算我不想包含的文本。例如,我使用了一个块,它有两个附加属性,我只在数据表中使用其中一个属性。
 
我还研究了DATAEXTRATION命令,因为我读过的几篇文章将其作为累积计数的首选方法。与AutoCAD一样,完成给定任务的方法不止一种。

BIGAL 发表于 2022-7-5 16:01:05

我发布的示例中,块有大约12个属性作为标题块。我搜索标签名。

(setq tag2 "DRG_NO") ;attribute tag name
(setq tag3 "WORKS_DESCRIPTION") ;attribute tag name
..............
(if (= tag2 (strcase (vla-get-tagstring att)))
............

BIGAL 发表于 2022-7-5 16:08:04

Bill发布了一个样例dwg,可以使用nentsel拾取属性,然后查看块而不是硬代码。
 

(entget (car (nentsel)))

((-1 . <Entity name: 7ffffb7e210>)
(0 . "ATTRIB") picked an attribute
(1 . "PRELIMINARY DRAWING") text value of attribute
(2 . "DRAWING_STATUS") tag name

Bill Tillman 发表于 2022-7-5 16:12:27

比加尔,
 
这是我正在努力解决的问题之一。我想做的是能够选择其中的一个或多个,并有一个像李Mac的文本计数程序中建立的数据表。它工作,但它也计算“FE1.1”字段,这不是我想要的。
图纸1.dwg

BIGAL 发表于 2022-7-5 16:18:17

这可能是一个潮湿的周末,所以应该有一些时间观看这个空间。
 
好的,我认为应该已经有一些东西了,比如李的tcount,选择所有的块,列出所有属性,并对列表进行排序。
 
((SLD-01)(SLD-01)(SLD-02)(SLD-02)(SLD-02))因此有2个SLD-01和3个SLD-02,依此类推
 
然后,只要通过每次名称更改时重置列表来填充表。
 
我不知道为什么你的门挡不能作为表中的多属性(即三列)来完成。
 
((门1把手1)(门1把手1)(门1把手1)(门1把手1)(门1把手2))带把手1的3个门1,带把手2的1个门1
 
这是你想要的吗?你可以有2个以上的属性,门把手1金色,门把手1黄铜。只需要知道写一个更好的版本第一次去。
 
它可能是一个通用的例程,而不是硬编码的max No属性?
 
数据提取浮现在脑海中。
页: [1] 2
查看完整版本: 标题的表格样式文本(&H)