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

ADN Club => Inventor API => Тема начата: filat от 07-05-2014, 10:26:10

Название: Перемещение точки SketchPoint3DProxy
Отправлено: filat от 07-05-2014, 10:26:10
Для перемещения точки SketchPoint3DProxy следует использовать метод MoveTo?
Использую следующий макрос:
Sub MovePoint()
    Dim oDoc As Document
    Set oDoc = ThisApplication.ActiveDocument
    Dim oPoint As SketchPoint3DProxy
    Dim nPoint As Point
    Set oPoint = ThisApplication.ActiveDocument.SelectSet.Item(1)
    Dim oTG As TransientGeometry
    Set oTG = ThisApplication.TransientGeometry
    Set nPoint = oTG.CreatePoint(10, 10, 10)
    Call oPoint.MoveTo(nPoint)
End Sub
Макрос проходитбез ошибок, но чтоостается на месте... Может я не тот метод использую?
Название: Re: Перемещение точки SketchPoint3DProxy
Отправлено: Владимир Ананьев от 07-05-2014, 14:14:33
Объект Point – «бестелесная сущность», просто абстрактная координатная точка.  В 3D-эскизе она не существует,  Инвентор ее не отображает,  юзер выделить её средствами UI не может никак.

Судя по коду, вы работаете в контексте документа сборки.
Следовательно, выделяя эскизную точку в 3D-эскизе, вы получаете ссылку на объект типа SketchPoint3DProxy.  Его и надо перемещать.
Попробуйте вот так:
Sub MoveSketchPoint3D_Corrected()
    Dim oTG As TransientGeometry
    Set oTG = ThisApplication.TransientGeometry
    Dim oAsmDoc As AssemblyDocument
    Set oAsmDoc = ThisApplication.ActiveDocument
   
    ' ссылка на эскизную точку в 3D-эскизе
    Dim oSketchPoint3DProxy As SketchPoint3DProxy
    Set oSketchPoint3DProxy = ThisApplication.ActiveDocument.SelectSet.Item(1)
   
    ' создание координатной точки (куда хотим попасть)
    Dim oPoint As Point
    Set oPoint = oTG.CreatePoint(10, 10, 10)
   
    ' перемещение выделенного объекта oSketchPoint3DProxy
    Call oSketchPoint3DProxy.MoveTo(oPoint)
    Beep
End Sub
Название: Re: Перемещение точки SketchPoint3DProxy
Отправлено: filat от 07-05-2014, 15:25:16
После этого кода тоже ничего не происходит - точка остается на месте...
Я должен более детально пояснить, что это за точка: в сборке выполняется разводка кабелей, при активации внутри самой сборки сборки Harness становятся доступные точки, по которым строятся кабели. После выделения точки, я посмотрел тип объекта и увидел, что это SketchPoint3DProxy. Вот теперь никак не могу добится ее перемещения с помощью API.
Название: Re: Перемещение точки SketchPoint3DProxy
Отправлено: Владимир Ананьев от 07-05-2014, 16:41:13
У этого addin нет API.  :(  В общем случае, это серьезно осложняет жизнь.
Самый простой способ - двигать точку размерами посредством параметров. 
Название: Re: Перемещение точки SketchPoint3DProxy
Отправлено: filat от 08-05-2014, 10:28:54
То что API нет под работу с кабелями это понятно, но я думал, что если макрос видет понятный ему элемент, то с ним можно работать... Параметры это не вариант: если точек под сотню, то параметры вручную забивать замучаешься, а потом в них легко запутаться...
Название: Re: Перемещение точки SketchPoint3DProxy
Отправлено: Владимир Ананьев от 08-05-2014, 10:34:56
Скинь мне, пожалуйста, в почту наипростейшую модель твоего типа для тестов "на кубиках".
Надо изучить тему подробнее.  Спасибо.
Название: Re: Перемещение точки SketchPoint3DProxy
Отправлено: filat от 08-05-2014, 11:30:29
Вот модель. Нужно переместить точку Work Point5 в кабеле Segment1.
Название: Re: Перемещение точки SketchPoint3DProxy
Отправлено: Владимир Ананьев от 14-05-2014, 16:49:35
Вот пример перемещения рабочей точки сегмента на заданный вектор.  Можно поставить ее и в конкретную координатную точку.  Как разрулить изломы на наконечниках, еще не понял :(
Надо как-то сделать сплайн гладким.
Код - Visual Basic [Выбрать]
  1. Sub RedefineWkPt_Simple()
  2.     Dim oTG As TransientGeometry
  3.     Set oTG = ThisApplication.TransientGeometry
  4.    
  5.     Dim oAssy As AssemblyDocument
  6.     Set oAssy = ThisApplication.ActiveDocument
  7.     Dim oAssyDef As AssemblyComponentDefinition
  8.     Set oAssyDef = oAssy.ComponentDefinition
  9.    
  10.     ' Get the Harness assembly
  11.    Dim oCHAssy As AssemblyDocument
  12.     Set oCHAssy = oAssyDef.Occurrences(3).Definition.Document
  13.     ' Get the Harness part
  14.    Dim oCHPart As PartDocument
  15.     Set oCHPart = oCHAssy.ComponentDefinition.Occurrences(1).Definition.Document
  16.    
  17.     ' Get the work point that should be moved
  18.    ' Here we use its name
  19.    Dim oWkPt As WorkPoint
  20.     Set oWkPt = oCHPart.ComponentDefinition.WorkPoints("Work Point5")
  21.    
  22.     'get current position of the workpoint
  23.    Dim oNewPt As Point
  24.     Set oNewPt = oWkPt.Point
  25.    
  26.     'define target position moving the Point object by vector
  27.    'new position can be set directly by (x,y,z) coordinates as well
  28.    Dim oVector As Vector
  29.     Set oVector = oTG.CreateVector(0, -1, 0)
  30.     Call oNewPt.TranslateBy(oVector)
  31.    
  32.     'redefine workpoint position
  33.    Call oWkPt.SetFixed(oNewPt)
  34.  
  35.     oAssy.Update2
  36.     Beep
  37. End Sub
  38.  

Пока вот так.  Надеюсь, это поможет продвинуться.
Название: Re: Перемещение точки SketchPoint3DProxy
Отправлено: filat от 26-05-2014, 15:12:02
Да, данный код полностью работоспособный, только я столкнулся с проблемой несоответствия типов объектов:
Используя ThisApplication.ActiveDocument.SelectSet я выделяю объект типа SketchPoint3DProxy, а приведенный выше код работает с WorkPoint...
Мне нужно переобращаться по имени точки? Даже не по имени (имя выделенной точки увидеть пока не получается...), а через сравнение (совпадение) координат?
Название: Re: Перемещение точки SketchPoint3DProxy
Отправлено: filat от 26-05-2014, 15:22:00
Я попробовал использовать равенство Set oWkPt = ThisApplication.ActiveDocument.SelectSet.Item(1).Constraints3D.Item(1).WorkPoint , но оно почему-то вызывает ошибку на Call oWkPt.SetFixed(oNewPt) ?
Название: Re: Перемещение точки SketchPoint3DProxy
Отправлено: filat от 26-05-2014, 15:27:48
Да, приходится использовать цикл поиска по имени точки... Может быть есть все-таки более простой способ?
Название: Re: Перемещение точки SketchPoint3DProxy
Отправлено: Владимир Ананьев от 26-05-2014, 18:39:37
Пожалуй, лучше искать не по именам, а по совпадению точек в пространстве:
Sub WorkPoint_By_SketchPoint3D()
    'selected point
    Dim oSketchPoint3DProxy As SketchPoint3DProxy
    Set oSketchPoint3DProxy = ThisApplication.ActiveDocument.SelectSet.Item(1)
           
    ' Get the Harness assembly
    Dim oCHAssy As AssemblyDocument
    Set oCHAssy = ThisApplication.ActiveEditDocument
    ' Get the Harness part
    Dim oCHPart As PartDocument
    Set oCHPart = oCHAssy.ComponentDefinition.Occurrences(1).Definition.Document
   
    Dim wp As WorkPoint
    For Each wp In oCHPart.ComponentDefinition.WorkPoints
      If wp.Point.IsEqualTo(oSketchPoint3DProxy.Geometry) Then
        Beep
        MsgBox ("Found !!!")
      End If
    Next
    MsgBox "Done"
End Sub
Название: Re: Перемещение точки SketchPoint3DProxy
Отправлено: filat от 10-06-2014, 13:06:33
В развитии этой темы
Столкнулся с такой проблемой: в сборке есть большой жгут, но при просмотре содержания (во время выполнения макроса) переменной oCHPart.ComponentDefinition.WorkPoints вижу только одну центральную точку (см. скин), а точек жгута в ней нет. где они еще могут находится?
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Ff6.s.qip.ru%2F3GS55pSA.jpg&hash=3f08bae4ab3b51db08f1425274169667) (http://shot.qip.ru/00pXxp-63GS55pSA/)
Название: Re: Перемещение точки SketchPoint3DProxy
Отправлено: filat от 10-06-2014, 14:13:59
Разобрался в чем проблема: нельзя использовать строку Set oCHAssy = oAssyDef.Occurrences(3).Definition.Document как записано в коде! Это строка выведена на основании примера, в котором было всего несколько деталей. В больших сборках деталей намного больше и вместо "3" нужно использовать обращение к той детали, в которой располагаются точки.
Название: Re: Перемещение точки SketchPoint3DProxy
Отправлено: filat от 20-11-2015, 10:47:40
Код - Visual Basic [Выбрать]
  1. 'redefine workpoint position
  2. Call oWkPt.SetFixed(oNewPt)
Почему эта команда не хочет работать с некоторыми точками в сборке? После выполнения кода перед этой строкой в переменной oNewPt находятся новые координаты точки, но после выполнения команды точка oWkPt остается на прежнем месте и не перемещается в заданные координаты!?