Перестал работать импорт SAT файлов через API

Автор Тема: Перестал работать импорт SAT файлов через API  (Прочитано 14297 раз)

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

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

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

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Думаю что тебе следует переадресовать этот вопрос в ADN DevHelp - возможно это баг Inventor.
ну если приведенный мной код Vladislav подтвердит, то я так и сделаю.

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

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

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

  • ADN OPEN
  • ***
  • Сообщений: 210
  • Карма: 0
Да, код воспроизведен верно.
У Вас тоже падение Инвентор на файлах Stapler-1 и Stapler-2?
И нормально работает на других?

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
У Вас тоже падение Инвентор на файлах Stapler-1 и Stapler-2?
И нормально работает на других?
Да,
написал в тех. поддержку. Но даже если поправят глюк то не скоро.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
У Вас тоже падение Инвентор на файлах Stapler-1 и Stapler-2?
И нормально работает на других?
Да,
написал в тех. поддержку. Но даже если поправят глюк то не скоро.
Возможно найдут workaround для данного случая, так как через интерфейс эти файлы нормально импортируются.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 210
  • Карма: 0
Спасибо.
Тогда сообщите пожалуйста о результате.
А нет ли каких-то альтернативных (по отношению к приведенному коду)
путей импорта или вставки SAT-файла в деталь или сборку через API?

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
А нет ли каких-то альтернативных (по отношению к приведенному коду)
путей импорта или вставки SAT-файла в деталь или сборку через API?
Порылся в хэлпе и нашел еще два способа импорта. Через использования транслятора и через DataIO.  На скрине, внизу сообщения, я нарисовал как можно посмотреть дополнительную инфу.

Попробовал импортировать через транслятор, вроде импортирует. Там только нужно нужные опции подобрать при трансляции из хелпа со страницы Translator Options

Код - Visual Basic [Выбрать]
  1. Sub ImportSATFunc()
  2.     ' Set SAT translator's CLSID and STL file name.
  3.    Dim strCLSID As String
  4.     Dim strFileName As String
  5.     strCLSld = "{89162634-02B6-11D5-8E80-0010B541CD80}"
  6.     strFileName = "D:\Stapler-1.SAT"
  7.      
  8.     Dim oAddIns As ApplicationAddIns
  9.     Set oAddIns = ThisApplication.ApplicationAddIns
  10.    
  11.     ' Find the SAT translator, get the CLSID and activate it.
  12.    Dim oTransAddIn As TranslatorAddIn
  13.     Set oTransAddIn = oAddIns.ItemById(strCLSld)
  14.     'oTransAddIn.Activate
  15.    
  16.     ' Get the transient object and take it as a factory to produce other objects
  17.    Dim transientObj As TransientObjects
  18.     Set transientObj = ThisApplication.TransientObjects
  19.    
  20.     ' Prepare the first parameter for Open(), the file name
  21.    Dim file As DataMedium
  22.     Set file = transientObj.CreateDataMedium
  23.     file.FileName = strFileName
  24.    
  25.     ' Prepare the second parameter for Open(), the open type.
  26.    Dim context As TranslationContext
  27.     Set context = transientObj.CreateTranslationContext
  28.     context.Type = kDataDropIOMechanism
  29.    
  30.     ' Prepare the 3rd parameter for Open(), the options.
  31.    Dim options As NameValueMap
  32.     Set options = transientObj.CreateNameValueMap
  33.     options.Value("SaveComponentDuringLoad") = False
  34.     options.Value("SaveLocationIndex") = 0
  35.     options.Value("ComponentDestFolder") = ""
  36.     options.Value("ImportUnit") = 1
  37.     options.Value("ImportColor") = True
  38.     options.Value("ImportColorIndex") = 0
  39.    
  40.     ' Prepare the fourth parameter for Open(), the final document.
  41.    Dim sourceObj As Object
  42.    
  43.     ' Open the SAT file.
  44.    oTransAddIn.Open file, context, options, sourceObj
  45. End Sub




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

  • ADN OPEN
  • ***
  • Сообщений: 210
  • Карма: 0
Большое спасибо.
А sourceObj должен представлять собой AssemblyDocument или PartDocument?
Или как его вставлять далее в модель?
Благодарю за информацию.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
А sourceObj должен представлять собой AssemblyDocument или PartDocument?
Ну в этом нетрудно убедится просто потестив код.

Или как его вставлять далее в модель?
копируем в буфер обмена, берем нужную сборку и вставляем туда, пример из хэлпа правда для скетча

Код - Visual Basic [Выбрать]
  1. Public Sub CopySketch()
  2.     ' Set a reference to the active document.
  3.    ' This assumes a part document is active.
  4.    Dim oDoc As PartDocument
  5.     Set oDoc = ThisApplication.ActiveDocument
  6.    
  7.     ' Set a reference to the component definition.
  8.    Dim oDef As PartComponentDefinition
  9.     Set oDef = oDoc.ComponentDefinition
  10.    
  11.     ' Set a reference to the first sketch in the part.
  12.    Dim oSketchToCopy As PlanarSketch
  13.     Set oSketchToCopy = oDef.Sketches.Item(1)
  14.    
  15.     ' Select the sketch to copy.
  16.    Call oDoc.SelectSet.Clear
  17.     Call oDoc.SelectSet.Select(oSketchToCopy)
  18.    
  19.     ' Execute the copy command.
  20.    Dim oCopyControlDef As ControlDefinition
  21.     Set oCopyControlDef = ThisApplication.CommandManager.ControlDefinitions.Item("AppCopyCmd")
  22.     oCopyControlDef.Execute
  23.    
  24.     ' Create a new sketch on the XY plane.
  25.    Dim oNewSketch As PlanarSketch
  26.     Set oNewSketch = oDef.Sketches.Add(oDef.WorkPlanes.Item(3))
  27.    
  28.     ' Put the sketch in edit mode.
  29.    oNewSketch.Edit
  30.    
  31.     ' Execute the paste command.
  32.    Dim oPasteControlDef As ControlDefinition
  33.     Set oPasteControlDef = ThisApplication.CommandManager.ControlDefinitions.Item("AppPasteCmd")
  34.     oPasteControlDef.Execute
  35.    
  36.     Dim oSketchEnts As ObjectCollection
  37.     Set oSketchEnts = ThisApplication.TransientObjects.CreateObjectCollection
  38.    
  39.     Dim oSketchEnt As SketchEntity
  40.     For Each oSketchEnt In oNewSketch.SketchEntities
  41.         Call oSketchEnts.Add(oSketchEnt)
  42.     Next
  43.    
  44.     ' Translate all sketch entities in the new sketch.
  45.    Call oNewSketch.MoveSketchObjects(oSketchEnts, ThisApplication.TransientGeometry.CreateVector2d(1, 0))
  46. End Sub

По описанию хэлпа с буфером можно работать через CommandManager.PostPrivateEvent

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

  • ADN OPEN
  • ***
  • Сообщений: 210
  • Карма: 0
Почему-то у меня при импорте создается файл Stapler-1.ipt.
Но он пустой...
Соответственно, если я выполняю код
Код - C# [Выбрать]
  1.             doc.SelectSet.Clear();
  2.             doc.SelectSet.Select(sourceObj);
  3.  
  4.             //Execute the copy command.    
  5.             ControlDefinition oCopyControlDef = m_inventorApplication.CommandManager.ControlDefinitions["AppCopyCmd"];
  6.             oCopyControlDef.Execute();
  7.  
  8.             //Execute the paste command.    
  9.             ControlDefinition oPasteControlDef = m_inventorApplication.CommandManager.ControlDefinitions["AppPasteCmd"];
  10.             oPasteControlDef.Execute();
тоже ничего не происходит.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
тоже ничего не происходит.
Вот на этом макросе в инвенторе 2021 все нормально копируется:
Код - Visual Basic [Выбрать]
  1. Sub cc()
  2. Dim doc As Document: Set doc = ThisApplication.ActiveDocument
  3.  
  4.     'Execute the copy command.
  5.     Dim oCopyControlDef As ControlDefinition: Set oCopyControlDef = ThisApplication.CommandManager.ControlDefinitions("AppCopyCmd")
  6.      oCopyControlDef.Execute
  7.  
  8.      'Execute the paste command.
  9.     Dim oPasteControlDef As ControlDefinition: Set oPasteControlDef = ThisApplication.CommandManager.ControlDefinitions("AppPasteCmd")
  10.      oPasteControlDef.Execute
  11. End Sub
  12.  




Может просто одна модель точно легла на другую и её не видно?

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

  • ADN OPEN
  • ***
  • Сообщений: 210
  • Карма: 0
Что-то я совсем запутался... :-\
Я правильно понимаю, что при выполнении этого кода
должен создаваться ipt-файл, в котором должна появиться импортированная sat-модель?
Код - C# [Выбрать]
  1.             String strCLSID = "";
  2.             String strFileName = "";
  3.             strCLSID = "{89162634-02B6-11D5-8E80-0010B541CD80}";
  4.             strFileName = "C:\\Users\\Владислав\\Desktop\\Новая папка (2)\\Stapler-1.SAT";
  5.  
  6.             ApplicationAddIns oAddIns = m_inventorApplication.ApplicationAddIns;
  7.             TranslatorAddIn oTransAddIn = oAddIns.ItemById[strCLSID] as TranslatorAddIn;
  8.  
  9.             TransientObjects transientObj = m_inventorApplication.TransientObjects;
  10.  
  11.             DataMedium file = transientObj.CreateDataMedium();
  12.             file.FileName = strFileName;
  13.  
  14.             //Prepare the second parameter for Open(), the open type.    
  15.             TranslationContext context = transientObj.CreateTranslationContext();
  16.             context.Type = IOMechanismEnum.kDataDropIOMechanism;
  17.  
  18.             //Prepare the 3rd parameter for Open(), the options.    
  19.             NameValueMap options = transientObj.CreateNameValueMap();
  20.             options.Value["SaveComponentDuringLoad"] = false;
  21.             options.Value["SaveLocationIndex"] = 0;
  22.             options.Value["ComponentDestFolder"] = "";
  23.             options.Value["ImportUnit"] = 1;
  24.             options.Value["ImportColor"] = true;
  25.             options.Value["ImportColorIndex"] = 0;
  26.  
  27.             // Prepare the fourth parameter for Open(), the final document.
  28.             Object sourceObj;
  29.  
  30.             //Open the SAT file.
  31.             oTransAddIn.Open(file, context, options, out sourceObj);

В моем случае сам файл создается, но он пуст. И в Inventor 2019, и в Inventor 2021...

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

  • ADN OPEN
  • ***
  • Сообщений: 210
  • Карма: 0
Почему-то, если путь к файлу содержит русские буквы, то не импортирует.
Если файл, например, просто на диске C:\, то все ОК.
Что-то с кодировкой? Или в чем может быть проблема?
Отчет об импорте прилагаю.
Путь к файлу указываю в коде напрямую. Он
такой:
Код - C# [Выбрать]
  1. strFileName = "C:\\Users\\Владислав\\Desktop\\Новая папка (2)\\Stapler-1.SAT";
Спасибо.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Почему-то, если путь к файлу содержит русские буквы, то не импортирует.
Вполне возможно. Это частая проблема со многим ПО, и не только, Autodesk.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение