04/06/2015
Программная имитация команды Burst
Команда "Burst" из Express Tools очень полезна при расчленении блока с атрибутами. В отличие от обычной команды Расчленить (Explode) она оставляет атрибуты неизменными при расчленении вставки блока.Вот пример кода имитирующий команду Burst при помощи AutoCAD .Net API. Он сначала расчленяет блок и заменяет все определения атрибутов текстами (DBText).
Код - C#: [Выделить]
- [CommandMethod("EB" , CommandFlags.UsePickSet)]
- public void ExplodeBock()
- {
- Document doc
- = Application.DocumentManager.MdiActiveDocument;
- Editor ed = doc.Editor;
- PromptSelectionResult psr = ed.SelectImplied();
- if (psr.Status != PromptStatus.OK)
- {
- ed.WriteMessage(@"Сначала выберите вставки блоков, а затем запустите команду" );
- return ;
- }
- using (SelectionSet ss = psr.Value)
- {
- if (ss.Count <= 0)
- {
- ed.WriteMessage(@"Сначала выберите вставки блоков, а затем запустите команду" );
- return ;
- }
- Database db = doc.Database;
- using (Transaction tr
- = db.TransactionManager.StartTransaction())
- {
- ObjectId msId
- = SymbolUtilityServices.GetBlockModelSpaceId(db);
- BlockTableRecord ms = tr.GetObject(msId,
- OpenMode.ForWrite) as BlockTableRecord;
- foreach (SelectedObject selectedEnt in ss)
- {
- BlockReference blockRef = tr.GetObject(
- selectedEnt.ObjectId,
- OpenMode.ForRead) as BlockReference;
- if (blockRef != null )
- {
- DBObjectCollection toAddColl
- = new DBObjectCollection();
- BlockTableRecord blockDef
- = tr.GetObject(
- blockRef.BlockTableRecord,
- OpenMode.ForRead) as BlockTableRecord;
- // Создаем текст для постоянных и видимых атрибутов
- foreach (ObjectId entId in blockDef)
- {
- if (entId.ObjectClass.Name
- == "AcDbAttributeDefinition" )
- {
- AttributeDefinition attDef
- = tr.GetObject(entId,
- OpenMode.ForRead)
- as AttributeDefinition;
- if ((attDef.Constant &&
- !attDef.Invisible))
- {
- DBText text = new DBText();
- text.Height = attDef.Height;
- text.TextString
- = attDef.TextString;
- text.Position =
- attDef.Position.TransformBy
- (blockRef.BlockTransform);
- toAddColl.Add(text);
- }
- }
- }
- // Создаем текст для непостоянных и видимых атрибутов
- foreach (ObjectId attRefId
- in blockRef.AttributeCollection)
- {
- AttributeReference attRef
- = tr.GetObject(attRefId,
- OpenMode.ForRead)
- as AttributeReference;
- if (attRef.Invisible == false )
- {
- DBText text = new DBText();
- text.Height = attRef.Height;
- text.TextString
- = attRef.TextString;
- text.Position = attRef.Position;
- toAddColl.Add(text);
- }
- }
- // Получаем примитивы из вставки блока
- // Атрибуты обработаны – пропускаем их
- DBObjectCollection entityColl
- = new DBObjectCollection();
- blockRef.Explode(entityColl);
- foreach (Entity ent in entityColl)
- {
- if (! (ent is AttributeDefinition))
- {
- toAddColl.Add(ent);
- }
- }
- // Добавляем примитивы к Пространству Модели
- foreach (Entity ent in toAddColl)
- {
- ms.AppendEntity(ent);
- tr.AddNewlyCreatedDBObject
- (ent, true );
- }
- // Удаляем вставку блока
- blockRef.UpgradeOpen();
- blockRef.Erase();
- }
- tr.Commit();
- }
- }
- }
- }
Источник: http://adndevblog.typepad.com/autocad/2015/06/programmatically-mimic-the-burst-command.html
Автор перевода: Александр Ривилис
Отредактировано 06.06.2015 в 16:00:24
Обсуждение: http://adn-cis.org/forum/index.php?topic=2761
Опубликовано 04.06.2015Отредактировано 06.06.2015 в 16:00:24