ComponentDefinition в C#

Автор Тема: ComponentDefinition в C#  (Прочитано 6462 раз)

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

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
ComponentDefinition в C#
« : 15-09-2015, 19:04:08 »
Доброго времени суток, уважаемые форумчане! Ищу вашей помощи в таком вот вопросе:
Пытаюсь перейти с VBA на C#. Пишу аналогию кода "oCD=ThisApplication.ActiveDocument.ComponentDefibition".
У меня есть "Inventor.Application oApp" которому я сумел присвоить ссылку на приложение инвентор.
Далее "Inventor.Document oDoc =oApp.ActiveDocument;"
Следом я хочу "подключиться" к ComponentDefinition по аналогии с VBA: "oCD=oDoc.ComponentDefinition", но программа не дает мне этого сделать, говорит: "Document не содержит определения для ComponentDefinition". Не могу разобраться, в чем проблема. Буду рад любому совету!
В программировании я новичок...но ненадолго! ;)

Отмечено как Решение R.I.Chernov 16-09-2015, 10:13:35

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: ComponentDefinition в C#
« Ответ #1 : 16-09-2015, 06:21:35 »
"oCD=oDoc.ComponentDefinition", но программа не дает мне этого сделать, говорит: "Document не содержит определения для ComponentDefinition"
Ну если тип Document действительно не содержит ComponentDefinition, что ж вы от него хотите. Тип Document является базовым для всех остальных производных документов типа деталей, чертежей и сборок. В документах чертежа, например, тоже нет ComponentDefinition. Как из этого выходить? Нужно просто  сделать приведение типов:

Inventor.AsseblyDocument AssDoc=oApp.ActiveDocument as Inventor.AsseblyDocument

или
Inventor.AsseblyDocument AssDoc=(Inventor.AsseblyDocument)oApp.ActiveDocument

тогда AssDoc будет иметь ComponentDefinition. Если однозначно не известно что за тип документа будет, то перед приведением типов нужно сделать проверку типа:
if (oDoc.DocumentType==kAssemblyDocument) {тогда делать приведение типов}

То что бейсик (VBA) своим "исскуственным интелектом" додумывает типы и программа работает, не должно сильно радовать, он иногда начинает додумывать по своему и приводит к непредсказуемым результатам.
В добавок на додумывание тратится время процессора. C# же строго типизированный, поэтому дурацких ошибок в нем будет меньше.

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Re: ComponentDefinition в C#
« Ответ #2 : 16-09-2015, 10:13:32 »
Спасибо, Михаил, за решение! "Приведение типов" - мое спасение, а то, либо документ у меня не содержал ComponentDefinition, либо (когда тип документа пробовал сделать AssemblyDocument) не работал код "AssDoc=oApp.ActiveDocument", указывая на несоответствие типов.
П.С. Я почему-то был уверен, что VBA и C# должны работать аналогично, так как объектные модели одинаковые. Что VBA "додумывает" мне в голову не приходило! :) Еще раз благодарю!
В программировании я новичок...но ненадолго! ;)

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Re: ComponentDefinition в C#
« Ответ #3 : 16-09-2015, 19:10:05 »
... то перед приведением типов нужно сделать проверку типа:
if (oDoc.DocumentType==kAssemblyDocument) {тогда делать приведение типов}

Тема закрыта, но хотел отметить, что на такой синтаксис программа стала ругаться, может я что-то сделал не так? :(
Сработало в таком виде "if (oDoc.DocumentType == Inventor.DocumentTypeEnum.kAssemblyDocumentObject)"
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: ComponentDefinition в C#
« Ответ #4 : 16-09-2015, 21:10:02 »
Тема закрыта, но хотел отметить, что на такой синтаксис программа стала ругаться, может я что-то сделал не так?
:)
Ну потому, что:
1. перечисление kAssemblyDocumentObject находится в пространстве имен: Inventor
Если в самом вверху файла с кодом написать
using Inventor;
то слово Inventor можно пропустить
2. Я честно сказать писал по памяти, и пытался просто дать направление, что перед приведением типов нужно проверить тип документа.
Так, что ты все сделал так как надо.

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Re: ComponentDefinition в C#
« Ответ #5 : 17-09-2015, 09:32:28 »
Понял. Еще раз спасибо!
В программировании я новичок...но ненадолго! ;)