コード例 #1
0
ファイル: ApUtilities.cs プロジェクト: Uniges/cad-plugin
        // парсим рабочее пространство, возвращаем массив точек с координатами
        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);
        }
コード例 #2
0
ファイル: ApUtilities.cs プロジェクト: Uniges/cad-plugin
        // метод класса, доступный для вызова внутри сборки. все другие приватные методы инкапсулированы
        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);
        }
コード例 #3
0
ファイル: ApUtilities.cs プロジェクト: Uniges/cad-plugin
        // метод рисует полилинию по вершинам и возвращает площадь
        // возврат площади нужен для того, чтобы не парсить пространство заново (экономия ресурсов)
        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));
            }
        }