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

ADN Club => AutoCAD .NET API => Тема начата: serhiy79 от 10-05-2019, 18:53:13

Название: При выполнении BlockJig моргает виндовс форма
Отправлено: serhiy79 от 10-05-2019, 18:53:13
Всем привет! Подскажите пожалуйста куда копать?
При выбора точки вставки(BlockJig), а также при повороте(RotateJig), на доли секунды появляется виндовс форма.
Название: Re: При выполнении BlockJig моргает виндовс форма
Отправлено: Александр Ривилис от 10-05-2019, 18:57:26
Какая форма, какой BlockJig, какой RotateJig???
Краткость не всегда сестра таланта.
Название: Re: При выполнении BlockJig моргает виндовс форма
Отправлено: serhiy79 от 10-05-2019, 19:12:03
Виндовс форма прилетает с 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)

Все точно такое же работает без проблем, если виндовс форма моя, тоесть в моем проекте.
Название: Re: При выполнении BlockJig моргает виндовс форма
Отправлено: Александр Ривилис от 10-05-2019, 19:16:26
serhiy79,
1. По поводу правила форматирования кода у нас на форуме - читай у меня в подписи. И неуклонно соблюдай!
2. Ты что вставляешь блок в событии??? О каком событии идёт речь?
3. Без кода я не буду гадать на кофейной гуще.
Название: Re: При выполнении BlockJig моргает виндовс форма
Отправлено: serhiy79 от 10-05-2019, 19:33:03
2. Нет, извиняюсь это функция . Есть форма с каталогом, из этой формы я выбираю деталь, потом собираю все данные нужные для вставки, делаю блок, и потом его вставляю
3. Какой код именно мне надо показать(его просто очень много) ?
Название: Re: При выполнении BlockJig моргает виндовс форма
Отправлено: Александр Ривилис от 10-05-2019, 19:43:52
2. Нет, извиняюсь это функция . Есть форма с каталогом, из этой формы я выбираю деталь, потом собираю все данные нужные для вставки, делаю блок, и потом его вставляю
Ничего не понял. Мне нужен код, из которого вызывается bJig.Run().
Вообще-же для того, чтобы форма нормально "спряталась" нужно использовать метод Editor.StartUserInteraction.
Как пример:
Код - C# [Выбрать]
  1. using (EditorUserInteraction UI = ed.StartUserInteraction(this))
  2. {
  3.          // Здесь можно запускать Jig
  4. }
Название: Re: При выполнении BlockJig моргает виндовс форма
Отправлено: serhiy79 от 10-05-2019, 20:02:03
после нажатия на кнопку на форме, вызывается эта функция
Код - 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. }

некоторую часть кода я удалил
Название: Re: При выполнении BlockJig моргает виндовс форма
Отправлено: Александр Ривилис от 10-05-2019, 20:08:55
после нажатия на кнопку на форме, вызывается эта функция
Функцию не смотрел и не вижу смысла, так как она у тебя зависит от твоих еще каких-то классов/методов. Так вот при нажатии на кнопку на форме первое что ты должен сделать, это вызвать код, который я привёл выше. ed - это экземпляр класса Editor.
Пример здесь: https://adndevblog.typepad.com/autocad/2012/05/taking-mouse-inputs-from-a-modal-dialog-box.html
Кроме того я заметил, что acTrans.Commit() у тебя вызвается не всегда. Это очень плохо, но к мерцанию на экране формы отношения не имеет.
Название: Re: При выполнении BlockJig моргает виндовс форма
Отправлено: serhiy79 от 10-05-2019, 20:32:53
Как я понимаю что
Код - C# [Выбрать]
  1. using (EditorUserInteraction UI = ed.StartUserInteraction(this))
this -это должна быть форма на которой я нажимаю кнопку?
но у меня нет доступа к этой форме
Название: Re: При выполнении BlockJig моргает виндовс форма
Отправлено: Александр Ривилис от 10-05-2019, 20:48:00
this -это должна быть форма на которой я нажимаю кнопку?
но у меня нет доступа к этой форме
Да. Это форма. Точнее указатель на форму. Доступ должен быть. Ты же как-то подписался на событие.
Название: Re: При выполнении BlockJig моргает виндовс форма
Отправлено: serhiy79 от 10-05-2019, 21:03:04
нет не могу, это usercontrol dll
Название: Re: При выполнении BlockJig моргает виндовс форма
Отправлено: Александр Ривилис от 10-05-2019, 21:08:13
А что у тебя в sender при вызове MfcInformationDataChanged? Может через него (или через args) ты можешь получить доступ к handle формы? Если нет, то у меня идеи закончились.
Название: Re: При выполнении BlockJig моргает виндовс форма
Отправлено: serhiy79 от 10-05-2019, 21:15:17
В sender передаются параметры формы, а в args параметры детали(блока который я выбрал)
Попробую погуглить можно ли как то получить доступ к форме
В любом случае большое спасибо!
Название: Re: При выполнении BlockJig моргает виндовс форма
Отправлено: Александр Ривилис от 10-05-2019, 22:23:47
В sender передаются параметры формы
Вот среди них и ищи handle формы.
Название: Re: При выполнении BlockJig моргает виндовс форма
Отправлено: serhiy79 от 10-05-2019, 22:42:50
Это все что есть
 
(https://i.postimg.cc/nXkmc6Ln/Handle.png) (https://postimg.cc/nXkmc6Ln)
Название: Re: При выполнении BlockJig моргает виндовс форма
Отправлено: Александр Ривилис от 11-05-2019, 00:02:02
serhiy79,
Handle - это именно оно. Его и передай вместо this.
Название: Re: При выполнении BlockJig моргает виндовс форма
Отправлено: serhiy79 от 16-05-2019, 16:51:58
Частично решил проблему
Еще раз с самого начала. Есть форма, на ней user control, который сслылаеться на dll(тоесть не мой). В форме есть каталог с продуктами, после выбора продукта, появляеться еще одна форма с дополнительными опциями. После выбора опций, нажимаем вставить продукт в рисунок, и если первая форма открывается как
Код - C# [Выбрать]
  1. form.ShowDialog()
или
Код - C# [Выбрать]
  1. AcApSrvApp.ShowModalDialog(AcApSrvApp.MainWindow.Handle, form, true);
, то при выборе координат для вставки эти две формы на какую то долю секунды появляються и пропадают. Тоже самое происходит при повороте. А если первая форма открывается как
Код - C# [Выбрать]
  1. form.Show()
, и при входе в функцию ее сразу же закрыть, то все отлично.
Но мне нужна не форма а палетта, а с палетой происходит тоже самое что и в первом варианте,так что будем ковырять дальше )