Из ilogic в inventor addin

Автор Тема: Из ilogic в inventor addin  (Прочитано 16952 раз)

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

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

  • ADN Club
  • **
  • Сообщений: 91
  • Карма: 0
  • Skype: niksasa1979
Из ilogic в inventor addin
« : 17-12-2013, 13:14:35 »
Добрый день. Решил адаптировать правило ilogic для addin.
Вот само правило ilogic для создания чертежа
Imports Inventor.ViewOrientationTypeEnum
Imports Inventor.DrawingViewStyleEnum
doc = ThisDoc.ModelDocument
If (doc.SubType <> "{9C464203-9BAE-11D3-8BAD-0060B0CE6BB4}") Then
MessageBox.Show("Это не файл сортамента", "iLogic")
Return
End If 
Dim oDrawingDoc as DrawingDocument   
Dim oPartDoc as Document
Dim oSheet As sheet
Dim oView1 as DrawingView
Dim oView2 as DrawingView
Dim oView3 as DrawingView
ViewScale = 1/2
'Ask to create drawing?
dwgQuery=MsgBox("Создать чертеж сортамента?", vbYesNo,"Выбирите действие")
If dwgQuery = vbYes Then
    oPartDoc = ThisDoc.Document
        'Define DWG Template File Location
    oDrawingDoc = ThisApplication.Documents.Add(kDrawingDocumentObject, "d:\Программы\Autodesk_Inventor_2013\Templates\Шаблоны-Никитин\Сортамент.dwg", True)
    'oDrawingDoc = ThisApplication.Documents.Add(kDrawingDocumentObject, "", True)
   oSheet = oDrawingDoc.Sheets.Item(1)
          ' Create a new NameValueMap object
  Dim oBaseViewOptions As NameValueMap
  oBaseViewOptions = ThisApplication.TransientObjects.CreateNameValueMap
  'True = folded view
 'False = flat pattern view
  oBaseViewOptions.Add("SheetMetalFoldedModel", False)
   'Define 2d view bottom left corner points for four views
oPoint1 = ThisApplication.TransientGeometry.CreatePoint2d(10, 20) ' front view
oPoint2 = ThisApplication.TransientGeometry.CreatePoint2d(20, 20) ' right view
oPoint3 = ThisApplication.TransientGeometry.CreatePoint2d(10, 15)' top view
oBaseView = oSheet.DrawingViews.AddBaseView(oPartDoc,oPoint1, ViewScale,kFrontViewOrientation, kHiddenLineRemovedDrawingViewStyle, "Главный")
oView2 = oSheet.DrawingViews.AddProjectedView(oBaseView,oPoint2, kFromBaseDrawingViewStyle, ViewScale)
oView3 = oSheet.DrawingViews.AddProjectedView(oBaseView,oPoint3, kFromBaseDrawingViewStyle, ViewScale) 
End If
На пользовательском элементе создана кнопка. На кнопку помещаю код:
Dim doc As Document = m_inventorApplication.ActiveDocument
        If (doc.SubType <> "{9C464203-9BAE-11D3-8BAD-0060B0CE6BB4}") Then
            MsgBox("Это не файл сортамента", , "myAddIn")
            Return
        End If
        Dim oDrawingDoc As DrawingDocument
        Dim oSheet As Sheet
        Dim oView1 As DrawingView
        Dim oView2 As DrawingView
        Dim oView3 As DrawingView
        Dim ViewScale As Double = 1 / 2
        'Ask to create drawing?
        Dim dwgQuery As Integer = MsgBox("Создать чертеж сортамента?", vbYesNo, "Выберите действие")
        If dwgQuery = vbYes Then
            'Define DWG Template File Location
            oDrawingDoc = m_inventorApplication.Documents.Add(DocumentTypeEnum.kDrawingDocumentObject, "d:\Программы\Autodesk_Inventor_2013\Templates\Шаблоны-Никитин\Сортамент.dwg", True)
            'oDrawingDoc = ThisApplication.Documents.Add(kDrawingDocumentObject, "", True)
            oSheet = oDrawingDoc.Sheets.Item(1)
            ' Create a new NameValueMap object
            Dim oBaseViewOptions As NameValueMap
            oBaseViewOptions = m_inventorApplication.TransientObjects.CreateNameValueMap
            'True = folded view
            'False = flat pattern view
            oBaseViewOptions.Add("SheetMetalFoldedModel", False)
            'Define 2d view bottom left corner points for four views
            Dim oPoint1 As Point = m_inventorApplication.TransientGeometry.CreatePoint2d(10, 20) ' front view
            Dim oPoint2 As Point = m_inventorApplication.TransientGeometry.CreatePoint2d(20, 20) ' right view
            Dim oPoint3 As Point = m_inventorApplication.TransientGeometry.CreatePoint2d(10, 15) ' top view
            oView1 = oSheet.DrawingViews.AddBaseView(doc, oPoint1, ViewScale, ViewOrientationTypeEnum.kFrontViewOrientation, _
                                                     DrawingViewStyleEnum.kHiddenLineRemovedDrawingViewStyle, "Главный")
            oView2 = oSheet.DrawingViews.AddProjectedView(oView1, oPoint2, DrawingViewStyleEnum.kFromBaseDrawingViewStyle, ViewScale)
            oView3 = oSheet.DrawingViews.AddProjectedView(oView1, oPoint3, DrawingViewStyleEnum.kFromBaseDrawingViewStyle, ViewScale)
        End If
После нажатия на кнопку инвентор зависает. Чего не хватает в коде для работы кнопки? Спасибо.
« Последнее редактирование: 26-12-2013, 15:54:11 от niksasa »

Оффлайн Владимир Ананьев

  • ADN DevHelp
  • *
  • Сообщений: 148
  • Карма: 8
Re: Из ilogic в inventor
« Ответ #1 : 17-12-2013, 14:56:22 »
На какой строке в режиме отладки  возникает проблема?

Создание нового документа чертежа надо бы проверять на возможность возникновения ошибки.
oDrawingDoc создается корректно?

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

  • ADN Club
  • **
  • Сообщений: 91
  • Карма: 0
  • Skype: niksasa1979
Re: Из ilogic в inventor
« Ответ #2 : 17-12-2013, 15:04:49 »
На какой строке в режиме отладки  возникает проблема?
В режиме отладки никаких ошибок не возникает.
oDrawingDoc создается корректно?
Чертеж вообще не создается

Оффлайн Владимир Ананьев

  • ADN DevHelp
  • *
  • Сообщений: 148
  • Карма: 8
Re: Из ilogic в inventor
« Ответ #3 : 17-12-2013, 15:20:38 »
Что странное пишешь. 
Или зависает, или в режиме пошагового исполнения все работает. 
Одно из двух...

Если документ чертежа не создается, выкинь из кода все, кроме команды на его создаение и добейся результата. 
Потом добавишь постепенно все остальное.

Если ничего не выйдет, выложи наипростейший компилируемый проект VB.NET, который надежно воспроизводит проблему. 

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

  • ADN Club
  • **
  • Сообщений: 91
  • Карма: 0
  • Skype: niksasa1979
Re: Из ilogic в inventor
« Ответ #4 : 17-12-2013, 16:25:40 »
Если документ чертежа не создается, выкинь из кода все, кроме команды на его создаение и добейся результата. 
Потом добавишь постепенно все остальное.
Сделал так, как Вы посоветовали. Дохожу до момента вставки вида и тут косяк.
Вот сообщение об ошибке:
Подробная информация об использовании оперативной
(JIT) отладки вместо данного диалогового
окна содержится в конце этого сообщения.

************** Текст исключения **************
System.InvalidCastException: Невозможно привести COM-объект типа "System.__ComObject" к интерфейсному типу "Inventor.Point". Операция завершилась со сбоем, поскольку вызов QueryInterface COM-компонента для интерфейса с IID "{CB69F172-558E-11D3-B793-0060B0F159EF}" возвратил следующую ошибку: Интерфейс не поддерживается (Исключение из HRESULT: 0x80004002 (E_NOINTERFACE)).
   в Properties.UserControl1.Button5_Click(Object sender, EventArgs e)
   в System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   в System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   в System.Windows.Forms.Control.WndProc(Message& m)
   в System.Windows.Forms.ButtonBase.WndProc(Message& m)
   в System.Windows.Forms.Button.WndProc(Message& m)
   в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Вот сам код:
Dim oView1 As DrawingView
                Dim oView2 As DrawingView
                Dim oView3 As DrawingView
                Dim ViewScale As Double = 1 / 2
                Dim oPoint1 As Point = m_inventorApplication.TransientGeometry.CreatePoint2d(10, 20) ' front view
                Dim oPoint2 As Point = m_inventorApplication.TransientGeometry.CreatePoint2d(20, 20) ' right view
                Dim oPoint3 As Point = m_inventorApplication.TransientGeometry.CreatePoint2d(10, 15) ' top view
                oView1 = oSheet.DrawingViews.AddBaseView(pDoc, oPoint1, ViewScale, ViewOrientationTypeEnum.kFrontViewOrientation, _
                                                         DrawingViewStyleEnum.kHiddenLineRemovedDrawingViewStyle, "Главный")
                oView2 = oSheet.DrawingViews.AddProjectedView(oView1, oPoint2, DrawingViewStyleEnum.kFromBaseDrawingViewStyle, ViewScale)
                oView3 = oSheet.DrawingViews.AddProjectedView(oView1, oPoint3, DrawingViewStyleEnum.kFromBaseDrawingViewStyle, ViewScale)
Что делать?

Оффлайн Владимир Ананьев

  • ADN DevHelp
  • *
  • Сообщений: 148
  • Карма: 8
Re: Из ilogic в inventor
« Ответ #5 : 17-12-2013, 16:31:57 »
Да, верно. Тип надо задать Point2d.  Точки же двумерные!

Dim oPoint1 As Point2d = m_inventorApplication.TransientGeometry.CreatePoint2d(10, 20)

Sorry, не обратил внимание :(

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

  • ADN Club
  • **
  • Сообщений: 91
  • Карма: 0
  • Skype: niksasa1979
Re: Из ilogic в inventor
« Ответ #6 : 17-12-2013, 21:09:14 »
Да, верно. Тип надо задать Point2d.  Точки же двумерные!

Dim oPoint1 As Point2d = m_inventorApplication.TransientGeometry.CreatePoint2d(10, 20)

Sorry, не обратил внимание

Ура!!!!!! Всё заработало. Большое спасибо, Владимир.

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

  • ADN Club
  • **
  • Сообщений: 91
  • Карма: 0
  • Skype: niksasa1979
Re: Из ilogic в inventor
« Ответ #7 : 18-12-2013, 10:34:21 »
Добрый день. Есть правило ilogic:
oView = ThisApplication.CommandManager.Pick(SelectionFilterEnum.kDrawingViewFilter, "Укажите вид")
oX = ActiveSheet.View(oView.Name).ModelDocument.ComponentDefinition.WorkAxes(1)
oY = ActiveSheet.View(oView.Name).ModelDocument.ComponentDefinition.WorkAxes(2)
oZ = ActiveSheet.View(oView.Name).ModelDocument.ComponentDefinition.WorkAxes(3)
ActiveSheet.View(oView.Name).View.SetIncludeStatus(oX, True)
ActiveSheet.View(oView.Name).View.SetIncludeStatus(oY, True)
ActiveSheet.View(oView.Name).View.SetIncludeStatus(oZ, True)
Хочу это правило переделать на VB.net
Пишу код:
If m_inventorApplication.ActiveDocumentType = DocumentTypeEnum.kDrawingDocumentObject Then
            pDoc = m_inventorApplication.ActiveDocument
            Dim ActiveSheet As Sheet
            ActiveSheet = pDoc.ActiveSheet
            Dim oView As DrawingView
            oView = m_inventorApplication.CommandManager.Pick(SelectionFilterEnum.kDrawingViewFilter, "Укажите вид")
            Dim oRefDoc As Object
            oRefDoc = oView.ReferencedDocumentDescriptor.ReferencedDocument
            Dim oX As WorkAxis
            Dim oY As WorkAxis
            Dim oZ As WorkAxis
            oX = ActiveSheet.DrawingViews(oView.Name).ModelDocument.ComponentDefinition.WorkAxes(1)
            oY = ActiveSheet.DrawingViews(oView.Name).ModelDocument.ComponentDefinition.WorkAxes(2)
            oZ = ActiveSheet.DrawingViews(oView.Name).ModelDocument.ComponentDefinition.WorkAxes(3)
            ActiveSheet.DrawingViews(oView.Name).View.SetIncludeStatus(oX, True)
            ActiveSheet.DrawingViews(oView.Name).View.SetIncludeStatus(oY, True)
            ActiveSheet.DrawingViews(oView.Name).View.SetIncludeStatus(oZ, True)
        Else
            MessageBox.Show("Активным должен быть чертеж!")
        End If
Появляется сообщение: приведение строки "Вид1" к типу "Integer" является недопустимым.
Что не так?

Оффлайн Владимир Ананьев

  • ADN DevHelp
  • *
  • Сообщений: 148
  • Карма: 8
Re: Из ilogic в inventor
« Ответ #8 : 21-12-2013, 15:45:17 »
Ошибка возникает при получении ссылки на чертежный вид.
Вы пытаетесь сделать это по текстовому имени вида.
Inventor API Help по этому поводу сообщает следующее:

Syntax
DrawingViews.Item( Index As Long ) As DrawingView

Рекомендация: сделайте вспомогательную функцию, которая будет находить в списке видов чертежный вид с нужным вам именем - обычным перебором for each - next.


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

  • ADN Club
  • **
  • Сообщений: 91
  • Карма: 0
  • Skype: niksasa1979
Re: Из ilogic в inventor addin
« Ответ #9 : 13-01-2014, 21:59:09 »
Рекомендация: сделайте вспомогательную функцию, которая будет находить в списке видов чертежный вид с нужным вам именем - обычным перебором for each - next.
Что то на подобие этого:
For Each oDrawView In oActiveSheet.DrawingViews
        If oView.Name = "ВИД3" Then Exit For
    Next

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Из ilogic в inventor addin
« Ответ #10 : 13-01-2014, 22:00:32 »
Думаю, что Владимир имел в виду следующее. После того как вы уже знаете имя вид (т.е. oView.Name) вы перебираете все виды (ActiveSheet.DrawingViews) и находите под каким номером oView.Name у вас в ActiveSheet.DrawingViews. После этого этот номер вы уже можете использовать в следующих вычислениях в виде:
Код - Visual Basic [Выбрать]
  1. oX = ActiveSheet.DrawingViews(iView).ModelDocument.ComponentDefinition.WorkAxes(1)
где iView это номер вида в массиве видов.
Могу ошибаться, так как Inventor видел издалека.  ;)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Из ilogic в inventor addin
« Ответ #11 : 13-01-2014, 22:05:42 »
Что то на подобие этого:
Код: [Выделить]
 
 For Each oDrawView In oActiveSheet.DrawingViews
        If oView.Name = "ВИД3" Then Exit For
    Next
Почти. Номер нужно подсчитать, т.е. должно быть что-то типа:
Код - Visual Basic [Выбрать]
  1. iView = 0
  2. For Each oDrawView In oActiveSheet.DrawingViews
  3.         iView = iView + 1
  4.         If oView.Name = oDrawView.Name Then Exit For
  5. Next
Только нужно проверить нумерация видов с 0 или с 1.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Романов

  • ADN Club
  • **
  • Сообщений: 87
  • Карма: 20
Re: Из ilogic в inventor addin
« Ответ #12 : 14-01-2014, 11:02:37 »
Не знаю, правильно или нет, я иногда так делаю:Dim i As Integer
For i = 1 To oActiveSheet.DrawingViews.Count
If oView.Name = oActiveSheet.DrawingViews(i).Name Then Exit For
Next
В i порядковый номер вида...

Оффлайн Алексей Романов

  • ADN Club
  • **
  • Сообщений: 87
  • Карма: 20
Re: Из ilogic в inventor addin
« Ответ #13 : 14-01-2014, 11:18:13 »
Хочу это правило переделать на VB.net
Пишу код:
Александр, у тебя уже есть нужный вид! Должно быть типа этого:oRefDoc = oView.ReferencedDocumentDescriptor.ReferencedDocument
Dim oX As WorkAxis
Dim oY As WorkAxis
Dim oZ As WorkAxis
oX = oRefDoc.ComponentDefinition.WorkAxes(1)
oY = oRefDoc.ComponentDefinition.WorkAxes(2)
oZ = oRefDoc.ComponentDefinition.WorkAxes(3)
oView.SetIncludeStatus(oX, True)
oView.SetIncludeStatus(oY, True)
oView.SetIncludeStatus(oZ, True)

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

  • ADN Club
  • **
  • Сообщений: 91
  • Карма: 0
  • Skype: niksasa1979
Re: Из ilogic в inventor addin
« Ответ #14 : 16-01-2014, 12:28:57 »
Dim i As Integer
For i = 1 To oActiveSheet.DrawingViews.Count
   If oView.Name = oActiveSheet.DrawingViews(i).Name Then Exit For
Next
Спасибо, Алексей, именно то, что нужно было.