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

03/06/2014

Получение штриховки (Hatch) из мультиполигона (MPolygon)

Вопрос: В dwg-файле имеется множество мультиполигонов (MPolygon). Как из них можно получить штриховки (Hatch)? Метод MPolygon.Hatch в большинстве случаев дает штриховку, у которой в панели свойств неопределенна площадь.

Ответ: Ниже приводится код, который позволяет получить из MPolygon корректную (т.е. имеющую площадь) штриховку.

Код - C#: [Выделить]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using Autodesk.AutoCAD.Interop;
  8. using Autodesk.AutoCAD.Interop.Common;
  9. using AcRx = Autodesk.AutoCAD.Runtime;
  10. using AcAp = Autodesk.AutoCAD.ApplicationServices;
  11. using AcDb = Autodesk.AutoCAD.DatabaseServices;
  12. using AcGe = Autodesk.AutoCAD.Geometry;
  13. using AcEd = Autodesk.AutoCAD.EditorInput;
  14. using AcInt = Autodesk.AutoCAD.Interop;
  15. using AcIntCom = Autodesk.AutoCAD.Interop.Common;
  16.  
  17. [assembly: CommandClass(typeof(TestArea.MyCommands))]
  18.  
  19. namespace TestArea
  20. {
  21.   public class MyCommands
  22.   {
  23.     [CommandMethod("MPtoHatch")]
  24.     public void TestMPtoHatch()
  25.     {
  26.       Document doc = AcAp.Application.DocumentManager.MdiActiveDocument;
  27.       Database db = doc.Database;
  28.       Editor ed = doc.Editor;
  29.       ObjectIdCollection ids;
  30.       ObjectId idHatch;
  31.       try {
  32.         using (DocumentLock docLock = doc.LockDocument()) {
  33.           TypedValue[] filList = new TypedValue[1] { new TypedValue((int)DxfCode.Start, "MPOLYGON") };
  34.           SelectionFilter filter = new SelectionFilter(filList);
  35.           PromptSelectionOptions opts = new PromptSelectionOptions();
  36.           opts.MessageForAdding = "Выберите MPolygon'ы: ";
  37.           PromptSelectionResult res = ed.GetSelection(opts, filter);
  38.           if (res.Status != PromptStatus.OK)
  39.             return;
  40.           SelectionSet selSet = res.Value;
  41.           ids = new ObjectIdCollection(selSet.GetObjectIds());
  42.           using (BlockTableRecord btr = db.CurrentSpaceId.Open(OpenMode.ForWrite) as BlockTableRecord) {
  43.             foreach (ObjectId id in ids) {
  44.               using (MPolygon mp = id.Open(OpenMode.ForRead) as MPolygon) {
  45.                 using (Hatch hatch = new Hatch()) {
  46.                   hatch.SetDatabaseDefaults(db);
  47.                   hatch.SetHatchPattern(mp.PatternType, mp.PatternName);
  48.                   try { hatch.PatternAngle = mp.PatternAngle; } catch { }
  49.                   try { hatch.PatternDouble = mp.PatternDouble; } catch { }
  50.                   try { hatch.PatternScale = mp.PatternScale; } catch { }
  51.                   try { hatch.PatternSpace = mp.PatternSpace; } catch { }
  52.                   hatch.Normal = mp.Normal;
  53.                   hatch.Elevation = mp.Elevation;
  54.                   idHatch = btr.AppendEntity(hatch);
  55.                   hatch.Associative = false;
  56.                   for (int i = 0; i < mp.NumMPolygonLoops; i++) {
  57.                     MPolygonLoop mpLoop = mp.GetMPolygonLoopAt(i);
  58.                     Point2dCollection vertexCol = new Point2dCollection();
  59.                     DoubleCollection bulgeCol = new DoubleCollection();
  60.                     for (int j = 0; j < mpLoop.Count; j++) {
  61.                       vertexCol.Add(mpLoop[j].Vertex);
  62.                       bulgeCol.Add(mpLoop[j].Bulge);
  63.                     }
  64.                     HatchLoopTypes loopType = (i == 0) ? HatchLoopTypes.External : HatchLoopTypes.Default;
  65.                     hatch.AppendLoop(loopType, vertexCol, bulgeCol);
  66.                   }
  67.                   hatch.EvaluateHatch(false);
  68.                   ed.WriteMessage("\nПлощадь={0}", hatch.Area);
  69.                 }
  70.               }
  71.             }
  72.           }
  73.         }
  74.       } catch { };
  75.     }
  76.   }
  77. }

Автор: Александр Ривилис
Автор перевода: Александр Ривилис

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

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