/// <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(); } }
/// <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(); } }
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); }
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()); }
/// <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); }
/// <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; }
/// <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); }
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; }
/// <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; }
/// <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; }