Почему автокад не завершается

Автор Тема: Почему автокад не завершается  (Прочитано 9341 раз)

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

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Добрый день!
В плагине создаю форму.
form = new Form1();
form.Show();
Нажимаю на крестик автокада. Форма уходит на задний план, а автокад не закрывается.
Только после закрытия формы автокад закрывается при нажатии на крестик.
В чем тут дело?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Почему автокад не завершается
« Ответ #1 : 22-12-2020, 18:08:30 »
Начнём с того, что вызывать форму нужно не через form.Show(), а через Application.ShowModelessDialog(form)
Ну и форму нужно закрывать самому - кто открыл, тот и закрывает.
 
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Re: Почему автокад не завершается
« Ответ #2 : 22-12-2020, 18:18:47 »
Открыл форму через Application.ShowModelessDialog(form). Теперь форма и приложение закрываются при 2-ом нажатии на крестик.
Кстати, не очень понимаю, почему нельзя пользоваться методом form.Show(). Везде написано, что это корректный метод.
А по поводу закрытия формы пользователем. Ему это не нужно. Ему удобнее сразу все закрыть, нажав на крестик автокада.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Почему автокад не завершается
« Ответ #3 : 22-12-2020, 18:20:41 »
Кстати, не очень понимаю, почему нельзя пользоваться методом form.Show(). Везде написано, что это корректный метод.
Везде - это где? В AutoCAD - это не так.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Re: Почему автокад не завершается
« Ответ #4 : 22-12-2020, 18:21:24 »
И еще. При нажатии на крестик автокада программа не попадает в событие Application.BeginQuit

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Почему автокад не завершается
« Ответ #5 : 22-12-2020, 18:23:35 »
А по поводу закрытия формы пользователем.
Я ничего не говорил по поводу закрытия формы пользователем. Не он открывал форму - форму открыла ваша программа. Вот она и должна закрыть форму. Например, отследить запуск команды "_QUIT" или Application.BeginQuit и закрыться.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Почему автокад не завершается
« Ответ #6 : 22-12-2020, 18:24:17 »
И еще. При нажатии на крестик автокада программа не попадает в событие Application.BeginQuit
Это что-то ваша форма напортачила - с ней разбирайтесь. Так быть не должно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Re: Почему автокад не завершается
« Ответ #7 : 22-12-2020, 18:26:32 »
Форму я взял самую примитивную (пустую Windows Form). Там негде наврать.

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

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

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Re: Почему автокад не завершается
« Ответ #9 : 22-12-2020, 18:49:50 »
Kean Walmsley пишет: When you run the application you may experience issues with the dialog getting/retaining focus - this is generally a problem with modeless dialogs that has been addressed automatically by the Palette class, something we'll take a look at in a future post.
Так что, похоже, проблема решается только через Palette class.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Почему автокад не завершается
« Ответ #10 : 22-12-2020, 21:19:43 »
Так что, похоже, проблема решается только через Palette class.
Это проблема с потерей/получением фокуса. Но к проблеме с "незавершением AutoCAD" это отношения не имеет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Re: Почему автокад не завершается
« Ответ #11 : 22-12-2020, 21:26:19 »
Дело в том, что при первом нажатии на крестик, фокус переходит из формы в автокад, а при втором - все завершается. Так что это именно проблема с потерей/получением фокуса.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Почему автокад не завершается
« Ответ #12 : 22-12-2020, 21:38:20 »
Борис_С,
Убедись, что в методе Terminate ты закрываешь свою форму:
Код - C# [Выбрать]
  1. public void Terminate()
  2. {
  3.     if (form != null)
  4.     {
  5.         if (!form.IsDisposed) form.Dispose();
  6.     }
  7. }
И вообще поищи готовые примеры немодальных форм в AutoCAD. Например,
https://drive-cad-with-code.blogspot.com/2014/02/showing-and-closing-modeless-formdialog.html
Проверь как с этим кодом закрывается AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Почему автокад не завершается
« Ответ #13 : 23-12-2020, 08:55:24 »
Так что, похоже, проблема решается только через Palette class.
Мне думается, что это неплохой вариант. В самом автокаде практически все немодальные инструменты реализованы через палитры. Это привычный для пользователя вид диалога, с ним удобно работать:
  • прикрепляется к сторонам окна,
  • комбинируется с другими палитрами,
  • есть автоматическое скрытие,
  • автоматически открывается при запуске автокада в том же состоянии, в котором была на момент закрытия.
Ну и нет таких проблем с блокировкой закрытия AutoCAD.
Я, например, всегда делаю палитру, если мне нужен немодальный диалог.

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Re: Почему автокад не завершается
« Ответ #14 : 23-12-2020, 10:58:10 »
if (form != null)
    {
        if (!form.IsDisposed) form.Dispose();
    }
Это ничего не изменило. Для того, чтобы закрыть автокад, нужно перевести фокус на автокад и нажать крестик.

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Re: Почему автокад не завершается
« Ответ #15 : 23-12-2020, 10:59:30 »
Так что, похоже, проблема решается только через Palette class.
Мне думается, что это неплохой вариант. В самом автокаде практически все немодальные инструменты реализованы через палитры. Это привычный для пользователя вид диалога, с ним удобно работать:
  • прикрепляется к сторонам окна,
  • комбинируется с другими палитрами,
  • есть автоматическое скрытие,
  • автоматически открывается при запуске автокада в том же состоянии, в котором была на момент закрытия.
Ну и нет таких проблем с блокировкой закрытия AutoCAD.
Я, например, всегда делаю палитру, если мне нужен немодальный диалог.
А где про это можно почитать?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Почему автокад не завершается
« Ответ #16 : 23-12-2020, 11:37:39 »
Борис_С,
Тестовый пример, на который я дал ссылку тоже не работает?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Почему автокад не завершается
« Ответ #17 : 23-12-2020, 12:55:38 »
Код - C# [Выбрать]
  1. // myCommands.cs
  2. using Autodesk.AutoCAD.ApplicationServices;
  3. using Autodesk.AutoCAD.DatabaseServices;
  4. using Autodesk.AutoCAD.EditorInput;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.Runtime;
  7. using System;
  8.  
  9. // This line is not mandatory, but improves loading performances
  10. [assembly: CommandClass(typeof(ModelessDialog.MyCommands))]
  11.  
  12. namespace ModelessDialog
  13. {
  14.   public class MyCommands
  15.   {
  16.      // Modal Command with localized name
  17.     [CommandMethod("StartForm")]
  18.     public void StartForm()
  19.     {
  20.       Application.ShowModelessDialog(Application.MainWindow.Handle, MyPlugin.form);
  21.       Autodesk.AutoCAD.Internal.Utils.SetFocusToDwgView();
  22.     }
  23.   }
  24. }
  25.  

Код - C# [Выбрать]
  1. // MyForm.Designer.cs
  2. namespace ModelessDialog
  3. {
  4.   partial class MyForm
  5.   {
  6.     /// <summary>
  7.     /// Required designer variable.
  8.     /// </summary>
  9.     private System.ComponentModel.IContainer components = null;
  10.  
  11.     /// <summary>
  12.     /// Clean up any resources being used.
  13.     /// </summary>
  14.     /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
  15.     protected override void Dispose(bool disposing)
  16.     {
  17.       if (disposing && (components != null))
  18.       {
  19.         components.Dispose();
  20.       }
  21.       base.Dispose(disposing);
  22.     }
  23.  
  24.     #region Windows Form Designer generated code
  25.  
  26.     /// <summary>
  27.     /// Required method for Designer support - do not modify
  28.     /// the contents of this method with the code editor.
  29.     /// </summary>
  30.     private void InitializeComponent()
  31.     {
  32.       this.Exit = new System.Windows.Forms.Button();
  33.       this.SuspendLayout();
  34.       //
  35.       // Exit
  36.       //
  37.       this.Exit.Location = new System.Drawing.Point(148, 35);
  38.       this.Exit.Name = "Exit";
  39.       this.Exit.Size = new System.Drawing.Size(75, 23);
  40.       this.Exit.TabIndex = 0;
  41.       this.Exit.Text = "Exit";
  42.       this.Exit.UseVisualStyleBackColor = true;
  43.       //
  44.       // MyForm
  45.       //
  46.       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
  47.       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
  48.       this.CausesValidation = false;
  49.       this.ClientSize = new System.Drawing.Size(413, 75);
  50.       this.Controls.Add(this.Exit);
  51.       this.Name = "MyForm";
  52.       this.Text = "MyForm";
  53.       this.ResumeLayout(false);
  54.  
  55.     }
  56.  
  57.     #endregion
  58.  
  59.     private System.Windows.Forms.Button Exit;
  60.   }
  61. }

Код - C# [Выбрать]
  1. // MyForm.cs
  2. using System;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11.  
  12. namespace ModelessDialog
  13. {
  14.   public partial class MyForm : Form
  15.   {
  16.     public MyForm()
  17.     {
  18.       InitializeComponent();
  19.     }
  20.   }
  21. }

Код - C# [Выбрать]
  1. // myPlugin.cs
  2. using Autodesk.AutoCAD.ApplicationServices;
  3. using Autodesk.AutoCAD.Runtime;
  4.  
  5. // This line is not mandatory, but improves loading performances
  6. [assembly: ExtensionApplication(typeof(ModelessDialog.MyPlugin))]
  7.  
  8. namespace ModelessDialog
  9. {
  10.   public class MyPlugin : IExtensionApplication
  11.   {
  12.     public static MyForm form = null;
  13.     void IExtensionApplication.Initialize()
  14.     {
  15.       form = new MyForm();
  16.     }
  17.  
  18.     void IExtensionApplication.Terminate()
  19.     {
  20.       form.Close();
  21.     }
  22.   }
  23. }



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

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Re: Почему автокад не завершается
« Ответ #18 : 23-12-2020, 20:53:44 »
В этом примере все работает. Но у меня на форме есть компонент ListView. Он заполняется после того, как форма показывается на экране.
Если сразу после этого нажать на крестик автокада, закрывается и форма, и автокад.
Но, если перевести фокус на одну из записей ListView, при нажатии на крестик, фокус уходит из ListView, и только при 2-ом нажатии
закрывается и форма, и автокад.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Почему автокад не завершается
« Ответ #19 : 23-12-2020, 20:57:36 »
Но, если перевести фокус на одну из записей ListView, при нажатии на крестик, фокус уходит из ListView, и только при 2-ом нажатии
закрывается и форма, и автокад.
Значит тебе самому придётся переводить фокус на AutoCAD при помощи Autodesk.AutoCAD.Internal.Utils.SetFocusToDwgView();
Ну или смирится с необходимостью дважды жать на AutoCAD'овский крестик.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Re: Почему автокад не завершается
« Ответ #20 : 24-12-2020, 16:33:36 »
А как я выловлю событие Нажатие на крестик?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Почему автокад не завершается
« Ответ #21 : 24-12-2020, 16:38:50 »
А как я выловлю событие Нажатие на крестик?
Думаю, что это будет не просто, но возможно. Потребуются исследования на уровне Win32 API.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Re: Почему автокад не завершается
« Ответ #22 : 24-12-2020, 17:01:37 »
Дмитрий Загорулькин пишет, что лучше работать с Palette Class. Может быть кто-нибудь выложит пример работы с этим классом или даст ссылку.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Почему автокад не завершается
« Ответ #23 : 24-12-2020, 19:28:27 »
Борис_С,
В ObjectARX SDK 2009 был пример: samples\dotNet\DockingPalette
Ссылка на ObjectARX SDK 2009: http://download.autodesk.com/esd/objectarx/2009/ObjectARX_2009_Win_64_and_32Bit.exe
Возможно придётся что-то в нём править чтобы он заработал в последних версия AutoCAD (как минимум версию .NET Framework)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Почему автокад не завершается
« Ответ #24 : 24-12-2020, 19:33:01 »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Re: Почему автокад не завершается
« Ответ #25 : 24-12-2020, 19:49:41 »
Спасибо. Посмотрю.

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
Re: Почему автокад не завершается
« Ответ #26 : 25-12-2020, 08:58:30 »
А что вообще нужно? Чтобы кастомное окно закрывалось вместе с AutoCAD?

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 238
  • Карма: 3
Re: Почему автокад не завершается
« Ответ #27 : 25-12-2020, 12:07:36 »
Да

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Почему автокад не завершается
« Ответ #28 : 26-12-2020, 18:23:34 »
Может быть кто-нибудь выложит пример работы с этим классом или даст ссылку.
Вот тут выкладывал проект с примером WPF в палитре: https://adn-cis.org/forum/index.php?topic=3220.msg16098#msg16098
Там, наверное, уже некоторые вещи устарели, но, в целом, идея осталась такая же.

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 384
  • Карма: 21
Re: Почему автокад не завершается
« Ответ #29 : 27-12-2020, 21:11:57 »
Сейчас у себя проверил, у меня всё нормально закрывается. Но у меня хостится UserControl в WPF окне, вызывается всё это через "ShowModelessWindow()" и ставится фокус через "SetFocusToDwgView()"