Класс Curve и его наследники из вертикальных приложений.

Автор Тема: Класс Curve и его наследники из вертикальных приложений.  (Прочитано 8583 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 95
  • Карма: 11
При работе с Civil вылезла такая вещь, все элементы оказались наследниками Autodesk.AutoCAD.DatabaseServices.Curve и соответственно выдают ошибки при попытке обработать их так же как кривую автокада, вопрос такой, можно ли сделать проверку что это точно кривая автокада кроме как проверкой на все виды кривой (линия полининия и тд.) сделал пока такой костыль if ((ent is Curve) & !(ent is Autodesk.Civil.DatabaseServices.Entity)) но вылезет потом еще что-нибудь из какого либо другого приложения.

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
У Curve не так много наследников в чистом Автокаде, что все проверки представляли какую-нибудь проблему. Я 11 насчитал: 
    static readonly RXClass dbLine = RXObject.GetClass(typeof(Line));
    static readonly RXClass dbPolyline = RXObject.GetClass(typeof(Polyline));
    static readonly RXClass dbPolyline2d = RXObject.GetClass(typeof(Polyline2d));
    static readonly RXClass dbPolyline3d = RXObject.GetClass(typeof(Polyline3d));
    static readonly RXClass dbCircle = RXObject.GetClass(typeof(Circle));
    static readonly RXClass dbRay = RXObject.GetClass(typeof(Ray));
    static readonly RXClass dbXLine = RXObject.GetClass(typeof(Xline));
    static readonly RXClass dbSpline = RXObject.GetClass(typeof(Spline));
    static readonly RXClass dbEllipse = RXObject.GetClass(typeof(Ellipse));
    static readonly RXClass dbArc = RXObject.GetClass(typeof(Arc));
И еще как ни странно Leader.  Но при этом MLine - это не Curve.

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

  • ADN OPEN
  • **
  • Сообщений: 95
  • Карма: 11
Ну собственно я пришел к тому же мнению и написал вот такой класс, что решило проблему,


Код - C# [Выбрать]
  1.        
  2.          public static bool IsAcadCurve(this Entity ent)
  3.         {
  4.             if (ent is Arc | ent is Circle | ent is Ellipse | ent is Line |
  5.                 ent is Polyline | ent is Polyline2d | ent is Polyline3d |
  6.                 ent is Ray | ent is Spline | ent is Xline) return true;
  7.             else return false;
  8.         }

Leader да, тоже относится к Curve но выдает ошибки при использовании GetGeCurve например, поэтому в список ее не внес.
MLine правильно что не Curve, это скорее такой вариант типа Блока или Размера по функционалу, ее я обрабатываю как блок, считывая составляющие элементы.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
... сделал пока такой костыль if ((ent is Curve) & !(ent is Autodesk.Civil.DatabaseServices.Entity)) но вылезет потом еще что-нибудь из какого либо другого приложения...
Вполне нормальный костыль. Добавь еще проверку на Autodesk.Aec.DatabaseServices.Entity
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Ещё варианты:
Можно через рефлексию получить название сборки, откуда загружен тип. И убедиться, что это AcDbMgd.dll.
Можно просто try-catch добавить.

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
HELIX - Спираль, тоже наследник Curve
AcDbSpline-AcDbCurve-AcDbEntity  ;)