Здравствуйте, создаю приложение, в нем использую WCF службу, с параметрами сервера: [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single,
IncludeExceptionDetailInFaults = true)]
Посылаю команды с клиента на сервер, а сервер общается с автокадом посредством длл (т.е никаких [CommandMethod()] не использую).
При этом, чтобы работать с документом автокада, использую метод
public static Document GetActiveDocument()
{
var document = (Document)_dispatcher.Invoke(new Func<Document>(() => Application.DocumentManager.MdiActiveDocument));
if (document == null)
Logger.Error("AcadHelper.GetActiveDocument", "document is null!");
return document;
}
С базой данных работается нормально. Сейчас хочу сделать, чтобы при создании блока, был запрос у пользователя о выборе точки вставки блока.
Тело метода:
var entities = new List<Entity>();
Logger.Trace("AcadDrawerPlugin.AddBlock");
var database = AcadHelper.GetActiveDb();
AcadHelper.GetActiveDocument().LockDocument();
ObjectIdCollection objectIdCollection = new ObjectIdCollection();
using (Transaction transaction = database.TransactionManager.StartTransaction())
{
BlockTable blockTable = database.GetBlockTable(transaction);
blockTable.UpgradeOpen();
BlockTableRecord blockTableRecord = new BlockTableRecord();
blockTableRecord.Name = blockName;
blockTable.UpgradeOpen();
ObjectId objectId = blockTable.Add(blockTableRecord);
foreach (EntityId entityId in entityIds)
{
ObjectId newObjectId = database.GetObjectId(false, new Handle(Convert.ToInt64(entityId.Id)), 0);
Logger.Debug("Server.AddBlock.Seacrh1: " + entityId);
Logger.Debug("Server.AddBlock.Seacrh2: " + newObjectId);
var entity = (Entity)newObjectId.GetObject(OpenMode.ForRead);
entities.Add(entity);
objectIdCollection.Add(newObjectId);
}
blockTableRecord.AssumeOwnershipOf(objectIdCollection);
blockTableRecord.DowngradeOpen();
Point3d pt = new Point3d(10,10,10);
BlockReference br = new BlockReference(pt, objectId);
AcadHelper.GetActiveDocument().AddEntity(br);
Application.UpdateScreen();
transaction.Commit();
}
Хочу дописать
Editor ed = AcadHelper.GetActiveDocument().Editor;
PromptPointOptions ppo = new PromptPointOptions("\nPick origin point for block: ");
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 отрабатывает нормально.