Переопределить оси эскиза.

Автор Тема: Переопределить оси эскиза.  (Прочитано 2839 раз)

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

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

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Доброго времени суток, уважаемые форумчане. Помогите пожалуйста разобраться в данном вопросе. Я проецирую деталь на плоскость в сборке и экспортирую в DXF. Порой получается, что из за неправильное ориентации эскиза, геометрия в DXF переворачивается. В пользовательском интерфейсе у эскиза есть команда "редактировать систему координат". Пытаюсь разобраться, как сделать аналогичное действие программно.
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Переопределить оси эскиза.
« Ответ #1 : 20-02-2021, 18:08:04 »
PlanarSketch.AxisEntity
PlanarSketch.AxisIsX

PlanarSketch.AxisEntityGeometry

Код - Visual Basic [Выбрать]
  1. Public Sub ChangeSketchPlane()
  2.    ' Set a reference to the part component definition.
  3.   ' This assumes that a part document is active.
  4.   Dim oCompDef As PartComponentDefinition
  5.    Set oCompDef = ThisApplication.ActiveDocument.ComponentDefinition
  6.  
  7.    ' Get the first face of the model. This sample assumes a simple
  8.   ' model where at least the first face is a plane. (A box is a good
  9.   ' test case.)
  10.   Dim oFace As Face
  11.    Set oFace = oCompDef.SurfaceBodies.Item(1).Faces.Item(1)
  12.  
  13.    ' Create a new sketch
  14.   Dim oSketch As PlanarSketch
  15.    Set oSketch = oCompDef.Sketches.Add(oFace, True)
  16.  
  17.    ' Draw a circle at the origin of the sketch plane.
  18.   Dim oCircle As SketchCircle
  19.    Set oCircle = oSketch.SketchCircles.AddByCenterRadius( _
  20.    ThisApplication.TransientGeometry.CreatePoint2d(0, 0), 1)
  21.  
  22.    ' Draw a line along the X axis.
  23.   Call oSketch.SketchLines.AddByTwoPoints(oCircle.CenterSketchPoint, _
  24.    ThisApplication.TransientGeometry.CreatePoint2d(1, 0))
  25.  
  26.    MsgBox "The sketch will be moved to another face."
  27.  
  28.    ' Move the sketch to the second face of the model.
  29.   Set oFace = oCompDef.SurfaceBodies.Item(1).Faces.Item(2)
  30.    oSketch.PlanarEntity = oFace
  31.  
  32.    MsgBox "Current Origin Point: " & oSketch.OriginPointGeometry.X & ", " & _
  33.    oSketch.OriginPointGeometry.Y & ", " & oSketch.OriginPointGeometry.Z & _
  34.    Chr(13) & Chr(13) & _
  35.    "The origin of the sketch will now be set to the center point."
  36.  
  37.    ' Set the origin point to use the center point work point.
  38.   oSketch.OriginPoint = oCompDef.WorkPoints.Item(1)
  39.  
  40.    MsgBox "New Origin Point: " & oSketch.OriginPointGeometry.X & ", " & _
  41.    oSketch.OriginPointGeometry.Y & ", " & oSketch.OriginPointGeometry.Z & _
  42.    Chr(13) & Chr(13) & _
  43.    "The origin of the sketch will now be set to the center point."
  44.  
  45.    MsgBox "Current X axis: " & oSketch.AxisEntityGeometry.Direction.X & ", " & _
  46.    oSketch.AxisEntityGeometry.Direction.Y & ", " & _
  47.    oSketch.AxisEntityGeometry.Direction.Z
  48.  
  49.    MsgBox "The X axis of the sketch will now be redefined."
  50.  
  51.    ' Set the axis to be one of the edges of the face.
  52.   oSketch.AxisEntity = oFace.Edges.Item(2)
  53.  
  54.    MsgBox "New X axis: " & oSketch.AxisEntityGeometry.Direction.X & ", " & _
  55.    oSketch.AxisEntityGeometry.Direction.Y & ", " & _
  56.    oSketch.AxisEntityGeometry.Direction.Z
  57.  
  58.    MsgBox "The direction of the axis will now be reversed."
  59.  
  60.    ' Reverse the axis direction.
  61.   oSketch.NaturalAxisDirection = False
  62.  
  63.    MsgBox "New X axis: " & oSketch.AxisEntityGeometry.Direction.X & ", " & _
  64.    oSketch.AxisEntityGeometry.Direction.Y & ", " & _
  65.    oSketch.AxisEntityGeometry.Direction.Z
  66.  
  67.    MsgBox "The axis will be changed to define the Y instead of the X axis."
  68.  
  69.    ' Change the axis definition.
  70.   oSketch.AxisIsX = False
  71. End Sub
  72.  

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Переопределить оси эскиза.
« Ответ #2 : 20-02-2021, 19:58:30 »
Спасибо, Михаил, за ответ. Но я часа три уже изучаю этот пример из мануала и читаю англоязычные статьи по теме, но таки не могу разобраться как это работает. Я походу суть кода не понимаю, потому как не получается написать аналогичное в C#. Был бы вам очень признателен, если бы вы смогли помочь.

Вот например, вот это строка кода вызывает ошибку:

Код - C# [Выбрать]
  1. sketch.AxisEntity = oCD.WorkAxes[3];
sketch - ссылка на эскиз на плоскости YZ, oCD - сборка, в которой находится эскиз.

Вот хоть убейте, по мне так, это тоже самое что и этот код из примера:

Код - Visual Basic [Выбрать]
  1. ' Set the axis to be one of the edges of the face.
  2.   oSketch.AxisEntity = oFace.Edges.Item(2)

Можете подсказать причину ошибки?
В программировании я новичок...но ненадолго! ;)

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Переопределить оси эскиза.
« Ответ #3 : 20-02-2021, 20:04:12 »
Также пытался как-то так вот делать, ошибки нет, но и результата нет:
Код - C# [Выбрать]
  1. sketch.AxisEntityGeometry.Direction = oCD.WorkAxes[2].Line.Direction;
  2. sketch.NaturalAxisDirection = false;
  3. sketch.AxisEntityGeometry.Direction = oCD.WorkAxes[3].Line.Direction;
  4. sketch.AxisIsX = true;
В программировании я новичок...но ненадолго! ;)

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Переопределить оси эскиза.
« Ответ #4 : 20-02-2021, 20:06:42 »
Быть может, если вы вдруг хорошо понимаете суть алгоритма, вы смогли бы словами описать логику того, что сделать надо?
В программировании я новичок...но ненадолго! ;)

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Переопределить оси эскиза.
« Ответ #5 : 21-02-2021, 18:33:56 »
Продолжаю разбираться в данной теме. В детали на плоскости YZ создан эскиз с именем Sketch. Написал такой вот код:
Код - Visual Basic [Выбрать]
  1. Sub PartSketchOrientation()
  2.     Dim oCD As PartComponentDefinition
  3.     Set oCD = ThisApplication.ActiveDocument.ComponentDefinition
  4.    
  5.     Dim oSketch As PlanarSketch
  6.     Set oSketch = oCD.Sketches.Item("Sketch")
  7.    
  8.     oSketch.AxisEntity = oCD.WorkAxes.Item(3)
  9.     oSketch.AxisIsX = False
  10.     oSketch.NaturalAxisDirection = False
  11. End Sub

Данный код работает, он меняет ориентацию эскиза, направляя ось Y в сторону отрицательного направления оси Z детали. Но мне необходимо проделать такую же операцию в сборке, пишу по аналогии:
Код - Visual Basic [Выбрать]
  1. Sub AssemblySketchOrientation()
  2.     Dim oCD As AssemblyComponentDefinition
  3.     Set oCD = ThisApplication.ActiveDocument.ComponentDefinition
  4.    
  5.     Dim oSketch As PlanarSketch
  6.     Set oSketch = oCD.Sketches.Item("Sketch")
  7.    
  8.     oSketch.AxisEntity = oCD.WorkAxes.Item(3)
  9.     oSketch.AxisIsX = False
  10.     oSketch.NaturalAxisDirection = False
  11. End Sub

в строке oSketch.AxisEntity = oCD.WorkAxes.Item(3) всплывает ошибка, нет идей, почему так может быть?
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Переопределить оси эскиза.
« Ответ #6 : 21-02-2021, 18:45:03 »
в строке oSketch.AxisEntity = oCD.WorkAxes.Item(3) всплывает ошибка, нет идей, почему так может быть?
Может в сборке нужно не элементами детали работать, а с прокси объектами. Тестовую модель бы еще выложить, чтоб посмотреть.

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Переопределить оси эскиза.
« Ответ #7 : 21-02-2021, 18:51:38 »
Тестовую модель бы еще выложить, чтоб посмотреть.
Я тестирую на голой детали и сборке:просто создаю деталь или сборку, создаю эскиз на плоскости YZ, имя эскиза "Sketch".

Насчет прокси, тоже об этом подумал, сидел ща пробовал:
Условия те же, в сборке создан эскиз Sketch на плоскости YZ, в сборку вставлена пустая деталь. Такой вот код:
Код - Visual Basic [Выбрать]
  1. Sub AssemblySketchOrientation()
  2.     Dim oCD As AssemblyComponentDefinition
  3.     Set oCD = ThisApplication.ActiveDocument.ComponentDefinition
  4.    
  5.     Dim partCD As PartComponentDefinition
  6.     Set partCD = oCD.Occurrences.Item(1).Definition
  7.    
  8.     Dim oSketch As PlanarSketch
  9.     Set oSketch = oCD.Sketches.Item("Sketch")
  10.    
  11.     Dim WorkAxisProxy As WorkAxisProxy
  12.     Call oCD.Occurrences.Item(1).CreateGeometryProxy(partCD.WorkAxes.Item(3), WorkAxisProxy)
  13.     oSketch.AxisEntity = WorkAxisProxy
  14.     oSketch.AxisIsX = False
  15.     oSketch.NaturalAxisDirection = False
  16. End Sub
  17.  

выдает ошибку в строке oSketch.AxisEntity = WorkAxisProxy
В программировании я новичок...но ненадолго! ;)

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Переопределить оси эскиза.
« Ответ #8 : 21-02-2021, 19:08:51 »
В пользу того, что дело не в прокси говорит еще то, что если например вы хотите спроецировать ось Z сборки в ее же эскиз, то с этим не возникает никаких трудностей. Ну то есть для этой операции не требуется прокси. Прокси необходимо, когда вы работаете с геометрией вхождений.
В программировании я новичок...но ненадолго! ;)

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Переопределить оси эскиза.
« Ответ #9 : 21-02-2021, 19:38:00 »
В ставил в сборку деталь, создал ссылку proxyEdge As EdgeProxy на ребро, коллинеарное оси Z сборки. В таком виде код заработал.
Код - Visual Basic [Выбрать]
  1. Sub AssemblySketchOrientation()
  2.     Dim oCD As AssemblyComponentDefinition
  3.     Set oCD = ThisApplication.ActiveDocument.ComponentDefinition
  4.  
  5.    
  6.     Dim oSketch As PlanarSketch
  7.     Set oSketch = oCD.Sketches.Item("Sketch")
  8.    
  9.     Dim Edge As Edge
  10.     Set Edge = oCD.Occurrences.Item(1).SurfaceBodies.Item(1).Edges.Item(2)
  11.    
  12.     Dim proxyEdge As EdgeProxy
  13.     Call oCD.Occurrences.Item(1).CreateGeometryProxy(Edge, proxyEdge)
  14.    
  15.     oSketch.AxisEntity = proxyEdge
  16.     oSketch.AxisIsX = False
  17.     oSketch.NaturalAxisDirection = False
  18. End Sub

То есть в принципе в сборке поменять ориентацию в эскизе можно, но почему он не дает это делать ссылаясь на главные оси детали / сборки?
В программировании я новичок...но ненадолго! ;)

Отмечено как Решение R.I.Chernov 21-02-2021, 19:55:54

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Переопределить оси эскиза.
« Ответ #10 : 21-02-2021, 19:55:52 »
В общем я походу понял, в чем дело. В пользовательском интерфейсе изменить ориентацию эскиза в сборке можно только ссылаясь на ребра вхождений. Ни на эскизные, ни на рабочие элементы самой сборки и ее вхождений ссылаться нельзя. Вероятно, и программно делать подобное просто не предусмотрено. Печаль ((
В программировании я новичок...но ненадолго! ;)