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

ADN Club => AutoCAD .NET API => Тема начата: Lemieux от 27-05-2020, 22:12:06

Название: CommandFlags.Session
Отправлено: Lemieux от 27-05-2020, 22:12:06
Всех приветствую.
Возникла небольшая проблема. Я вставляю блоки и потом их перемещаю на чертеже с помощью DrawJig. Вся эта магия происходит с помощью нажатия кнопки на ленте. В коде я блокирую документ, но если во время таскания блоков попытаться максимально отзуммировать, то AutoCAD выдаёт критическую ошибку - "System.AccessViolationException Attempted to read or write protected memory....". Лечится эта проблема если вызывать метод не напрямую, после нажатия кнопки, а через команду [CommandMethod("Command", CommandFlags.Session)]. Есть ли возможность вызывать метод напрямую, а не через команду?
Название: Re: CommandFlags.Session
Отправлено: Lemieux от 27-05-2020, 22:32:29
Нашёл ответ Александра Ривилиса https://forums.autodesk.com/t5/net/simulate-commandflags-session-from-form-button/td-p/3453040 пошёл мучить AutoCAD  8)
Название: Re: CommandFlags.Session
Отправлено: Александр Ривилис от 27-05-2020, 22:44:50
В коде я блокирую документ, но если во время таскания блоков попытаться максимально отзуммировать, то AutoCAD выдаёт критическую ошибку - "System.AccessViolationException Attempted to read or write protected memory....". Лечится эта проблема если вызывать метод не напрямую, после нажатия кнопки, а через команду [CommandMethod("Command", CommandFlags.Session)]. Есть ли возможность вызывать метод напрямую, а не через команду?
Не надо вызвать напрямую. Надо вызвать через команду. И не очень понятно вообще зачем тебе CommandFlags.Session для таскания блоков.
Вообще же похоже тебе нужно искать ошибку у себя в коде.
Название: Re: CommandFlags.Session
Отправлено: Lemieux от 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" с ним почему-то выскакивает ошибка.
Название: Re: CommandFlags.Session
Отправлено: Александр Ривилис от 27-05-2020, 23:46:06
А мне надо, чтобы кнопка ждала пока я не вставлю блоки.
Кнопка ничего ждать не должна. Ты хочешь использовать Ленту так, как она в AutoCAD работать не должна. От этого и все проблемы.
Кроме того есть Editor.CommandAsync
Название: Re: CommandFlags.Session
Отправлено: Lemieux от 28-05-2020, 08:49:38
Кнопка ничего ждать не должна. Ты хочешь использовать Ленту так, как она в AutoCAD работать не должна. От этого и все проблемы.
Мои сумасшедшие идеи никому не дают покоя  ;D Но ошибка вылетает даже тогда, когда кнопка не ждёт выполнения команды. А кнопку я выключаю для того, чтобы у пользователя не было возможности нажать её второй раз, пока выполняется Jig. Так как кнопка это своеобразный тумблер, когда её включаешь, то в чертёж вставляются элементы выбранной в ComboBox схемы, а когда выключаешь, то элементы этой схемы должны автоматически удаляться. А то может так получиться, что пользователь таскает блоки и ещё не успел их вставить, а уже удалил.
Название: Re: CommandFlags.Session
Отправлено: Александр Ривилис от 28-05-2020, 12:50:13
Lemieux,
К тому что ты написал у меня нет комментариев. Если человек привык работать в AutoCAD, то та логика, которую ты вкладываешь в свою программу, будет для него совершенно непонятна и неприемлема.
Название: Re: CommandFlags.Session
Отправлено: Lemieux от 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, действия над вставками блоков, возвращение координат, вставка блоков уже в чертёж.
Свой код выкладывать не буду так как вся нужная информация есть по ссылкам.
Название: Re: CommandFlags.Session
Отправлено: Александр Ривилис от 07-06-2020, 14:52:28
сейчас последовательность действий такая: формирование списка ObjectId описаний блоков, передача этого списка в мой Jig, действия над вставками блоков, возвращение координат, вставка блоков уже в чертёж.
Логика правильная. Единственная проблема в том, что всё это крайне желательно делать из контекста документа, а не из контекста приложения.
Название: Re: CommandFlags.Session
Отправлено: Lemieux от 07-06-2020, 17:12:39
Логика правильная. Единственная проблема в том, что всё это крайне желательно делать из контекста документа, а не из контекста приложения.
Да я до этого и сделал, чтобы работало из контекста документа, а но коли появилась новая информация, то грех её не использовать. Может быть, если бы не было этой ошибки, то я бы не стал глубже разбираться в работе Jig.