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