Сообщество программистов Autodesk в СНГ
ADN Club => Inventor API => Тема начата: R.I.Chernov от 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". Не могу разобраться, в чем проблема. Буду рад любому совету!
-
"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# же строго типизированный, поэтому дурацких ошибок в нем будет меньше.
-
Спасибо, Михаил, за решение! "Приведение типов" - мое спасение, а то, либо документ у меня не содержал ComponentDefinition, либо (когда тип документа пробовал сделать AssemblyDocument) не работал код "AssDoc=oApp.ActiveDocument", указывая на несоответствие типов.
П.С. Я почему-то был уверен, что VBA и C# должны работать аналогично, так как объектные модели одинаковые. Что VBA "додумывает" мне в голову не приходило! :) Еще раз благодарю!
-
... то перед приведением типов нужно сделать проверку типа:
if (oDoc.DocumentType==kAssemblyDocument) {тогда делать приведение типов}
Тема закрыта, но хотел отметить, что на такой синтаксис программа стала ругаться, может я что-то сделал не так? :(
Сработало в таком виде "if (oDoc.DocumentType == Inventor.DocumentTypeEnum.kAssemblyDocumentObject)"
-
Тема закрыта, но хотел отметить, что на такой синтаксис программа стала ругаться, может я что-то сделал не так?
:)
Ну потому, что:
1. перечисление kAssemblyDocumentObject находится в пространстве имен: Inventor
Если в самом вверху файла с кодом написать
using Inventor;
то слово Inventor можно пропустить
2. Я честно сказать писал по памяти, и пытался просто дать направление, что перед приведением типов нужно проверить тип документа.
Так, что ты все сделал так как надо.
-
Понял. Еще раз спасибо!