乐筑天下

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

变得非常“large"消极的块

[复制链接]

2

主题

7

帖子

1

银币

初来乍到

Rank: 1

铜币
15
发表于 2021-1-21 09:54:01 | 显示全部楼层 |阅读模式
当我得到他们通常处理块引用

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

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

使用道具 举报

16

主题

506

帖子

6

银币

中流砥柱

Rank: 25

铜币
570
发表于 2021-1-21 13:31:31 | 显示全部楼层
这些句柄来自哪里-扩展数据?Xrecords
粗略猜测,如果从中发现一些错误的代码修改了错误的变量,导致无法使用的数字,或者导致数据类型限制导致数字溢出。无论哪种方式,都无法恢复实际句柄值。
回复

使用道具 举报

14

主题

275

帖子

6

银币

后起之秀

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

铜币
331
发表于 2021-1-21 15:21:45 | 显示全部楼层
也许您可以使用“审核”命令修复它。
大数字看起来像多头的最小值。它是负面的,因此无效。它可能会得到修复。
回复

使用道具 举报

2

主题

7

帖子

1

银币

初来乍到

Rank: 1

铜币
15
发表于 2021-1-22 02:46:58 | 显示全部楼层
@dgorsman我不确定他们叫什么tbh。我对Autocad API相当缺乏经验,但我是这样得到它们的:
  1. using (var transaction = db.TransactionManager.StartTransaction())
  2. {
  3.     var layoutEntries = transaction.GetObject(db.LayoutDictionaryId, OpenMode.ForRead) as DBDictionary;
  4.     foreach (DBDictionaryEntry layoutEntry in layoutEntries)
  5.     {
  6.         var layout = transaction.GetObject(layoutEntry.Value, OpenMode.ForRead) as Autodesk.AutoCAD.DatabaseServices.Layout;
  7.         var fileRecords = transaction.GetObject(layout.BlockTableRecordId, OpenMode.ForRead) as BlockTableRecord;
  8.         foreach (ObjectId id in fileRecords)
  9.         {
  10.             var blockRef = transaction.GetObject(id, OpenMode.ForRead) as BlockReference;
  11.             var handle = blockRef.Handle.Value,
  12.             var name = blockRef.Name,
  13.             ...
  14.         }
  15.     }
  16.     transaction.Abort();
  17. }

@huiz,这是一个不错的猜测,但是当我查看其他几个句柄时,我看到的值类似于-4066801656856679638,-4066801656856679152,-646675092。所以不是所有的都一样。
对模型运行审计和恢复时,我得到以下输出“objects auditedacdblocktablerecord:" A$c431c 598 e ",XData Handle Unknown,Null "然后Autocad就挂起了...
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2021-1-22 05:19:56 | 显示全部楼层
嗨,尝试替换:var blockRef = transaction.GetObject(id, OpenMode.ForRead) as BlockReference;。
var handle = blockRef.Handle.Value,。
var name = blockRef.Name,with:var blockRef = transaction.GetObject(id, OpenMode.ForRead) as BlockReference;。
if (blockRef != null)。
{。
var handle = blockRef.Handle.Value;。
var name = blockRef.Name;。
// ...。
}因为布局的块表记录包含不是块引用的实体(至少一个视口)。
回复

使用道具 举报

2

主题

7

帖子

1

银币

初来乍到

Rank: 1

铜币
15
发表于 2021-1-22 06:00:44 | 显示全部楼层
谢谢@gile,但这不是问题所在。如果是这样的话,我会得到空引用异常。但是无论如何检查空值总是一个好主意。
在带有奇怪句柄的BlockReference上,我仍然可以获得我需要的其他信息。所以它们仍然是正确的块引用,只是句柄被破坏了。
回复

使用道具 举报

2

主题

7

帖子

1

银币

初来乍到

Rank: 1

铜币
15
发表于 2021-4-22 07:54:30 | 显示全部楼层
我相信我已经找到了问题的一部分。
我得到负数的原因是句柄的十六进制值大于常规long中的值,这导致它换行为负数。它确实适合ulong,但是我不认为你可以从ulong创建一个句柄。
所以这仍然是一个问题,因为我不能从负数创建新的句柄,因为它不是正确的句柄id。
可以从十六进制字符串或ulong而不是long创建句柄吗?
回复

使用道具 举报

0

主题

3

帖子

1

银币

初来乍到

Rank: 1

铜币
3
发表于 2021-4-22 16:09:43 | 显示全部楼层
看看这个链接得到从十六进制生态处理吗
回复

使用道具 举报

2

主题

7

帖子

1

银币

初来乍到

Rank: 1

铜币
15
发表于 2021-4-23 02:25:38 | 显示全部楼层
谢谢,但这仍然会导致相同的现象,即长包装为负值
  1. long ln = Convert.ToInt64(pr.StringResult, 16);

尽管如此!我注意到负数不是问题所在。即使句柄为负,它似乎也能获得正确的id
我的问题似乎是由<pre>引起的其他问题
  1. db.TryGetObjectId(new Handle(longHandle), out var id);

,其中即使在特定情况下有效和现有的对象句柄上,TryGetObjectId也会失败。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2024-11-22 01:27 , Processed in 0.191439 second(s), 70 queries .

© 2020-2024 乐筑天下

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