03/06/2014
Получение штриховки (Hatch) из мультиполигона (MPolygon)
Вопрос: В dwg-файле имеется множество мультиполигонов (MPolygon). Как из них можно получить штриховки (Hatch)? Метод MPolygon.Hatch в большинстве случаев дает штриховку, у которой в панели свойств неопределенна площадь.
Ответ: Ниже приводится код, который позволяет получить из MPolygon корректную (т.е. имеющую площадь) штриховку.
Код - C#: [Выделить]
- using System;
- using Autodesk.AutoCAD.Runtime;
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.DatabaseServices;
- using Autodesk.AutoCAD.Geometry;
- using Autodesk.AutoCAD.EditorInput;
- using Autodesk.AutoCAD.Interop;
- using Autodesk.AutoCAD.Interop.Common;
- using AcRx = Autodesk.AutoCAD.Runtime;
- using AcAp = Autodesk.AutoCAD.ApplicationServices;
- using AcDb = Autodesk.AutoCAD.DatabaseServices;
- using AcGe = Autodesk.AutoCAD.Geometry;
- using AcEd = Autodesk.AutoCAD.EditorInput;
- using AcInt = Autodesk.AutoCAD.Interop;
- using AcIntCom = Autodesk.AutoCAD.Interop.Common;
- [assembly: CommandClass(typeof(TestArea.MyCommands))]
- namespace TestArea
- {
- public class MyCommands
- {
- [CommandMethod("MPtoHatch")]
- public void TestMPtoHatch()
- {
- Document doc = AcAp.Application.DocumentManager.MdiActiveDocument;
- Database db = doc.Database;
- Editor ed = doc.Editor;
- ObjectIdCollection ids;
- ObjectId idHatch;
- try {
- using (DocumentLock docLock = doc.LockDocument()) {
- TypedValue[] filList = new TypedValue[1] { new TypedValue((int)DxfCode.Start, "MPOLYGON") };
- SelectionFilter filter = new SelectionFilter(filList);
- PromptSelectionOptions opts = new PromptSelectionOptions();
- opts.MessageForAdding = "Выберите MPolygon'ы: ";
- PromptSelectionResult res = ed.GetSelection(opts, filter);
- if (res.Status != PromptStatus.OK)
- return;
- SelectionSet selSet = res.Value;
- ids = new ObjectIdCollection(selSet.GetObjectIds());
- using (BlockTableRecord btr = db.CurrentSpaceId.Open(OpenMode.ForWrite) as BlockTableRecord) {
- foreach (ObjectId id in ids) {
- using (MPolygon mp = id.Open(OpenMode.ForRead) as MPolygon) {
- using (Hatch hatch = new Hatch()) {
- hatch.SetDatabaseDefaults(db);
- hatch.SetHatchPattern(mp.PatternType, mp.PatternName);
- try { hatch.PatternAngle = mp.PatternAngle; } catch { }
- try { hatch.PatternDouble = mp.PatternDouble; } catch { }
- try { hatch.PatternScale = mp.PatternScale; } catch { }
- try { hatch.PatternSpace = mp.PatternSpace; } catch { }
- hatch.Normal = mp.Normal;
- hatch.Elevation = mp.Elevation;
- idHatch = btr.AppendEntity(hatch);
- hatch.Associative = false;
- for (int i = 0; i < mp.NumMPolygonLoops; i++) {
- MPolygonLoop mpLoop = mp.GetMPolygonLoopAt(i);
- Point2dCollection vertexCol = new Point2dCollection();
- DoubleCollection bulgeCol = new DoubleCollection();
- for (int j = 0; j < mpLoop.Count; j++) {
- vertexCol.Add(mpLoop[j].Vertex);
- bulgeCol.Add(mpLoop[j].Bulge);
- }
- HatchLoopTypes loopType = (i == 0) ? HatchLoopTypes.External : HatchLoopTypes.Default;
- hatch.AppendLoop(loopType, vertexCol, bulgeCol);
- }
- hatch.EvaluateHatch(false);
- ed.WriteMessage("\nПлощадь={0}", hatch.Area);
- }
- }
- }
- }
- }
- } catch { };
- }
- }
- }
Автор: Александр Ривилис
Автор перевода: Александр Ривилис
Автор перевода: Александр Ривилис
Обсуждение: http://adn-cis.org/forum/index.php?topic=784
Опубликовано 03.06.2014