Приведение объекта AutoCAD к собственному производному типу

Автор Тема: Приведение объекта AutoCAD к собственному производному типу  (Прочитано 8519 раз)

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

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Добрый день! Помогите, пожалуйста, разобраться в такой ситуации:
Создаю собственный класс, производный от какого-либо класса AutoCAD (например Polyline)
Код - C# [Выбрать]
  1. public class Class03 : Polyline
  2. {
  3.     public int myValue = 1;
  4.  
  5.     public Class03()
  6.     {
  7.     }
  8.  }

Далее, в другом классе получаю объект Polyline (зная ObjectId), и пытаюсь привести его к типу собственного класса Class03
Код - C# [Выбрать]
  1. Transaction tr = db.TransactionManager.StartTransaction();
  2. using (tr)
  3. {
  4.      Polyline pLine = tr.GetObject(objId, OpenMode.ForRead) as Polyline;
  5.      Class03 objClass03 = new Class03();
  6.      objClass03 = (Class03)pLine;
  7. }
В результате получаю ошибку  System.InvalidCastException: Не удалось привести тип объекта "Autodesk.AutoCAD.DatabaseServices.Polyline" к типу "Class03"

Можно ли каким-нибудь образом объекту собственного класса передать значения всех свойств объекта AutoCad ?

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
neopentan, проблема в том, что создав свой класс, производный от Polyline, это совсем не значит, что объект AutoCAD, который Вы получили по ID, имеет тип Class03.
Вы неверно используете механизм наследования. Класс Class03 можно привести к классу Polyline, но не наоборот.
Если я правильно понимаю, Вы пытаетесь добавить некие пользовательские свойства к классу Polyline. Вы это делаете неверно. Специалисты по AutoCAD Вам лучше подскажут, как лучше это реализовать.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
neopentan, приветствую на форуме!
Создаю собственный класс, производный от какого-либо класса AutoCAD (например Polyline)
Так конечно сделать можно, но какой в этом смысл?
1) Созданный таким образом экземпляр класса нельзя добавить в чертеж. Такое в AutoCAD можно делать только средствами ObjectARX (native C++), но не средствами AutoCAD .NET API.
2) Нельзя сделать приведение Polyline к Class03, т.к. нельзя сделать приведение базового класса к производному если объект не является экземпляром производного класса. А у тебя в чертеже PolyLine, а не Class03.
Можно ли каким-нибудь образом объекту собственного класса передать значения всех свойств объекта AutoCad ?
Объясни цель этого действия и тогда возможно найдется способ. Если это как-то связано с пунктом 1), то это бессмысленное занятие.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Если я правильно понимаю, Вы пытаетесь добавить некие пользовательские свойства к классу Polyline. Вы это делаете неверно. Специалисты по AutoCAD Вам лучше подскажут, как лучше это реализовать.
Увы, но средствами AutoCAD .NET API это сделать невозможно. Ну во всяком случае вот так в лоб.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
+ к сказанному:
Все что можно сделать (из под .Net) - это расширить функционал класса (добавить статических методов или методов экземпляра, но без дополнительных данных) - что впрочем относится к любому классу платформы (а не только к "автокадному").

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
Александр Ривилис, Виктор Чекалин, Дима_, большое спасибо за ответы!

1) Созданный таким образом экземпляр класса нельзя добавить в чертеж.
Я ни в коем случае не собирался добавлять объект собственного класса в чертеж. Просто думал создать служебный класс на базе, например Polyline, дополнив его некоторыми методами. Далее объект созданного класса должен был получить все данные выбранной на чертеже полилинии (как выяснилось это невозможно). А затем некоторые методы и свойства этого объекта записать в DBDictionary...
   В итоге, я понял, что можно просто записать значения необходимых свойств полилинии в собственный объект и на основе этих данных сформировать DBDictionary.

2) Нельзя сделать приведение Polyline к Class03, т.к. нельзя сделать приведение базового класса к производному
Буду весьма признателен, если проясните, почему приведение типов работает в следующем коде:
Код - C# [Выбрать]
  1. //базовый класс
  2. public class Class01
  3. {
  4.     public string a1 = "Переменная из класса 1";
  5. }
  6.  
  7. //производный класс
  8. public class Class02 : Class01
  9. {
  10.     public string a2 = "Переменная из класса 2";
  11.  
  12.     public void Meth02()
  13.     {
  14.         Class01 obj01 = new Class01();
  15.         Class02 obj02 = new Class02();
  16.  
  17.         // приведение к базовому типу
  18.         obj01 = obj02;
  19.         obj01.a1 = "Новое значение класса 1";
  20.  
  21.         // приведение к производному типу
  22.         obj02 = (Class02)obj01;
  23.     }
  24. }

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Просто думал создать служебный класс на базе, например Polyline, дополнив его некоторыми методами.
Не изобретай велосипед, почитай про методы расширений. Примеры их создания и использования я показывал здесь. В указанной мною ссылке экземплярам класса Database добавляются новые методы, которые в коде можно вызывать как "родные" методы объекта Database.

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Буду весьма признателен, если проясните, почему приведение типов работает в следующем коде:
После строки
Код - C# [Выбрать]
  1.         obj01 = obj02;
объект obj1 будет содержать в себе ссылку на obj2, т.е. являться классом Class02, т.е. производным.
Вы что-то слишком перемудрили в примере. Вот пример по проще:
Код - C# [Выбрать]
  1.             Class01 obj1 = new Class01();
  2.             Class02 obj2 = (Class02) obj1; // ошибка, так как нельзя привети базовый класс к производному
  3.  
  4.             Class01 obj3 = new Class02();
  5.             Class02 obj4 = (Class02)obj3; // Ошибки нет, как как объект obj3 имеет тип Class02