2015-08-11 2 views
1

Я пишу плагин для AutoCAD и хочу импортировать все блоки, которые он будет использовать в начале, чтобы убедиться, что они доступны по мере необходимости. Для этого я использую этот методПрограммно импортировать блок в AutoCAD (C#)

public static void ImportBlocks(string[] filesToTryToImport, string filter = "") 
{ 
    foreach (string blockToImport in filesToTryToImport) 
    { 
     if (blockToImport.Contains(filter)) 
     { 
      Database sourceDb = new Database(false, true); //Temporary database to hold data for block we want to import 
      try 
      { 
       sourceDb.ReadDwgFile(blockToImport, System.IO.FileShare.Read, true, ""); //Read the DWG into a side database 
       ObjectIdCollection blockIds = new ObjectIdCollection(); // Create a variable to store the list of block identifiers 

       Autodesk.AutoCAD.DatabaseServices.TransactionManager tm = sourceDb.TransactionManager; 

       using (Transaction myT = tm.StartTransaction()) 
       { 
        // Open the block table 
        BlockTable bt = (BlockTable)tm.GetObject(sourceDb.BlockTableId, OpenMode.ForRead, false); 

        // Check each block in the block table 
        foreach (ObjectId btrId in bt) 
        { 
         BlockTableRecord btr = (BlockTableRecord)tm.GetObject(btrId, OpenMode.ForRead, false); 
         // Only add named & non-layout blocks to the copy list 
         if (!btr.IsAnonymous && !btr.IsLayout) 
         { 
          blockIds.Add(btrId); 
         } 
         btr.Dispose(); 
        } 
       } 
       // Copy blocks from source to destination database 
       IdMapping mapping = new IdMapping(); 
       sourceDb.WblockCloneObjects(blockIds, _database.BlockTableId, mapping, DuplicateRecordCloning.Replace, false); 
       _editor.WriteMessage("\nCopied " + blockIds.Count.ToString() + " block definitions from " + blockToImport + " to the current drawing."); 
      } 
      catch (Autodesk.AutoCAD.Runtime.Exception ex) 
      { 
       _editor.WriteMessage("\nError during copy: " + ex.Message); 
      } 
      finally 
      { 
       sourceDb.Dispose(); 
      } 
     } 
    } 
} 

Этот метод работает, потому что он успешно выполняется. Однако, когда я перехожу к вставке блока в чертеж через интерфейс AutoCAD, он не отображается как опция, и когда я пытаюсь вставить его программно, он выдает исключение FileNotFound, что означает, что он не работает. Что не так с этим методом? Заранее спасибо!

EDIT: Вот менее сложный метод с методом испытаний

public static void ImportSingleBlock(string fileToTryToImport) 
{ 
    using (Transaction tr = _database.TransactionManager.StartTransaction()) 
    { 
     Database sourceDb = new Database(false, true); //Temporary database to hold data for block we want to import 
     try 
     { 
      sourceDb.ReadDwgFile(fileToTryToImport, System.IO.FileShare.Read, true, ""); //Read the DWG into a side database 
      _database.Insert(fileToTryToImport, sourceDb, false); 
      _editor.WriteMessage("\nSUCCESS: " + fileToTryToImport); 
     } 
     catch (Autodesk.AutoCAD.Runtime.Exception ex) 
     { 
      _editor.WriteMessage("\nERROR: " + fileToTryToImport); 
     } 
     finally 
     { 
      sourceDb.Dispose(); 
     } 
     tr.Commit(); 
    } 
} 

[CommandMethod("TESTSINGLEBLOCKIMPORTING")] 
public void TestSingleBlockImporting() 
{ 
    OpenFileDialog ofd = new OpenFileDialog(); 
    DialogResult result = ofd.ShowDialog(); 
    if (result == DialogResult.Cancel) //Ending method on cancel 
    { 
     return; 
    } 
    string fileToTryToImport = ofd.FileName; 
    using (Transaction tr = _database.TransactionManager.StartTransaction()) 
    { 
     EntityMethods.ImportSingleBlock(fileToTryToImport); 
     tr.Commit(); 
    } 
} 

This file является блок я пытаюсь импортировать. Надеюсь, это вдохновляет кого-то, что я отчаянно теряю сейчас.

ответ

0

Ваш код верный и должен работать. На самом деле я это пробовал и отлично работает. Вероятно, вам не хватает Commit() внешней транзакции (где вы называете этот метод ImportBlocs()). Проверка:

using (Transaction trans = _database.TransactionManager.StartTransaction()) 
{ 
    ImportBlocks(... parameters here ...); 
    trans.Commit(); // remember to call this commit, if omitted, Abort() is assumed 
} 
+0

Не исправить это для меня ... вот блок, который я пытаюсь импортировать, возможно, проблема связана с блоком https://drive.google.com/file/d/ 0BwwMHXVXHuDjaVZ4NUlNbHNUN0E/view? Usp = sharing –

+0

ah ok, этот чертеж «есть» блок (и не содержит «блок»). Ваш исходный код читает весь блок, но ваш чертеж не содержит. Для таких рисунков вы должны вызвать Database.Insert(), передающую путь .dwg, который вернет ObjectId нового определения блока, которое затем можно использовать для создания BlockReference. –