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

ADN Club => AutoCAD .NET API => Тема начата: Vns от 23-12-2015, 21:06:44

Название: VB.Net Не отображаются изменения в окне AutoCad до завершения .NET комманды
Отправлено: Vns от 23-12-2015, 21:06:44
Здравствуйте! Пожалуйста помогите разобраться.

Перехожу с VBA на VB.NET. Столкнулся с проблемой: В ходе выполнения NET.команды на экране не видно никаких изменений до тех пор, пока команда не завершится.
Например, программно создаю в пространстве модели примитив и поворачиваю его сначала на 10 градусов, затем на 15. На экране во время выполнения команды не видно как примитив поворачивается сначала на 10, потом на 15 градусов, но по завершению команды примитив повернут на 25 градусов. Как добиться визуализации изменений в пределах NET.команды.
Пробовал метод Application.UpdateScreen() - не помогло, экспериментироал с флагами CommandMethod - тот же результат.

Заранее благодарю.
Название: Re: VB.Net Не отображаются изменения в окне AutoCad до завершения .NET комманды
Отправлено: Александр Пекшев aka Modis от 23-12-2015, 21:10:36
Вам нужно использовать Jig. Хорошие примеры найдете у Велмсли - http://through-the-interface.typepad.com/through_the_interface/jigs/
Пример с поворотом примитива - http://through-the-interface.typepad.com/through_the_interface/2008/03/using-a-jig-to.html
Перехожу с VBA на VB.NET
Плохая идея
Название: Re: VB.Net Не отображаются изменения в окне AutoCad до завершения .NET комманды
Отправлено: Vns от 23-12-2015, 21:17:01
Спасибо! Посмотрю.
Название: Re: VB.Net Не отображаются изменения в окне AutoCad до завершения .NET комманды
Отправлено: Александр Ривилис от 23-12-2015, 21:31:06
В ходе выполнения NET.команды на экране не видно никаких изменений до тех пор, пока команда не завершится.
Не совсем так. Обновление может произойти при наличии нескольких условий:
1) Завершена и подтверждена транзакция.
2) AutoCAD получил управление для того, чтобы он мог обновить экран.
Название: Re: VB.Net Не отображаются изменения в окне AutoCad до завершения .NET комманды
Отправлено: Александр Ривилис от 23-12-2015, 22:24:28
Код - 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. // This line is not mandatory, but improves loading performances
  9. [assembly: CommandClass(typeof(RotateEntity.MyCommands))]
  10.  
  11. namespace RotateEntity
  12. {
  13.   public class MyCommands
  14.   {
  15.     [CommandMethod("RTE", CommandFlags.Modal)]
  16.     public void MyCommand()
  17.     {
  18.       // Put your command code here
  19.       Document doc = Application.DocumentManager.MdiActiveDocument;
  20.       if (doc == null) return;
  21.       Editor ed = doc.Editor;
  22.       Matrix3d ucs = ed.CurrentUserCoordinateSystem;
  23.       PromptEntityOptions enOpt =
  24.         new PromptEntityOptions("\nВыберите примитив: ");
  25.       PromptEntityResult enRes = ed.GetEntity(enOpt);
  26.       if (enRes.Status != PromptStatus.OK) return;
  27.  
  28.       PromptPointOptions ptOpt =
  29.         new PromptPointOptions("\nУкажите базовую точку: ");
  30.       PromptPointResult ptRes = ed.GetPoint(ptOpt);
  31.       if (ptRes.Status != PromptStatus.OK) return;
  32.  
  33.       // Базовая точка в МСК
  34.       Point3d pBase = ptRes.Value.TransformBy(ucs);
  35.  
  36.       PromptAngleOptions angOpt =
  37.         new PromptAngleOptions("\nУкажите угол поворота (ENTER - завершение): ");
  38.       angOpt.BasePoint = ptRes.Value;  angOpt.UseBasePoint = true;
  39.       angOpt.AllowNone = true; // Для завершения команды по ENTER
  40.  
  41.       while (true) {
  42.         PromptDoubleResult angRes = ed.GetAngle(angOpt);
  43.         if (angRes.Status != PromptStatus.OK) break;
  44.         using (Transaction tr = doc.TransactionManager.StartTransaction()) {
  45.           Entity ent = tr.GetObject(enRes.ObjectId, OpenMode.ForWrite) as Entity;
  46.           Matrix3d mat = Matrix3d.Rotation(angRes.Value, Vector3d.ZAxis, pBase);
  47.           ent.TransformBy(mat);
  48.           tr.Commit();
  49.         }
  50.       }
  51.     }
  52.   }
  53. }

P.S.: На VB.NET сконвертируешь при необходимости сам.

Название: Re: VB.Net Не отображаются изменения в окне AutoCad до завершения .NET комманды
Отправлено: Дима_ от 24-12-2015, 02:05:29
Вот еще пример http://forum.dwg.ru/showpost.php?p=1261573&postcount=1 (http://forum.dwg.ru/showpost.php?p=1261573&postcount=1), непосредственно вращение см. в функции  RotateKR.
Название: Re: VB.Net Не отображаются изменения в окне AutoCad до завершения .NET комманды
Отправлено: Александр Ривилис от 24-12-2015, 10:00:45
Вот еще пример http://forum.dwg.ru/showpost.php?p=1261573&postcount=1 (http://forum.dwg.ru/showpost.php?p=1261573&postcount=1), непосредственно вращение см. в функции  RotateKR.
Это ты лихо закрутил. Если Vns не знаком с C#, то F# ему будет в самый раз. :) К тому же нет конверторов F# -> C# и F# -> VB.NET
Название: Re: VB.Net Не отображаются изменения в окне AutoCad до завершения .NET комманды
Отправлено: Vns от 24-12-2015, 12:12:17
Александр, огромное спасибо! Совет был полезен. Моя программа гораздо сложнее, чем поворот примитивов - много подпрограмм и функций, которые вызываются друг из друга. Я понял - тут главная хитрость - знать где закончить транзакцию и где ее потом снова начать с (получением ObjectId). Переделал - теперь все работает как надо. Огромное спасибо!!!
Название: Re: VB.Net Не отображаются изменения в окне AutoCad до завершения .NET комманды
Отправлено: Александр Ривилис от 24-12-2015, 12:21:28
Vns
Пожалуйста. А почему ты отметил Решением своё сообщение, а не моё? ;)
Название: Re: VB.Net Не отображаются изменения в окне AutoCad до завершения .NET комманды
Отправлено: Vns от 24-12-2015, 12:25:55
Прошу прощения, на форуме - я первый раз.
Название: Re: VB.Net Не отображаются изменения в окне AutoCad до завершения .NET комманды
Отправлено: Александр Ривилис от 24-12-2015, 12:29:47
Прошу прощения, на форуме - я первый раз.
Раз это было не умышленно, то я исправил. Это нужно для тех, у кого возникнут аналогичные проблемы - это позволит им быстрее найти решение.
Название: Re: VB.Net Не отображаются изменения в окне AutoCad до завершения .NET комманды
Отправлено: Vns от 24-12-2015, 12:34:18
Больше этого не повторится. Поздравляю с наступающими праздниками! (https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fadn-cis.org%2Fforum%2FSmileys%2Fdefault%2Fsmiley.gif&hash=e8437140d66d3b00f9796368c9fcdf68)
Название: Re: VB.Net Не отображаются изменения в окне AutoCad до завершения .NET комманды
Отправлено: Дима_ от 24-12-2015, 21:32:31
тут главная хитрость - знать где закончить транзакцию и где ее потом снова начать с (получением ObjectId)
Возможно тут Вы что-то напутали в терминологии, но по новой получать ObjectID для этой задачи не нужно.
Название: Re: VB.Net Не отображаются изменения в окне AutoCad до завершения .NET комманды
Отправлено: Vns от 25-12-2015, 10:16:56
Может быть я что-то не до конца понимаю?
Например, в ходе транзакции методом GetObject мы получили доступ к идентификаторам объектов ObjectId. После закрытия транзакции закрывается и доступ к набору ObjectId. Чтобы снова получить доступ к набору ObjectId нам надо: или опять применить метод GetObject или использовать переменные, которым мы присвоили значения OdjectId (например Dim A As ObjectId) в ходе предыдущей транзакции. Разве не так?
Название: Re: VB.Net Не отображаются изменения в окне AutoCad до завершения .NET комманды
Отправлено: Александр Ривилис от 25-12-2015, 13:33:02
После закрытия транзакции закрывается и доступ к набору ObjectId.
Чего это вдруг? ObjectId прекрасно существуют вне пределов транзакции. Вот DBObject и все его производные (в том числе и Entity) вне транзакции, в которой они открыты (т.е. к ним получен доступ через GetObject) , не действительны.

P.S.: Чтобы не повторяться почитай: http://adn-cis.org/forum/index.php?topic=2886.0 и все ссылки, ведущие из той темы.
Название: Re: VB.Net Не отображаются изменения в окне AutoCad до завершения .NET комманды
Отправлено: Vns от 31-12-2015, 09:40:03
Спасибо, Александр!
Очень полезная и очень нужная информация по транзакциям - особенно для меня.