// парсим рабочее пространство, возвращаем массив точек с координатами private static List <Dot> FindDots() { // получаем текущую БД Database db = ApUtilities.TakeDB(); // создаем массив точек List <Dot> dots = new List <Dot>(); // начинаем транзакцию using (Transaction tr = db.TransactionManager.StartTransaction()) { // получаем ссылку на пространство модели (ModelSpace) BlockTableRecord ms = (BlockTableRecord)tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead); // "пробегаем" по всем объектам в пространстве модели foreach (ObjectId id in ms) { // приводим каждый из них к типу Entity Entity entity = (Entity)tr.GetObject(id, OpenMode.ForRead); // если это точка - создаем объект Dot if (entity.GetType() == typeof(DBPoint)) { dots.Add(new Dot(((DBPoint)entity).Position.X, ((DBPoint)entity).Position.Y)); } } } return(dots); }
// метод класса, доступный для вызова внутри сборки. все другие приватные методы инкапсулированы internal static void Main() { // получаем все точки с экрана List <Dot> dots = ApUtilities.FindDots(); // получаем все вершины, анализируя точки List <Dot> vertices = ApUtilities.FindVertices(dots); // отрисовываем контур, используя вершины, и получаем его площадь double area = ApUtilities.DrawPLineAndCountArea(vertices); // выводим результаты ApUtilities.PrintResult(dots.Count, vertices.Count, area); }
// метод рисует полилинию по вершинам и возвращает площадь // возврат площади нужен для того, чтобы не парсить пространство заново (экономия ресурсов) private static double DrawPLineAndCountArea(List <Dot> vertices) { Database db = ApUtilities.TakeDB(); using (Transaction tr = db.TransactionManager.StartTransaction()) { // открытие таблицы Блоков для чтения BlockTable blkTbl; blkTbl = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; // открытие записи таблицы Блоков пространства Модели для записи BlockTableRecord blkTblRec; blkTblRec = tr.GetObject(blkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; // создание полилинии по найденным вершинам Polyline acPoly = new Polyline(); acPoly.SetDatabaseDefaults(); for (int i = 0; i < vertices.Count; i++) { // строим полилинию по вершинам acPoly.AddVertexAt(i, new Point2d(vertices[i].X, vertices[i].Y), 0, 0, 0); // замыкаем полилинию if (i == vertices.Count - 1) { acPoly.AddVertexAt(i + 1, new Point2d(vertices[0].X, vertices[0].Y), 0, 0, 0); } } // добавление нового объекта в запись таблицы блоков и в транзакцию blkTblRec.AppendEntity(acPoly); tr.AddNewlyCreatedDBObject(acPoly, true); // сохранение нового объекта в базе данных tr.Commit(); // возврат площади фигуры return(Math.Round(acPoly.Area, 4)); } }