DGRL 发表于 2022-7-5 15:25:14

获取并设置

亲爱的程序员
 
 
你们中有人有过获取和设置对象属性的经验吗?
试图获取块的对象属性,但返回的是块记录的名称,而不是转储属性时可以看到的字符串
 
 

当我扔掉道具的时候我看到了这个
 
 
.....
块ID(类型:AcDbObjectId)(RO)=7ffff9359f0
.....
 
 
执行时
 
 
(getpropertyvalue e1“BlockId”)
 
 
我得到的只是
 
 
$(getpropertyvalue e1“BlockId”)
_$
 
 
执行entget时
 
 
((-1 . ) (0.“BLOCK\u RECORD”)(5.“1F”)(102.{ACAD\u XDICTIONARY”)(360。)(102 . "}") (330 . ) (100.“AcDbSymbolTableRecord”)(100.“AcDbBlockTableRecord”)(2.“*Model_Space”)(360。)(340 . ) (70 . 0) (280 . 1) (281 . 0))
 
 
 
 
我得到了大量的信息,但不是我想要的区块id
还是我丢了东西?

hanhphuc 发表于 2022-7-5 15:29:18

我的2007版没有此功能
(getpropertyvalue e1“BlockId”)
 
让其他积极的成员帮助你。。
 
 
FWIW这是获取“值”的示例。。

((lambda (l)
(vlax-for x (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object)))
    (setq l (cons (cons (vla-get-Name x)(vla-get-ObjectID x)) l))
    )
l )
nil
)
 

(("BKL" . 2130687768) ("_Oblique" . 2130687736) ("*Paper_Space0" . 2130627944) ("*Paper_Space" . 2130627904) ("*Model_Space" . 2130627832))
 
我可能对你的BlockId值错了。。

ziele_o2k 发表于 2022-7-5 15:36:25

自AC2012起,以下功能可用
dumpallproperties
getpropertyvalue
setpropertyvalue
iPropertyReadOnly
 
我不知道用ename作为字符串要实现什么操作,也许需要更多的解释?
顺便说一句(如何将ename作为字符串)
(vl-princ-to-string (CAR (ENTSEL)))

Jef! 发表于 2022-7-5 15:40:06

2015年,我的区块记录中没有“BlockId”,但我有一个“ObjectID”。Vlax dump表示值为43(RO),getpropertyvalue返回一个ename。可疑。
 
从您的示例中,转储返回的字符串(7ffff9359f0)似乎是使用getpropertyvalue()获得的名称,但我从未见过使用字符串表示名称的程序,据我所知,您也无法从字符串“创建”名称。
 
getpropertyvalue/getpropertyvalue函数是为mac用户创建的,作为vlax get property/vlax put property的替代品,但它们似乎有缺陷,并不总是有效。例如,如果我使用(getpropertyvalue myblkrecord“IsDynamicBlock”),它将返回;错误:ADS请求错误
 
如果您是windows用户,我推荐如下Vlisp
(vlax get属性(vlax ename->vla object myblkrecord)“ObjectID”)。如果我使用(vlax get property(vlax ename->vla object myblkrecord)“IsDynamicBlock”,它会工作并返回:vlax false。
 
旁注:如果一个属性在转储时有(RO),这意味着它是只读的,因此您可以获取它们,但不能设置它们。

DGRL 发表于 2022-7-5 15:44:19

@hanhphuc公司
@杰夫!
谢谢你的代码:-D,但我不能使用对象id,因为当块有微小变化时,它会发生变化
我需要一个可靠的属性,我可以用它来选择一个实体(我唯一能想到的是插入点和ename的组合)
为什么要额外检查-->因为一个人可以插入多个名称相同、内容不同的块,所以blockname不是no
我希望我的例程是唯一的activex而不是autolisp,但在这种情况下,我认为我别无选择
需要将vla对象转换为ename,然后从中获得assoc 10或与插入点合并为vlax数组
 
 
@ziele_o2k谢谢你的代码
 
@杰夫!谢谢你告诉我MAC的部分我忘了

ronjonp 发表于 2022-7-5 15:45:42

“需要将vla对象转换为ename,并从中获得assoc 10或与插入点合并为vlax数组”:vlax vla对象->ename
 
获取插入点:(vlax get obj’insertionpoint)或(cdr(assoc 10(entget ename)))

ziele_o2k 发表于 2022-7-5 15:51:11

 
为什么你不能使用手柄?
 
要查看可以与get/set propertyvalue一起使用的属性,应该使用dumpallproperties而不是Vlax dump。是的,它适用于mac用户,但这不是vlax get/vlax set属性的1:1替换。
获取/设置propertyvalue提供了更多的可能性。
如果你不介意的话,我可以举几个例子。

Jef! 发表于 2022-7-5 15:54:26

不客气!
 
在不确切知道自己正在努力实现什么以及迄今为止做了什么的情况下,盲目地提出建议是相当困难的,但有几点可能值得一提:
块记录和块插入是两件不同的事情。块记录是块定义,即使用块编辑或参照编辑时看到的内容。不能“选择”块定义。当用户“选择块”时,他实际上选择了一个插入。
给定块定义的不同插入将始终具有相同的内容,除非该块是动态的。如果块是动态的,则插入的名称将匿名(即:*232),因此需要检查其属性“EffectiveName”以获取相应块定义的名称。您可以使用以下选项之一
(vlax get property(vlax ename->vla object(car(entsel)))“EffectiveName”)或
(vla get EffectiveName(vlax ename->vla object(car(entsel)))
有些事情在lisp中更容易完成,有些在Visual lisp或active-x中更容易完成。不要仅仅为了一种语言而局限于一种语言。。。更多选项更有趣
 
请随意发布您的代码以获取建议。
干杯
 
编辑:
@齐尔
IsDynamicBlock在2015年不起作用。。。除非只有mac?我很想知道“get/set propertyvalue提供了更多的可能性”基于哪些事实。我总是对学习新事物持开放态度!

DGRL 发表于 2022-7-5 15:58:44

 
好lol我想要的是使用getpropertyvalue获取blockid,它最终似乎是ename的str。
虽然不能真正使用它,但有一个我可以使用的答案:-D

ziele_o2k 发表于 2022-7-5 16:01:43

 
作为其他论坛的第一个例子-尝试从附件中删除对象。仅带VanillaLisp/VisualLisp的dwg
稍后还有更多示例,我将检查IsDynamicBlock属性。
del_obj。图纸
页: [1] 2
查看完整版本: 获取并设置