Замена аннотативного масштаба у выносок

Автор Тема: Замена аннотативного масштаба у выносок  (Прочитано 8096 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Всем привет!
Для очистки списка аннтотативных масштабов у объектов использую простейший код (сначала удаляю все, затем добавляю текущий):
Код - C# [Выбрать]
  1. foreach (var objId in psr.Value.GetObjectIds())
  2. {
  3.     using (var ent = tr.GetObject(objId, OpenMode.ForWrite, false, false))
  4.     {
  5.         if (ent.Annotative == AnnotativeStates.True)
  6.         {
  7.             foreach (var objectContext in occ)
  8.             {
  9.                 var scale = (AnnotationScale)objectContext;
  10.                 if (ent.HasContext(scale))
  11.                     ent.RemoveContext(scale);
  12.             }
  13.             ent.AddContext(currentscale);
  14.         }
  15.     }
  16. }

Для текста и размеров срабатывает как положено. А вот с мультивыносками беда  :-\
Допустим, создал я аннотативные размеры и выноску с масштабами 1:100. Потом добавил к ним масштаб 1:50. Затем я включаю текущий аннотативный масштаб 1:20 и использую этот код: у размеров очистится список масштабов, поставится 1:20 и они будут выглядеть соответственно своему масштабу. А вот выноска останется такой-же как и была

Если проделать такую-же процедуру через свойства выноски (удалить все масштабы и поставить 1:20), то выноска так-же уменьшится, как и размеры
Как правильно менять аннотативный масштаб для выносок?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Могу предположить, что нужно назначить масштаб еще и ent.MText
Код - C# [Выбрать]
  1. MText mt = ent.MText;
  2. mt.AddContext(currentscale);
  3. ent.MText = mt;
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Чет ничего не получается  :-\
Все варианты приводят к тому, что в свойствах выноски стоит высота текста как положено, а когда заходишь в редактор текста выноски - то там высота текста множится

Update: Проблема происходит когда текущий аннотативный масштаб отсутствует у выноски

Отмечено как Решение Александр Пекшев aka Modis 10-04-2016, 09:49:24

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Вот код:
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7.  
  8. [assembly: CommandClass(typeof(Rivilis.MLeaderScale))]
  9.  
  10. namespace Rivilis
  11. {
  12.   public class MLeaderScale
  13.   {
  14.     [CommandMethod("MLeaderScale", CommandFlags.Modal)]
  15.     public void MyCommand()
  16.     {
  17.       Document doc = Application.DocumentManager.MdiActiveDocument;
  18.       if (doc == null) return;
  19.       Editor ed = doc.Editor;
  20.       Database db = doc.Database;
  21.       PromptEntityOptions prEnt = new PromptEntityOptions("\nВыберите мультилидер");
  22.       prEnt.SetRejectMessage("\nЭто не мультилидер");
  23.       prEnt.AddAllowedClass(typeof(MLeader), true);
  24.       PromptEntityResult rsEnt = ed.GetEntity(prEnt);
  25.       if (rsEnt.Status != PromptStatus.OK) return;
  26.       ObjectContextManager ocm = db.ObjectContextManager;
  27.       ObjectContextCollection occ = ocm.GetContextCollection("ACDB_ANNOTATIONSCALES");
  28.       ObjectContext curAnnoScale = occ.GetContext(db.Cannoscale.Name);
  29.       using (MLeader ml = rsEnt.ObjectId.Open(OpenMode.ForWrite) as MLeader)
  30.       {
  31.         if (ml.Annotative == AnnotativeStates.True)  {
  32.           AddScale(ml, curAnnoScale, occ);
  33.           if (ml.ContentType == ContentType.MTextContent)
  34.           {
  35.             MText mt = ml.MText;
  36.             if (mt.Annotative == AnnotativeStates.True)
  37.             {
  38.               AddScale(mt, curAnnoScale, occ);
  39.               ml.MText = mt;
  40.             }
  41.           }
  42.         }
  43.       }
  44.     }
  45.     void AddScale(Entity ent, ObjectContext curScale, ObjectContextCollection occ)
  46.     {
  47.       ent.AddContext(curScale);
  48.       foreach (ObjectContext scale in occ) {
  49.         if (scale.Name != curScale.Name && ent.HasContext(scale))
  50.           ent.RemoveContext(scale);
  51.       }
  52.     }
  53.   }
  54. }

Вот результат:



Во вложении dwg-файл, на котором я экспериментировал.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Александр Ривилис, спасибо, что так разжевали. Я так и не понял, где у меня была ошибка. Вроде тоже самое делал...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я так и не понял, где у меня была ошибка. Вроде тоже самое делал...
Ну по твоему обрывку кода и лаконичному описанию того, что есть и что должно быть, сложно понять где была ошибка...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Я так и не понял, где у меня была ошибка. Вроде тоже самое делал...
Ну по твоему обрывку кода и лаконичному описанию того, что есть и что должно быть, сложно понять где была ошибка...
Да не - ошибка была не в том коде, что в топике, а уже потом, когда я пробовал обработать текст в выноске.
Ну да ладно - вопрос уже исчерпан. Еще раз спасибо