从块中提取属性值

问题描述 投票:0回答:1

我试图将属性值从块中拉出,但我遇到了一些困难。该块的名称是固定的(ShtScale),属性标签也是固定的(Scale),但我不确定我将使用什么函数来提取这些信息,因为我不知道它是如何存储的。为了让这个问题变得更棘手,我不能使用任何 VL、VLA 或 VLAX 函数,因为这是我通过 accoreconsole 运行的更大例程的一部分,并且它不会接受任何这些函数(即使在加载acapp.arx)。这也意味着我无法使用任何用户提示,但我并不认为这是一个太大的问题,因为块名称和 att 值都是 100% 固定的,并且始终用于此功能的目的。到目前为止,我得到的唯一代码片段是:

(setq blk (ssget "_X" '((0 . "INSERT") (2 . "ShtScale") (410 . ltab))))

但这带来了我遇到困难的问题 2,即如何将当前布局选项卡的布局选项卡名称传递给选择集。我试过这个:

(setq ltab (getvar "ctab"))

但是设置为“ltab”变量的内容在选择集过滤器中不可用,因为我当前正在使用它,但我不明白为什么。

理想情况下,它应该从块中提取的信息是:“1/8”= 1'-0“”

lisp autocad autolisp
1个回答
0
投票

您的变量

ltab
未在
ssget
过滤器列表中求值的原因是由于使用了撇号,它将列表引用为文字数据(即不求值)。您可以通过阅读我的教程这里来找到有关使用撇号和引号功能的更多信息。

要评估

ltab
变量,您需要使用
ssget
list
函数构造
cons
过滤器列表,例如:

(setq blk (ssget "_X" (list '(0 . "INSERT") '(2 . "ShtScale") (cons 410 ltab))))

这里,文字数据仍然被引用,但是当

ltab
表达式被求值以返回点对时,
cons
变量将被求值。

我应该注意,如果您的目标块是动态的,您还需要在选择集中包含匿名块引用,否则具有已修改动态参数的目标块名称的动态块引用将被忽略。

然后,您需要迭代选择集以分别对每个块引用实体进行操作。 有很多方法可以做到这一点。就我个人而言,我喜欢选择基本的

repeat
循环,例如

(repeat (setq idx (sslength blk))
    (setq idx (1- idx)
          ent (ssname blk idx)
    )
)

块引用所持有的属性引用将遵循图形数据库中的块引用实体,直到到达终止

SEQEND
实体。有了这些信息,您可以使用
entnext
函数迭代块参考实体后面的图形数据库记录,直到到达
SEQEND
实体。

这是一个基本示例:

(repeat (setq idx (sslength blk))
    (setq idx (1- idx)
          ent (ssname blk idx)
    )

    (setq att (entnext ent) ;; ATTRIB entity
          atx (entget  att) ;; ATTRIB DXF data
    )
    (while (= "ATTRIB" (cdr (assoc 0 atx))) ;; While we have an ATTRIB
        (if (= "SCALE" (cdr (assoc 2 atx))) ;; If we've reached our target ATTRIB
            (setq val (cdr (assoc 1 atx)))  ;; Obtain the ATTRIB value
        )
        (setq att (entnext att) ;; Get next entity
              atx (entget  att) ;; Get DXF data for next entity
        )
    )
)

这里,每个块引用的属性值将由

val
变量保存。

© www.soinside.com 2019 - 2024. All rights reserved.