乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 147|回复: 7

擦除和替换多个块

[复制链接]

3

主题

13

帖子

1

银币

初来乍到

Rank: 1

铜币
25
发表于 2018-6-12 07:08:27 | 显示全部楼层 |阅读模式
早上好,我正在尝试编写一些代码来查看一个块,看看它是否被不当修改,如果是,则将其删除并正确重新插入该块。目前,代码能够找到修改后的块,并且能够删除和重建它。但是,如果在绘图中找到超过1个块,我在第二遍的粗体代码行中收到错误“对象引用未设置为对象的实例”。代码:Public SubDrawing_Check()'在测试中。

将我的块调暗为ArrayList=GetTopLevelBlock()。
将myBlockName调暗为字符串。
调暗myTransMan作为DatabaseServices.TransactionManager。
调暗myTransDatabaseServices.Transaction。
调暗myDB作为DatabaseServices.Database。
将mydwg调暗为文档=ApplicationServices.Application.DocumentManager.MdiActiveDocument。
MyDB=mydwg.Database。
我的TransMan=myDB.TransactionManager。
myTrans=myTransMan.StartTransaction。

对于myblock中的每个myBlockName。
调暗myObjID作为DatabaseServices.ObjectIdCollection。
调暗myObjID作为DatabaseServices.ObjectId。
调暗myBlockRef作为DatabaseServices.BlockReference。
myObjIDs=PopulateOIDC(myBlockName)。

对于myObjID中的每个myObjID。
DatabaseServices.OpenMode.ForReadmyObjID.GetObject。
调暗mybtr作为DatabaseServices.BlockTableRecord=myBlockRef.DynamicBlockTableRecord.GetObject(OpenMode.ForRead)。
如果mybtr.Name="通用块",则。
'检查是否旋转。
如果myBlockRef.Rotation>Math.PI/2或myBlockRef.Rotation>Math.PI*3/2那么。
'读取属性。
Temp_1为字符串=Class1_Obj.ReadAttributeValue(myObjID,"Attribute_1")。
Temp_2为字符串=Class1_Obj.ReadAttributeValue(myObjID,"Attribute_2")。
'读取动态。
Temp_3为字符串=Class1_Obj.ReadDynamicValue(myObjID,"Dynamic_1")。
昏暗Insertion_Point为Point3d=myBlockRef.Position。
昏暗New_Insertion_Point为Point3d=Insertion_Point.Add(新Vector3d(Math.Cos(myBlockRef.Rotation)*Temp_3,Math.Sin(myBlockRef.Rotation)*Temp_3,0))。

调用RepopulatetoForm(myObjID)'记录块相关项目。

myBlockRef.UpgradeOpen()'打开写块引用。
myBlockRef.Erase(True)'擦除不正确的块。
myTrans.Commit。
myTrans.Dispose。
'myTransMan.Dispose()。

调用Class1_Obj.InsertConveyorBlock()'重新绘制一个新块。

结束如果。
结束如果。
下一个。
下一个。
'结束交易。
myTrans.Dispose。
myTransMan.Dispose。

结束子请让我知道你的想法。

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2018-6-12 07:22:52 | 显示全部楼层
我只是很快地查看了您的代码,但您应该只需要重新定义您的块“定义”,所有“引用”(图中的引用)都会相应地更新,保持它们的方向等。这也可能是您出错的原因,当您更新第一个块时,旧的引用可能已经更新了(?)
刚刚注意到它们可能是动态块,所以我说的可能不相关??
回复

使用道具 举报

3

主题

13

帖子

1

银币

初来乍到

Rank: 1

铜币
25
发表于 2018-6-12 07:39:09 | 显示全部楼层
早上,
我以为当代码第二次出现时,“对于每个myObjID In myObjIDs”循环,这种情况正在发生。 但我可能是误解了。
当我测试这一点时,我在DWG中有三个块,其中两个不正确。 当代码运行时,我的myObjID中确实有(3)个objID。 当它出错时,myObjID 被设置为下一个对象 ID,而不是在上一次传递中被擦除和替换的对象 ID。
是的,它们是动态块。
请让我知道你的想法。
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2018-6-13 03:12:24 | 显示全部楼层
说实话,我只是在快速观察,你可能正在尝试编辑每个单独的块“引用”,而不是编辑块“定义”,这将在更新时更新所有块引用(所有引用都引用一个定义,但我不清楚这如何与动态块一起工作)。
但是,我确实注意到您在发布的代码中两次处置了该交易:
myTrans.Commit()
myTrans.Dispose()
'myTransMan.Dispose()

Call Class1_Obj.InsertConveyorBlock() ' Redraws a New Block

End If
End If
Next
' End Transactions
myTrans.Dispose()
只有在完成所有工作(即在这种情况下的循环迭代)后,才提交并释放您的事务。如果由于其他情况而必须提交,请在循环中创建一个新的嵌套事务,并确保在下一个循环之前提交和释放。
回复

使用道具 举报

24

主题

204

帖子

6

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2018-6-13 07:08:42 | 显示全部楼层

更好的是,将您的事务放在使用语句中并让系统处理它。
回复

使用道具 举报

3

主题

13

帖子

1

银币

初来乍到

Rank: 1

铜币
25
发表于 2018-6-18 18:16:04 | 显示全部楼层
我注意到,您在循环之外启动事务,但在内部循环中提交并处理它。
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2018-6-18 18:54:34 | 显示全部楼层
你是对的。这就是问题所在<谢谢你的帮助。
回复

使用道具 举报

24

主题

204

帖子

6

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2018-6-18 19:17:39 | 显示全部楼层
太棒了,干杯
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-4 10:50 , Processed in 0.269178 second(s), 68 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表