CommandFlags.Session

Автор Тема: CommandFlags.Session  (Прочитано 5248 раз)

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

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

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

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
CommandFlags.Session
« : 27-05-2020, 22:12:06 »
Всех приветствую.
Возникла небольшая проблема. Я вставляю блоки и потом их перемещаю на чертеже с помощью DrawJig. Вся эта магия происходит с помощью нажатия кнопки на ленте. В коде я блокирую документ, но если во время таскания блоков попытаться максимально отзуммировать, то AutoCAD выдаёт критическую ошибку - "System.AccessViolationException Attempted to read or write protected memory....". Лечится эта проблема если вызывать метод не напрямую, после нажатия кнопки, а через команду [CommandMethod("Command", CommandFlags.Session)]. Есть ли возможность вызывать метод напрямую, а не через команду?

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

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
Re: CommandFlags.Session
« Ответ #1 : 27-05-2020, 22:32:29 »
Нашёл ответ Александра Ривилиса https://forums.autodesk.com/t5/net/simulate-commandflags-session-from-form-button/td-p/3453040 пошёл мучить AutoCAD  8)

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: CommandFlags.Session
« Ответ #2 : 27-05-2020, 22:44:50 »
В коде я блокирую документ, но если во время таскания блоков попытаться максимально отзуммировать, то AutoCAD выдаёт критическую ошибку - "System.AccessViolationException Attempted to read or write protected memory....". Лечится эта проблема если вызывать метод не напрямую, после нажатия кнопки, а через команду [CommandMethod("Command", CommandFlags.Session)]. Есть ли возможность вызывать метод напрямую, а не через команду?
Не надо вызвать напрямую. Надо вызвать через команду. И не очень понятно вообще зачем тебе CommandFlags.Session для таскания блоков.
Вообще же похоже тебе нужно искать ошибку у себя в коде.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
Re: CommandFlags.Session
« Ответ #3 : 27-05-2020, 22:56:29 »
В коде я блокирую документ, но если во время таскания блоков попытаться максимально отзуммировать, то AutoCAD выдаёт критическую ошибку - "System.AccessViolationException Attempted to read or write protected memory....". Лечится эта проблема если вызывать метод не напрямую, после нажатия кнопки, а через команду [CommandMethod("Command", CommandFlags.Session)]. Есть ли возможность вызывать метод напрямую, а не через команду?
Не надо вызвать напрямую. Надо вызвать через команду. И не очень понятно вообще зачем тебе CommandFlags.Session для таскания блоков.
Вообще же похоже тебе нужно искать ошибку у себя в коде.
Я не могу вызывать через команду так как вот этот кусок выполняется весь
Код - C# [Выбрать]
  1. toggleButton.IsEnabled = false;
  2. Application.DocumentManager.MdiActiveDocument.SendStringToExecute("TCNCIRCUIT1 ", true, false, true);
  3. toggleButton.IsEnabled = true;
А мне надо, чтобы кнопка ждала пока я не вставлю блоки.

А ошибка выскакивает вот в этом куске на строке 5

Код - C# [Выбрать]
  1.         protected override SamplerStatus Sampler(JigPrompts prompts)
  2.         {
  3.             JigPromptPointOptions jigPrPntOpt = new JigPromptPointOptions("\nNew location:") { UseBasePoint = false };
  4.  
  5.             PromptPointResult prPntRes = prompts.AcquirePoint(jigPrPntOpt);
  6.             if (prPntRes.Status == PromptStatus.Cancel || prPntRes.Status == PromptStatus.Error) return SamplerStatus.Cancel;
  7.  
  8.             if (!newPnt.IsEqualTo(prPntRes.Value, new Tolerance(10e-10, 10e-10)))
  9.             {
  10.                 newPnt = prPntRes.Value;
  11.                 return SamplerStatus.OK;
  12.             }
  13.             else return SamplerStatus.NoChange;
  14.         }

Кстати, я разобрался с методом "ExecuteInApplicationContext" с ним почему-то выскакивает ошибка.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: CommandFlags.Session
« Ответ #4 : 27-05-2020, 23:46:06 »
А мне надо, чтобы кнопка ждала пока я не вставлю блоки.
Кнопка ничего ждать не должна. Ты хочешь использовать Ленту так, как она в AutoCAD работать не должна. От этого и все проблемы.
Кроме того есть Editor.CommandAsync
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
Re: CommandFlags.Session
« Ответ #5 : 28-05-2020, 08:49:38 »
Кнопка ничего ждать не должна. Ты хочешь использовать Ленту так, как она в AutoCAD работать не должна. От этого и все проблемы.
Мои сумасшедшие идеи никому не дают покоя  ;D Но ошибка вылетает даже тогда, когда кнопка не ждёт выполнения команды. А кнопку я выключаю для того, чтобы у пользователя не было возможности нажать её второй раз, пока выполняется Jig. Так как кнопка это своеобразный тумблер, когда её включаешь, то в чертёж вставляются элементы выбранной в ComboBox схемы, а когда выключаешь, то элементы этой схемы должны автоматически удаляться. А то может так получиться, что пользователь таскает блоки и ещё не успел их вставить, а уже удалил.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: CommandFlags.Session
« Ответ #6 : 28-05-2020, 12:50:13 »
Lemieux,
К тому что ты написал у меня нет комментариев. Если человек привык работать в AutoCAD, то та логика, которую ты вкладываешь в свою программу, будет для него совершенно непонятна и неприемлема.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Lemieux 07-06-2020, 11:40:25

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

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
Re: CommandFlags.Session
« Ответ #7 : 07-06-2020, 11:39:59 »
Решил я тут поглубже изучить Jig и сумел починить вылетание AutoCAD, и вызов метода добавления блоков напрямую, а не через команду.

Изначально Jig и вставка блоков основывался на этом коде https://adn-cis.org/forum/index.php?topic=9721.msg42666#msg42666, но изучая Jig я находил другие темы. Я переписал методы Sampler и WorldDraw взяв за основу вот этот код https://adndevblog.typepad.com/autocad/2012/07/how-to-show-a-block-when-positioning-it-using-c.html Так же я переделал логику вставки блоков в чертёж, сейчас последовательность действий такая: формирование списка ObjectId описаний блоков, передача этого списка в мой Jig, действия над вставками блоков, возвращение координат, вставка блоков уже в чертёж.
Свой код выкладывать не буду так как вся нужная информация есть по ссылкам.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: CommandFlags.Session
« Ответ #8 : 07-06-2020, 14:52:28 »
сейчас последовательность действий такая: формирование списка ObjectId описаний блоков, передача этого списка в мой Jig, действия над вставками блоков, возвращение координат, вставка блоков уже в чертёж.
Логика правильная. Единственная проблема в том, что всё это крайне желательно делать из контекста документа, а не из контекста приложения.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
Re: CommandFlags.Session
« Ответ #9 : 07-06-2020, 17:12:39 »
Логика правильная. Единственная проблема в том, что всё это крайне желательно делать из контекста документа, а не из контекста приложения.
Да я до этого и сделал, чтобы работало из контекста документа, а но коли появилась новая информация, то грех её не использовать. Может быть, если бы не было этой ошибки, то я бы не стал глубже разбираться в работе Jig.