eNotApplicable при использование Editor

Автор Тема: eNotApplicable при использование Editor  (Прочитано 5991 раз)

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

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

  • ADN Club
  • Сообщений: 2
  • Карма: 0
Здравствуйте, создаю приложение, в нем использую WCF службу, с параметрами сервера: [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single,
        IncludeExceptionDetailInFaults = true)]
Посылаю команды с клиента на сервер, а сервер общается с автокадом посредством длл (т.е никаких  [CommandMethod()] не использую).
При этом, чтобы работать с документом автокада, использую метод
Код - C# [Выбрать]
  1. public static Document GetActiveDocument()
  2.         {
  3.             var document = (Document)_dispatcher.Invoke(new Func<Document>(() => Application.DocumentManager.MdiActiveDocument));
  4.            
  5.             if (document == null)
  6.                 Logger.Error("AcadHelper.GetActiveDocument", "document is null!");
  7.  
  8.             return document;
  9.         }
С базой данных работается нормально. Сейчас хочу сделать, чтобы при создании блока, был запрос у пользователя о выборе точки вставки блока.
Тело метода:
Код - C# [Выбрать]
  1. var entities = new List<Entity>();
  2.             Logger.Trace("AcadDrawerPlugin.AddBlock");
  3.             var database = AcadHelper.GetActiveDb();
  4.             AcadHelper.GetActiveDocument().LockDocument();
  5.             ObjectIdCollection objectIdCollection = new ObjectIdCollection();
  6.             using (Transaction transaction = database.TransactionManager.StartTransaction())
  7.             {
  8.                 BlockTable blockTable = database.GetBlockTable(transaction);                
  9.                 blockTable.UpgradeOpen();
  10.                 BlockTableRecord blockTableRecord = new BlockTableRecord();
  11.                 blockTableRecord.Name = blockName;
  12.                 blockTable.UpgradeOpen();
  13.                 ObjectId objectId = blockTable.Add(blockTableRecord);
  14.                 foreach (EntityId entityId in entityIds)
  15.                 {
  16.                     ObjectId newObjectId = database.GetObjectId(false, new Handle(Convert.ToInt64(entityId.Id)), 0);
  17.                     Logger.Debug("Server.AddBlock.Seacrh1: " + entityId);
  18.                     Logger.Debug("Server.AddBlock.Seacrh2: " + newObjectId);
  19.                     var entity = (Entity)newObjectId.GetObject(OpenMode.ForRead);
  20.                     entities.Add(entity);
  21.                     objectIdCollection.Add(newObjectId);
  22.                 }
  23.                 blockTableRecord.AssumeOwnershipOf(objectIdCollection);
  24.                 blockTableRecord.DowngradeOpen();
  25.                 Point3d pt = new Point3d(10,10,10);
  26.                 BlockReference br = new BlockReference(pt, objectId);
  27.                 AcadHelper.GetActiveDocument().AddEntity(br);
  28.                 Application.UpdateScreen();
  29.                 transaction.Commit();
  30.             }
Хочу дописать
Код - C# [Выбрать]
  1. Editor ed = AcadHelper.GetActiveDocument().Editor;
  2. PromptPointOptions ppo = new PromptPointOptions("\nPick origin point for block: ");
  3. PromptPointResult pres = ed.GetPoint(ppo);
Получаю
Цитировать
ERROR System.ServiceModel.FaultException`1[System.ServiceModel.ExceptionDetail]: eNotApplicable (Дополнительные сведения об ошибке — ExceptionDetail, возможно созданный параметром IncludeExceptionDetailInFaults=true, имеющим следующее значение:
Autodesk.AutoCAD.Runtime.Exception: eNotApplicable
   в AcMgUserInteraction.{ctor}(AcMgUserInteraction* , AcApDocument* pDoc, Boolean prompting)
   в Autodesk.AutoCAD.EditorInput.Editor.DoPrompt(PromptOptions opt)
   в Autodesk.AutoCAD.EditorInput.Editor.GetPoint(PromptPointOptions options)
Как можно вызвать запрос на выбор точки?
Без этого запроса блок рисуется нормально.
Тестировал работу через [CommandMethod()]  - все нормально.

Проблема, наверняка, кроется именно в работе с Editor, потому что ed.UpdateScreen(); также вылетает с ошибкой, но ed.WriteMessage отрабатывает нормально.
« Последнее редактирование: 16-11-2014, 16:56:22 от Александр Ривилис »

Отмечено как Решение Kirill 16-11-2014, 18:02:23

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: eNotApplicable при использование Editor
« Ответ #1 : 16-11-2014, 17:16:12 »
Приветствую на форуме!
1) Не забывай использовать тэги: [code=csharp]...здесь код...[/code], чтобы код был читабельным.
2) AutoCAD является "потоконебезопасным" приложением. Обращаться к нему следует только из его главного потока (Thread). Это касается и обращения к базе чертежа.
Как это можно сделать описано здесь: http://adn-cis.org/ispolzovanie-potokov-dlya-fonovoj-obrabotki.html Основная мысль - создать в главном потоке экземпляр System.Windows.Forms.Control ctrl и обращаться к AutoCAD через "заглушку" вида ctrl.Invoke(...)
3) На всякий случай посмотри еще эту тему: http://forums.autodesk.com/t5/net/wcf-and-autocad-p-amp-id-enotapplicable-error/m-p/4331429
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • Сообщений: 2
  • Карма: 0
Re: eNotApplicable при использование Editor
« Ответ #2 : 16-11-2014, 18:02:15 »
Александр Ривилис, спасибо огромное за помощь, вроде сдвинулся с мертвой точки (ну метод аптейд уже выполняется). :)

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: eNotApplicable при использование Editor
« Ответ #3 : 16-11-2014, 18:24:46 »
Отлично! Если будут еще вопросы - милости просим.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение