Расчленение DBText в Geometry с использованием Design Automation API
Я получил запрос от одного из наших специалистов по техническому продажам, чей клиент хотел бы автоматизировать рабочий процесс проектирования с помощью Forge Design Automation, одним из аспектов рабочего потока является расчленение объектов Text в Geometry (полилинии и дуги).
У нас есть экспресс-инструмент, доступный для AutoCAD под названием TXTEXP, к сожалению, этот инструмент недоступен для Forge, я создал программу на C#, которая взрывает текстовый объект в геометрию, эта настраиваемая программа может быть указана в Forge Activity.
- public void EXPTXT()
- {
- var doc = Application.DocumentManager.MdiActiveDocument;
- var db = doc.Database;
- var ed = doc.Editor;
- // выделенный текст
- ObjectId[] dbtextIds = ed.SelectTextEntitesInModelSpace();
- foreach (ObjectId id in dbtextIds)
- {
- using (Transaction tr = db.TransactionManager.StartTransaction())
- {
- var text = (DBText)tr.GetObject(id, OpenMode.ForWrite);
- ObjectId[] ids = new ObjectId[1];
- ids[0] = id;
- ed.SetImpliedSelection(ids);
- var tempFile = Path.Combine(Path.GetTempPath(), "Q.wmf");
- if (File.Exists(tempFile))
- {
- File.Delete(tempFile);
- }
- ed.Command("_.WMFOUT", tempFile, "", "");
- var viewSize = (double)Application.GetSystemVariable("VIEWSIZE");
- var screenSize = (Point2d)Application.GetSystemVariable("SCREENSIZE");
- double factor = viewSize * (screenSize.X / screenSize.Y);
- var viewCtr = (Point3d)Application.GetSystemVariable("VIEWCTR");
- // Преобразование viewCtr из UCS в DCS
- Matrix3d matUCS2DCS = ed.UCS2WCS() * ed.WCS2DCS();
- viewCtr = viewCtr.TransformBy(matUCS2DCS);
- var p1 = new Point3d(viewCtr.X - (factor / 2.0), viewCtr.Y - (viewSize / 2.0), .0);
- var p2 = new Point3d(viewCtr.X + (factor / 2.0), viewCtr.Y + (viewSize / 2.0), .0);
- // Преобразовать p1, p2 от DCS до UCS;
- Matrix3d matDCS2UCS = ed.DCS2WCS() * ed.WCS2UCS();
- p1 = p1.TransformBy(matDCS2UCS);
- p2 = p2.TransformBy(matDCS2UCS);
- Point2d wmfinBlockPos = new Point2d(p1.X, p2.Y);
- var tempWithOutExt = Path.Combine(Path.GetDirectoryName(tempFile),
- Path.GetFileNameWithoutExtension(tempFile));
- ed.Command("_.WMFIN", tempWithOutExt, wmfinBlockPos, "2", "", "");
- try
- {
- var wmfBlock = tr.GetObject(ed.SelectLastEnt(), OpenMode.ForWrite) as BlockReference;
- DBObjectCollection pElems = new DBObjectCollection();
- wmfBlock?.Explode(pElems);
- var space = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
- foreach (DBObject elem in pElems)
- {
- space.AppendEntity(elem as Entity);
- tr.AddNewlyCreatedDBObject(elem, true);
- }
- // Очистка неиспользуемого блока WMFIN и ссылки
- ObjectId wmfBtr = GetNonErasedTableRecordId(db.BlockTableId, wmfBlock.Name);
- ObjectIdCollection blockIds = new ObjectIdCollection();
- blockIds.Add(wmfBtr);
- db.Purge(blockIds);
- foreach (ObjectId oId in blockIds)
- {
- DBObject obj = tr.GetObject(oId, OpenMode.ForWrite);
- obj.Erase();
- }
- }
- catch (Exception ex)
- {
- ed.WriteMessage(ex.Message);
- }
- finally
- {
- // Удаление текстовой сущности
- text.Erase();
- tr.Commit();
- }
- }
- }
- }
MadhukarMoogala/Forge-ExplodeText
Forge-ExplodeText - это образец Forge Design Automation, который расчленяет объекты Text в Geomerty, в настоящее время поддерживается только объект DBText.
Источник: https://forge.autodesk.com/blog/explode-dbtext-geometry-using-design-automation-api-6
Обсуждение: http://adn-cis.org/forum/index.php?topic=
Опубликовано 24.04.2018