C#. Как задать ссылку на сборку через проводник?

Автор Тема: C#. Как задать ссылку на сборку через проводник?  (Прочитано 9955 раз)

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

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

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

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

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
OpenFileDialog что-ли?

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
OpenFileDialog что-ли?
Спасибо, вроде похоже. А вы не могли бы привести какой-нубудь пример использования "OpenFileDialog'?
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
А вы не могли бы привести какой-нубудь пример использования "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.  

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Ну ведь хэлп же рулит:
Спасибо, Михаил. Но я почему-то не нашел в поиске объектного браузера инвентора данный класс, а откопал его в "System.Windows.Forms". Поэтому в хелпе и не пытался искать. Сейчас буду разбираться.
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Но я почему-то не нашел в поиске объектного браузера инвентора данный класс
Ну это потому что такой динамический объект создается через метод:
Код - C# [Выбрать]
  1. oApp.CreateFileDialog(out(oFileDlg));
  2.  
Вот его там и нет в объектном браузере у Applicatioon.

а откопал его в "System.Windows.Forms"
Это конечно хорошо, но только там в System.Windows.Forms нет путей поиска в верхнем левом углу, как у родного окна, а без них не удобно.

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Ну это потому что такой динамический объект создается через метод:
Я вероятно двусмысленно выразился. Я не нашел его в инвенторе до того, как задал вопрос. Не знаю, как я смог так накосячить. После вашего примера из хелпа, разумеется я  его откопал. Сижу разбираюсь. Еще раз спс.
В программировании я новичок...но ненадолго! ;)

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

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

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
как отследить, что пользователь в открывшемся окне не выбрал ничего, чтобы код дальше не выполнять?
Ну дак если хэлп посмотреть, там свойство есть
FileDialog.FileName Property
Вот если после закрытия окна равно пустой строке, значит юзер ничего и не выбрал, просто нажал Esc и все.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
П.С. Свойство FileDialog.InsertMode?
Это свойство чтобы окно имело вида не для открытия документа, а для вставки компонента в сборку. Внешний вид у этих окон немножко отличается.

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
FileDialog.FileName Property
Вот если после закрытия окна равно пустой строке, значит юзер ничего и не выбрал, просто нажал Esc и все.

Ага, спасибо, не додумался. Михаил, подскажите пожалуйста, как с помощью свойства FileDialog.FileName задать ссылку на сборку? Ну в смысле как, зная путь документа инвентора создать на него ссылку? То ли не делал так никогда, то ли склероз - пол дня ковыряюсь уже, но ничего не выходит.
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Ну в смысле как, зная путь документа инвентора создать на него ссылку?
В смысле создать ссылку? Ссылки разные бывают в разных местах.

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
В смысле создать ссылку? Ссылки разные бывают в разных местах.
Извиняюсь за кривословие. Я хочу создать объект типа Inventor.AssambleyDocument и присвоить ему ссытку на объект, которые выирает пользователь в "FileDialog". Как я понимаю, делается это с помошью пути в свойстве FileDialog.FileName. Или я ошибаюсь?
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Как я понимаю, делается это с помошью пути в свойстве FileDialog.FileName.
Не понятно где оно делается, потому как на задание свойства FileDialog.FileName не реагирует. Так же в реестре есть ключи со свойствами, но там информация обновляется только после закрытия инвентора.
Поэтому видимо где то в переменной внутри инвентора последний выбранный файл запоминается.


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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Не понятно где оно делается
Хмм... Я почему-то был уверен, что есть команда, с помощью которой, зная путь к файлу сборки на компьютере, можно было бы установить ссылку на него. Ну в смысле из свойства FileDialog.FileName выковырнуть путь файлу, и потом им воспользоваться.
В программировании я новичок...но ненадолго! ;)

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

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

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
как инвентор может считывать параметры с еще не подгруженного файла?
Дак ApprenticeServer может считывать данные с не открытого файла, причем очень быстро. В хэлпе инфа есть. Можно юзать интерфейс IStorage из Win32, но это по сложнее немного, но IStorage может читать с файла все что угодно.

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Дак 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", тоже не дало результата.
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Также пробовал добавлять "oDoc.Close", тоже не дало результата.
А это как то мешает работе, что документ показывается подгруженным?
Возможно, инвентор удерживает его для обеспечения транзакций.

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

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

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

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Спасибо, Михаил, получилось.

с аргументом 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
В программировании я новичок...но ненадолго! ;)

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
В итоге выходит, что нужный документ закрыть не получается, а закрывать все разом - не удобно. В общем решил не связываться с "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
В программировании я новичок...но ненадолго! ;)

Отмечено как Решение R.I.Chernov 01-02-2017, 16:32:42

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
После двух недель обсуждения хочу вернуться к изначальному вопросу данного топика "Как задать ссылку на сборку через проводник?".
Ниже приведу код для 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.         }
« Последнее редактирование: 01-02-2017, 20:27:03 от R.I.Chernov »
В программировании я новичок...но ненадолго! ;)