AVZ 发表于 2022-7-6 22:15:50

以编程方式更改块

嗨,我是新来的,有点小问题。
 
我有一个AutoCAD动态块,它有几个属性和一个visibilityparameter,允许不同的开关显示为块的一部分。此块用作与数据库软件包一起使用的模板的一部分。SQL查询写在块的属性中,当从数据库软件中选择模板时,模板会自动填充信息。
 
SQL查询只能写入块属性中。我可以向块中添加另一个属性,并插入一个SQL查询以索引到correctvisibility数字,以显示右侧开关。我需要的是aVBA例程来检测和属性的变化,然后更改可见性参数的值,以便显示正确的开关。
 
事实上,我对AutoCAD方法、属性和事件不是很熟悉,这周才开始研究。

BlackBox 发表于 2022-7-6 22:26:17

欢迎来到CADTutor,祝贺你的第一个帖子!
 
 
 
我对这个不应命名的“数据库软件包”一无所知,但假设该软件提供了更新这些属性引用的命令。。。当引发ObjectModified事件时,您希望捕捉修改的AttributeReference对象的ObjectId,并通过挂接“database software package”命令的CommandCancelled、CommandEnded或CommandFailed事件来处理存储的ObjectId[](集合)或列表,因为当ObjectId的DBObject在数据库中打开时,不能修改它(并且没有这样的DBObject.ClosedInDatabase事件)。
 
需要更多信息。
 
干杯

AVZ 发表于 2022-7-6 22:33:38

感谢您的快速回复。
 
也许我对数据库软件包isAveva Instrumentation有点神秘。它在AutoCAD中添加了一个选项,允许选择块以将数据链接添加到属性字段中。这些属性是在图形变暗时使用Aveva数据库中的信息填充的,并且图形上属性的文本也会更新例如,我的区块的表格具有以下属性:INSTRUMENT\u DESCRIPTION、INSTRUMENT\u RANGE、INSTRUMENT\u TAG和CABLE#这些属性的文本从数据库中的文本数据链接更改并显示在图形上。我添加了另一个属性“SWPOS”,在这里我可以对数据链进行SQL查询,以生成与“开关类型”的可见性状态匹配的值。
 
我需要捕获修改的事件,然后检查修改的对象是否是我的一个块的“SWPOS”属性,如果是,请将该值放入可见性参数中,以使切换图片发生更改。
我的问题是我不知道如何正确调用路径来访问正确的属性。

BlackBox 发表于 2022-7-6 22:41:51

感谢您提供的额外信息,但由于不熟悉该软件,我仍然不明白是否使用命令来填充/更新所述属性块?
 
也就是说,我在前面的回答中忽略了这一点,您还需要在被修改之前捕获对象(隐式存储原始值),这样当您捕获修改后的对象时,您就可以进行比较了。我建议您同时存储ObjectId和原始值,以便匹配相应的结果(修改)对象。
 
此外,有一个样本图来测试。。。显然,我没有您的补充软件,但假设值的变化应该足以进行测试。我更感兴趣的是捕捉适当的对象(因为我怀疑您需要捕捉BlockReference,而不是AttributeReference,因为它是可以从其所有者BlockReference中剔除的嵌套实体),并相应地正确更改可见性状态。
 
干杯

AVZ 发表于 2022-7-6 22:47:14

谢谢你的帮助。我已连接了该块。我在想,我所需要的只是在属性“SWPOS”中寻找变化,然后将可见性参数“Switch Type”更改为该值。这样,其他属性的更改将通过来自Aviva软件的数据链接完成。如果我可以把数据链路放在“Switch Type”参数中,我会这么做,但这是不可能的。

DI块示例。图纸

BlackBox 发表于 2022-7-6 22:53:58

感谢您邮寄样品;我会在午休时间调查的。。。再说一遍,是命令,还是没有命令?
 
 
对的
 
一旦“SWPOS”AttributeReference中的更改被识别,我们可以通过AttributeReference的OwnerId属性更改对BlockReference的访问。。。从那里,我们可以通过DynamicBlockReferencePropertyCollection更改可见性状态。

AVZ 发表于 2022-7-6 23:02:31

谢谢你的帮助,但我不理解你的问题。从数据链接指向的信息更改为从Aviva软件打开图形时的属性。这就是数据链接表的样子,您只需将它们拖放到我上一篇文章中所示的表单中
https://www.cadtutor.net/forum/images/misc_cadtutor/pencil.png

BlackBox 发表于 2022-7-6 23:07:39

 
如果我再多解释一点,也许会更有意义。。。。
 
存储修改的对象是一个相对简单的过程,将其与先验值进行比较要复杂一些,在事实发生后处理存储的对象相对容易*如果*支持CommandCancelled、CommandEnded或CommandFailed事件,因为此时数据库中存储的对象已关闭。我们无法更改当前在数据库中打开的对象,这就是为什么我们无法修改AttributeReference对象的所有者(BlockReference),因为它在数据库中也是打开的(其中前者是OpenMode.ForWrite,通过UpgradeOpen()方法,后者是OpenMode)。ForRead)。
 
人们甚至可以在没有命令结束等的情况下处理存储的对象。但这又带来了复杂性的飞跃(ObjectOverrule),除非需要,否则我宁愿避免。
 
 
 
也就是说,浏览了您发布的图形后,我想我已经回答了是否使用命令修改属性值的问题。。。由于正在手动修改SWPOS属性,而不是通过一些编程方式(例如.NET、ObjectARX等)进行修改,因此使用了EATTEDIT命令。。。我们会收回的。
 
但是,如果您改为通过“特性”选项板等更改SWPOS属性值。。那么这个命令就不用了,事实上,我提到的ObjectOverrule是必要的。
 
我希望这能让(更多?)你现在感觉到了吗?
 
干杯

AVZ 发表于 2022-7-6 23:12:30

你好,我很抱歉离开这么久。我试着了解并回答你的问题,但我找不到。我只能猜测,在生成图形时,属性是以编程方式更新的,因此它是被命令的。
如果是这种情况,需要什么类型的代码?
当使用AutoCAD输入Aviva数据链接时,会加载VBA模块。我看不出这与访问数据库和检索数据字段有什么关系。我已经将代码包含在我的帖子中。
谢谢你的帮助。
密码txt文件

AVZ 发表于 2022-7-6 23:22:23

嗯……我找到了一种方法来做我想做的事。它可能不是一个有经验的职业选手的口才,但是,嘿,它有效。
我在ThisDrawing中有以下代码。
从Object Modified事件中,它将调用模块1中的子模块。
1
页: [1]
查看完整版本: 以编程方式更改块