我有许多具有属性的块。我正在尝试搜索WEE特定值中的属性,当我找到它时,我想将NDT更改为某个值。
名称属性 | 值属性 | |
---|---|---|
WEE | A011 | |
NDT | (空) |
问题就在这里:
for att in Atributi.GetAttributes():
if att.TagString == 'WEE' and att.TextString == 'A011':
if att.TagString == 'NDT':
考虑到att.TagString
不能同时等于WEE
和NDT
,因此第二个if
语句的测试表达式永远无法验证,因为要达到它,att.TagString
必须等于WEE
。
相反,一种可能的解决方案是对属性集进行迭代,并使用两个单独的if
语句(或者更确切地说,if elif
):
if att.TagString == 'WEE' and att.TextString == 'A011'
然后将布尔"flag"变量设置为true,这样我们以后就知道条件已经满足。否则
if att.TagString == 'NDT'
将属性引用对象设置为一个单独的变量,这样我们就可以在循环之外对其进行操作。
由于我们不能依赖于在循环中遇到属性引用的顺序,因此如果仅满足其中一个条件,我们就不能退出循环,因此必须单独评估它们。
然后,在循环之外,您可以测试标志变量,如果为true,则修改第二个if
语句分配的属性值。
例如:
for Atributi in acad.ActiveDocument.ModelSpace:
name = Atributi.EntityName
if name == 'AcDbBlockReference':
if Atributi.HasAttributes and Atributi.Name == blokZvar:
flg = False
for att in Atributi.GetAttributes():
if att.TagString == 'WEE' and att.TextString == 'A011':
flg = True
elif att.TagString == 'NDT':
atb = att
if flg and atb:
atb.TextString = '*'
atb.Update()