При выполнении BlockJig моргает виндовс форма

Автор Тема: При выполнении BlockJig моргает виндовс форма  (Прочитано 12270 раз)

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

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
Всем привет! Подскажите пожалуйста куда копать?
При выбора точки вставки(BlockJig), а также при повороте(RotateJig), на доли секунды появляется виндовс форма.

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Какая форма, какой BlockJig, какой RotateJig???
Краткость не всегда сестра таланта.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
Виндовс форма прилетает с dll с другого проекта, я не котролирую ее поведение, после нажатия на кнопку на форме, срабатывает событие в котором я собираю нужную мне информацию о блоке. Потом мне нужно вставить этот блок в рисунок в автокаде.

Код - C# [Выбрать]
  1. BlockJig bJig = new BlockJig(acTrans, brPn, dictAttInfo, nodeVectors);
Код - C# [Выбрать]
  1. RotateJig rJig = new RotateJig(ent, rotationPoint, baseAngle, ucs);

Форма пропадает когда пользователя спрашивают подтверждение для вставки в рисунок
Код - C# [Выбрать]
  1. if (bJig.Run() != PromptStatus.OK)

Все точно такое же работает без проблем, если виндовс форма моя, тоесть в моем проекте.

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
serhiy79,
1. По поводу правила форматирования кода у нас на форуме - читай у меня в подписи. И неуклонно соблюдай!
2. Ты что вставляешь блок в событии??? О каком событии идёт речь?
3. Без кода я не буду гадать на кофейной гуще.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
2. Нет, извиняюсь это функция . Есть форма с каталогом, из этой формы я выбираю деталь, потом собираю все данные нужные для вставки, делаю блок, и потом его вставляю
3. Какой код именно мне надо показать(его просто очень много) ?

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
2. Нет, извиняюсь это функция . Есть форма с каталогом, из этой формы я выбираю деталь, потом собираю все данные нужные для вставки, делаю блок, и потом его вставляю
Ничего не понял. Мне нужен код, из которого вызывается bJig.Run().
Вообще-же для того, чтобы форма нормально "спряталась" нужно использовать метод Editor.StartUserInteraction.
Как пример:
Код - C# [Выбрать]
  1. using (EditorUserInteraction UI = ed.StartUserInteraction(this))
  2. {
  3.          // Здесь можно запускать Jig
  4. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
после нажатия на кнопку на форме, вызывается эта функция
Код - C# [Выбрать]
  1.  private void MfcInformationDataChanged(object sender, EventArgs args)
  2. {
  3.         EnterpriseManagerControl.CatalogReaderControl.MfcInformationDataChangedEventArgs input = (EnterpriseManagerControl.CatalogReaderControl.MfcInformationDataChangedEventArgs)args;
  4.         if (input != null)
  5.         {
  6.                 ReadXMLFile();
  7.                 InsertBlock(psPlacementOptionsValue);
  8.         }
  9. }
  10.  
  11. public static ObjectId InsertBlock(string psPlacementOptionsValue)
  12. {
  13.          using (acActiveDoc.LockDocument())
  14.         {
  15.                 using (Transaction acTrans = acActiveDoc.TransactionManager.StartTransaction())
  16.                 {
  17.                         //DocumentLock docLock = acActiveDoc.LockDocument()
  18.                         acBlkTbl = (BlockTable)acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForWrite);
  19.                         space = (BlockTableRecord)acTrans.GetObject(acCurDb.CurrentSpaceId, OpenMode.ForWrite);
  20.                         if (!acBlkTbl.Has(blockName))
  21.                         {
  22.                                 acBlkTbl.UpgradeOpen();
  23.                                 psPlc.MakePnBlockDefNew.makePnBlockDefMethod(psPlacementOptionsValue,
  24.                                                                                                                         acActiveDoc,
  25.                                                                                                                         acCurDb,
  26.                                                                                                                         acTrans,
  27.                                                                                                                         acBlkTbl,
  28.                                                                                                                         CatalogCode,
  29.                                                                                                                         EnterpriseCode,
  30.                                                                                                                         insertPn.psSyladsSymbols,
  31.                                                                                                                         Symbol2D,
  32.                                                                                                                         Symbol3D,
  33.                                                                                                                         uniqueSpSymbol3D,
  34.                                                                                                                         blockName,
  35.                                                                                                                         false);
  36.                            
  37.                         }
  38.                        
  39.                          if (!insertPn.skipInserting)
  40.                         {
  41.                                 using (aCommon.SysVarCache sysvars = new aCommon.SysVarCache())
  42.                                 {
  43.                                         insertPn.SetSnap();
  44.                                         BlockJig bJig = new BlockJig(acTrans, brPn, dictAttInfo, nodeVectors);
  45.  
  46.                                         //select point insertion
  47.                                         if (bJig.Run() != PromptStatus.OK)
  48.                                         {
  49.                                                 bJig.Cleanup();
  50.                                                 brPn.Erase();
  51.                                                 acTrans.Commit();
  52.                                                 return ObjectId.Null;
  53.                                         }
  54.                                         bJig.Cleanup();
  55.                                         insertPn.ResetSnap();
  56.                                 }
  57.                         }
  58.                 }              
  59.         }
  60. }

некоторую часть кода я удалил

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
после нажатия на кнопку на форме, вызывается эта функция
Функцию не смотрел и не вижу смысла, так как она у тебя зависит от твоих еще каких-то классов/методов. Так вот при нажатии на кнопку на форме первое что ты должен сделать, это вызвать код, который я привёл выше. ed - это экземпляр класса Editor.
Пример здесь: https://adndevblog.typepad.com/autocad/2012/05/taking-mouse-inputs-from-a-modal-dialog-box.html
Кроме того я заметил, что acTrans.Commit() у тебя вызвается не всегда. Это очень плохо, но к мерцанию на экране формы отношения не имеет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
Как я понимаю что
Код - C# [Выбрать]
  1. using (EditorUserInteraction UI = ed.StartUserInteraction(this))
this -это должна быть форма на которой я нажимаю кнопку?
но у меня нет доступа к этой форме

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

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

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
нет не могу, это usercontrol dll

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
А что у тебя в sender при вызове MfcInformationDataChanged? Может через него (или через args) ты можешь получить доступ к handle формы? Если нет, то у меня идеи закончились.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
В sender передаются параметры формы, а в args параметры детали(блока который я выбрал)
Попробую погуглить можно ли как то получить доступ к форме
В любом случае большое спасибо!

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

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
В sender передаются параметры формы
Вот среди них и ищи handle формы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
Это все что есть