Как управлять окнами *.dll в AutoCAD (C#)
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как управлять окнами *.dll в AutoCAD (C#)

Как управлять окнами *.dll в AutoCAD (C#)

Ответ
Поиск в этой теме
Непрочитано 19.06.2013, 10:31 #1
Как управлять окнами *.dll в AutoCAD (C#)
ghost
 
Регистрация: 19.12.2011
Сообщений: 35

Доброго времени суток!
Недавно столкнулся с проблемой.
Есть программка которая считывает текст из пространства модели AutoCAD. У нее есть форма, на этой форме кнопка по нажатию которой и происходит считывание текста.После нажатия на кнопку приходиться сначала кликнуть на окно AutoCAD и только после этого выбирать считываемый текст. Как после нажатия на кнопку передать фокус окну AutoCAD?
Попытки получить родителя формы из dll - ки приводят к фатальной ошибке AutoCADа! Видимо у dll - ки родителя нет!?

Может как то можно использовать окна самого AutoCADа что бы упростить процесс передачи фокуса и управления окнами!?
Заранее спасибо за внимание!
Просмотров: 9609
 
Непрочитано 19.06.2013, 10:46
#2
trir


 
Регистрация: 18.12.2010
Сообщений: 5,115


угу
trir вне форума  
 
Непрочитано 19.06.2013, 12:00
#3
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Цитата:
Сообщение от ghost Посмотреть сообщение
Может как то можно использовать окна самого AutoCADа что бы упростить процесс передачи фокуса и управления окнами!?
Смотря какая форма модальная или нет используется разный подход
Посмотри весь топик здесь:

http://forums.autodesk.com/t5/NET/Pr...m/td-p/3945244
и здесь
http://drive-cad-with-code.blogspot....dialog-be.html
Олег (jr.) вне форума  
 
Непрочитано 19.06.2013, 12:19
#4
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


@ghost
ты когда вопросы задаёшь, код свой показывать не забывай... Х.з. что ты там у себя понаписал... Элементарный пример (протестировано в AutoCAD 2014 x64 Enu):
Код:
[Выделить все]
using System;
using Frm = System.Windows.Forms;
using Dwg = System.Drawing;
using cad = Autodesk.AutoCAD.ApplicationServices.Application;
using App = Autodesk.AutoCAD.ApplicationServices;
using Db = Autodesk.AutoCAD.DatabaseServices;
using Ed = Autodesk.AutoCAD.EditorInput;
using Rtm = Autodesk.AutoCAD.Runtime;

[assembly: Rtm.CommandClass(typeof(SomeNamespace.SomeClass))]

namespace SomeNamespace {

    public class SomeClass {

        const string ns = "hwd";

        [Rtm.CommandMethod(ns, "test", Rtm.CommandFlags.Modal)]
        public void Command() {         

            Frm.Form frm = new Frm.Form();
            frm.Width = 600;
            frm.Height = 300;            
            frm.Text = "Hello world";

            Frm.Button btn = new Frm.Button();
            btn.Text = "I am a button. Click me and select a DText " + 
                "object, please...";
            btn.Width = 350;
            btn.Parent = frm;
            btn.Location = new Dwg.Point(20, 20);
            btn.Click += btn_Click;
            
            cad.ShowModelessDialog(frm); // немодальное окно
            // cad.ShowModalDialog(frm); // модальное окно
        }

        void btn_Click(object sender, EventArgs e) {
            App.Document doc = cad.DocumentManager.MdiActiveDocument;
            Ed.Editor ed = doc.Editor;
            Db.Database db = doc.Database;

            Frm.Button btn = (Frm.Button) sender;
            Frm.Form frm = (Frm.Form) btn.Parent;
            frm.Visible = false;

            Db.TypedValue[] types = new Db.TypedValue[] { 
                new Db.TypedValue((int) Db.DxfCode.Start, "TEXT") };
            Ed.SelectionFilter filter = new Ed.SelectionFilter(types);
            Ed.PromptSelectionOptions pso = new Ed.PromptSelectionOptions();
            pso.SingleOnly = true;
            Ed.PromptSelectionResult result = ed.GetSelection(pso, filter);

            Frm.Label lbl = new Frm.Label();
            lbl.Parent = frm;
            lbl.Location = new Dwg.Point(20,50);

            if (result.Status == Ed.PromptStatus.OK) {
                Db.ObjectId id = result.Value.GetObjectIds()[0];

                if (!id.IsValid || id.IsErased) return;               

                using (Db.Transaction tr = db.TransactionManager.StartTransaction()) {
                    Db.DBText db_text = tr.GetObject(id, Db.OpenMode.ForRead) as Db.DBText;
                    lbl.Text = (db_text != null) ? db_text.TextString : "Can't get the item.";                    
                }                
            }
            else
                lbl.Text = "Empty selection.";

            btn.Enabled = false;
            frm.Visible = true;
        }
    }
}
Сильно подозреваю, что автор топика открывает окно как в обычном WinForm приложении, а не так, как это следует делать в AutoCAD (т.е. не использует ShowModelessDialog или ShowModalDialog).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 19.06.2013 в 12:25.
hwd вне форума  
 
Автор темы   Непрочитано 25.06.2013, 10:51
#5
ghost


 
Регистрация: 19.12.2011
Сообщений: 35


Цитата:
Сообщение от hwd Посмотреть сообщение
Сильно подозреваю, что автор топика открывает окно как в обычном WinForm приложении, а не так, как это следует делать в AutoCAD (т.е. не использует ShowModelessDialog или ShowModalDialog).
Да вы правы я до этого выводил окно WinForm!
Код:
[Выделить все]
            MainForm MF = new MainForm();
            MF.Show();
Сейчас делаю так:
Код:
[Выделить все]
            MainForm MF = new MainForm();
            IWin32Window win = Autodesk.AutoCAD.ApplicationServices.Application.MainWindow as IWin32Window;
            Autodesk.AutoCAD.ApplicationServices.Application.ShowModelessDialog(win as IWin32Window, MF, true);
Что приводит к: "Ссылка на объект не указывает на экземпляр объекта"! Как и раньше.....

Цитата:
Сообщение от hwd Посмотреть сообщение
ты когда вопросы задаёшь, код свой показывать не забывай...
Ок!Вот код нажатия кнопки:

Код:
[Выделить все]
        private void button3_Click(object sender, EventArgs e)
        {
            if (CheckText)
            {
                MessageBox.Show(@"Нажмите клавишу ESC для выхода из режима выбора текста!");
                return;
            }

            if (Plus1)
            {
                MessageBox.Show(@"Нажмите клавишу ESC для выхода из режима +1 !");
                return;
            }
            //Parent.Focus();
            //Control control = this.TopLevelControl;
            //Control control2 = control.TopLevelControl;
            //control2.Focus();
            IWin32Window IWin = this.ParentForm;
            //this.Parent.Focus();
            string str;
            do
            {
                CheckText = true;
                str = ACAD.GetText();
                str = str.Replace(" ", string.Empty);
                str = str.Trim().Replace(" ", string.Empty);
                char zap = Convert.ToChar(",");
                if (richTextBox1.Text == "")
                {
                    richTextBox1.Text = richTextBox1.Text + str;
                }
                else 
                {
                    if (str == "")
                    {
                        break;
                    }
                    else
                    {
                        if (richTextBox1.Text.ElementAt(richTextBox1.Text.Length - 1) == zap)
                        {
                            richTextBox1.Text = richTextBox1.Text + str;
                        }
                        else
                        {
                            richTextBox1.Text = richTextBox1.Text + ",";
                            richTextBox1.Text = richTextBox1.Text + str;
                        }
                    }
                }
            } while (str != "");
            CheckText = false;

            richTextBox1.Focus();
            //Windows.SetFocus(GetWindow(Handle, GW_HWNDPREV));
        }

Цитата:
Сообщение от Олег (jr.) Посмотреть сообщение
Смотря какая форма модальная или нет используется разный подход
Посмотри весь топик здесь:

http://forums.autodesk.com/t5/NET/Pr...m/td-p/3945244
и здесь
http://drive-cad-with-code.blogspot....dialog-be.html
Честно говоря после чтения этих источников так и не понял как передать фокус автокаду!? Там описано только что нужно пользовать ShowModelessDialog, ShowModalDialog..... И различные нюансы их использования!?
ghost вне форума  
 
Непрочитано 25.06.2013, 12:04
#6
trir


 
Регистрация: 18.12.2010
Сообщений: 5,115


Используй Tool Palette
trir вне форума  
 
Непрочитано 25.06.2013, 12:06
#7
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от ghost Посмотреть сообщение
Сейчас делаю так:
Код:
[Выделить все]
 
MainForm MF = new MainForm();
IWin32Window win = Autodesk.AutoCAD.ApplicationServices.Application.MainWindow as IWin32Window;
Autodesk.AutoCAD.ApplicationServices.Application.ShowModelessDialog(win as IWin32Window, MF, true);
Что приводит к: "Ссылка на объект не указывает на экземпляр объекта"! Как и раньше.....
Код:
[Выделить все]
 
MainForm MF = new MainForm();
Autodesk.AutoCAD.ApplicationServices.Application.ShowModelessDialog(MF);
Do$ вне форума  
 
Непрочитано 25.06.2013, 12:12
#8
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от ghost Посмотреть сообщение
Сейчас делаю так:
Я кому выше пример показал?
Цитата:
Сообщение от ghost Посмотреть сообщение
После нажатия на кнопку приходиться сначала кликнуть на окно AutoCAD и только после этого выбирать считываемый текст. Как после нажатия на кнопку передать фокус окну AutoCAD?
В обозначенном мною выше коде данная проблема не наблюдается - первым же кликом спокойно выбирается нужный примитив.
Цитата:
Сообщение от ghost Посмотреть сообщение
Что приводит к: "Ссылка на объект не указывает на экземпляр объекта"! Как и раньше.....
На эту тему я уже писал на данном форуме, юзай поиск.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 25.06.2013 в 12:23.
hwd вне форума  
 
Непрочитано 25.06.2013, 12:53
#9
bargool


 
Регистрация: 16.08.2006
Санкт-Петербург
Сообщений: 508
<phrase 1=


Если у тебя модальное окно - у Editor есть метод StartUserInteraction - он как раз для твоей задачи.
Вот тебе пример: http://adndevblog.typepad.com/autoca...ialog-box.html
__________________
Алексей
bargool вне форума  
 
Автор темы   Непрочитано 25.06.2013, 15:40
#10
ghost


 
Регистрация: 19.12.2011
Сообщений: 35


Цитата:
Сообщение от trir Посмотреть сообщение
Используй Tool Palette
Я пытался разобраться! Но в C# Классы отличаются ..... Есть пространство имен Autodesk.AutoCAD.Windows.ToolPalette..... В нем есть класс CustomToolBase..... И в нем есть метод CreatePalette()...
public Autodesk.AutoCAD.Windows.ToolPalette.Palette CreatePalette(Autodesk.AutoCAD.Windows.ToolPalette.Catalog catalogName, string paletteName) С paletteName все понятно, а Autodesk.AutoCAD.Windows.ToolPalette.Catalog студия пишет что "Пространстве имен ToolPalette нет класса Catalog..... Надо что то подключить а что !?
Может где то есть такой же мануал только для C#!?


Цитата:
Сообщение от Do$ Посмотреть сообщение
MainForm MF = new MainForm();
Autodesk.AutoCAD.ApplicationServices.Application.ShowModelessDialog(MF);
Таким способом у меня происходит то же исключение "Ссылка на объект не указывает на экземпляр объекта"! Когда я делаю на форме this.Parent.Focus();


Цитата:
Сообщение от bargool Посмотреть сообщение
Если у тебя модальное окно - у Editor есть метод StartUserInteraction - он как раз для твоей задачи.
Вот тебе пример: http://adndevblog.typepad.com/autoca...ialog-box.html
К сожалению нужно именно немодальное окно...


Цитата:
Сообщение от hwd Посмотреть сообщение
Ed.PromptSelectionResult result = ed.GetSelection(pso, filter);
Я так понимаю вот эта строчка фокус передает!? Дело в том что у меня все практически также..... Но извиняюсь виноват! Не сообщил одну деталь..... Окно должно быть TopMost поверх всех окон..... И когда эта опция включается..... То нужно кликнуть по автокаду что бы передать ему фокус...
ghost вне форума  
 
Непрочитано 25.06.2013, 15:50
#11
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


@ghost,
Ты запускал то, что я показал выше, или гаданием занимаешься?
Цитата:
Окно должно быть TopMost поверх всех окон.....
кто тебе запрещает добавить строку кода:
Код:
[Выделить все]
 frm.TopMost = true;
?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 26.06.2013, 00:39
#12
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от ghost Посмотреть сообщение
Окно должно быть TopMost поверх всех окон..... И когда эта опция включается..... То нужно кликнуть по автокаду что бы передать ему фокус...
А как иначе если окно TopMost???
Александр Ривилис вне форума  
 
Непрочитано 26.06.2013, 08:21
#13
Salt

Josser
 
Регистрация: 09.11.2011
Сообщений: 66


Для 2014 автокада (вероятно и для 2013) можно так:
Код:
[Выделить все]
Application.DocumentManager.MdiActiveDocument.Window.Focus()
И еще пример http://www.caduser.ru/forum/index.ph...#message273121
__________________
... пути твои в водах многих, и следы твои не познaются.

Последний раз редактировалось Salt, 26.06.2013 в 08:36.
Salt вне форума  
 
Непрочитано 26.06.2013, 08:39
#14
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
А как иначе если окно TopMost???
выше я показывал один из возможных вариантов, работает и для TopMost. У попа была собака... Кстати, TopMost != AlwaysFocused.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 03.07.2013, 11:53
#15
ghost


 
Регистрация: 19.12.2011
Сообщений: 35


Цитата:
Сообщение от hwd Посмотреть сообщение
@ghost,
Ты запускал то, что я показал выше, или гаданием занимаешься?

кто тебе запрещает добавить строку кода:
Код:
[Выделить все]
 frm.TopMost = true;
?
Да, запускал..... Все работает хорошо до тех пор пока TopMost = false , а когда TopMost = true происходит то же что и у меня, нужно делать дополнительный клик!

Цитата:
Сообщение от hwd Посмотреть сообщение
Кстати, TopMost != AlwaysFocused.
Я форме не делал "AlwaysFocused".....

Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
А как иначе если окно TopMost???
Мне нужно что бы окно было TopMost = true и просто передавало фокус автокаду..... Но при этом оставалось поверх автокада!

Как на фотках!

В фокусе окно проги.

Цитата:
Сообщение от Salt Посмотреть сообщение
Для 2014 автокада (вероятно и для 2013) можно так:
Код:
[Выделить все]
Application.DocumentManager.MdiActiveDocument.Window.Focus()
К сожалению я пишу для 2012-го AutoCADa..... А там фреймворк 3.5 на сколько я понял....

Я решил проблему способами описанными тут.....
Цитата:
Сообщение от Salt Посмотреть сообщение
А именно методом Autodesk.AutoCAD.Internal.Utils.SetFocusToDwgView() и через P/Invoke!
Всем спасибо за помошь и внимание к моей проблеме!
Изображения
Тип файла: jpg Фото 1.JPG (153.4 Кб, 460 просмотров)
Тип файла: jpg Фото 2.JPG (152.0 Кб, 456 просмотров)

Последний раз редактировалось Кулик Алексей aka kpblc, 03.07.2013 в 13:24.
ghost вне форума  
 
Непрочитано 03.07.2013, 11:57
#16
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от ghost Посмотреть сообщение
Да, запускал..... Все работает хорошо до тех пор пока TopMost = false , а когда TopMost = true происходит то же что и у меня, нужно делать дополнительный клик!
Не верю.
hwd вне форума  
 
Непрочитано 03.07.2013, 12:42
#17
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


У меня с автокадом тоже пару раз проскакивало (не постоянно), что он не видит что окно приложения (winforms) TopMost=true..., потом само ушло - почему так и осталось загадкой.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 04.07.2013, 16:51
#18
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,616


Цитата:
Сообщение от ghost Посмотреть сообщение
К сожалению я пишу для 2012-го AutoCADa..... А там фреймворк 3.5 на сколько я понял....
у 2012 автокада фреймворк 4.0
Boxa вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как управлять окнами *.dll в AutoCAD (C#)



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AUTOCAD 2010 перестал переключаться в многооконный режим. Проблемы с переменными Андрей Х. AutoCAD 24 27.05.2015 10:17
Интеграция Autodesk СПДС в AutoCAD 2012 bolotov Прочее. Программное обеспечение 24 07.01.2013 20:22
Превратить AutoCAD Map 3D в обычный AutoCAD (по панелям) gizmo_zx Вертикальные решения на базе AutoCAD 3 24.08.2011 11:25
AutoCAD 2009/2010 в ряде вопросов серьёзно курят перед AutoCAD 2007/2008 hwd Баги и пожелания в Autodesk 30 10.11.2010 12:56
В русской версии AutoCAD 2010 SP1 32-bit файл Acad.PGP содержит ошибки. hwd Баги и пожелания в Autodesk 21 21.04.2010 20:27