public static bool GetData(Db.ObjectId ObjectId) { SettingsParser settings = SettingsParser.getInstance(); Db.Database acCurDb = App.Application.DocumentManager.MdiActiveDocument.Database; using (Db.Transaction acTrans = acCurDb.TransactionManager.StartOpenCloseTransaction()) { Db.Polyline acPLine = acTrans.GetObject(ObjectId, Db.OpenMode.ForRead) as Db.Polyline; //Блокируем повторный выбор линии if (curveDict.FirstOrDefault(s => s.ObjId == ObjectId) == null) { Curve crv = new Curve(ObjectId); crv.Number = settings.startNumberCurve; crv.Area = round(acPLine.Area, settings.areaTolerance); crv.AreaOutput = round(acPLine.Area * settings.allAreaTolerance, settings.coordinateTolerance); settings.startNumberCurve++; if (pointDict.Count > 0) { settings.startNumberPoint = pointDict.Count; } int countVertix = acPLine.NumberOfVertices; for (int i = 0; i < countVertix; i++) { Gem.Point2d pt = acPLine.GetPoint2dAt(i); int iMin = (i == 0) ? iMin = countVertix - 1 : iMin = i - 1; int iMax = (i == countVertix - 1) ? iMax = 0 : iMax = i + 1; //Поучаю все три точки угла Gem.Point3d ptO = new Gem.Point3d(acPLine.GetPoint2dAt(i).X, acPLine.GetPoint2dAt(i).Y, 0); Gem.Point3d ptMin = new Gem.Point3d(acPLine.GetPoint2dAt(iMin).X, acPLine.GetPoint2dAt(iMin).Y, 0); Gem.Point3d ptMax = new Gem.Point3d(acPLine.GetPoint2dAt(iMax).X, acPLine.GetPoint2dAt(iMax).Y, 0); Gem.Vector3d vMin = ptO.GetVectorTo(ptMin); Gem.Vector3d vMax = ptO.GetVectorTo(ptMax); Gem.Vector3d vNormaliseMin = vMin / vMin.Length; Gem.Vector3d vNormaliseMax = vMax / vMax.Length; Gem.Vector3d vNormalise = vNormaliseMin + vNormaliseMax; vNormalise = vNormalise / vNormalise.Length; //Тут нужно проверять, попадает ли точка нормализованного вектора внутрь фигуры или наружу using (Db.Ray cl = new Db.Ray()) { cl.BasePoint = ptO + vNormalise; cl.UnitDir = vNormalise; Gem.Point3dCollection pnt3dCol = new Gem.Point3dCollection(); acPLine.IntersectWith(cl, Db.Intersect.OnBothOperands, pnt3dCol, IntPtr.Zero, IntPtr.Zero); if ((pnt3dCol.Count % 2) != 0) { vNormalise = vNormalise * (-1); } } int namb = 0; //Номер вершины if (pointDict.FirstOrDefault(s => s.IsEqualTo(pt, settings.coordinateTolerance)) == null) { Point pnt = new Point(round(pt.X, settings.coordinateTolerance), round(pt.Y, settings.coordinateTolerance), settings.startNumberPoint); //Добавляем нормализованный вектор биссектриссы угла pnt.vNormalise = vNormalise; //Добавляем в список точек pointDict.Add(pnt); //Добавляем в кривую crv.Vertixs.Add(pnt); namb = settings.startNumberPoint; settings.startNumberPoint++; } else { //Добавляем в список вершин уже обраотанную точку crv.Vertixs.Add(pointDict.FirstOrDefault(s => s.IsEqualTo(pt, settings.coordinateTolerance))); } } //Добавляем в список линий curveDict.Add(crv); //Вывожу данные линии в чертеж View.TextToDwg(crv); //View.AddText(crv.textPoint(), $"{crv.Number} \\P S={crv.Area} кв.м."); } acTrans.Commit(); } return(true); }