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

24/09/2013

Петля штриховки использующая коллекцию Curve2d

Чтобы создать штриховку информация для создания петли может быть указана как коллекция ObjectId содержащихся в базе примитивов. Тут лучше всего посмотреть эту статью: Создание объектов штриховки с использованием трассировки границ в .NET. Другой путь заключается в работе с одной лишь геометрией без добавления примитивов в базу.

Вот пример кода, который демонстрирует второй подход создания петли штриховки на основе только геометрии границы. Мы создадим две петли для одной штриховки просто указав две внутренних точки.

Код - C#: [Выделить]
  1. [CommandMethod("TH")]
  2. public void TestHatch()
  3. {
  4.     Document doc = Application.DocumentManager.MdiActiveDocument;
  5.     Database db = doc.Database;
  6.     Editor ed = doc.Editor;
  7.  
  8.     PromptPointResult ppr1
  9.                  = ed.GetPoint("\nУкажите внутреннюю точку 1 : ");
  10.     if (ppr1.Status != PromptStatus.OK)
  11.         return;
  12.     Point3d internalPt1 = ppr1.Value;
  13.     DBObjectCollection dbo1
  14.                         = ed.TraceBoundary(internalPt1, true);
  15.     if (dbo1 == null)
  16.         return;
  17.  
  18.     PromptPointResult ppr2
  19.                   = ed.GetPoint("\nУкажите внутреннюю точку 2 : ");
  20.     if (ppr2.Status != PromptStatus.OK)
  21.         return;
  22.     Point3d internalPt2 = ppr2.Value;
  23.     DBObjectCollection dbo2
  24.                         = ed.TraceBoundary(internalPt2, true);
  25.     if (dbo2 == null)
  26.         return;
  27.  
  28.     try
  29.     {
  30.         using (Transaction tr
  31.                    = db.TransactionManager.StartTransaction())
  32.         {
  33.             BlockTable bt = tr.GetObject(
  34.                                             db.BlockTableId,
  35.                                             OpenMode.ForWrite
  36.                                         ) as BlockTable;
  37.             BlockTableRecord btr = tr.GetObject
  38.                             (
  39.                                bt[BlockTableRecord.ModelSpace],
  40.                                OpenMode.ForWrite
  41.                             ) as BlockTableRecord;
  42.  
  43.             Curve2dCollection edgePtrs1 = new Curve2dCollection();
  44.             IntegerCollection edgeTypes1 = new IntegerCollection();
  45.             foreach (DBObject obj in dbo1)
  46.             {
  47.                 Entity entity = obj as Entity;
  48.                 Autodesk.AutoCAD.DatabaseServices.Polyline pline
  49.                 = entity as Autodesk.AutoCAD.DatabaseServices.Polyline;
  50.                 if (pline != null)
  51.                 {
  52.                     GetEdgeInformation( pline,
  53.                                         ref edgePtrs1,
  54.                                         ref  edgeTypes1);
  55.                 }
  56.             }
  57.  
  58.             Curve2dCollection edgePtrs2 = new Curve2dCollection();
  59.             IntegerCollection edgeTypes2 = new IntegerCollection();
  60.             foreach (DBObject obj in dbo2)
  61.             {
  62.                 Entity entity = obj as Entity;
  63.                 Autodesk.AutoCAD.DatabaseServices.Polyline pline
  64.                 = entity as Autodesk.AutoCAD.DatabaseServices.Polyline;
  65.                 if (pline != null)
  66.                 {
  67.                     GetEdgeInformation( pline,
  68.                                         ref edgePtrs2,
  69.                                         ref  edgeTypes2);
  70.                 }
  71.             }
  72.  
  73.             Hatch hatchObj = new Hatch();
  74.             hatchObj.SetDatabaseDefaults();
  75.  
  76.             Vector3d normal = new Vector3d(0.0, 0.0, 1.0);
  77.             hatchObj.HatchObjectType = HatchObjectType.HatchObject;
  78.             hatchObj.Color
  79.                     = Autodesk.AutoCAD.Colors.Color.FromColor
  80.                                     (System.Drawing.Color.Blue);
  81.  
  82.             hatchObj.Normal = normal;
  83.             hatchObj.Elevation = 0.0;
  84.             hatchObj.PatternScale = 0.5;
  85.             hatchObj.SetHatchPattern
  86.                                 (
  87.                                     HatchPatternType.PreDefined,
  88.                                     "ZIGZAG"
  89.                                 );
  90.  
  91.             btr.AppendEntity(hatchObj);
  92.             tr.AddNewlyCreatedDBObject(hatchObj, true);
  93.  
  94.             hatchObj.Associative = true;
  95.             hatchObj.AppendLoop(
  96.                                 (int)HatchLoopTypes.Default,
  97.                                 edgePtrs1,
  98.                                 edgeTypes1
  99.                                 );
  100.             hatchObj.AppendLoop(
  101.                                 (int)HatchLoopTypes.Default,
  102.                                 edgePtrs2,
  103.                                 edgeTypes2
  104.                                );
  105.  
  106.             hatchObj.EvaluateHatch(true);
  107.  
  108.             tr.Commit();
  109.         }
  110.     }
  111.     catch (System.Exception ex)
  112.     {
  113.         ed.WriteMessage(ex.ToString() + Environment.NewLine);
  114.     }
  115. }
  116.  
  117. public void GetEdgeInformation
  118.         (
  119.             Autodesk.AutoCAD.DatabaseServices.Polyline pline,
  120.             ref Curve2dCollection plCurves,
  121.             ref IntegerCollection edgeTypes
  122.         )
  123. {
  124.     int segCount = pline.NumberOfVertices;
  125.     for (int cnt = 0; cnt < segCount; cnt++)
  126.     {
  127.         SegmentType type = pline.GetSegmentType(cnt);
  128.  
  129.         switch (type)
  130.         {
  131.             case SegmentType.Arc:
  132.                 CircularArc2d arc2d = pline.GetArcSegment2dAt(cnt);
  133.                 plCurves.Add(arc2d);
  134.                 edgeTypes.Add((int)Enum.Parse(typeof(HatchEdgeType),
  135.                         HatchEdgeType.CircularArc.ToString()));
  136.                 break;
  137.  
  138.             case SegmentType.Line:
  139.                 LineSegment2d line2d = pline.GetLineSegment2dAt(cnt);
  140.                 plCurves.Add(line2d);
  141.                 edgeTypes.Add((int)Enum.Parse(typeof(HatchEdgeType),
  142.                                HatchEdgeType.Line.ToString()));
  143.                 break;
  144.  
  145.             case SegmentType.Coincident:
  146.                 break;
  147.             case SegmentType.Empty:
  148.                 break;
  149.             case SegmentType.Point:
  150.                 break;
  151.         }
  152.     }
  153. }

Вот пример, содержащий две петли, которые добавлены в чертеж в качестве примера для вас:

 

Загрузить тест

 

Источник: http://adndevblog.typepad.com/autocad/2013/08/hatch-loop-using-a-curve2d-collection.html

 

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

Опубликовано 24.09.2013
Отредактировано 24.09.2013 в 12:53:18