VB.Net Не отображаются изменения в окне AutoCad до завершения .NET комманды

Автор Тема: VB.Net Не отображаются изменения в окне AutoCad до завершения .NET комманды  (Прочитано 12972 раз)

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

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

Оффлайн VnsАвтор темы

  • ADN OPEN
  • Сообщений: 34
  • Карма: 0
Здравствуйте! Пожалуйста помогите разобраться.

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

Заранее благодарю.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Вам нужно использовать 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
Плохая идея

Оффлайн VnsАвтор темы

  • ADN OPEN
  • Сообщений: 34
  • Карма: 0

Отмечено как Решение Александр Ривилис 24-12-2015, 12:28:05

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

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

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

  • 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. // 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 сконвертируешь при необходимости сам.

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

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Вот еще пример http://forum.dwg.ru/showpost.php?p=1261573&postcount=1, непосредственно вращение см. в функции  RotateKR.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Вот еще пример http://forum.dwg.ru/showpost.php?p=1261573&postcount=1, непосредственно вращение см. в функции  RotateKR.
Это ты лихо закрутил. Если Vns не знаком с C#, то F# ему будет в самый раз. :) К тому же нет конверторов F# -> C# и F# -> VB.NET
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн VnsАвтор темы

  • ADN OPEN
  • Сообщений: 34
  • Карма: 0
Александр, огромное спасибо! Совет был полезен. Моя программа гораздо сложнее, чем поворот примитивов - много подпрограмм и функций, которые вызываются друг из друга. Я понял - тут главная хитрость - знать где закончить транзакцию и где ее потом снова начать с (получением ObjectId). Переделал - теперь все работает как надо. Огромное спасибо!!!

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

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

Оффлайн VnsАвтор темы

  • ADN OPEN
  • Сообщений: 34
  • Карма: 0
Прошу прощения, на форуме - я первый раз.

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

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

Оффлайн VnsАвтор темы

  • ADN OPEN
  • Сообщений: 34
  • Карма: 0
Больше этого не повторится. Поздравляю с наступающими праздниками!
« Последнее редактирование: 24-12-2015, 23:04:32 от Александр Ривилис »

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
тут главная хитрость - знать где закончить транзакцию и где ее потом снова начать с (получением ObjectId)
Возможно тут Вы что-то напутали в терминологии, но по новой получать ObjectID для этой задачи не нужно.

Оффлайн VnsАвтор темы

  • ADN OPEN
  • Сообщений: 34
  • Карма: 0
Может быть я что-то не до конца понимаю?
Например, в ходе транзакции методом GetObject мы получили доступ к идентификаторам объектов ObjectId. После закрытия транзакции закрывается и доступ к набору ObjectId. Чтобы снова получить доступ к набору ObjectId нам надо: или опять применить метод GetObject или использовать переменные, которым мы присвоили значения OdjectId (например Dim A As ObjectId) в ходе предыдущей транзакции. Разве не так?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
После закрытия транзакции закрывается и доступ к набору ObjectId.
Чего это вдруг? ObjectId прекрасно существуют вне пределов транзакции. Вот DBObject и все его производные (в том числе и Entity) вне транзакции, в которой они открыты (т.е. к ним получен доступ через GetObject) , не действительны.

P.S.: Чтобы не повторяться почитай: http://adn-cis.org/forum/index.php?topic=2886.0 и все ссылки, ведущие из той темы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение