乐筑天下

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

标识Block(而非BlockRef)属性的存在

[复制链接]

21

主题

58

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
142
发表于 2017-3-21 09:03:47 | 显示全部楼层 |阅读模式
我继承了一个大型VB.NET和Delphi(请不要问,我不知道为什么)工具/项目,多年来有多个作者。我修改了一些代码以添加新的块属性,并且需要能够检查其存在性(缺少=需要插入默认值的旧图形),但只能找到引用块引用的代码。查看该系统中其他地方的代码,这种识别数据的尝试被包装在一个try/catch例程中:
try
strDepotID=clientDetailsBlock.Item(3).文本字符串
捕获ex作为异常
,如果没有车辆段(旧图纸)设置为Weston Underwood
strDepotID=enumDepot.Weston.ToString()
结束尝试
但是在这种情况下,不管异常处理程序是什么,我总是得到一个未处理的异常
我担心在这种情况下,在互联网上扎根对我没有帮助,因为所有东西都指向块引用(我猜这是我的前任应该使用的)。有没有办法找出是否阻塞。项目(3)在尝试访问之前是否存在

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

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

使用道具 举报

21

主题

58

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
142
发表于 2017-3-21 09:13:52 | 显示全部楼层
如果不知道clientDetailsBlock是什么类型的对象的很多细节,但是如果它是一个集合/列表/IEnumerable,那么在检查它是否存在之前,是否可以检查计数是否> = 4(如果从零开始)?
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2017-3-21 10:11:02 | 显示全部楼层
clientDetailsBlock属于AcadBlock类型。我不希望单例对象拥有集合的属性,但它确实拥有...谢谢你让我再看一眼。
自我提醒:在处理AutoCAD时,把所有正确OOP设计的概念都抛开...想想80年代
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2017-3-21 11:53:00 | 显示全部楼层
我通常会循环遍历所有属性以寻找唯一标签,您可能必须检查块中的属性定义,以验证您是否拥有尝试更新的唯一属性。这是更新单个块ref的代码,但您可以以类似的方式循环遍历块记录中的属性定义以检查DepotID属性。//。
///更新属性,。
>/// ///块引用对象ID,。
//其中键是标签的字典,文本字符串的值。
公共静态int更新属性(ObjectId block RefID,字典atts)。
{。
int updatedAtts=0;。
使用(LockedTransaction acTr=Active.Document.TransactionManager.StartLockedTransaction())。
{。
BlockRef=acTr.GetObject(block RefID,OpenMode.ForRead, true)作为BlockRef;。
如果(块Ref!=null)。
{。
foreach(KeyValuePairatt in atts)。
{。
foreach(ObjectId attId inblockRef.AttributeCollection)。
{。
属性引用ar=acTr.GetObject(attId,OpenMode.ForRead)作为属性引用;。
如果(ar!=null&&string.Equals(ar.Tag,att.Key,StringComparison.CurrentCultureIgnoreCase))。
{。
ar.UpgradeOpen();。
ar.TextStringatt.Value。
ar.DowngradeOpen();。
updatedAtts++;。
}。
}。

}。

}。
acTr.Commit();。
}。
返回更新的属性;。
}。

回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2017-3-21 12:10:22 | 显示全部楼层
@Atook<br>看起来您正在迭代字典中每个条目的属性集合
字典集合的目的是通过其键直接访问条目
因此,只迭代属性集合要高效得多:
公共静态int-UpdateAttributes(ObjectId blockRefID,Dictionary<string,>atts)
{
如果(blockRefID==ObjectId.Null)
抛出新的ArgumentNullException(“blockRefID”)
如果(blockRefID.ObjectClass.DxfName!=“插入”)
抛出新的ArgumentException(“不是块引用”)
int-updatedAtts=0
使用(var tr=blockRefID.Database.TransactionManager.StartTransaction())
{
var br=(BlockReference)tr。GetObject(blockRefID,OpenMode.ForRead)
foreach(br.AttributeCollection中的ObjectId)
{
var-att=(AttributeReference)tr。GetObject(id,OpenMode.ForRead)
if(atts.ContainsKey(att.Tag))
{
附件UpgradeOpen()
att.TextString=atts[att.Tag]
updatedAtts++
}
}
tr.Commit()
}
返回更新的tts
}

PS:您不应在未通知第三方库的情况下发布代码。
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2017-3-21 13:06:38 | 显示全部楼层
谢谢Gile,我知道这是没有效率的,但是当我写它的时候没有考虑到整个字典的事情。很丑,但是很有效。
您的代码效率更高。
我相信您所指的第三方代码是LockedTransaction类,这是我从Jeff H那里得到的。感谢您的提示。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-2-4 13:54 , Processed in 0.203797 second(s), 75 queries .

© 2020-2025 乐筑天下

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