乐筑天下

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

保存xRecords是一个问题

[复制链接]

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2017-5-11 18:38:44 | 显示全部楼层 |阅读模式
我需要在图形中保存数据。此数据为非图形数据,并保存为xRecord
第一次写入数据时,一切正常。我可以读取数据以验证数据是否存在并保存图形。但是,当我重新打开图形并尝试添加更多数据时,它似乎可以工作,但每当我保存图形时,AutoCAD就会崩溃。在保存文件时,当我尝试重新打开文件时,会出现以下错误<strong>内部错误:!dbAnnoScaleCompositionReactori.cpp@1415:eInvalidIndex
这是相关代码
公共函数GetNotes(ByVal布局为字符串)为字符串
将acDoc作为Document=Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager.MdiActiveDocument
将acDB设置为数据库=acDoc.Database
将右值变暗为字符串=”
使用acLckDoc=acDoc.LockDocument()
使用acTrans作为Transaction=acDB.TransactionManager.StartTransaction
Dim acDict As DBDictionary=DirectCast(acTrans.GetObject(acDB.layoutdirectionaryid,OpenMode.ForRead),DBDictionary)
<div>将数据变暗为Xrecord</div>
试试
Dim dataID作为ObjectId=acDict.GetAt(布局)
lData=DirectCast(acTrans.GetObject(dataID,OpenMode.ForRead),Xrecord)
<div>对于每个电视,作为lData.Data中的TypedValue</div>
如果tv.TypeCode=DxfCode。然后是文本
右值&=tv.Value。ToString()&vbCrLf
如果
下一个
捕获
rValue=“无布局注释:”&layout
结束尝试
结束使用
结束使用
返回右值
结束函数
公共子集合注释(ByVal注释为字符串,ByVal布局为字符串)
将acDoc作为Document=Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager.MdiActiveDocument
将acDB设置为数据库=acDoc.Database
使用acLckDoc=acDoc.LockDocument()
使用acTrans作为Transaction=acDB.TransactionManager.StartTransaction
Dim acDict As DBDictionary=DirectCast(acTrans.GetObject(acDB.layoutdirectionaryid,OpenMode.ForWrite),DBDictionary)
<div>将数据变暗为Xrecord</div>
试试
<div>‘xRecord是否已经存在
Dim dataID作为ObjectId=acDict.GetAt(布局)
lData=DirectCast(acTrans.GetObject(dataID,OpenMode.ForWrite),Xrecord)
lData。数据=新结果缓冲(新类型值(DxfCode.Text,notes))
捕获
显然不是,让我们创建一个新的。
lData=New Xrecord()
lData。数据=新结果缓冲(新类型值(DxfCode.Text,notes))
acDict。SetAt(布局,lData)
演员。AddNewlyCreatedDBObject(lData,True)
结束尝试
acTrans.Commit()
结束使用
结束使用
末端接头

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

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

使用道具 举报

57

主题

559

帖子

13

银币

中流砥柱

Rank: 25

铜币
786
发表于 2017-5-11 21:56:40 | 显示全部楼层

lData=DirectCast(acTrans.GetObject(dataID,OpenMode.ForWrite), XRecords)
我很确定这无法完成。
补充说:
就我个人而言,我不会像您那样使用try/catch来检查数据...它是为捕获异常而设计的
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2017-5-11 22:23:40 | 显示全部楼层
基思,我无法直接看到问题,但可能try/catch隐藏了一个错误。我用这样的东西来编辑/添加xrecords。key是字符串,rBuff是ResultBuffer
如果(myDbDictionary.Contains(key))
{
//编辑现有的xrecord
var myXRec=(Xrecord)tr.GetObject(myDbDictionary.GetAt(key),OpenMode.ForWrite)
myXRec。数据=rBuff
}
其他
{
//添加xrecord
Xrecord newXRec=newxrecord(){Data=rBuff}
myDbDictionary。SetAt(密钥,newXRec)
tr.AddNewlyCreatedDBObject(newXRec,true);
}
tr。提交()
我想我在读了这篇文章后把这段代码放在了一起:http://aucache.autodesk.com/au2012/sessionsFiles/2146/2646/handout_2146_CP2146.pdf
这是一个很好的例子
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2017-5-12 17:24:02 | 显示全部楼层
我想我找到问题所在了...现在好像起作用了..
我把这一行



Dim acDict改为db dictionary = DirectCast(acTrans。GetObject(acDB。LayoutDictionaryId,OpenMode。ForRead)、db dictionary)



到此



Dim acDict As db dictionary = DirectCast(acTrans。GetObject(acDB。NamedObjectsDictionaryId,OpenMode。ForRead)、db dictionary)



而这一行



Dim acDict As db dictionary = DirectCast(acTrans。GetObject(acDB。LayoutDictionaryId,OpenMode。ForWrite)、db dictionary)



到此



Dim acDict As db dictionary = DirectCast(acTrans。GetObject(acDB。NamedObjectsDictionaryId,OpenMode。ForWrite)、db dictionary)



layout dictionary与NamedObjectsDictionary是完全不同的东西。
这不是铸造一个布局...如果您仔细观察代码,您会发现dataID应该是xRecord的ObjectId...下面是正在发生的事情,以及Try/Catch包装器的情况。
acDict。GetAt(layout)应该返回应该是xRecord的ObjectID,其名称由调用函数传递..图形中布局的名称...如果不存在该名称的xRecord,则为acDict。GetAt抛出了一个异常,所以我把包装器放在那里,用不存在的名称创建一个xRecord(参见rValue = " No Notes for layout:" & layout)。
无论如何,在我读到Atook的帖子之前,这只是一个权宜之计...“包含”解决了我的“尝试/捕捉”问题...干净多了。我已经实现了,因为我已经发现了潜在的问题!
它像冠军一样工作..除了我有一件事想解决...
用户创建了一个带有几个布局的绘图...他们将一个xRecord添加到布局中(存储为布局名)..然后重新命名该布局。我不能再过滤布局名称,因为它不会找到xRecord,即使它存在...
我迁移到扩展记录,因为它们比扩展数据更灵活,并且可以存储更大量的信息..但是缺点是我不能把它附加到特定的布局选项卡上,因为xRecords存在于文档级。我目前使用一个名称保存xRecords,这个名称是布局的句柄。这应该可以防止任何找不到xRecords的问题...如果一个布局被删除,我需要xRecord也消失..不想用无用的垃圾污染图纸。我将把这留给用户,我想确保如果用户重命名一个布局,我仍然能够将它与xRecord配对。
感谢您的帮助!
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2017-5-12 17:45:56 | 显示全部楼层
我想我解决了这个问题...在xRecords中搜索以句柄命名的条目,不考虑布局名称...将布局名称和句柄传递给函数。
现在,如果标签被删除,xRecords将消失。
回复

使用道具 举报

16

主题

506

帖子

6

银币

中流砥柱

Rank: 25

铜币
570
发表于 2017-5-15 10:32:23 | 显示全部楼层
"...文档级别的XRecords live ... "。您可以将扩展字典(包含XRecrods和其他扩展字典)添加到几乎任何东西中。或者你指的是别的什么?
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2017-5-15 19:57:44 | 显示全部楼层
好,你是说我可以在当前的布局中添加一个扩展字典,然后在这个特定的布局中添加一个xrecord...
你所说的这个魔法是什么...
目标是能够添加适用于图纸空间布局或模型空间的嵌入式文档和数据。通常,xrecords是文档级的,不与任何特定的对象相关联...至少这是我的理解。
我很乐意听到更多关于这是如何工作的信息。如果我能实现的话,将会减少很多开销。
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2017-5-16 02:28:23 | 显示全部楼层
您好,
这里有一些扩展方法可以获取或设置任何DBObject扩展字典xrecord数据
公共静态类DBOjectExtension
{
//
///从DBObject扩展字典的Xrecord中获取数据。
//
DBObject的<div>//<param>实例。
//
Xrecord键。
///
如果找到Xrecord数据,则返回该数据,否则为空。
公共静态ResultBuffer GetXrecData(此DBObject源,字符串键)
{
如果(源==null)
抛出新的ArgumentNullException(“源”)
var tr=source.Database.TransactionManager.TopTransaction
如果(tr==null)
抛出新的Autodesk.AutoCAD.Runtime.Exception(ErrorStatus.NoActiveTransactions)
var-xdictId=source.ExtensionDictionary
如果(xdictId.IsNull)
返回null
var xdict=(DBDictionary)tr。GetObject(xdictId,OpenMode.ForRead)
如果(!xdict.Contains(key))
返回null
var xrec=tr.GetObject(xdict.GetAt(key),OpenMode。ForRead)作为Xrecord
如果(xrec==null)
返回null
返回xrec.数据
}
//
///设置DBObject扩展字典的Xrecord数据。
///如果扩展字典和xrecord不存在,则会创建它们。
//
DBObject的<div>//<param>实例。
//
Xrecord键。
//
数据来填充xrecord。
公共静态void SetXrecData(此DBObject源、字符串键、结果缓冲数据)
{
如果(源==null)
抛出新的ArgumentNullException(“源”)
var tr=source.Database.TransactionManager.TopTransaction
如果(tr==null)
抛出新的Autodesk.AutoCAD.Runtime.Exception(ErrorStatus.NoActiveTransactions)
如果(source.ExtensionDictionary.IsNull)
{
source.UpgradeOpen()
source.CreateExtensionDictionary()
}
var xdict=(DBDictionary)tr.GetObject(source.ExtensionDictionary,OpenMode.ForRead)
Xrecord-xrec
如果(xdict.Contains(key))
{
xrec=(Xrecord)tr.GetObject(xdict.GetAt(key),OpenMode.ForWrite)
}
其他
{
xdict.UpgradeOpen()
xrec=newxrecord()
xdict。SetAt(密钥,xrec)
tr.addNewlyCreatedBobObject(xrec,true)
}
xrec。数据=数据
}
}
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2017-5-16 02:55:20 | 显示全部楼层
伟大的东西像往常一样吉尔,谢谢!
回复

使用道具 举报

16

主题

506

帖子

6

银币

中流砥柱

Rank: 25

铜币
570
发表于 2017-5-16 10:16:38 | 显示全部楼层

有时,我发现将扩展字典和XRecords分别看作XML元素和属性的类似物会有所帮助。您可以无限添加字典作为其他字典的子字典(在合理范围内)。每本词典都可以单独保存XRecords,也可以与其他词典一起保存。所有这些都是名称索引(不再是“索引是31还是32…”),因此您可以构建伪XPath表示法来查找嵌套数据
AutoCAD中的几乎所有内容都可以使用扩展字典。作为DBObject基本对象的属性,它应该继承到几乎所有其他对象和实体。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-2-4 13:59 , Processed in 0.160710 second(s), 72 queries .

© 2020-2025 乐筑天下

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