Можно ли узнать единицу измерения пользовательского параметра?

Автор Тема: Можно ли узнать единицу измерения пользовательского параметра?  (Прочитано 6196 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Доброго времени суток, уважаемые форумчане! Ищу вашей помощи в вопросе, указанном в теме:
У меня есть пользовательские параметры выраженные в "мм", градусах, и безразмерные. Могу ли я, обращаясь к параметру, узнать, какая у него единица измерения?
П.С. Это нужно, чтобы  поместить параметры в разные массивы для дальнейших манипуляций. Пока вручную их "фильтрую".
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Оно?
ModelParameter.Units
Спасибо, Михаил. Я уже пробовал, но что-то не выходит. Быть может вы поможете мне найти ошибку.
В VBA все работает:
Код - Visual Basic [Выбрать]
  1. Sub param_units()
  2.     Dim oCD As AssemblyComponentDefinition
  3.     Set oCD = ThisApplication.ActiveDocument.ComponentDefinition
  4.     Dim oParam As Parameter
  5.     Set oParam = oCD.Parameters.Item("test_param")
  6.     Dim str As String
  7.     str = oParam.Units
  8.     Debug.Print (str)
  9. End Sub

Но в C# вылетает ошибка. Во-первых, такого свойства (Units) в объектной модели в C# нет, вместо него есть "get_units" и "set_units".
Когда я пытаюсь использовать свойство get_units:
Код - C# [Выбрать]
  1. private void test_button_Click(object sender, EventArgs e)
  2.         {
  3.             Inventor.Parameter oParam = oParamS["test_param"];
  4.             string str = oParam.get_Units(); // в этой строке ошибка
  5.             Debug.WriteLine(str);
  6.         }
во второй строке вылетает ошибка (см. вложение)
Не могу разобраться в чем дело. По идее "get_Units" возвращает значение в формате string, и не должно быть никаких проблем. В общем буду признателен за любую идею.


В программировании я новичок...но ненадолго! ;)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не могу разобраться в чем дело. По идее "get_Units" возвращает значение в формате string, и не должно быть никаких проблем. В общем буду признателен за любую идею.
В сообщении об ошибке говорится, что такого метода нет.
Хотя судя по этой теме ты всё делаешь правильно: http://forums.autodesk.com/t5/inventor-customization/how-to-get-parameter-s-unit-in-c-net/td-p/4939786
Разве что oParam может быть null?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение R.I.Chernov 12-01-2017, 14:17:56

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Идея такая назначить опцию библиотеки инвентора "внедрить типы взаимодействия=false" (см. скрин.) и все должно заработать. Как пример:

Код - C# [Выбрать]
  1.   static void Main(string[] args)
  2.     {
  3.         InvApp = System.Runtime.InteropServices.Marshal.GetActiveObject("Inventor.Application") as Application;
  4.         PartDocument part = InvApp.ActiveDocument as PartDocument;
  5.         Parameter oParam = part.ComponentDefinition.Parameters["kkk"];
  6.         string str =  oParam.get_Units();
  7.         return;
  8.     }

А то что он ведет себя не как свойство, видимо баг библиотеки инвентора.

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Разве что oParam может быть null?
Да в том то и дело, что все ок. Если написать, например, "Debug.WriteLine(oParam.Name)" - имя параметра определяется корректно, то есть ссылка на параметр верная. В любом случае спасибо!
В программировании я новичок...но ненадолго! ;)

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Идея такая назначить опцию библиотеки инвентора "внедрить типы взаимодействия=false"
Спасибо, Михаил. Когда я меняю вышеуказанное значение на "false", перестает работать половина ранее написанного кода. :) Так что я даже не смог проверить, работает в принципе ваше решение или нет. Не могли бы пояснить, что мы  делаем, меня данное значение?
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
перестает работать половина ранее написанного кода.
так быть не должно. Наоборот когда True многие вещи могут не работать, например часть событий отваливается.
Эта вещь появилась в 4 фреймворке, и заставляет компилятор внедрять используемые COM-типы в выходной файл. Это что бы СОМ-библиотеки здоровенные за собой не таскать ради двух трех функций.
Собственно сам автодеск для инвентора требует что бы внедрение типов было False, потому как с True инвентор глючит. Так что очень странно что программа перестает работать. Может библиотека типов инвентора подцеплена от старого инвентора и нужно просто обновить Autodesk.Inventor.Interop
« Последнее редактирование: 09-01-2017, 07:33:47 от mikazakov »

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
так быть не должно.
Ну так как бы есть ))
Появилось время, покопался еще чуток. Из-за того, что было много аналогичных операций, сначала показалось, что половина кода сломалась )) При более внимательном рассмотрении оказалось,что  вся суть ошибок сводилась к необходимости дополнительного привидения типов в определенного вида операциях. Быть может кому-то пригодится, вот примеры операций, где была ошибка:

Код - C# [Выбрать]
  1. // здесь он не мог типу string присвоить значение типа object
  2. string TempID = App.ActiveDocument.PropertySets["Inventor User Defined Properties"][Usr_param].Value;
  3.  
  4. // здесь он не мог типу Inventor.PartDocument присвоить значение типа object
  5. static Inventor.PartDocument oDoc = oDerivedPtCompS[1].ReferencedDocumentDescriptor.ReferencedDocument;
  6.  
  7. // здесь просит привести левую часть сравнения к типу string
  8. if (oParamS["type"].Value == "25K2")

Михаил, если сможете, поясните пожалуйста, почему при изменении вышеуказанного параметра потребовалось привидение типов в местах, где раньше не требовалось? Может ли это быть связанным с тем. что библиотека у меня называется "Inventor", а не "Autodesk.Inventor.Interop", быть может я что-то не то подключил?

В итоге все вроде работает. Спасибо за помощь в решении!
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
потребовалось привидение типов в местах, где раньше не требовалось?
Дак собственно C# язык строго типизированный, и это правильно когда он требует от программиста приведение типов при использовании объектов типа Object или при расширяющем преобразовании при наследовании (например из Document в PartDocument) так что приведение типов это как раз корректная работа, а раньше просто С# глючил из-за внедренных COM-овских типов и не не требовал преобразований.
VB.NET по умолчанию типы сам пытается преобразовать, иногда это правда боком выходит во время выполнения программы и понять то не просто из-за чего баги прут.
Так что строгая типизация это хорошо. Кстати, VB.NET тоже можно настроить так, что он будет такой же требовательный к преобразованию типов как и C#.

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Ок, спасибо. А что насчет разного названия библиотек: "Inventor" и "Autodesk.Inventor.Interop"? Есть какие-то комментарии?
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Ок, спасибо. А что насчет разного названия библиотек: "Inventor" и "Autodesk.Inventor.Interop"? Есть какие-то комментарии?
COM-овская библиотека типов находится в фале RxInventor.tlb в папки с там где инвентор. Это все зарегестрированно в реестре винды. А Autodesk.Inventor.Interop - это NET-овская обертка этой COM-овской библиотеки типов. Autodesk.Inventor.Interop регистрации в реестре не подлежит и её можно просто переносить со своим проектом.
Но если инвентор стоит на компе, то эта библиотека уже есть в глобальном КЭШе Net-овских сборок. Её просто нужно там найти и указать на неё.
Но это не всегда легко сделать, трудно искать.
Как то был глюк, что в глобальном КЭШе сборок Autodesk.Inventor.Interop.dll не обновили.
Сейчас не знаю как там дела обстоят.

Поэтому Autodesk.Inventor.Interop лучше указать по адресу где находится инвентор:

C:\Program Files\Autodesk\Inventor 2016\Bin\Public Assemblies\Autodesk.Inventor.Interop.dll


Использование ссылки на COM-овскую библиотеку в чистом виде, для инвентор считается устаревшим. Я даже не уверен, что её обновляют.
Хотя в дальней перспективе NET тоже должен сдохнуть, т.к. это просто надстройка над растровым Win32.
И что там будет фиг его знает, оно с восьмой винды теперь WinRT называется, что то близкое к WPF. Окна инвентора уже похоже тоже на WPF переписали, что бы потом на WinRT проще было перейти.
Хотя Win32 пока подыхать не собирается, все равно на NET много пишут до сих пор.


P.S. Вот такая книжка по C# у меня дома:
http://www.ozon.ru/context/detail/id/135794222/
Она для тех кто уже, что то понимает но хочет знать больше, там и про Net-обертки есть. Так что рекомендую.
« Последнее редактирование: 13-01-2017, 07:48:23 от mikazakov »

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Спасибо, Михаил, за развернутый ответ!
В связи с тем, что я не до конца владею терминами, я таки уточню: правильно ли я понимаю. что ваша фраза
Использование ссылки на COM-овскую библиотеку в чистом виде, для инвентор считается устаревшим.
означает, что вы рекомендуете использовать Autodesk.Inventor.Interop.dll из папки инвентора.
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
что вы рекомендуете использовать Autodesk.Inventor.Interop.dll из папки инвентора.
Это Автодеск рекомендует, а я рекомендую книжку хорошую почитать  8).