Example #1
0
        /// <summary>
        /// Создание объекта границы чертежа
        /// Масштаб берётся из масштаба вхождения блока по оси X
        /// </summary>
        /// <param name="brefId">ObjectId вхождения блока рамки</param>
        /// <param name="name">Имя будущего листа</param>
        /// <returns>Объект границ чертежа</returns>
        private DrawingBorders CreateBorder(ObjectId brefId, string name)
        {
            DrawingBorders border = null;

            using (Transaction tr = _wdb.TransactionManager.StartTransaction())
            {
                BlockReference bref  = (BlockReference)tr.GetObject(brefId, OpenMode.ForRead);
                double         scale = bref.ScaleFactors.X;
                border = DrawingBorders.CreateDrawingBorders(bref.GeometricExtents.MinPoint,
                                                             bref.GeometricExtents.MaxPoint,
                                                             name,
                                                             scale);
                tr.Commit();
            }
            return(border);
        }
Example #2
0
        public DrawingBorders[] GetDrawingBorders()
        {
            List <DrawingBorders> borders = new List <DrawingBorders>();

            // Выставляем osmode в 1 - ENDpoint
            using (AcadSystemVariableSwitcher varSW = new AcadSystemVariableSwitcher("OSMODE", 1))
            {
                Configuration.AppConfig cfg = Configuration.AppConfig.Instance;
                // Крутимся, пока нужны новые масштабы (а один раз он точно нужен)
                bool needNewScale = true;

                BorderDrawer drawer = new BorderDrawer();

                while (needNewScale)
                {
                    // Получаем масштаб
                    double scale = GetScale(cfg.ReferenceDimension);
                    if (scale == 0)
                    {
                        return(borders.ToArray());
                    }

                    needNewScale = false;

                    // Крутимся, пока нужны новые рамки
                    bool needNewBorder = true;
                    while (needNewBorder)
                    {
                        BorderPromptResult borderRes = GetBorderPoints();
                        switch (borderRes.QueryStatus)
                        {
                        case PromptResultStatus.Cancelled:
                            // Пользователь нажал escape, запускаем процесс создания листов
                            needNewBorder = false;
                            break;

                        case PromptResultStatus.Keyword:
                            // Использованы параметры ком. строки

                            // Нужен новый масштаб
                            if (borderRes.StringResult.Equals(CO.NewScale, StringComparison.InvariantCulture))
                            {
                                needNewBorder = false;
                                needNewScale  = true;
                            }

                            // Запускаем процесс создания листов
                            if (borderRes.StringResult.Equals(CO.Process, StringComparison.InvariantCulture))
                            {
                                needNewBorder = false;
                            }

                            // Отменяем последний введённый чертёж
                            if (borderRes.StringResult.Equals(CO.Undo, StringComparison.InvariantCulture))
                            {
                                if (borders.Count > 0)
                                {
                                    borders.RemoveAt(borders.Count - 1);
                                    InitialBorderIndex--;

                                    drawer.ClearData();
                                    foreach (DrawingBorders b in borders)
                                    {
                                        b.Accept(drawer);
                                    }
                                }
                                else
                                {
                                    ed.WriteMessage("\nНечего возвращать");
                                }
                            }

                            // Выходим из команды
                            if (borderRes.StringResult.Equals(CO.Cancel, StringComparison.InvariantCulture))
                            {
                                ed.WriteMessage("\nОтмена!");
                                drawer.ClearData();
                                borders.Clear();
                                return(borders.ToArray());
                            }

                            break;

                        case PromptResultStatus.OK:
                            // Введены точки
                            string         bordername = string.Format("{0}{1}{2}", cfg.Prefix, InitialBorderIndex++, cfg.Suffix);
                            DrawingBorders border     =
                                DrawingBorders.CreateDrawingBorders(borderRes.FirstPoint,
                                                                    borderRes.SecondPoint,
                                                                    bordername,
                                                                    scale);
                            ed.WriteMessage("\nДобавляем лист {0}. Формат листа: {1}", bordername, border.PSInfo.Name);
                            borders.Add(border);
                            border.Accept(drawer);

                            break;

                        default:
                            throw new Exception("Invalid value for BorderQueryResultStatus");
                        }
                    }
                }
                drawer.ClearData();
                // Возвращаем osmode в исходное состояние
            }
            return(borders.ToArray());
        }