Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Дмитрий Загорулькин от 11-06-2015, 17:52:44

Название: Регенерация всех видовых экранов чертежа.
Отправлено: Дмитрий Загорулькин от 11-06-2015, 17:52:44
Подскажите пожалуйста, или пните в нужном направлении. Столкнулся с такой задачей - нужно сделать полный аналог команды REGENALL. Сейчас использую метод Application.DocumentManager.MdiActiveDocument.Editor.Regen(), но с помощью него можно обновить только текущий видовой экран. Например, если модель разделена на несколько видовых экранов, то обновление произойдет только в одном текущем. В листе вообще ничего не обновляет, пока внутрь какого-нибудь ВЭ не войдешь. Нашел на болоте тему (http://www.theswamp.org/index.php?topic=30487.0) с несколькими вариантами решения, наиболее толковый из них - это выполнить SendStringToExecute("REGENALL ", true, false, false). Неужели нет какого-то аналога этого в NET.API?
Название: Re: Регенерация всех видовых экранов чертежа.
Отправлено: German от 11-06-2015, 18:07:52
Editor.Command()? http://adn-cis.org/forum/index.php?topic=1816.msg7061#msg7061
Название: Re: Регенерация всех видовых экранов чертежа.
Отправлено: Дмитрий Загорулькин от 11-06-2015, 18:14:24
Ну это все равно "командный" метод получается, тот же SendStringToExecute, но другой подход.
Название: Re: Регенерация всех видовых экранов чертежа.
Отправлено: German от 11-06-2015, 23:08:50
Это читал? http://forums.autodesk.com/t5/net/how-to-regen-acallviewports-with-vb-net/td-p/2446427
Название: Re: Регенерация всех видовых экранов чертежа.
Отправлено: Александр Ривилис от 12-06-2015, 00:15:29
Дмитрий Загорулькин, 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()
Название: Re: Регенерация всех видовых экранов чертежа.
Отправлено: Дмитрий Загорулькин от 12-06-2015, 08:29:10
Это читал?
Нет, не видел этого.
Непонятно, конечно, почему в чистом NET нет таких методов и нужно через COM или командную интерпретацию или еще какими-то обходными путями выполнять. Но это уже не вопрос, а мысли вслух :-). Спасибо за подсказки!