Сообщество программистов Autodesk в СНГ

ADN Club => Inventor API => Тема начата: R.I.Chernov от 16-01-2017, 23:56:36

Название: C#. Как задать ссылку на сборку через проводник?
Отправлено: R.I.Chernov от 16-01-2017, 23:56:36
Доброго времени суток, уважаемые форумчане! Ищу вашей помощи в решении такой вот задачи:
У меня есть два узла (две сборочные единицы), которые стыкуются между собой. Идея в том, что некоторые параметры в узлах (в месте их соединения) идентичны. Для того чтобы пользователь не вводил одни и те же цифры два раза, требуется реализовать операцию, что-то вроде"укажите сборку для считывания данных". Должно открываться окно проводника, где человек указывает, где на компьютере лежит сборка (данные в которой он уже заполнил), и программа оттуда берет необходимые параметры для импорта во вторую сборку. Не подскажите, как это делается, или хотя бы что гуглить?
Название: Re: C#. Как задать ссылку на сборку через проводник?
Отправлено: Дима_ от 17-01-2017, 09:27:40
OpenFileDialog что-ли?
Название: Re: C#. Как задать ссылку на сборку через проводник?
Отправлено: R.I.Chernov от 17-01-2017, 18:12:08
OpenFileDialog что-ли?
Спасибо, вроде похоже. А вы не могли бы привести какой-нубудь пример использования "OpenFileDialog'?
Название: Re: C#. Как задать ссылку на сборку через проводник?
Отправлено: mikazakov от 17-01-2017, 18:16:48
А вы не могли бы привести какой-нубудь пример использования "OpenFileDialog'?
Ну ведь хэлп же рулит:

Код - C# [Выбрать]
  1. public void TestFileDialog()
  2. {
  3.     Application oApp = ThisApplication;
  4.  
  5.     // Create a new FileDialog object.
  6.     FileDialog oFileDlg;
  7.     oApp.CreateFileDialog(out(oFileDlg));
  8.  
  9.     // Define the filter to select part and assembly files or any file.
  10.     oFileDlg.Filter = "Inventor Files (*.iam;*.ipt)|*.iam;*.ipt|All Files (*.*)|*.*";
  11.  
  12.     // Define the part and assembly files filter to be the default filter.
  13.     oFileDlg.FilterIndex = 1;
  14.  
  15.     // Set the title for the dialog.
  16.     oFileDlg.DialogTitle = "Open File Test";
  17.  
  18.     // Set the initial directory that will be displayed in the dialog.
  19.     oFileDlg.InitialDirectory = "C:/Temp";
  20.  
  21.     // Set the flag so an error will not be raised if the user clicks the Cancel button.
  22.     oFileDlg.CancelError = false;
  23.  
  24.     // Show the open dialog.  The same procedure is also used for the Save dialog.
  25.     // The commented code can be used for the Save dialog.
  26.     oFileDlg.ShowOpen();
  27.     // oFileDlg.ShowSave();
  28.  
  29.     System.Windows.Forms.MessageBox.Show("File " + oFileDlg.FileName + " was selected.", "Selected file");
  30. }
  31.  
  32.  
Название: Re: C#. Как задать ссылку на сборку через проводник?
Отправлено: R.I.Chernov от 18-01-2017, 11:22:05
Ну ведь хэлп же рулит:
Спасибо, Михаил. Но я почему-то не нашел в поиске объектного браузера инвентора данный класс, а откопал его в "System.Windows.Forms". Поэтому в хелпе и не пытался искать. Сейчас буду разбираться.
Название: Re: C#. Как задать ссылку на сборку через проводник?
Отправлено: mikazakov от 18-01-2017, 11:32:03
Но я почему-то не нашел в поиске объектного браузера инвентора данный класс
Ну это потому что такой динамический объект создается через метод:
Код - C# [Выбрать]
  1. oApp.CreateFileDialog(out(oFileDlg));
  2.  
Вот его там и нет в объектном браузере у Applicatioon.

а откопал его в "System.Windows.Forms"
Это конечно хорошо, но только там в System.Windows.Forms нет путей поиска в верхнем левом углу, как у родного окна, а без них не удобно.
Название: Re: C#. Как задать ссылку на сборку через проводник?
Отправлено: R.I.Chernov от 18-01-2017, 11:35:04
Ну это потому что такой динамический объект создается через метод:
Я вероятно двусмысленно выразился. Я не нашел его в инвенторе до того, как задал вопрос. Не знаю, как я смог так накосячить. После вашего примера из хелпа, разумеется я  его откопал. Сижу разбираюсь. Еще раз спс.
Название: Re: C#. Как задать ссылку на сборку через проводник?
Отправлено: R.I.Chernov от 18-01-2017, 15:40:58
Михаил, а не подскажете, как отследить, что пользователь в открывшемся окне не выбрал ничего, чтобы код дальше не выполнять?
П.С. Свойство FileDialog.InsertMode?
Название: Re: C#. Как задать ссылку на сборку через проводник?
Отправлено: mikazakov от 18-01-2017, 20:26:00
как отследить, что пользователь в открывшемся окне не выбрал ничего, чтобы код дальше не выполнять?
Ну дак если хэлп посмотреть, там свойство есть
FileDialog.FileName Property
Вот если после закрытия окна равно пустой строке, значит юзер ничего и не выбрал, просто нажал Esc и все.
Название: Re: C#. Как задать ссылку на сборку через проводник?
Отправлено: mikazakov от 19-01-2017, 06:13:11
П.С. Свойство FileDialog.InsertMode?
Это свойство чтобы окно имело вида не для открытия документа, а для вставки компонента в сборку. Внешний вид у этих окон немножко отличается.
Название: Re: C#. Как задать ссылку на сборку через проводник?
Отправлено: R.I.Chernov от 19-01-2017, 12:59:24
FileDialog.FileName Property
Вот если после закрытия окна равно пустой строке, значит юзер ничего и не выбрал, просто нажал Esc и все.

Ага, спасибо, не додумался. Михаил, подскажите пожалуйста, как с помощью свойства FileDialog.FileName задать ссылку на сборку? Ну в смысле как, зная путь документа инвентора создать на него ссылку? То ли не делал так никогда, то ли склероз - пол дня ковыряюсь уже, но ничего не выходит.
Название: Re: C#. Как задать ссылку на сборку через проводник?
Отправлено: mikazakov от 19-01-2017, 13:23:11
Ну в смысле как, зная путь документа инвентора создать на него ссылку?
В смысле создать ссылку? Ссылки разные бывают в разных местах.
Название: Re: C#. Как задать ссылку на сборку через проводник?
Отправлено: R.I.Chernov от 19-01-2017, 16:14:55
В смысле создать ссылку? Ссылки разные бывают в разных местах.
Извиняюсь за кривословие. Я хочу создать объект типа Inventor.AssambleyDocument и присвоить ему ссытку на объект, которые выирает пользователь в "FileDialog". Как я понимаю, делается это с помошью пути в свойстве FileDialog.FileName. Или я ошибаюсь?
Название: Re: C#. Как задать ссылку на сборку через проводник?
Отправлено: mikazakov от 22-01-2017, 12:33:54
Как я понимаю, делается это с помошью пути в свойстве FileDialog.FileName.
Не понятно где оно делается, потому как на задание свойства FileDialog.FileName не реагирует. Так же в реестре есть ключи со свойствами, но там информация обновляется только после закрытия инвентора.
Поэтому видимо где то в переменной внутри инвентора последний выбранный файл запоминается.

Название: Re: C#. Как задать ссылку на сборку через проводник?
Отправлено: R.I.Chernov от 22-01-2017, 12:58:53
Не понятно где оно делается
Хмм... Я почему-то был уверен, что есть команда, с помощью которой, зная путь к файлу сборки на компьютере, можно было бы установить ссылку на него. Ну в смысле из свойства FileDialog.FileName выковырнуть путь файлу, и потом им воспользоваться.
Название: Re: C#. Как задать ссылку на сборку через проводник?
Отправлено: R.I.Chernov от 22-01-2017, 13:13:27
Хотя с другой стороны, как инвентор может считывать параметры с еще не подгруженного файла? И поэтому нельзя на него ссылку сделать "заочно"? Может тогда стоит открывать файл с помощью пути из FileDialog.FileName, создавать ссылку, считывать все необходимые параметры и закрывать? Так наверно сейчас и попробую.
Название: Re: C#. Как задать ссылку на сборку через проводник?
Отправлено: mikazakov от 22-01-2017, 13:23:12
как инвентор может считывать параметры с еще не подгруженного файла?
Дак ApprenticeServer может считывать данные с не открытого файла, причем очень быстро. В хэлпе инфа есть. Можно юзать интерфейс IStorage из Win32, но это по сложнее немного, но IStorage может читать с файла все что угодно.
Название: Re: C#. Как задать ссылку на сборку через проводник?
Отправлено: R.I.Chernov от 30-01-2017, 16:12:52
Дак ApprenticeServer может считывать данные с не открытого файла
Спасибо, Михаил, за "наводку". Покопался в объектном браузере и хелпе, получился такой вот код:
Код - Visual Basic [Выбрать]
  1. Sub ApprServ_1()
  2.     Dim invApprentice As New Inventor.ApprenticeServerComponent
  3.     Dim invDoc As Inventor.ApprenticeServerDocument
  4.     Set invDoc = invApprentice.Open("D:\Vault\test_asm.iam")
  5.    
  6.     Dim oDoc As Inventor.Document
  7.     Set oDoc = invDoc
  8.     Dim oCD As AssemblyComponentDefinition
  9.    
  10.     Set oCD = oDoc.ComponentDefinition
  11.     Debug.Print oCD.Parameters.Item("param").Value
  12.     oCD.Parameters.Item("param").Value = (oCD.Parameters.Item("param").Value * 10 + 1) / 10
  13.     Debug.Print oCD.Parameters.Item("param").Value
  14. '    oDoc.Save
  15.    
  16.     Set invDoc = Nothing
  17.     Call invApprentice.Close
  18.     Set invApprentice = Nothing
  19. End Sub

Проблема в итоге такая: Последние три строчки я стащил из примера хелпа. Как я понимаю, они должны "выгружать файл" из памяти программы. Но этого не происходит. Если запустить код на "голом инвенторе", ну в смысле не открыт ни один файл, то в нижнем правом углу количество подгруженных файлов сменится с нуля на единицу, и по завершении когда не обнулится. Помогите пожалуйста разобраться, где ошибка, или чего я не понимаю?
П.С. Также пробовал добавляь "oDoc.Close", тоже не дало результата.
Название: Re: C#. Как задать ссылку на сборку через проводник?
Отправлено: mikazakov от 30-01-2017, 20:10:56
Также пробовал добавлять "oDoc.Close", тоже не дало результата.
А это как то мешает работе, что документ показывается подгруженным?
Возможно, инвентор удерживает его для обеспечения транзакций.

Но в хелпе написано так: нужно попробовать
 
Documents.CloseAll( [UnreferencedOnпly] As Boolean )

с аргументом true:

Documents.CloseAll(True)
тогда должны выгрузится все закрытые документы.
Название: Re: C#. Как задать ссылку на сборку через проводник?
Отправлено: R.I.Chernov от 01-02-2017, 13:52:01
Спасибо, Михаил, получилось.

с аргументом true:
Documents.CloseAll(True)
тогда должны выгрузится все закрытые документы.

Аргумент true в итоге не работает. Не разобрался почему, но документ из моего примера он  закрывает только с агрументом "False".
Может потому что я создаю объект и присваиваю ему ссылку:
Код - Visual Basic [Выбрать]
  1. Dim oDoc As Inventor.Document
  2. Set oDoc = invDoc

В итоге такой вот код получился:
Код - Visual Basic [Выбрать]
  1. Sub ApprServ_2()
  2.     Dim invApprentice As New Inventor.ApprenticeServerComponent
  3.     Dim invDoc As Inventor.ApprenticeServerDocument
  4.     Set invDoc = invApprentice.Open("D:\Vault\test_asm.iam")
  5.     Dim oDoc As Inventor.Document
  6.     Set oDoc = invDoc
  7.     Dim oCD As AssemblyComponentDefinition
  8.     Set oCD = oDoc.ComponentDefinition
  9.     oCD.Parameters.Item("param").Value = (oCD.Parameters.Item("param").Value * 10 + 1) / 10
  10.     oDoc.Save
  11.     ThisApplication.Documents.CloseAll (False)
  12. End Sub
Название: Re: C#. Как задать ссылку на сборку через проводник?
Отправлено: R.I.Chernov от 01-02-2017, 15:34:44
В итоге выходит, что нужный документ закрыть не получается, а закрывать все разом - не удобно. В общем решил не связываться с "ApprenticeServerComponent", так как проще открыть документ в фоновом режиме:
Код - Visual Basic [Выбрать]
  1. Sub ApprServ_4()
  2.     Dim FileName As String
  3.     FileName = "D:\Vault\test_asm.iam"    
  4.     Dim oDoc As Inventor.Document
  5.     Set oDoc = ThisApplication.Documents.Open(FileName, False)
  6.     Dim oCD As AssemblyComponentDefinition
  7.     Set oCD = oDoc.ComponentDefinition    
  8.     oCD.Parameters.Item("param").Value = (oCD.Parameters.Item("param").Value * 10 + 1) / 10
  9.     oDoc.Save
  10.     oDoc.Close
  11. End Sub
Название: Re: C#. Как задать ссылку на сборку через проводник?
Отправлено: R.I.Chernov от 01-02-2017, 16:32:27
После двух недель обсуждения хочу вернуться к изначальному вопросу данного топика "Как задать ссылку на сборку через проводник?".
Ниже приведу код для VBA и C#, который у меня получился (без проверок корректности выбора пользователя). Я отмечу данное сообщение решением, но, разумеется, львиная его доля была найдена не мной, а Михаилом Казаковым, за что ему большое человеческое спасибо! Надеюсь данный код еще кому-нибудь пригодится!
Код - Visual Basic [Выбрать]
  1. Sub FDialog()
  2.     Dim oFileDlg As Inventor.FileDialog
  3.     Call ThisApplication.CreateFileDialog(oFileDlg)
  4.         With oFileDlg
  5.             .Filter = "Сборку, сами знаете какую|*.iam;"
  6.             .DialogTitle = "Откройте ..."
  7.             .InitialDirectory = ThisApplication.DesignProjectManager.ActiveDesignProject.WorkspacePath
  8.             .ShowOpen
  9.         End With
  10.         If oFileDlg.FileName = "" Then Exit Sub
  11.    
  12.     Dim oDoc As Inventor.Document
  13.     Set oDoc = ThisApplication.Documents.Open(oFileDlg.FileName, False)
  14.     Dim oCD As AssemblyComponentDefinition
  15.     Set oCD = oDoc.ComponentDefinition
  16.     oCD.Parameters.Item("param").Value = (oCD.Parameters.Item("param").Value * 10 + 1) / 10
  17.     oDoc.Save
  18.     oDoc.Close
  19. End Sub

Код - C# [Выбрать]
  1. private void FDialog()
  2.         {
  3.             Inventor.FileDialog oFileDlg;
  4.             oApp.CreateFileDialog(out (oFileDlg));
  5.             oFileDlg.Filter = "Сборку,сами знаете какую|*.iam;";
  6.             oFileDlg.DialogTitle = "Откройте...";
  7.             string WSpace = oApp.DesignProjectManager.ActiveDesignProject.WorkspacePath;
  8.             oFileDlg.InitialDirectory = WSpace;
  9.             oFileDlg.ShowOpen();
  10.             if (oFileDlg.FileName == "") return;
  11.  
  12.             Inventor.AssemblyDocument tmp_oDoc = (Inventor.AssemblyDocument) oApp.Documents.Open(oFileDlg.FileName,false);
  13.             Inventor.AssemblyComponentDefinition tmp_oCD = tmp_oDoc.ComponentDefinition;
  14.             tmp_oCD.Parameters["param"].Value = ((double)tmp_oCD.Parameters["param"].Value * 10 + 1) / 10;
  15.             tmp_oDoc.Save();
  16.             tmp_oDoc.Close();
  17.         }