ADN Club > AutoCAD .NET API
Как назначить вьюпорту AnnotationScale в соответствии с StandardScale ?
(1/1)
avc:
Заметил, что при программном назначении вьюпорту StandardScale или CustomScale, его свойство AnnotationScale остается старое, от старого масштаба. А если масштаб менять в интерфейсе Автокада, то AnnotationScale синхронно переключается как масштаб. Вопрос - как программно синхронизировать AnnotationScale с масштабом?
Свойство AnnotationScale имеет публичный сеттер, но этого объекта очень мутные конструкторы, ни StandardScaleType, ни масштаб как double они не принимают (а в некоторых других API вообще нет публичных конструкторов). Похоже надо как-то получить этот объект из БД чертежа. Но как?
Привалов Дмитрий:
--- Цитата: avc от 09-12-2025, 22:44:11 ---Свойство AnnotationScale имеет публичный сеттер, но этого объекта очень мутные конструкторы, ни StandardScaleType, ни масштаб как double они не принимают (а в некоторых других API вообще нет публичных конструкторов). Похоже надо как-то получить этот объект из БД чертежа. Но как?
--- Конец цитаты ---
Скорее всего нужно извлекать реально существующий масштаб из списка масштабов текущего чертежа, его и назначать.
--- Код - C# [Выбрать] ---ObjectContextManager contextManager = db.ObjectContextManager;if (contextManager != null){ ObjectContextCollection collectionScales = contextManager.GetContextCollection("ACDB_ANNOTATIONSCALES");//Получение списка масштабов в текущем чертеже foreach (AnnotationScale scale in collectionScales) { scales.Add(scale); } //или текущий. AnnotationScale currentScale = (AnnotationScale)collectionScales.CurrentContext; //Добавление масштаба к чертежу AnnotationScale scale = new AnnotationScale(); scale.Name = "MyScale 1:28"; scale.PaperUnits = 1; scale.DrawingUnits = 28; collectionScales.AddContext(scale); //Добавление к аннотативному объекту ObjectContext objectContext = collectionScales.GetContext("MyScale 1:28"); anotativeObject.AddContext(objectContext );}
avc:
Спасибо. Стандартные масштабы похоже всегда присутствуют в этом словаре. Но как создать нестандартные?
--- Код - C# [Выбрать] --- /// <summary> /// назначить стандартный или пользовательский масштаб /// </summary> public static void SetScale(this Viewport vp, double scale) { if (vp is null || double.IsNaN(scale) || scale < MinScale) return; StandardScaleType std = FindStdScale(scale, vp.Database); // моя процедура подбора масштаба из стандартных double oldScale = vp.CustomScale; if (std != StandardScaleType.CustomScale) vp.StandardScale = std; else vp.CustomScale = scale; if (vp.Database != null && oldScale != vp.CustomScale) { ObjectContextManager ocm = vp.Database.ObjectContextManager; ObjectContextCollection occ = ocm.GetContextCollection("ACDB_ANNOTATIONSCALES"); bool found = false; foreach (AnnotationScale ac in occ) if (Abs(ac.Scale - vp.CustomScale) < ScaleTolerance) { vp.AnnotationScale = ac; found = true; break; } if (!found) //occ.AddContext(new AnnotationScale()); // надо создавать новый AnnotationScale, но непонятно как vp.AnnotationScale = vp.Database.Cannoscale; } }
Привалов Дмитрий:
--- Цитата: avc от 11-12-2025, 12:15:06 ---Но как создать нестандартные?
--- Конец цитаты ---
Выше сообщение изменил, как добавлять. В collectionScales все масштабы хранятся. Скорее всего можно все масштабы изменить, но один должен всегда присутствовать, т.к. много мест с масштабом по умолчанию.
avc:
Черт! Что-то я тормознул. Полноценного конструктора у класса нет, но свойства-то доступны для записи ;D
Вот так работает:
--- Код - C# [Выбрать] --- /// <summary> /// назначить стандартный или пользовательский масштаб /// </summary> public static void SetScale(this Viewport vp, double scale) { if (vp is null || double.IsNaN(scale) || scale < MinScale) return; StandardScaleType std = FindStdScale(scale, vp.Database); double oldScale = vp.CustomScale; if (std != StandardScaleType.CustomScale) vp.StandardScale = std; else vp.CustomScale = scale; if (vp.Database != null && oldScale != vp.CustomScale) { ObjectContextManager ocm = vp.Database.ObjectContextManager; ObjectContextCollection occ = ocm.GetContextCollection("ACDB_ANNOTATIONSCALES"); bool found = false; foreach (AnnotationScale oldAnnoScale in occ) if (Abs(oldAnnoScale.Scale - vp.CustomScale) < ScaleTolerance) { vp.AnnotationScale = oldAnnoScale; found = true; break; } if (!found) { //Добавление масштаба к чертежу AnnotationScale newScale = new() { Name = $"CustomScale {vp.CustomScale}x", PaperUnits = vp.CustomScale, DrawingUnits = 1 }; occ.AddContext(newScale); vp.AnnotationScale = newScale; } } }
Навигация
Перейти к полной версии