Example #1
0
        /// <summary>
        /// Метод создаёт Layout по заданным параметрам
        /// </summary>
        /// <param name="borders">Границы выделенной области в пространстве модели</param>
        public void CreateLayout(DrawingBorders borders)
        {
            using (Transaction tr = this.wdb.TransactionManager.StartTransaction())
            {
                string layoutName = CheckLayoutName(borders.Name);

                PlotSettings  ps = ImportPlotSettings(borders, tr);
                LayoutManager lm = LayoutManager.Current;
                Layout        layout;
                try
                {
                    layout = (Layout)tr.GetObject(lm.CreateLayout(layoutName), OpenMode.ForWrite);
                }
                catch (System.Exception ex)
                {
                    throw new System.Exception(String.Format("Ошибка создания Layout {0}\n{1}", layoutName, ex.Message));
                }

                layout.CopyFrom(ps);
                lm.CurrentLayout = layout.LayoutName;
                View.Zoom(new Point3d(0, 0, 0), new Point3d(layout.PlotPaperSize.X, layout.PlotPaperSize.Y, 0), new Point3d(), 1);
                CreateViewport(layout, borders, tr);
                tr.Commit();
            }
        }
Example #2
0
        /// <summary>
        /// Метод ищет наименьший формат бумаги, в который помещается указанная область
        /// </summary>
        /// <param name="borders">Границы области, для которой надо делать Layout</param>
        /// <param name="precision">Точность определения формата</param>
        /// <returns>Формат бумаги</returns>
        public PlotSettingsInfo GetPlotSettings(DrawingBorders borders, int precision)
        {
            double scale = 1 / borders.ScaleFactor;

            return(plotSettingsInfos
                   .Where(n => n.Height >= borders.Height * scale - precision)
                   .Where(n => n.Width >= borders.Width * scale - precision)
                   .Aggregate(maximumHeighted, (work, next) => {
                double DiffHeightNext = Math.Round(next.Height) - borders.Height * scale;
                double DiffHeightWork = Math.Round(work.Height) - borders.Height * scale;
                double DiffWidthNext = Math.Round(next.Width) - borders.Width * scale;
                double DiffWidthWork = Math.Round(work.Width) - borders.Width * scale;
                if (DiffHeightNext < DiffHeightWork)
                {
                    return next;
                }
                if (DiffHeightNext == DiffHeightWork)
                {
                    if (DiffWidthWork < DiffWidthNext)
                    {
                        return work;
                    }
                    return next;
                }
                return work;
            }));
        }
        /// <summary>
        /// Метод создаёт Layout по заданным параметрам
        /// </summary>
        /// <param name="borders">Границы выделенной области в пространстве модели</param>
        public void CreateLayout(DrawingBorders borders)
        {
            using (Transaction tr = this.wdb.TransactionManager.StartTransaction())
            {
                string layoutName = CheckLayoutName(borders.Name);

                PlotSettings ps = ImportPlotSettings(borders, tr);
                LayoutManager lm = LayoutManager.Current;
                Layout layout;
                try
                {
                    layout = (Layout)tr.GetObject(lm.CreateLayout(layoutName), OpenMode.ForWrite);
                }
                catch (System.Exception ex)
                {
                    throw new System.Exception(String.Format("Ошибка создания Layout {0}\n{1}", layoutName, ex.Message));
                }

                layout.CopyFrom(ps);
                lm.CurrentLayout = layout.LayoutName;
                View.Zoom(new Point3d(0,0,0), new Point3d(layout.PlotPaperSize.X, layout.PlotPaperSize.Y, 0), new Point3d(), 1);
                CreateViewport(layout, borders, tr);
                tr.Commit();
            }
        }
Example #4
0
        public static DrawingBorders CreateDrawingBorders(Point3d first, Point3d second, string name, double scale)
        {
            DrawingBorders      borders = new DrawingBorders(first, second, name, scale);
            PlotSettingsManager psm     = PlotSettingsManager.Current;

            borders.PSInfo = psm.GetPlotSettings(borders, Configuration.AppConfig.Instance.Precision);
            return(borders);
        }
Example #5
0
        public void DrawBorder(DrawingBorders border)
        {
            // Обводим рамку прямоугольником
            Drawable rec = CreateRectangle(border.First, border.Second);
            this.objects.Add(rec);
            TransientManager tm = TransientManager.CurrentTransientManager;
            tm.AddTransient(rec, TransientDrawingMode.Highlight, 128, new IntegerCollection());

            // Вписываем в рамку название будущего листа и его формат
            Drawable txt = CreateLayoutNameMText(border.Center, border.Name, border.PSInfo.Name, border.ScaleFactor);
            this.objects.Add(txt);
            tm.AddTransient(txt, TransientDrawingMode.DirectShortTerm, 256, new IntegerCollection());
        }
Example #6
0
        public void DrawBorder(DrawingBorders border)
        {
            // Обводим рамку прямоугольником
            Drawable rec = CreateRectangle(border.First, border.Second);

            this.objects.Add(rec);
            TransientManager tm = TransientManager.CurrentTransientManager;

            tm.AddTransient(rec, TransientDrawingMode.Highlight, 128, new IntegerCollection());

            // Вписываем в рамку название будущего листа и его формат
            Drawable txt = CreateLayoutNameMText(border.Center, border.Name, border.PSInfo.Name, border.ScaleFactor);

            this.objects.Add(txt);
            tm.AddTransient(txt, TransientDrawingMode.DirectShortTerm, 256, new IntegerCollection());
        }
Example #7
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 #8
0
        /// <summary>
        /// Метод создаёт Viewport на заданном Layout, в размер листа
        /// </summary>
        /// <param name="layout">Layout, на котором создаётся viewport</param>
        /// <param name="borders">Границы выделенной области в модели</param>
        void CreateViewport(Layout layout, DrawingBorders borders, Transaction tr)
        {
            int vpCount = layout.GetViewports().Count;

            if (vpCount == 0)
            {
                throw new System.Exception(String.Format("Layout {0} не инициализирован", layout.LayoutName));
            }
            Viewport vp;

            if (vpCount == 1)
            {
                BlockTableRecord lbtr =
                    (BlockTableRecord)tr.GetObject(layout.BlockTableRecordId, OpenMode.ForWrite);
                vp = new Viewport();
                vp.SetDatabaseDefaults();
                lbtr.AppendEntity(vp);
                tr.AddNewlyCreatedDBObject(vp, true);
                vp.On = true;
            }
            else
            {
                ObjectId vpId = layout.GetViewports()[vpCount - 1];
                if (vpId.IsNull)
                {
                    throw new System.Exception("Не удалось получить вьюпорт!");
                }

                vp = (Viewport)tr.GetObject(vpId, OpenMode.ForWrite);
                if (vp == null)
                {
                    throw new System.Exception("Не удалось получить вьюпорт!");
                }
            }
            // Высоту и ширину вьюпорта выставляем в размер выделенной области
            vp.Height      = borders.Height / borders.ScaleFactor;
            vp.Width       = borders.Width / borders.ScaleFactor;
            vp.CenterPoint = new Point3d(vp.Width / 2 + layout.PlotOrigin.X,
                                         vp.Height / 2 + layout.PlotOrigin.Y,
                                         0);
            vp.ViewTarget = new Point3d(0, 0, 0);
            vp.ViewHeight = borders.Height;
            vp.ViewCenter = new Point2d(borders.Center.X, borders.Center.Y);
            vp.Locked     = LayoutsFromModel.Configuration.AppConfig.Instance.LockViewPorts;
        }
Example #9
0
        /// <summary>
        /// Метод добавляет из объекта границ чертежа новые
        /// именованые настройки печати в файл, если таковых там нет
        /// </summary>
        /// <param name="borders">Объект границ чертежа</param>
        /// <param name="tr">Текущая транзакция</param>
        /// <returns>Настройки печати, соответствующие границам чертежа</returns>
        PlotSettings ImportPlotSettings(DrawingBorders borders, Transaction tr)
        {
            PlotSettings ps = new PlotSettings(false);

            ps.CopyFrom(borders.PSInfo.PSettings);

            DBDictionary psDict = (DBDictionary)tr.GetObject(this.wdb.PlotSettingsDictionaryId,
                                                             OpenMode.ForRead);

            if (!psDict.Contains(ps.PlotSettingsName))
            {
                psDict.UpgradeOpen();
                ps.AddToPlotSettingsDictionary(this.wdb);
                tr.AddNewlyCreatedDBObject(ps, true);
                psDict.DowngradeOpen();
            }
            return(ps);
        }
Example #10
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());
        }
 public static DrawingBorders CreateDrawingBorders(Point3d first, Point3d second, string name, double scale)
 {
     DrawingBorders borders = new DrawingBorders(first, second, name, scale);
     PlotSettingsManager psm = PlotSettingsManager.Current;
     borders.PSInfo = psm.GetPlotSettings(borders, Configuration.AppConfig.Instance.Precision);
     return borders;
 }
Example #12
0
        /// <summary>
        /// Метод добавляет из объекта границ чертежа новые
        /// именованые настройки печати в файл, если таковых там нет
        /// </summary>
        /// <param name="borders">Объект границ чертежа</param>
        /// <param name="tr">Текущая транзакция</param>
        /// <returns>Настройки печати, соответствующие границам чертежа</returns>
        PlotSettings ImportPlotSettings(DrawingBorders borders, Transaction tr)
        {
            PlotSettings ps = new PlotSettings(false);
            ps.CopyFrom(borders.PSInfo.PSettings);

            DBDictionary psDict = (DBDictionary)tr.GetObject(this.wdb.PlotSettingsDictionaryId,
                                                             OpenMode.ForRead);
            if (!psDict.Contains(ps.PlotSettingsName))
            {
                psDict.UpgradeOpen();
                ps.AddToPlotSettingsDictionary(this.wdb);
                tr.AddNewlyCreatedDBObject(ps, true);
                psDict.DowngradeOpen();
            }
            return ps;
        }
Example #13
0
        /// <summary>
        /// Метод создаёт Viewport на заданном Layout, в размер листа
        /// </summary>
        /// <param name="layout">Layout, на котором создаётся viewport</param>
        /// <param name="borders">Границы выделенной области в модели</param>
        void CreateViewport(Layout layout, DrawingBorders borders, Transaction tr)
        {
            int vpCount = layout.GetViewports().Count;
            if (vpCount == 0)
            {
                throw new System.Exception(String.Format("Layout {0} не инициализирован", layout.LayoutName));
            }
            Viewport vp;
            if (vpCount == 1)
            {
                BlockTableRecord lbtr =
                    (BlockTableRecord)tr.GetObject(layout.BlockTableRecordId, OpenMode.ForWrite);
                vp = new Viewport();
                vp.SetDatabaseDefaults();
                lbtr.AppendEntity(vp);
                tr.AddNewlyCreatedDBObject(vp, true);
                vp.On = true;
            }
            else
            {
                ObjectId vpId = layout.GetViewports()[vpCount-1];
                if (vpId.IsNull)
                    throw new System.Exception("Не удалось получить вьюпорт!");

                vp = (Viewport)tr.GetObject(vpId, OpenMode.ForWrite);
                if (vp == null)
                    throw new System.Exception("Не удалось получить вьюпорт!");
            }
            // Высоту и ширину вьюпорта выставляем в размер выделенной области
            vp.Height = borders.Height / borders.ScaleFactor;
            vp.Width = borders.Width / borders.ScaleFactor;
            vp.CenterPoint = new Point3d(vp.Width/2 + layout.PlotOrigin.X,
                                         vp.Height/2 + layout.PlotOrigin.Y,
                                         0);
            vp.ViewTarget = new Point3d(0,0,0);
            vp.ViewHeight = borders.Height;
            vp.ViewCenter = new Point2d(borders.Center.X, borders.Center.Y);
            vp.Locked = LayoutsFromModel.Configuration.AppConfig.Instance.LockViewPorts;
        }