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

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

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

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