Nightcrawler 发表于 2021-1-21 09:54:01

变得非常“large"消极的块

当我得到他们通常处理块引用
**** Hidden Message *****

dgorsman 发表于 2021-1-21 13:31:31

这些句柄来自哪里-扩展数据?Xrecords
粗略猜测,如果从中发现一些错误的代码修改了错误的变量,导致无法使用的数字,或者导致数据类型限制导致数字溢出。无论哪种方式,都无法恢复实际句柄值。

huiz 发表于 2021-1-21 15:21:45

也许您可以使用“审核”命令修复它。
大数字看起来像多头的最小值。它是负面的,因此无效。它可能会得到修复。

Nightcrawler 发表于 2021-1-22 02:46:58

@dgorsman我不确定他们叫什么tbh。我对Autocad API相当缺乏经验,但我是这样得到它们的:
using (var transaction = db.TransactionManager.StartTransaction())
{
    var layoutEntries = transaction.GetObject(db.LayoutDictionaryId, OpenMode.ForRead) as DBDictionary;
    foreach (DBDictionaryEntry layoutEntry in layoutEntries)
    {
      var layout = transaction.GetObject(layoutEntry.Value, OpenMode.ForRead) as Autodesk.AutoCAD.DatabaseServices.Layout;
      var fileRecords = transaction.GetObject(layout.BlockTableRecordId, OpenMode.ForRead) as BlockTableRecord;
      foreach (ObjectId id in fileRecords)
      {
            var blockRef = transaction.GetObject(id, OpenMode.ForRead) as BlockReference;
            var handle = blockRef.Handle.Value,
            var name = blockRef.Name,
            ...
      }
    }
    transaction.Abort();
}

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

gile 发表于 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;。
// ...。
}因为布局的块表记录包含不是块引用的实体(至少一个视口)。

Nightcrawler 发表于 2021-1-22 06:00:44

谢谢@gile,但这不是问题所在。如果是这样的话,我会得到空引用异常。但是无论如何检查空值总是一个好主意。
在带有奇怪句柄的BlockReference上,我仍然可以获得我需要的其他信息。所以它们仍然是正确的块引用,只是句柄被破坏了。

Nightcrawler 发表于 2021-4-22 07:54:30

我相信我已经找到了问题的一部分。
我得到负数的原因是句柄的十六进制值大于常规long中的值,这导致它换行为负数。它确实适合ulong,但是我不认为你可以从ulong创建一个句柄。
所以这仍然是一个问题,因为我不能从负数创建新的句柄,因为它不是正确的句柄id。
可以从十六进制字符串或ulong而不是long创建句柄吗?

pera 发表于 2021-4-22 16:09:43

看看这个链接得到从十六进制生态处理吗

Nightcrawler 发表于 2021-4-23 02:25:38

谢谢,但这仍然会导致相同的现象,即长包装为负值
long ln = Convert.ToInt64(pr.StringResult, 16);
尽管如此!我注意到负数不是问题所在。即使句柄为负,它似乎也能获得正确的id
我的问题似乎是由<pre>引起的其他问题db.TryGetObjectId(new Handle(longHandle), out var id);
,其中即使在特定情况下有效和现有的对象句柄上,TryGetObjectId也会失败。
页: [1]
查看完整版本: 变得非常“large"消极的块