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

24/04/2018

Расчленение DBText в Geometry с использованием Design Automation API

Я получил запрос от одного из наших специалистов по техническому продажам, чей клиент хотел бы автоматизировать рабочий процесс проектирования с помощью Forge Design Automation, одним из аспектов рабочего потока является расчленение объектов Text в Geometry (полилинии и дуги).

У нас есть экспресс-инструмент, доступный для AutoCAD под названием TXTEXP, к сожалению, этот инструмент недоступен для Forge, я создал программу на C#, которая взрывает текстовый объект в геометрию, эта настраиваемая программа может быть указана в Forge Activity.

Код - C#: [Выделить]
  1.         public void EXPTXT()
  2.         {
  3.             var doc = Application.DocumentManager.MdiActiveDocument;
  4.             var db = doc.Database;
  5.             var ed = doc.Editor;
  6.  
  7.             // выделенный текст
  8.             ObjectId[] dbtextIds = ed.SelectTextEntitesInModelSpace();
  9.             foreach (ObjectId id in dbtextIds)
  10.             {
  11.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  12.                 {
  13.                     var text = (DBText)tr.GetObject(id, OpenMode.ForWrite);
  14.                     ObjectId[] ids = new ObjectId[1];
  15.                     ids[0] = id;
  16.                     ed.SetImpliedSelection(ids);
  17.                     var tempFile = Path.Combine(Path.GetTempPath(), "Q.wmf");
  18.  
  19.                     if (File.Exists(tempFile))
  20.                     {
  21.                         File.Delete(tempFile);
  22.                     }
  23.                     ed.Command("_.WMFOUT", tempFile, "", "");
  24.                     var viewSize = (double)Application.GetSystemVariable("VIEWSIZE");
  25.                     var screenSize = (Point2d)Application.GetSystemVariable("SCREENSIZE");
  26.                     double factor = viewSize * (screenSize.X / screenSize.Y);
  27.                     var viewCtr = (Point3d)Application.GetSystemVariable("VIEWCTR");
  28.                     // Преобразование viewCtr из UCS в DCS
  29.                     Matrix3d matUCS2DCS = ed.UCS2WCS() * ed.WCS2DCS();
  30.                     viewCtr = viewCtr.TransformBy(matUCS2DCS);
  31.                     var p1 = new Point3d(viewCtr.X - (factor / 2.0), viewCtr.Y - (viewSize / 2.0), .0);
  32.                     var p2 = new Point3d(viewCtr.X + (factor / 2.0), viewCtr.Y + (viewSize / 2.0), .0);
  33.                     // Преобразовать p1, p2 от DCS до UCS;
  34.                     Matrix3d matDCS2UCS = ed.DCS2WCS() * ed.WCS2UCS();
  35.                     p1 = p1.TransformBy(matDCS2UCS);
  36.                     p2 = p2.TransformBy(matDCS2UCS);
  37.                     Point2d wmfinBlockPos = new Point2d(p1.X, p2.Y);
  38.                     var tempWithOutExt = Path.Combine(Path.GetDirectoryName(tempFile),
  39.                                                       Path.GetFileNameWithoutExtension(tempFile));
  40.                     ed.Command("_.WMFIN", tempWithOutExt, wmfinBlockPos, "2", "", "");
  41.                     try
  42.                     {
  43.                         var wmfBlock = tr.GetObject(ed.SelectLastEnt(), OpenMode.ForWrite) as BlockReference;
  44.                         DBObjectCollection pElems = new DBObjectCollection();
  45.                         wmfBlock?.Explode(pElems);
  46.                         var space = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  47.                         foreach (DBObject elem in pElems)
  48.                         {
  49.                             space.AppendEntity(elem as Entity);
  50.                             tr.AddNewlyCreatedDBObject(elem, true);
  51.                         }
  52.                         // Очистка неиспользуемого блока WMFIN и ссылки
  53.                         ObjectId wmfBtr = GetNonErasedTableRecordId(db.BlockTableId, wmfBlock.Name);
  54.                         ObjectIdCollection blockIds = new ObjectIdCollection();
  55.                         blockIds.Add(wmfBtr);
  56.                         db.Purge(blockIds);
  57.                         foreach (ObjectId oId in blockIds)
  58.                         {
  59.                             DBObject obj = tr.GetObject(oId, OpenMode.ForWrite);
  60.                             obj.Erase();
  61.  
  62.                         }
  63.                     }
  64.                     catch (Exception ex)
  65.                     {
  66.                         ed.WriteMessage(ex.Message);
  67.                     }
  68.                     finally
  69.                     {
  70.                         // Удаление текстовой сущности
  71.                         text.Erase();
  72.                         tr.Commit();
  73.                     }
  74.                 }
  75.  
  76.             }
  77.  
  78.         }

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