Тема: Контроль типа передаваемого объекта

Суть вопроса необходимо проконтролировать тип передаваемого объекта в основной класс для обработки данных.
Вызываем меню в меню после настроек нажимаем Ок и выбираем полилинию.
Когда выбираем полилинию, то проблем нет. А при "не выборе", т.е. нажиди ОК и правый клик (или 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);
            }
        }
    }

Re: Контроль типа передаваемого объекта

Рекомендую задать этот вопрос здесь: http://adn-cis.org/forum/index.php?board=4.0
Если в двух словах, то в случае

if (EntityResult.Status != PromptStatus.OK) 

необходимо возвращать false и завершать работу.

Re: Контроль типа передаваемого объекта

Когда увидел ваш ответ и понял свою "невнимательность".
Благодарю, все получилось.

Re: Контроль типа передаваемого объекта

Отлично! Но рекомендация остаётся в силе на будущее.