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

ADN Club => Inventor API => Тема начата: Elfilagas от 07-11-2018, 08:32:53

Название: 2D эскиз детали из сборки
Отправлено: Elfilagas от 07-11-2018, 08:32:53
Добрый день,
Пытаюсь сделать эскиз из сборки во входящей детали:
Код - vb.net [Выбрать]
  1. Dim selFace As Face = InvApp.CommandManager.Pick(SelectionFilterEnum.kPartFaceFilter, "Выберите плоскость детали")
  2. Dim oOcc As ComponentOccurrence = selFace.ContainingOccurrence
  3. oOcc.Edit()
  4. Dim oPartCompDef As PartComponentDefinition = oOcc.Definition
  5. Dim oSketch As PlanarSketch = oPartCompDef.Sketches.Add(selFace, True)
Но выдает ошибку на добавлении эскиза, подозреваю что не нравится плоскость. В чем может быть проблема?
Название: Re: 2D эскиз детали из сборки
Отправлено: Elfilagas от 07-11-2018, 10:50:18
Не понял почему, но при FaceProxy работает:
Код - vb.net [Выбрать]
  1. Dim oFace As FaceProxy = InvApp.CommandManager.Pick(SelectionFilterEnum.kPartFaceFilter, "Выберите плоскость детали")
  2. Dim oOcc As ComponentOccurrence = oFace.ContainingOccurrence
  3. oOcc.Edit()
  4. Dim oPartCompDef As PartComponentDefinition = oOcc.Definition
  5. Dim oSketch As Sketch = oPartCompDef.Sketches.Add(oFace.NativeObject, True)
Но работает если деталь находится непосредственно в сборке, если она находится в подсборке, ошибка такая же - не правильный аргумент.
Название: Re: 2D эскиз детали из сборки
Отправлено: mikazakov от 07-11-2018, 12:49:19
Не понял почему, но при FaceProxy работает:
Ключевое слово "в сборке"
запустите свой код на отдельно открытой детали и будет срабатывать обычный Face.
Причина вот в чем, когда деталь вставляется в сборку, то работа с ней идет через производные объекты
FaceProxy как раз является производным относительно Face
Просто видимо нужно делать проверку возвращаемого типа в функции:
InvApp.CommandManager.Pick(SelectionFilterEnum.kPartFaceFilter, "Выберите плоскость детали")
Я думаю, что если вы по кликаете по очереди на все что вас интересует и посмотрите получаемый тип данных,
то можно будет дальше сделать проверку по типу данных и принять решение что дальше с этим делать
Название: Re: 2D эскиз детали из сборки
Отправлено: Elfilagas от 07-11-2018, 13:39:58
Спасибо за разъяснения, по детали стало понятно.
Но если деталь находится как в сборке, так и в подсборке, то возвращается тип FaceProxy. Однако при нахождении детали непосредственно в сборке - все работает, а если она на уровень ниже, то уже нет.
Название: Re: 2D эскиз детали из сборки
Отправлено: mikazakov от 07-11-2018, 13:52:58
Ну варианта два, либо Face либо FaceProxy

Однако при нахождении детали непосредственно в сборке - все работает, а если она на уровень ниже, то уже нет.
А что возвращает Pick в "глубоко зарытой" детали?
Название: Re: 2D эскиз детали из сборки
Отправлено: Elfilagas от 07-11-2018, 13:57:11
Pick возвращает FaceProxy при любой степени "зарытости". )
Название: Re: 2D эскиз детали из сборки
Отправлено: mikazakov от 07-11-2018, 14:18:03
Pick возвращает FaceProxy при любой степени "зарытости". )
Логично, значит либо Face либо FaceProxy просто потом проверку полученного типа сделать.
Название: Re: 2D эскиз детали из сборки
Отправлено: Elfilagas от 07-11-2018, 14:33:53
Логично, но почему код:
Код - vb.net [Выбрать]
  1. Dim oFace As FaceProxy = InvApp.CommandManager.Pick(SelectionFilterEnum.kPartFaceFilter, "Выберите плоскость детали")
  2. Dim oOcc As ComponentOccurrence = oFace.ContainingOccurrence
  3. oOcc.Edit()
  4. Dim oPartCompDef As PartComponentDefinition = oOcc.Definition
  5. Dim oSketch As Sketch = oPartCompDef.Sketches.Add(oFace.NativeObject, True)
не работает для "зарытых" деталей?
Название: Re: 2D эскиз детали из сборки
Отправлено: mikazakov от 07-11-2018, 20:54:53
Попробовал зарыл деталь на третий уровень внутрь подсборки, все србатывает, эскиз появляется

Код - vb.net [Выбрать]
  1. Imports Inventor
  2. Module Module1
  3.     Private m_InvApp As Inventor.Application
  4.     Sub Main()
  5.         Try 'Попытка получить существующий экземпляр Inventor
  6.             m_InvApp = CType(Runtime.InteropServices.Marshal.
  7.             GetActiveObject("Inventor.Application"), Inventor.Application)
  8.         Catch ex As Exception 'Загрузка Inventor
  9.             m_InvApp = CType(Activator.CreateInstance(Type.GetTypeFromProgID _
  10.             ("Inventor.Application")), Inventor.Application)
  11.             m_InvApp.Visible = True
  12.         End Try
  13.  
  14.         Dim oFace As FaceProxy = m_InvApp.CommandManager.Pick(SelectionFilterEnum.kPartFaceFilter, "Выберите плоскость детали")
  15.         Dim oOcc As ComponentOccurrence = oFace.ContainingOccurrence
  16.         oOcc.Edit()
  17.         Dim oPartCompDef As PartComponentDefinition = oOcc.Definition
  18.         Dim oSketch As Sketch = oPartCompDef.Sketches.Add(oFace.NativeObject, True)
  19.  
  20.         Console.ReadKey()
  21.     End Sub
  22.  
  23. End Module
  24.  
Название: Re: 2D эскиз детали из сборки
Отправлено: Elfilagas от 08-11-2018, 09:18:37
Разобрался в чем дело и даже не знаю что с этим делать.
Код перестает работать, если добавить какой либо элемент, задевающий деталь, в пространстве сборки (например выдавливание на рисунке во вложении) и от "зарытости" детали это не зависит.
Название: Re: 2D эскиз детали из сборки
Отправлено: mikazakov от 08-11-2018, 09:42:25
дак если объект существует только в сборке, ясно что в самой детали его нет.
А что за задача стоит?
Название: Re: 2D эскиз детали из сборки
Отправлено: Elfilagas от 08-11-2018, 10:12:32
Основная задача это спроецировать на эскиз детали точки, которые выберет конструктор, это будут проекции точек других элементов сборки. На месте этих точек будут построены небольшие отверстия по всем точкам. Как я себе это видел, конструктор запускает инструмент, выбирает плоскость детали, куда все это будет проецироваться, открывается эскиз на редактирование, "накликиваются" точки с других элементов, которые нужно спроецировать на этот эскиз и по нажатии ОК строятся отверстия по всем этим точкам на детали. Как видите увяз уже в начале. )
Дополнительная задача, как раз перенести элементы построенные в пространстве сборки в пространство детали. Что то похожее на addin featureMigrator, но указанный addin нам не подходит.
Название: Re: 2D эскиз детали из сборки
Отправлено: mikazakov от 09-11-2018, 07:04:41
"накликиваются" точки с других элементов, которые нужно спроецировать на этот эскиз и по нажатии ОК строятся отверстия по всем этим точкам на детали.
Эдакая адаптивность похоже. Подразумеваю, это мебельное производство?
Название: Re: 2D эскиз детали из сборки
Отправлено: Elfilagas от 09-11-2018, 09:01:09
Почти, шкафы электрораспределительные. ) Отверстия символические (керновка) показать границы привариваемых деталей.
Название: Re: 2D эскиз детали из сборки
Отправлено: Elfilagas от 15-11-2018, 10:39:41
Удалось собрать что-то рабочее по основной задаче.
Осталась последняя проблема, как раз вот эта - при наличии элемента в сборке, задевающего деталь, на этой детали не рисуется эскиз. Подавление этих отверстий в сборке не помогает.
Была идея исключать эти детали из элемента, выполнять эскиз, потом включать обратно, но у этого решения есть несколько недостатков. Во первых придется сперва выбирать деталь, проверять и исключать из всех элементов, а затем выбирать плоскость эскиза. А второе это то, что элемент удаляется при отсутствии в нем деталей обрабатываемых в сборе, и в случае если в элементе присутствует только одна эта деталь придется добавлять любую деталь из сборки в качестве "заглушки", а потом возвращать все обратно, после отрисовки эскиза. И такое решение кажется слишком "костыльным".
Может что-то еще посоветуете попробовать?
Название: Re: 2D эскиз детали из сборки
Отправлено: mikazakov от 16-11-2018, 06:43:43
поподробнее, что куда кликнуть и что получить
Название: Re: 2D эскиз детали из сборки
Отправлено: Elfilagas от 16-11-2018, 08:36:37
Да в принципе вопрос все тот же. )
Задача из пространства сборки построить эскиз на детали. Следующий код работает корректно если нет отверстий в сборке, которые задевают деталь.
Код - vb.net [Выбрать]
  1. Dim oFace As FaceProxy = InvApp.CommandManager.Pick(SelectionFilterEnum.kPartFaceFilter, "Выберите плоскость детали")
  2. Dim oOcc As ComponentOccurrence = oFace.ContainingOccurrence
  3. Dim oPartCompDef As PartComponentDefinition = oOcc.Definition
  4. Dim oSketch As Sketch = oPartCompDef.Sketches.Add(oFace.NativeObject, True)
Но если есть какие либо элементы, добавленные в сборке и затрагивающие деталь (рисунок с примером во вложении), то эскиз не добавляется.
Название: Re: 2D эскиз детали из сборки
Отправлено: mikazakov от 17-11-2018, 08:10:16
Да, интересный вопрос, ссылка Face.NativeObject не приходит на грань выделенной детали. Отправлю как я его к тех поддержке по АПИ инвентора. Еще бы вспомнить как туда отправлять :)
Название: Re: 2D эскиз детали из сборки
Отправлено: mikazakov от 19-11-2018, 07:45:20
Пытаюсь доступ получить на техподдержку. Поэтому немного придется подождать
Название: Re: 2D эскиз детали из сборки
Отправлено: mikazakov от 21-11-2018, 21:37:36
Написал в техподдержку дня через три ответят
Название: Re: 2D эскиз детали из сборки
Отправлено: mikazakov от 23-11-2018, 10:51:34
Пришел ответ с техподдержки:
Так вот сразу и не догадаешься, что нужно менять свойство через вызов метода Face.GetSourceFace(True)

Код - Visual Basic [Выбрать]
  1. Sub nn_1()
  2.  Dim asdoc As AssemblyDocument
  3.   Set asdoc = ThisApplication.ActiveDocument
  4.  
  5.   Dim oFace As FaceProxy
  6.   Set oFace = ThisApplication.CommandManager.Pick(SelectionFilterEnum.kPartFaceFilter, "Select planar face")
  7.  
  8.   Dim oOcc As ComponentOccurrence
  9.   Set oOcc = oFace.ContainingOccurrence
  10.  
  11.   Dim oPartCompDef As PartComponentDefinition
  12.   Set oPartCompDef = oOcc.Definition
  13.  
  14.  Dim oNativeFace As Face
  15.  Set oNativeFace = oFace.GetSourceFace(True)
  16.  
  17.   Dim oSketch As PlanarSketch
  18.   Set oSketch = oPartCompDef.Sketches.Add(oNativeFace, True)
  19.  
  20.   Call asdoc.Update
  21. End Sub
  22.  
Название: Re: 2D эскиз детали из сборки
Отправлено: Elfilagas от 23-11-2018, 11:07:37
Да, весьма не очевидно. Большое спасибо.