После вставки блока, блокируется текстовое окно Autocad-a.

Автор Тема: После вставки блока, блокируется текстовое окно Autocad-a.  (Прочитано 12246 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн ДианкаАвтор темы

  • ADN Club
  • Сообщений: 41
  • Карма: 0
После процесса вставки блока,не без помощи WinForm  блокируется text window(вызывала по F2)

причем намертво,на время всей сессии работы автокада, т.е. его надо перегрузить что бы оно шевелилось,а так,залоченное,как будто в режиме модального.
Заканчивается моя программа,после встевки блока просто - this.close();

закрыть я его могу только кликнув в контекстном меню в taskbar


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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
не без помощи WinForm
Красиво сказано! :)
Заканчивается моя программа,после встевки блока просто - this.close();
Пару нескромных вопросов:
1) А как эта форма вызывается?
2) В каком контексте работает форма (т.е. вызывается из команды, панели или еще как-то)?
3) А как блок вставляется?
4) Если убрать код вставки блока то тоже блокируется?
5) Какое значение системной переменной FIBERWORLD?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ДианкаАвтор темы

  • ADN Club
  • Сообщений: 41
  • Карма: 0
Пару нескромных вопросов:
1) А как эта форма вызывается?
2) В каком контексте работает форма (т.е. вызывается из команды, панели или еще как-то)?
3) А как блок вставляется?
4) Если убрать код вставки блока то тоже блокируется?
5) Какое значение системной переменной FIBERWORLD?

1) форма вызывается при вызове комманды [commandmetod("xxx")];
 2) из команды вызывается конструктор new Form();
нашла именно после вставки какого блока затыкается .(их три ,вставки,по очередности отключила каждую)
3) ниже приведу код вставки именного "Того" затычного блока.
4)нашла после какого блока
5)FIBERWORLD = 1 (read only)-кстати неизменное значение,хоть при блокированном окне,хоть и при нормальном.


Код - C# [Выбрать]
  1.    public void Ins_Shtamp_Block(string BlockPath)
  2.         {
  3.             ///Вставка блока:                                                       ///
  4.             ///---------------------------------------------------------------------///
  5.             Document doc = acadApp.DocumentManager.MdiActiveDocument;
  6.             Editor ed = doc.Editor;
  7.             Transaction tr = doc.TransactionManager.StartTransaction();
  8.             try
  9.             {
  10.                 using (tr)
  11.                 {
  12.                     Database db = new Database(false, false);
  13.                     Database curdb = doc.Database;
  14.                     db.ReadDwgFile(BlockPath, System.IO.FileShare.Read, true, null);
  15.                     ObjectId BlkId = doc.Database.Insert(BlockPath, db, false);
  16.                     BlockTable bt = (BlockTable)tr.GetObject(doc.Database.BlockTableId, OpenMode.ForRead, true);
  17.                     BlockTableRecord ps = tr.GetObject(curdb.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  18.                     PromptPointResult ppr = ed.GetPoint("\nУкажите точку вставки блока ");
  19.                     Point3d pt = ppr.Value;
  20.                     MyData.InsPt = pt; ///сохраняю точку вставки,для вставки следующих блоков
  21.  
  22.                     BlockReference bref = new BlockReference(pt, BlkId);
  23.                     ps.AppendEntity(bref);
  24.                     tr.AddNewlyCreatedDBObject(bref, true);
  25.                     bref.ExplodeToOwnerSpace();
  26.                     bref.Erase();
  27.                     tr.Commit();
  28.  
  29.                 }
  30.             }
  31.             catch (Autodesk.AutoCAD.Runtime.Exception ex)
  32.             {
  33.                 acadApp.ShowAlertDialog(ex.Message);
  34.             }
  35.             finally
  36.             {
  37.                  acadApp.ShowAlertDialog("Adios");
  38.             }
  39.         }

Оффлайн ДианкаАвтор темы

  • ADN Club
  • Сообщений: 41
  • Карма: 0
о я нашла,но как изменить не понимаю..
затык именно на точке вставки..
я изменила точку вставки на Point3d.Origin и перестало.
но ведь мне необходимо что бы для первого указывалась точка вставки,а потом она осталась для последующих блоков ..:\


             
Код - C# [Выбрать]
  1.        PromptPointResult ppr = ed.GetPoint("\nУкажите точку вставки блока "); ///вот именно тут проблема
  2.                     Point3d pt = ppr.Value;
несмотря на то ,что я даже не использую эту точку (изменила код)
именно из-за этой строки блокируется .
« Последнее редактирование: 18-12-2014, 17:14:18 от Дианка »

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

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Попробуй так:
Код - C# [Выбрать]
  1. public void Ins_Shtamp_Block(string BlockPath)
  2. {
  3.    ///Вставка блока:                                                       ///
  4.    ///---------------------------------------------------------------------///
  5.    Document doc = acadApp.DocumentManager.MdiActiveDocument;
  6.    Editor ed = doc.Editor;
  7.    try
  8.    {
  9.        Point3d pt = Point3d.Origin;
  10.        using (EditorUserInteraction UI = ed.StartUserInteraction(this)) {
  11.           PromptPointResult ppr = ed.GetPoint("\nУкажите точку вставки блока ");
  12.           pt = ppr.Value;
  13.        }
  14.        Database db = new Database(false, false);
  15.        Database curdb = doc.Database;
  16.        db.ReadDwgFile(BlockPath, System.IO.FileShare.Read, true, null);
  17.  
  18.        using (Transaction tr = doc.TransactionManager.StartTransaction())
  19.        {
  20.            ObjectId BlkId = curdb.Database.Insert(BlockPath, db, false);
  21.            BlockTable bt = (BlockTable)tr.GetObject(doc.Database.BlockTableId, OpenMode.ForRead, true);
  22.            BlockTableRecord ps = tr.GetObject(curdb.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  23.            MyData.InsPt = pt; ///сохраняю точку вставки,для вставки следующих блоков
  24.            BlockReference bref = new BlockReference(pt, BlkId);
  25.            ps.AppendEntity(bref);
  26.            tr.AddNewlyCreatedDBObject(bref, true);
  27.            bref.ExplodeToOwnerSpace();
  28.            bref.Erase();
  29.            tr.Commit();
  30.  
  31.        }
  32.    }
  33.    catch (Autodesk.AutoCAD.Runtime.Exception ex)
  34.    {
  35.        acadApp.ShowAlertDialog(ex.Message);
  36.    }
  37.    finally
  38.    {
  39.         acadApp.ShowAlertDialog("Adios");
  40.    }
  41. }

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

Оффлайн ДианкаАвтор темы

  • ADN Club
  • Сообщений: 41
  • Карма: 0
Код жуткий. Ни одной проверки на ошибки. Что будет если пользователь нажмёт ESC вместо ввода точки?
Что будет если блока с таким именем нет?
не помогло  :(
я знаю что код жуткий,я впервые вообще пишу такое )

Код - C# [Выбрать]
  1. PromptPointResult ppr = ed.GetPoint("\nУкажите точку вставки блока "); ///вот именно тут проблема
  2.  if (ppt.Status != PromptStatus.OK)
  3. return;
  4. Point3d pt = ppr.Value;
  5.  
-это на эскейп и т.п.? я введу..позже.

проверка на наличие штампа у меня изначально проходит....и на проверку пространства,еще до вызова формы. КОгда эти оба условия   true  тогда уже у меня форма запускается

я боюсь кидать весь код,вы поседеете  ;D ;D ;D
« Последнее редактирование: 18-12-2014, 18:01:48 от Дианка »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
не помогло
Жаль.
я боюсь кидать весь код,вы поседеете
Я уже давно седой и уже практически лысый. Но я думаю тебе будет полезнее самой найти ошибку в своем коде.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ДианкаАвтор темы

  • ADN Club
  • Сообщений: 41
  • Карма: 0
Я уже давно седой и уже практически лысый. Но я думаю тебе будет полезнее самой найти ошибку в своем коде.
Но я ведь нашла это место ,я просто не знаю что теперь делать ведь мне нужна эта точка....
Код - C# [Выбрать]
  1.  PromptPointResult ppr = ed.GetPoint("\nУкажите точку вставки блока "); ///вот именно тут проблема
  2.                     Point3d pt = ppr.Value;

если я не беру с экрана точку,а просто ее назначаю-
Код - C# [Выбрать]
  1. Point 3d =Point3d.Origin
тогда всё ок.


сам процесс "взятия" точки с экрана,рождает этот затык...

Отмечено как Решение Дианка 18-12-2014, 22:37:21

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Повторю вопрос:
1) Запрос точки внутри формы?
2) Как запускается форма? Она должна запускаться через Application.ShowModalDialog(frm), а не через frm.ShowDialog()
3) Конструкция вида
Код - C# [Выбрать]
  1.        using (EditorUserInteraction UI = ed.StartUserInteraction(this)) {
  2.           PromptPointResult ppr = ed.GetPoint("\nУкажите точку вставки блока ");
  3.           pt = ppr.Value;
  4.        }
обязательна внутри модальной формы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ДианкаАвтор темы

  • ADN Club
  • Сообщений: 41
  • Карма: 0
2) Как запускается форма? Она должна запускаться через Application.ShowModalDialog(frm), а не через frm.ShowDialog()

УРА! вот тут то и была проблема..
Код - C# [Выбрать]
  1. [CommandMethod("INB")]
  2.         public void InsertData()
  3.         {            
  4.             bool i = CheckSpace();      //проверка на пространство
  5.             bool block = CheckBlock(); //проверка на наличие блока
  6.             MyData.block = block;                    
  7.             MyForm f1 = new MyForm();
  8.                        
  9.             if (i)      //-Если Находимся  в листе,то далее....
  10.             {
  11.                 if (!block)
  12.                 {                  
  13.                   // DialogResult re = f1.ShowDialog(); [/b][/size] ///  !!!!
  14.                     DialogResult re = Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog(f1);
  15.                 }
  16.                 else
  17.                 {
  18.                     MessageBox.Show("В  данном файле уже присутствует блок штампа.\nВставка нового - невозможна.Доступна только функция обновления данных!",
  19.                                      "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Information);
  20.                     f1.Close();
  21.                 }
  22.             }
  23.         }

СПАСИБО!
что бы я без Вас делала ))
теперь запомню что тут нельзя просто форму запускать,а надо в модальном режиме

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
Можно и немодальном, если использовать палитры...

Оффлайн ДианкаАвтор темы

  • ADN Club
  • Сообщений: 41
  • Карма: 0
Можно и немодальном, если использовать палитры...
Спасибо,буду иметь в виду...
скоро предстоит переход на 16-ю версию
может там пригодятся палитры

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
теперь запомню что тут нельзя просто форму запускать,а надо в модальном режиме
Ты видимо не поняла. Форму нужно запускать используя метод Application.ShowModalDialog или Application.ShowModelessDialog, а не соотвественно Form.ShowDialog или Form.Show. К модальности это никакого отношения не имеет. Вопрос же использовать или нет немодальные формы достаточно сложный. Есть куча особенность и если нет прямой необходимости делать именно немодальные формы, то я бы не стал это советовать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение