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;        }      }    }

Навигация

[0] Главная страница сообщений

Перейти к полной версии