Как написать viewer?

Автор Тема: Как написать viewer?  (Прочитано 10467 раз)

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

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

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

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Как написать viewer?
« : 31-05-2016, 10:07:13 »
Казалось, что ничего сложного... Код простой до безобразия:
Код - vb.net [Выбрать]
  1. Imports System
  2. Imports System.IO
  3. Imports System.Windows.Forms
  4. Imports Inventor
  5. Imports System.Drawing
  6.  
  7. Public Class Form1
  8.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  9.         Dim oName As String = "C:\1.ipt"
  10.         Dim oApprentice As ApprenticeServerComponent
  11.         oApprentice = New ApprenticeServerComponent
  12.         Dim oDoc As ApprenticeServerDocument
  13.         oDoc = oApprentice.Open(oName)
  14.         Dim oPropSet As PropertySet
  15.         Dim oProp As [Property]
  16.         oPropSet = oDoc.PropertySets.Item("Design Tracking Properties") ' {32853F0F-3444-11D1-9E93-0060B03C1CA6}
  17.         oProp = oPropSet.Item("Part Number")
  18.         Label1.Text = oProp.Value
  19.         Dim oClientView As ClientView
  20.         oClientView = oDoc.ClientViews.Add(PictureBox1.Handle)
  21.         Dim oCamera As Camera
  22.         oCamera = oClientView.Camera
  23.         oCamera.ViewOrientationType = ViewOrientationTypeEnum.kBottomViewOrientation
  24.         oCamera.Perspective = True
  25.         oCamera.Apply()
  26.         oClientView.Update(False)
  27.         PictureBox1.Refresh()
  28.     End Sub
  29. End Class
(я сейчас не учитываю обработку событий кнопок и мыши).
А в результате PictureBox1 остается пустым!? Какие тут еще могут быть подводные камни?
Для PictureBox1.Handle пробовал приведение значения к ToInt32 и к ToInt64 - результата никакого.

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как написать viewer?
« Ответ #1 : 31-05-2016, 13:54:23 »
Может тебе нужен для этой цели InventorViewControl? Например, http://adndevblog.typepad.com/manufacturing/2013/08/use-inventorviewcontrol-to-print.html
Если Inventor 2015, то http://adndevblog.typepad.com/manufacturing/2014/09/inventorviewctrlocx-2015-not-displaying-inventor-files.html
Ну и про необходимость зарегистрировать этот контрол: http://adndevblog.typepad.com/manufacturing/2012/05/inventor-view-control-is-not-registered-on-inventor-2012.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как написать viewer?
« Ответ #2 : 31-05-2016, 16:52:12 »
А здесь готовый пример на C#: https://github.com/adamenagy/InventorView-FileDisplay-.NET-4.0
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение filat 09-06-2016, 14:00:52

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Как написать viewer?
« Ответ #3 : 07-06-2016, 20:58:23 »
А в результате PictureBox1 остается пустым!? Какие тут еще могут быть подводные камни?
Ну Автодеск камней подводных всегда наворотить успеет. Вот и наворотили с 2015-ого похоже.
Не спрашивай сколько я времени потратил, что бы найти решение этой траблы.
Проблема в переменной среды, которую нужно переопределить в процедуре AddInventorPath().
Эту переменную среды так же можно переопределить и в самой винде.

И филат, привыкай использовать конструкторы классов Public Sub New, а не события загрузки формы OnLoad


Код - vb.net [Выбрать]
  1. Imports System.Windows.Forms
  2. Imports Inventor
  3.  
  4. Public Class Form1
  5.  
  6.     Private oDoc As ApprenticeServerDocument
  7.     Private oClientView As ClientView
  8.     Private oApprentice As ApprenticeServerComponent
  9.     Private oCamera As Camera
  10.  
  11.     Public Sub New()
  12.         ' Этот вызов является обязательным для конструктора.
  13.         InitializeComponent()
  14.  
  15.         ' Добавить код инициализации после вызова InitializeComponent().
  16.         oApprentice = New ApprenticeServerComponent
  17.         AddInventorPath()
  18.  
  19.     End Sub
  20.  
  21.     Public Sub AddInventorPath()
  22.  
  23.         Dim path As String = System.Environment.GetEnvironmentVariable("PATH")
  24.         Dim inventorPath As String = oApprentice.InstallPath
  25.         path &= ";" & inventorPath & "Bin"
  26.  
  27.         System.Environment.SetEnvironmentVariable("PATH", path)
  28.     End Sub
  29.  
  30.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  31.         Dim oName As String = "C:\Users\Pater\Documents\Part3.ipt"
  32.  
  33.         oDoc = oApprentice.Open(oName)
  34.  
  35.         oClientView = oDoc.ClientViews.Add(PictureBox1.Handle.ToInt32())
  36.         oCamera = oClientView.Camera
  37.         oCamera.ViewOrientationType = ViewOrientationTypeEnum.kIsoTopRightViewOrientation
  38.         oCamera.Fit()
  39.  
  40.         oCamera.Perspective = True
  41.  
  42.         oCamera.Apply()
  43.         oClientView.Update(False)
  44.         'PictureBox1.Image.Save("D:\111.png")
  45.     End Sub
  46.  
  47.  
  48. End Class

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как написать viewer?
« Ответ #4 : 07-06-2016, 23:32:36 »
mikazakov
В ссылке, которую я приводил выше как раз про добавление путей доступа Inventor (http://adndevblog.typepad.com/manufacturing/2014/09/inventorviewctrlocx-2015-not-displaying-inventor-files.html) :
Цитировать
The problem can be resolved by adding a folder to the path in the system Environment Variables. The path depends on what OS your application is running on and the bitness of your application...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как написать viewer?
« Ответ #5 : 07-06-2016, 23:54:08 »
mikazakov
Кстати, в твоём коде добавление пути доступа к Inventor будет происходить при каждом запуске вьювера. Не думаю, что это правильно, т.к. и длина переменной ограничена и система каждый раз будет просматривать все пути. Думаю, что так лучше (не уверен в синтаксисе):

Код - vb.net [Выбрать]
  1. Public Sub AddInventorPath()
  2.     Dim path As String = System.Environment.GetEnvironmentVariable("PATH")
  3.     Dim inventorPath As String = oApprentice.InstallPath
  4.     If (Not path.Contains(inventorPath & "Bin")) Then
  5.      path &= ";" & inventorPath & "Bin"
  6.      System.Environment.SetEnvironmentVariable("PATH", path)
  7.     End If
  8. End Sub
  9.  
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Как написать viewer?
« Ответ #6 : 08-06-2016, 05:08:31 »
Кстати, в твоём коде добавление пути доступа к Inventor будет происходить при каждом запуске вьювера.
Согласен

В ссылке, которую я приводил выше
Ну мы с филатом прохлопали ушами, я просто по памяти нашел в старых скаченных файлах пример.

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

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: Как написать viewer?
« Ответ #7 : 08-06-2016, 10:27:42 »
Всем спасибо за советы, но, как оказалось, это не та проблема из-за которой у меня не получалось заставить код работать...
Проекты созданые в  VS 2013 работают без проблем.
Проект созданый в VS 2010 не выводит изображение на PictureBox, хоть-ты-тресни! Да хоть открывай его в  VS 2013! - результат не изменен!

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как написать viewer?
« Ответ #8 : 08-06-2016, 10:48:00 »
Проект созданый в VS 2010 не выводит изображение на PictureBox, хоть-ты-тресни! Да хоть открывай его в  VS 2013! - результат не изменен!
Тогда с вероятностью 99% проблема в версии .NET Framework, указанной компилятору.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: Как написать viewer?
« Ответ #9 : 08-06-2016, 11:59:45 »
Тогда с вероятностью 99% проблема в версии .NET Framework, указанной компилятору.
4.0 и там, и там...
Если бы дело было в этом, то наверное изменение версии .NET Framework в VS 2013 должно было исправля ситуацию, но и это тоже не помогает.

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

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: Как написать viewer?
« Ответ #10 : 09-06-2016, 13:03:50 »
Большое спасибо Мише! Он нашел решение проблемы!
Как оказалось все действительно упирается в процедуру AddInventorPath(), только с небольшой оговоркой: битность процедуры должна соответствовать битности написанной программы (выложенный пример процедуры соответствует х64).

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как написать viewer?
« Ответ #11 : 09-06-2016, 13:07:51 »
filat
Как же ты можешь всех запутать. :) И причем здесь тогда VS 2010 и VS 2013???
P.S.: Отметь сообщение Миши как "Решение" если всё нормально.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: Как написать viewer?
« Ответ #12 : 09-06-2016, 14:08:44 »
И причем здесь тогда VS 2010 и VS 2013???
А при том, что при создании проекта нет возможности задать его битность, и VS 2010, по умолчанию, создает проект х86, а VS 2013 - х64.

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как написать viewer?
« Ответ #13 : 09-06-2016, 14:20:45 »
А при том, что при создании проекта нет возможности задать его битность, и VS 2010, по умолчанию, создает проект х86, а VS 2013 - х64.
Но можно изменить битность потом и в VS 2010 и в 2013.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: Как написать viewer?
« Ответ #14 : 09-06-2016, 14:40:52 »
А при том, что при создании проекта нет возможности задать его битность, и VS 2010, по умолчанию, создает проект х86, а VS 2013 - х64.
Но можно изменить битность потом и в VS 2010 и в 2013.
Можно и я изменил. Но до этого момента не знал, что у этих версий студии есть такое отличие и не обращал на него внимания. По крайней мере пока в это я ниразу не упирался.