2015-05-25 4 views
3

Я пытаюсь написать метод, предлагающий пользователю выбрать все объекты, которые они хотят объединить, в блок, а затем объединить их в блок и вернуть ссылку на блок , Сейчас это выглядит так.Использование C# для присоединения объектов AutoCAD к блоку программно

 /// <summary> 
     /// Returns all entities in an AutoCAD drawing in a list 
     /// </summary> 
     public static List<Entity> GetEntitiesInDrawing() 
     { 
      List<Entity> entitiesToReturn = new List<Entity>(); //Blocks that will be returned 
      Transaction tr = _database.TransactionManager.StartTransaction(); 
      DocumentLock docLock = _activeDocument.LockDocument(); 

      using (tr) 
      using (docLock) 
      { 
       BlockTableRecord blockTableRecord = (BlockTableRecord)tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(_database), OpenMode.ForRead); 
       foreach (ObjectId id in blockTableRecord) 
       { 
        try 
        { 
         Entity ent = (Entity)tr.GetObject(id, OpenMode.ForWrite); 
         entitiesToReturn.Add(ent); 
        } 
        catch (InvalidCastException) 
        { 
         continue; 
        } 
       } 
      } 
      return entitiesToReturn; 
     } 
     /// <summary> 
     /// Prompts the user for a number of entities and then joins them into a block 
     /// </summary> 
     public static BlockReference JoinEntities() 
     { 
      BlockReference blkToReturn = null; 
      List<Entity> entitiesToJoin = PromptUserForEntities(); 
      foreach (Entity ent in entitiesToJoin) 
      { 
       // ToDo: Join entities into blkToReturn 
      } 
      return blkToReturn; 

     } 

Моя проблема заключается в том, что я понятия не имею, как или, если можно взять список лиц и присоединиться к ним в blockreference.

ответ

2

В итоге:

  1. использование Editor.Getselection, так что пользователь может выбрать объекты
  2. создать blockTableRecord (BTR) на BlockTable (от Database.BlockTableId)
  3. Добавить все объекты в только что созданный БТР, здесь вам может понадобиться создать новые объекты или переместить право собственности (см. Метод BlockTableRecord.AssumeOwnershipOf)
  4. создать новый blockreference, который указывает на BTR
  5. открыть модельное пространство (или Paper Space) и добавить ссылку на блок для его
  6. необязательно: удалить все исходные объекты из пространства модели (во избежание дублируется), если вы не меняли владельца

сообщение упоминалось может помочь, но это создает новые объекты (и не переходить от модели к определению блока (шаг 3 #)

+0

Я последовал за эту процедуру, и теперь его бросание ошибки eAlreadyInDb каждый раз, когда я пытаюсь добавить объект в новый БТР. Вы можете увидеть мой полный код здесь http://forums.autodesk.com/t5/net/joining-entities-into-a-block-programmatically/mp/5651349/highlight/false#M44682 на посту # 4 –

+0

, который ожидается: вы не можете добавить и сущность в 2 записи таблицы блоков ... см. мое предложение выше, № 3, попробуйте с AssumeOwnershipOf также запись в блочной таблице не может содержать объекты до тех пор, пока она уже не находится в базе данных ... поэтому сначала добавьте BTR, затем переместите объекты на него. –