Тема: Контроль типа передаваемого объекта
Суть вопроса необходимо проконтролировать тип передаваемого объекта в основной класс для обработки данных.
Вызываем меню в меню после настроек нажимаем Ок и выбираем полилинию.
Когда выбираем полилинию, то проблем нет. А при "не выборе", т.е. нажиди ОК и правый клик (или ESC) появляется ошибка по сслылке строки - это неверный тип возворащаемого объекта.
Подскажите кто как решал такую задачу. (я только учусь).
public bool GetPolyline(Document LocalAcadDoc, Database LocalAcadDB, out Polyline LocalPoly) //out Polyline LocalPoly { using (Transaction trPoly = LocalAcadDB.TransactionManager.StartTransaction()) { //Переменая получаемая из командной строки PromptEntityOptions EntityOption = new PromptEntityOptions("\nВыберите полилинию-трассу МН"); //Запрос в командную строку на указание полилинии EntityOption.SetRejectMessage(""); // \nВыберите полилинию-трассу МН //Проверка типа выбранного объекта EntityOption.AddAllowedClass(typeof(Autodesk.AutoCAD.DatabaseServices.Polyline), true); //Запрос выбора объектов в области чертежа PromptEntityResult EntityResult = LocalAcadDoc.Editor.GetEntity(EntityOption); //Проверка статуса правильности выбора //if (EntityResult.Status == PromptStatus.OK) //{ Polyline LocalPolyTrassaMN = trPoly.GetObject(EntityResult.ObjectId, OpenMode.ForRead) as Polyline; if (LocalPolyTrassaMN.GetType() != typeof(Polyline)) { MessageBox.Show("Полиния трассы не выбрана. Расстановка знаков не выполнена", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Warning); LocalPoly = null; return false; } else { LocalPoly = LocalPolyTrassaMN; return true; } } }
Текст исключения:
Текст исключения **************
Autodesk.AutoCAD.Runtime.Exception: eNullObjectId
в Autodesk.AutoCAD.DatabaseServices.TransactionManager.GetObjectInternal(AcDbTransactionManager* pTM, ObjectId id, OpenMode mode, Boolean openErased, Boolean forceOpenOnLockedLayer)
в Autodesk.AutoCAD.DatabaseServices.Transaction.GetObject(ObjectId id, OpenMode mode)
в GlobalSign.SignBase.GetPolyline(Document LocalAcadDoc, Database LocalAcadDB, Polyline& LocalPoly) в D:\Csharp\Programm\002-SignOnOilPipe\00-SignOnOilTrass.cs:строка 6554
в GlobalSign.SignModelGroupSign.InsertGroupSignTrassa() в D:\Csharp\Programm\002-SignOnOilPipe\00-SignOnOilTrass.cs:строка 2608
в Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorker(MethodInfo mi, Object commandObject, Boolean bLispFunction)
в Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorkerWithExceptionFilter(MethodInfo mi, Object commandObject, Boolean bLispFunction)
в Autodesk.AutoCAD.Runtime.PerDocumentCommandClass.Invoke(MethodInfo mi, Boolean bLispFunction)
в Autodesk.AutoCAD.Runtime.CommandClass.CommandThunk.Invoke()
Код вызова:
//Метод расчета геометрии по трассе основных знаков и их вставки [CommandMethod("InsertGroupSignTrassa", CommandFlags.UsePickSet)] public void InsertGroupSignTrassa() { //экземпляр класса доступа к чертежу AccessToDocument AcToDraw = new AccessToDocument(); //Получаем ссылкe на документ Document AcadDoc = AcToDraw.Doc; // получаем ссылкe на БД Database AcadDB = AcToDraw.DBase; //Экземпляр формы для доступа к исходным данным для доступа к полям SignModelGroupSign S = new SignModelGroupSign(); //Экземпляр формы для доступа к исходным данным для доступа к полям GroupSignTrassa_Form GSF = new GroupSignTrassa_Form(); //Открываем форму для исходных данных для расстановки знаков GSF.ShowDialog(); bool checkPoly = GetPolyline(AcadDoc, AcadDB, out Polyline PolyTrassaMN); //получение полинии для расчета знаков //Polyline PolyTrassaMN = GetPolyline(AcadDoc, AcadDB); if (checkPoly == true) { using (Transaction tr = AcadDB.TransactionManager.StartTransaction()) //Старт транзакции { //Начальный ПК трассы для расстановки знаков string BeginPiketString = GSF.TextBoxText(1); double PK100 = PiketSto(BeginPiketString); double PK000 = PiketPlus(BeginPiketString); double BeginPiketDouble = PiketStringToDouble(BeginPiketString); int i, j; #ТУТ КОД РАССТАНОВКИ tr.Commit(); } } else { MessageBox.Show("Полиния трассы не выбрана. Расстановка знаков не выполнена", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } }