Регенерация всех видовых экранов чертежа.

Автор Тема: Регенерация всех видовых экранов чертежа.  (Прочитано 10880 раз)

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

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

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Подскажите пожалуйста, или пните в нужном направлении. Столкнулся с такой задачей - нужно сделать полный аналог команды REGENALL. Сейчас использую метод Application.DocumentManager.MdiActiveDocument.Editor.Regen(), но с помощью него можно обновить только текущий видовой экран. Например, если модель разделена на несколько видовых экранов, то обновление произойдет только в одном текущем. В листе вообще ничего не обновляет, пока внутрь какого-нибудь ВЭ не войдешь. Нашел на болоте тему с несколькими вариантами решения, наиболее толковый из них - это выполнить SendStringToExecute("REGENALL ", true, false, false). Неужели нет какого-то аналога этого в NET.API?

Оффлайн German

  • ADN Club
  • **
  • Сообщений: 84
  • Карма: 13

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Ну это все равно "командный" метод получается, тот же SendStringToExecute, но другой подход.


Отмечено как Решение Дмитрий Загорулькин 12-06-2015, 08:29:29

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Дмитрий Загорулькин, German
Резюме:
Код - C# [Выбрать]
  1. using System;
  2. using System.Reflection;
  3. using Autodesk.AutoCAD.Runtime;
  4. using Autodesk.AutoCAD.ApplicationServices;
  5. using Autodesk.AutoCAD.EditorInput;
  6. using Autodesk.AutoCAD.Interop;
  7. using Autodesk.AutoCAD.Interop.Common;
  8. [assembly: CommandClass(typeof(MyRegen.MyCommands))]
  9.  
  10. namespace MyRegen
  11. {
  12.   public class MyCommands
  13.   {
  14.     // Требуется
  15.     // using Autodesk.AutoCAD.Interop;
  16.     // using Autodesk.AutoCAD.Interop.Common;
  17.     // и подключение соответствующих dll
  18.     [CommandMethod("MyRegenAll1")]
  19.     public void MyRegenAll1()
  20.     {
  21.       Document doc = Application.DocumentManager.MdiActiveDocument;
  22.       if (doc == null) return;
  23.       (doc.GetAcadDocument() as AcadDocument).Regen(AcRegenType.acAllViewports);
  24.     }
  25.     // Не требуется
  26.     // using Autodesk.AutoCAD.Interop;
  27.     // using Autodesk.AutoCAD.Interop.Common;
  28.     // и подключение соответствующих dll
  29.     [CommandMethod("MyRegenAll2")]
  30.     public void MyRegenAll2()
  31.     {
  32.       Document doc = Application.DocumentManager.MdiActiveDocument;
  33.       if (doc == null) return;
  34.       object aDoc = doc.GetAcadDocument();
  35.       aDoc.GetType().InvokeMember(
  36.         "Regen", BindingFlags.InvokeMethod,
  37.         null, aDoc, new object[] { 1 });
  38.     }
  39.   }
  40. }

P.S.: Document.AcadDocument было в версиях до 2013. В последних: Document.GetAcadDocument()
« Последнее редактирование: 12-06-2015, 10:42:14 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Это читал?
Нет, не видел этого.
Непонятно, конечно, почему в чистом NET нет таких методов и нужно через COM или командную интерпретацию или еще какими-то обходными путями выполнять. Но это уже не вопрос, а мысли вслух :-). Спасибо за подсказки!