24/09/2013
Петля штриховки использующая коллекцию Curve2d
Чтобы создать штриховку информация для создания петли может быть указана как коллекция ObjectId содержащихся в базе примитивов. Тут лучше всего посмотреть эту статью: Создание объектов штриховки с использованием трассировки границ в .NET. Другой путь заключается в работе с одной лишь геометрией без добавления примитивов в базу.Вот пример кода, который демонстрирует второй подход создания петли штриховки на основе только геометрии границы. Мы создадим две петли для одной штриховки просто указав две внутренних точки.
Код - C#: [Выделить]
- [CommandMethod("TH")]
- public void TestHatch()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Database db = doc.Database;
- Editor ed = doc.Editor;
- PromptPointResult ppr1
- = ed.GetPoint("\nУкажите внутреннюю точку 1 : ");
- if (ppr1.Status != PromptStatus.OK)
- return;
- Point3d internalPt1 = ppr1.Value;
- DBObjectCollection dbo1
- = ed.TraceBoundary(internalPt1, true);
- if (dbo1 == null)
- return;
- PromptPointResult ppr2
- = ed.GetPoint("\nУкажите внутреннюю точку 2 : ");
- if (ppr2.Status != PromptStatus.OK)
- return;
- Point3d internalPt2 = ppr2.Value;
- DBObjectCollection dbo2
- = ed.TraceBoundary(internalPt2, true);
- if (dbo2 == null)
- return;
- try
- {
- using (Transaction tr
- = db.TransactionManager.StartTransaction())
- {
- BlockTable bt = tr.GetObject(
- db.BlockTableId,
- OpenMode.ForWrite
- ) as BlockTable;
- BlockTableRecord btr = tr.GetObject
- (
- bt[BlockTableRecord.ModelSpace],
- OpenMode.ForWrite
- ) as BlockTableRecord;
- Curve2dCollection edgePtrs1 = new Curve2dCollection();
- IntegerCollection edgeTypes1 = new IntegerCollection();
- foreach (DBObject obj in dbo1)
- {
- Entity entity = obj as Entity;
- Autodesk.AutoCAD.DatabaseServices.Polyline pline
- = entity as Autodesk.AutoCAD.DatabaseServices.Polyline;
- if (pline != null)
- {
- GetEdgeInformation( pline,
- ref edgePtrs1,
- ref edgeTypes1);
- }
- }
- Curve2dCollection edgePtrs2 = new Curve2dCollection();
- IntegerCollection edgeTypes2 = new IntegerCollection();
- foreach (DBObject obj in dbo2)
- {
- Entity entity = obj as Entity;
- Autodesk.AutoCAD.DatabaseServices.Polyline pline
- = entity as Autodesk.AutoCAD.DatabaseServices.Polyline;
- if (pline != null)
- {
- GetEdgeInformation( pline,
- ref edgePtrs2,
- ref edgeTypes2);
- }
- }
- Hatch hatchObj = new Hatch();
- hatchObj.SetDatabaseDefaults();
- Vector3d normal = new Vector3d(0.0, 0.0, 1.0);
- hatchObj.HatchObjectType = HatchObjectType.HatchObject;
- hatchObj.Color
- = Autodesk.AutoCAD.Colors.Color.FromColor
- (System.Drawing.Color.Blue);
- hatchObj.Normal = normal;
- hatchObj.Elevation = 0.0;
- hatchObj.PatternScale = 0.5;
- hatchObj.SetHatchPattern
- (
- HatchPatternType.PreDefined,
- "ZIGZAG"
- );
- btr.AppendEntity(hatchObj);
- tr.AddNewlyCreatedDBObject(hatchObj, true);
- hatchObj.Associative = true;
- hatchObj.AppendLoop(
- (int)HatchLoopTypes.Default,
- edgePtrs1,
- edgeTypes1
- );
- hatchObj.AppendLoop(
- (int)HatchLoopTypes.Default,
- edgePtrs2,
- edgeTypes2
- );
- hatchObj.EvaluateHatch(true);
- tr.Commit();
- }
- }
- catch (System.Exception ex)
- {
- ed.WriteMessage(ex.ToString() + Environment.NewLine);
- }
- }
- public void GetEdgeInformation
- (
- Autodesk.AutoCAD.DatabaseServices.Polyline pline,
- ref Curve2dCollection plCurves,
- ref IntegerCollection edgeTypes
- )
- {
- int segCount = pline.NumberOfVertices;
- for (int cnt = 0; cnt < segCount; cnt++)
- {
- SegmentType type = pline.GetSegmentType(cnt);
- switch (type)
- {
- case SegmentType.Arc:
- CircularArc2d arc2d = pline.GetArcSegment2dAt(cnt);
- plCurves.Add(arc2d);
- edgeTypes.Add((int)Enum.Parse(typeof(HatchEdgeType),
- HatchEdgeType.CircularArc.ToString()));
- break;
- case SegmentType.Line:
- LineSegment2d line2d = pline.GetLineSegment2dAt(cnt);
- plCurves.Add(line2d);
- edgeTypes.Add((int)Enum.Parse(typeof(HatchEdgeType),
- HatchEdgeType.Line.ToString()));
- break;
- case SegmentType.Coincident:
- break;
- case SegmentType.Empty:
- break;
- case SegmentType.Point:
- break;
- }
- }
- }
Вот пример, содержащий две петли, которые добавлены в чертеж в качестве примера для вас:
Источник: 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