С# привязка внешних ссылок к базе данных неопубликованной загрузки AutoCAD

Я пытаюсь связать внешние ссылки в базе данных чертежей с боковой загрузкой. программа останавливается на этой строке 'if(!xNode.Database.Filename.Equals(NewDb.Filename))'. я также получаю эту ошибку «System.NullReferenceException: ссылка на объект не указывает на экземпляр object.at XBind.RecursiveFileProcessor.ProcessFile (строковый путь)». Я провел некоторое исследование и нашел код VB.NET для прикрепления внешней ссылки и безуспешно попытался экстраполировать это. Я был бы признателен, если бы кто-то указал мне правильное направление в этом.

                using (Database NewDb = new Database(false, true))
            {
                NewDb.ReadDwgFile(path, FileOpenMode.OpenForReadAndWriteNoShare, true, "");
                NewDb.CloseInput(true);
                using (Transaction tr = NewDb.TransactionManager.StartTransaction())
                {
                    ObjectIdCollection xrefCollection = new ObjectIdCollection();
                    XrefGraph xg = NewDb.GetHostDwgXrefGraph(false);
                    int numOfNodes = xg.NumNodes;
                    for (int cnt = 0; cnt < xg.NumNodes; cnt++)
                    {
                        XrefGraphNode xNode = xg.GetXrefNode(cnt) as XrefGraphNode;
                        if (!xNode.Database.Filename.Equals(NewDb.Filename))
                        {
                            if (xNode.XrefStatus == XrefStatus.Resolved)
                            {
                                xrefCollection.Add(xNode.BlockTableRecordId);
                            }
                        }
                    }
                    if (xrefCollection.Count != 0)
                    {
                        NewDb.BindXrefs(xrefCollection, true);
                    }
                    tr.Commit();
                }
                NewDb.SaveAs(path, DwgVersion.Current);
            }

person Winslow North    schedule 09.09.2015    source источник


Ответы (2)


На самом деле, это будет работать в памяти. У Уинслоу Норта отсутствует следующая строка кода после функции CloseInput()...

NewDb.ResolveXrefs(true, false);

Но также для этого не нужна Транзакция. Это необязательно. Я создал свой собственный образец и протестировал его. Оно работает. Если вам нужно, чтобы я опубликовал это, дайте мне знать. Проблема заключалась в том, что у xNode была пустая база данных из-за того, что внешняя ссылка не была разрешена. Вы должны сделать это вручную с помощью строки выше.

person bjhuffine    schedule 09.09.2015

Не верьте, что это сработает для базы данных в памяти, вы можете попробовать этот подход, см. его фрагмент ниже:

[CommandMethod("CHX")]
public void ChangeXref()
{
  var doc = Application.DocumentManager.MdiActiveDocument;
  if (doc == null) return;

  var ed = doc.Editor;
  var db = doc.Database;

  // Get the database associated with each xref in the
  // drawing and change all of its circles to be dashed

  using (var tr = db.TransactionManager.StartTransaction())
  {
    var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
    var ms = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead);

    // Loop through the contents of the modelspace
    foreach (var id in ms)
    {
      // We only care about BlockReferences
      var br = tr.GetObject(id, OpenMode.ForRead) as BlockReference;
      if (br != null)
      {
        // Check whether the associated BlockTableRecord is
        // an external reference
        var bd = (BlockTableRecord)tr.GetObject(br.BlockTableRecord, OpenMode.ForRead);
        if (bd.IsFromExternalReference)
        {
          // If so, get its Database and call the function
          // to change the linetype of its Circles

          var xdb = bd.GetXrefDatabase(false);
          if (xdb != null)
          {

            using (var xf = XrefFileLock.LockFile(xdb.XrefBlockId))
            {
              // Make sure the original symbols are loaded
              xdb.RestoreOriginalXrefSymbols();

              xdb.RestoreForwardingXrefSymbols();
            }

          }
        }
      }
    }
    tr.Commit();
  }
}
person Augusto Goncalves    schedule 09.09.2015