ADN Open CIS
Сообщество программистов Autodesk в СНГ

27/12/2013

Создаем блок из набора примитивов

Код ниже показывает алгоритм создания нового блока из выбранных на экране примитивов.  Важнейшим методом для этого является “DeepCloneObjects” который получает набор ObjectId примитивов для копирования. Второй параметр – новый «владелец» скопированных примитивов. В следующем коде запись таблицы блоков с именем «тест» передаётся как новый владелец, так что копии выбранных примитивов попадают в этот блок.

Код - C#: [Выделить]
  1. [CommandMethod("CreateBlock")]
  2. public void CreateBlock()
  3. {
  4.     Document doc = Application.DocumentManager.MdiActiveDocument;
  5.     Database db = doc.Database;
  6.     Editor ed = doc.Editor;
  7.  
  8.     TypedValue[] filterlist = new TypedValue[1];
  9.  
  10.     filterlist[0] = new TypedValue(0, "CIRCLE,LINE");
  11.  
  12.     SelectionFilter filter = new SelectionFilter(filterlist);
  13.  
  14.     PromptSelectionOptions opts = new PromptSelectionOptions();
  15.  
  16.     opts.MessageForAdding = "Выберите объекты: ";
  17.  
  18.     PromptSelectionResult selRes = ed.GetSelection(opts, filter);
  19.  
  20.     if (selRes.Status != PromptStatus.OK)
  21.     {
  22.         return;
  23.     }
  24.  
  25.     ObjectId[] ids = selRes.Value.GetObjectIds();
  26.     ObjectId blockId = ObjectId.Null;
  27.     // Создадим запись таблицы блоков с именем "Test" ...
  28.     using (Transaction Tx = db.TransactionManager.StartTransaction())
  29.     {
  30.         BlockTable bt = (BlockTable)Tx.GetObject(db.BlockTableId, OpenMode.ForRead);
  31.         if (!bt.Has("Test"))
  32.         {
  33.             bt.UpgradeOpen();
  34.             //create new
  35.             BlockTableRecord record = new BlockTableRecord();
  36.             record.Name = "Test";
  37.             bt.Add(record);
  38.             Tx.AddNewlyCreatedDBObject(record, true);
  39.         }
  40.  
  41.         blockId = bt["Test"];
  42.         Tx.Commit();
  43.     }
  44.     // Копируем выбранные примитивы в блок при помощи DeepClone.
  45.     ObjectIdCollection collection = new ObjectIdCollection(ids);
  46.     IdMapping mapping = new IdMapping();
  47.     db.DeepCloneObjects(collection, blockId, mapping, false);
  48. }

Источник: http://adndevblog.typepad.com/autocad/2012/07/creating-block-from-selection-set.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=424

Опубликовано 27.12.2013