27/12/2013
Создаем блок из набора примитивов
Код ниже показывает алгоритм создания нового блока из выбранных на экране примитивов. Важнейшим методом для этого является “DeepCloneObjects” который получает набор ObjectId примитивов для копирования. Второй параметр – новый «владелец» скопированных примитивов. В следующем коде запись таблицы блоков с именем «тест» передаётся как новый владелец, так что копии выбранных примитивов попадают в этот блок.
Код - C#: [Выделить]
- [CommandMethod("CreateBlock")]
- public void CreateBlock()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Database db = doc.Database;
- Editor ed = doc.Editor;
- TypedValue[] filterlist = new TypedValue[1];
- filterlist[0] = new TypedValue(0, "CIRCLE,LINE");
- SelectionFilter filter = new SelectionFilter(filterlist);
- PromptSelectionOptions opts = new PromptSelectionOptions();
- opts.MessageForAdding = "Выберите объекты: ";
- PromptSelectionResult selRes = ed.GetSelection(opts, filter);
- if (selRes.Status != PromptStatus.OK)
- {
- return;
- }
- ObjectId[] ids = selRes.Value.GetObjectIds();
- ObjectId blockId = ObjectId.Null;
- // Создадим запись таблицы блоков с именем "Test" ...
- using (Transaction Tx = db.TransactionManager.StartTransaction())
- {
- BlockTable bt = (BlockTable)Tx.GetObject(db.BlockTableId, OpenMode.ForRead);
- if (!bt.Has("Test"))
- {
- bt.UpgradeOpen();
- //create new
- BlockTableRecord record = new BlockTableRecord();
- record.Name = "Test";
- bt.Add(record);
- Tx.AddNewlyCreatedDBObject(record, true);
- }
- blockId = bt["Test"];
- Tx.Commit();
- }
- // Копируем выбранные примитивы в блок при помощи DeepClone.
- ObjectIdCollection collection = new ObjectIdCollection(ids);
- IdMapping mapping = new IdMapping();
- db.DeepCloneObjects(collection, blockId, mapping, false);
- }
Источник: 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