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

ADN Club => Inventor API => Тема начата: anton.gorschnev от 09-07-2019, 08:29:15

Название: Аналог команды “Sketch3DProjectCmd” или как передать в команду необходимые объе
Отправлено: anton.gorschnev от 09-07-2019, 08:29:15
   Добрый день. Возникло затруднение с проецированием, средствами API, на поверхность прямой. 
Подскажите решение или скиньте ссылку на материал, заранее благодарен. Далее описание проблемы.
   В режиме пользователя задача решается банально просто. Создаем 3D эскиз вызываем команду  “Sketch3DProjectCmd” (Проецирование на поверхность), выбираем на какие поверхности проецируем выбираем что  проецируем, выполняем команду получаем требуемый результат.
  С программой все не так однозначно.
  Первый путь, наиболее правильный (с моей точки зрения) но к которому я даже не знаю как подступиться это написать код аналог команды “Sketch3DProjectCmd”. Примерный алгоритм кода, в 3D эскизе создаем кривую далее назначаем взаимосвязи между этой кривой поверхностью и проецируемой геометрией (вопрос в назначение взаимосвязей поверхность и проецируемая геометрия меняется в зависимости от выбранных параметров определить количество точек на кривой и т.д становиться затруднительно).
  Второй путь использовать функционал команды   “Sketch3DProjectCmd”  затруднения начинаются после того как выбирается поверхность на которую необходимо спроецировать. Не могу понять как переключиться на выбор проецируемой геометрии и выполнить команду, да вообще возможно ли это?
 
Код - Visual Basic [Выбрать]
  1. Private Sub Nesting(n As Double)
  2.     Dim oSketch As PlanarSketch
  3.     Dim oSketch3D As Sketch3D
  4.     Dim oSketchEllipticalArc As SketchEllipticalArc
  5.     Dim oSketchLine As SketchLine
  6.     Dim Rd As Double
  7.    
  8.     On Error Resume Next
  9.     oCompDef.Sketches3D.Item("Projection of welds").Delete
  10.     oCompDef.Sketches.Item("Nesting").Delete
  11.     If Err Then
  12.     End If
  13.    
  14.     Set oSketch = oCompDef.Sketches.Item("SketchBottom")
  15.     Set oSketchEllipticalArc = oSketch.SketchEllipticalArcs.Item(2)
  16.     Set oSketchLine = oSketch.SketchLines.Item(2)
  17.     Rd = oSketchEllipticalArc.Length + oSketchLine.Length
  18.    
  19.     Set oSketch = oCompDef.Sketches.Add(oCompDef.WorkPlanes(3))
  20.     oSketch.Name = "Nesting"
  21.     Dim oTransGeom As TransientGeometry
  22.     Set oTransGeom = ThisApplication.TransientGeometry
  23.     Dim oCircle1 As SketchCircle
  24.     Dim oPoint As Point
  25.     Set oCircle1 = oSketch.SketchCircles.AddByCenterRadius(oTransGeom.CreatePoint2d(0, 0), Rd)
  26.     Call oSketch.GeometricConstraints.AddGround(oCircle1.CenterSketchPoint)
  27.     Dim oDiameterDimConstraint As DiameterDimConstraint
  28.     Set oDiameterDimConstraint = oSketch.DimensionConstraints.AddDiameter(oCircle1, oTransGeom.CreatePoint2d(0, 0))
  29.     Set oSketchLine = oSketch.SketchLines.AddByTwoPoints(oTransGeom.CreatePoint2d(0, 0), oTransGeom.CreatePoint2d(0, Rd))
  30.     Call oSketch.GeometricConstraints.AddCoincident(oSketchLine.StartSketchPoint, oCircle1.CenterSketchPoint)
  31.     Call oSketch.GeometricConstraints.AddCoincident(oSketchLine.EndSketchPoint, oCircle1)
  32.     Call oSketch.GeometricConstraints.AddVertical(oSketchLine)
  33.     oSketchLine.Construction = True
  34.    
  35.     Select Case n
  36.         Case 2
  37.         Set oSketchLine = oSketch.SketchLines.AddByTwoPoints(oTransGeom.CreatePoint2d(0, Rd), oTransGeom.CreatePoint2d(0, -Rd))
  38.         Call oSketch.GeometricConstraints.AddCoincident(oSketchLine.StartSketchPoint, oCircle1)
  39.         Call oSketch.GeometricConstraints.AddCoincident(oSketchLine.EndSketchPoint, oCircle1)
  40.         Call oSketch.GeometricConstraints.AddCoincident(oSketchLine, oCircle1.CenterSketchPoint)
  41.         Dim oTwoLineAngleDimConstraint As TwoLineAngleDimConstraint
  42.         Set oTwoLineAngleDimConstraint = oSketch.DimensionConstraints.AddTwoLineAngle(oSketch.SketchLines.Item(1), oSketch.SketchLines.Item(2), oTransGeom.CreatePoint2d(0, Rd / 2))
  43.         oTwoLineAngleDimConstraint.Parameter.Name = "Angel"
  44.         oTwoLineAngleDimConstraint.Parameter.Expression = "10"
  45.         TextBox17.Value = oParameters.Item("Angel").Expression
  46.         Set oSketch3D = oCompDef.Sketches3D.Add
  47.         oSketch3D.Name = "Projection of welds"
  48.         oSketch3D.Edit
  49.        
  50.         Dim oCopyControlDef As ControlDefinition
  51.         Set oCopyControlDef = ThisApplication.CommandManager.ControlDefinitions.Item("Sketch3DProjectCmd")
  52.         oCopyControlDef.Execute
  53.      
  54.         Call oCopyControlDef.Parent.DoSelect(oCompDef.SurfaceBodies.Item(1))
  55.         'Дальше проблема
  56.  
  57.         oSketch3D.ExitEdit
  58.        
  59.         Case 3
  60.        
  61.     End Select
  62. oPart.Update
  63. End Sub

Ожидаемый результат в вложении.
Название: Re: Аналог команды “Sketch3DProjectCmd” или как передать в команду необходимые объе
Отправлено: mikazakov от 09-07-2019, 11:35:38
Нужно юзать : Sketches3D.SilhouetteCurves.Add
Перед запуском макроса нужно выделить тело на которое будет проецироваться кривая
Код - Visual Basic [Выбрать]
  1. Public Sub CreateSilhouetteCurve()
  2.  
  3.   Dim doc As PartDocument: Set doc = ThisApplication.ActiveDocument
  4.   Dim sk As Sketch3D: Set sk = doc.ComponentDefinition.Sketches3D(1)
  5.  
  6.   Call sk.SilhouetteCurves.Add(doc.SelectSet.Item(1), doc.ComponentDefinition.WorkPlanes(3), True)
  7.    
  8. End Sub

Вот такая у меня моделька была для теста
(https://i.postimg.cc/TLMcVXwg/image.png) (https://postimg.cc/TLMcVXwg)
Название: Re: Аналог команды “Sketch3DProjectCmd” или как передать в команду необходимые объе
Отправлено: anton.gorschnev от 09-07-2019, 15:46:49
Спасибо за ответ, но это не та команда.
Предложенное Вами решение аналог команды "Кривая силуэта".
Результат использования этой команды
Код - Visual Basic [Выбрать]
  1. Call oSketch3D.SilhouetteCurves.Add(oCompDef.SurfaceBodies.Item(1), oSketch.SketchLines.Item(2), True)
отличается от требуемого.

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2F&hash=c22fb92101a29a8eea42a98c45872d65)
Название: Re: Аналог команды “Sketch3DProjectCmd” или как передать в команду необходимые объе
Отправлено: mikazakov от 09-07-2019, 18:31:57
В общем так, спросим у разработчиков. Но для этого:
сделайте модельку ТОЛЬКО под нужную операцию, и картинку что должно получится
так чтобы люди поняли что нам нужно и ничего лишнего не было. Приаттачте это всё.
Я им туда переправлю.
Название: Re: Аналог команды “Sketch3DProjectCmd” или как передать в команду необходимые объе
Отправлено: anton.gorschnev от 10-07-2019, 08:10:37
Спасибо за помощь.
И так задача. Средствами API спроецировать прямые (кривые) выделенные красным цветом на поверхности выделенные зеленым цветом.
Исходное состояние рис.1, требуемый результат рис.2.
Картинки и модель см. вложения.
Название: Re: Аналог команды “Sketch3DProjectCmd” или как передать в команду необходимые объе
Отправлено: mikazakov от 10-07-2019, 16:51:30
anton.gorschnev,
по гуглил
https://forums.autodesk.com/t5/inventor-customization/project-to-surface-with-api-in-3d-sketch/td-p/5697774
сам Экинс говорит что нет доступа через АПИ к функционалу "Project To Surface", лучше Экинса инвенторовское АПИ никто не знает, он его создатель.
Но я вот я что подумал, можно и воспользоваться СилуэтКурвэ, но для этого нужно построить вспомогательную рабочую плоскость через

WorkPlanes.AddByLinePlaneAndAngle( Line As Object, Plane As Object, Angle As Variant, [Construction] As Boolean )
обратите внимание, что в сигнатуре самая последняя опция стоит [Construction] As Boolean, если её сделать =True , то пользователь её никогда не увидит ни в пространстве трёхмера ни в браузере. Но для построения кривой пересечения эллиптической поверхности и рабочей плоскости, такая рабочая плоскость вполне сгодится, в вашем случае. можно построить не только рабочую плоскость но и криволинейную поверхность и уже с ней находить пересечения элипса
Название: Re: Аналог команды “Sketch3DProjectCmd” или как передать в команду необходимые объе
Отправлено: anton.gorschnev от 11-07-2019, 16:14:32
Спасибо за инфу. Попробую с пересечением поверхностей, дерево конечно разрастется, как результат получу тогда выложу, может кому полезен будет.
Название: Re: Аналог команды “Sketch3DProjectCmd” или как передать в команду необходимые объе
Отправлено: anton.gorschnev от 12-07-2019, 11:12:10
Выкладываю рабочий код проецирования кривых на тело через пересечение построенной дополнительной поверхности.

Код - Visual Basic [Выбрать]
  1. Private Sub Nesting(n As Integer)
  2.     Dim oSketch As PlanarSketch
  3.     Dim oSketch3D As Sketch3D
  4.     Dim oSketchEllipticalArc As SketchEllipticalArc
  5.     Dim oSketchLine As SketchLine
  6.     Dim Rd As Double
  7.     Dim oTransGeom As TransientGeometry
  8.     Dim oCircle1 As SketchCircle
  9.     Dim oPoint As Point
  10.     Dim oDiameterDimConstraint As DiameterDimConstraint
  11.     Dim oTwoLineAngleDimConstraint As TwoLineAngleDimConstraint
  12.     Dim oAddOffset As OffsetDimConstraint
  13.     Dim oExtrudeFeature As ExtrudeFeature
  14.     Dim oProfileOne As Profile
  15.     Dim oExtrudeDef As ExtrudeDefinition
  16.     Dim oExtrude As ExtrudeFeature
  17.     Dim obj As ObjectCollection
  18.     Dim Lh As Double
  19.  
  20.  'Зачистка от предыдущего выбранного раскроя  
  21.    On Error Resume Next
  22.     oCompDef.Sketches3D.Item("Projection of welds").Delete
  23.     If Err Then
  24.     'MsgBox "1"
  25.    On Error Resume Next
  26.     oCompDef.Sketches3D.Item("Projection of welds").ExitEdit
  27.     oCompDef.Sketches3D.Item("Projection of welds").Delete
  28.     If Err Then
  29.     'MsgBox "11"
  30.    End If
  31.     End If
  32.    
  33.     On Error Resume Next
  34.  
  35.     For Each oExtrude In oCompDef.Features.ExtrudeFeatures
  36.    
  37.         If oExtrude.Name Like "ProjWelds *" Then
  38.             oExtrude.Delete
  39.         End If
  40.      Next
  41.      
  42.     If Err Then
  43.     'MsgBox "2"
  44.    End If
  45.    
  46.     On Error Resume Next
  47.     oCompDef.Sketches.Item("Nesting").ExitEdit
  48.     oCompDef.Sketches.Item("Nesting").Delete
  49.     If Err Then
  50.     'MsgBox "3"
  51.    End If
  52.     'oParameters.Item("Angel").Delete
  53.  
  54.     Lh = 2 * ohotbortovki.Value + oHvn.Value
  55.     Set oSketch = oCompDef.Sketches.Item("SketchBottom")
  56.     Set oSketchEllipticalArc = oSketch.SketchEllipticalArcs.Item(2)
  57.     Set oSketchLine = oSketch.SketchLines.Item(2)
  58.     Rd = oSketchEllipticalArc.Length + oSketchLine.Length
  59.    
  60.     Set oSketch = oCompDef.Sketches.Add(oCompDef.WorkPlanes(3))
  61.     oSketch.Name = "Nesting"
  62.     Set oTransGeom = ThisApplication.TransientGeometry
  63.     Set oCircle1 = oSketch.SketchCircles.AddByCenterRadius(oTransGeom.CreatePoint2d(0, 0), Rd)
  64.     Call oSketch.GeometricConstraints.AddGround(oCircle1.CenterSketchPoint)
  65.     Set oDiameterDimConstraint = oSketch.DimensionConstraints.AddDiameter(oCircle1, oTransGeom.CreatePoint2d(0, 0))
  66.     oDiameterDimConstraint.Parameter.Name = "DimSweep"
  67.     oDiameterDimConstraint.Parameter.Comment = "Теоретический диаметр заготовки"
  68.     Set oSketchLine = oSketch.SketchLines.AddByTwoPoints(oTransGeom.CreatePoint2d(0, 0), oTransGeom.CreatePoint2d(0, Rd))
  69.     Call oSketch.GeometricConstraints.AddCoincident(oSketchLine.StartSketchPoint, oCircle1.CenterSketchPoint)
  70.     Call oSketch.GeometricConstraints.AddCoincident(oSketchLine.EndSketchPoint, oCircle1)
  71.     Call oSketch.GeometricConstraints.AddVertical(oSketchLine)
  72.     oSketchLine.Construction = True
  73.    
  74.     Select Case n
  75. '....
  76. '....
  77. 'Построение эскиза раскроя и проецирование линий сварных швов на поверхность днища
  78. Case 12
  79.        
  80.         Set oCircle1 = oSketch.SketchCircles.AddByCenterRadius(oSketch.SketchCircles.Item(1).CenterSketchPoint, oDvn.Value / 3)
  81.         Call oSketch.GeometricConstraints.AddGround(oCircle1.CenterSketchPoint)
  82.         Set oDiameterDimConstraint = oSketch.DimensionConstraints.AddDiameter(oCircle1, oTransGeom.CreatePoint2d(0, 0))
  83.         oDiameterDimConstraint.Parameter.Name = "DimCentralSegment"
  84.        
  85.         Set oProfileOne = oSketch.Profiles.AddForSurface(oCircle1)
  86.         Set oExtrudeDef = oCompDef.Features.ExtrudeFeatures.CreateExtrudeDefinition(oProfileOne, kSurfaceOperation)
  87.         Call oExtrudeDef.SetDistanceExtent(Lh, kPositiveExtentDirection)
  88.         Set oExtrude = oCompDef.Features.ExtrudeFeatures.Add(oExtrudeDef)
  89.         oExtrude.Name = "ProjWelds 1"
  90.  
  91.         Set oSketchLine = oSketch.SketchLines.AddByTwoPoints(oTransGeom.CreatePoint2d(0, oDvn.Value / 3), oTransGeom.CreatePoint2d(0, Rd))
  92.         Call oSketch.GeometricConstraints.AddCoincident(oSketchLine.StartSketchPoint, oCircle1)
  93.         Call oSketch.GeometricConstraints.AddCoincident(oSketchLine.EndSketchPoint, oSketch.SketchCircles.Item(1))
  94.         Call oSketch.GeometricConstraints.AddCoincident(oSketchLine, oSketch.SketchCircles.Item(1).CenterSketchPoint)
  95.  
  96.         Set oTwoLineAngleDimConstraint = oSketch.DimensionConstraints.AddTwoLineAngle(oSketch.SketchLines.Item(1), oSketch.SketchLines.Item(2), oTransGeom.CreatePoint2d(0, Rd / 2))
  97.         oTwoLineAngleDimConstraint.Parameter.Name = "Angel"
  98.        
  99.         Set oProfileOne = oSketch.Profiles.AddForSurface(oSketchLine)
  100.         Set oExtrudeDef = oCompDef.Features.ExtrudeFeatures.CreateExtrudeDefinition(oProfileOne, kSurfaceOperation)
  101.         Call oExtrudeDef.SetDistanceExtent(Lh, kPositiveExtentDirection)
  102.         Set oExtrude = oCompDef.Features.ExtrudeFeatures.Add(oExtrudeDef)
  103.         oExtrude.Name = "ProjWelds 2"
  104.        
  105.         Dim k As Integer
  106.         Dim k1 As Double
  107.        
  108.         k = 3
  109.         k1 = 2 * pi / (k + 1)
  110.        
  111.         For i = 1 To k
  112.             Set oSketchLine = oSketch.SketchLines.AddByTwoPoints(oTransGeom.CreatePoint2d(0, oDvn.Value / 3), oTransGeom.CreatePoint2d(0, Rd))
  113.             Set obj = ThisApplication.TransientObjects.CreateObjectCollection
  114.             Call obj.Add(oSketchLine)
  115.             Call oSketch.GeometricConstraints.AddCoincident(oSketchLine.StartSketchPoint, oCircle1)
  116.             Call oSketch.GeometricConstraints.AddCoincident(oSketchLine.EndSketchPoint, oSketch.SketchCircles.Item(1))
  117.             Call oSketch.GeometricConstraints.AddCoincident(oSketchLine, oSketch.SketchCircles.Item(1).CenterSketchPoint)
  118.             Call oSketch.RotateSketchObjects(obj, oTransGeom.CreatePoint2d(0, 0), i * 2 * pi / (k + 1), False, False)
  119.             Set oTwoLineAngleDimConstraint = oSketch.DimensionConstraints.AddTwoLineAngle(oSketch.SketchLines.Item(2), oSketch.SketchLines.Item(i + 2), oTransGeom.CreatePoint2d(0, Rd / 2))
  120.            
  121.             Set oProfileOne = oSketch.Profiles.AddForSurface(oSketchLine)
  122.             Set oExtrudeDef = oCompDef.Features.ExtrudeFeatures.CreateExtrudeDefinition(oProfileOne, kSurfaceOperation)
  123.             Call oExtrudeDef.SetDistanceExtent(Lh, kPositiveExtentDirection)
  124.             Set oExtrude = oCompDef.Features.ExtrudeFeatures.Add(oExtrudeDef)
  125.             oExtrude.Name = "ProjWelds " & i + 2
  126.         Next i
  127.        
  128.         Set oSketch3D = oCompDef.Sketches3D.Add
  129.         oSketch3D.Name = "Projection of welds"
  130.        
  131.         For i = 1 To k + 2
  132.         Set oExtrude = oCompDef.Features.ExtrudeFeatures.Item("ProjWelds " & i)
  133.         Call oSketch3D.IntersectionCurves.Add(oCompDef.SurfaceBodies.Item(1), oExtrude.SurfaceBodies.Item(1))
  134.         oExtrude.Faces.Item(1).SurfaceBody.Visible = False
  135.         Next i
  136.         oSketch.Visible = True
  137. '....
  138. '....
  139.    End Select
  140. oPart.Update
  141. End Sub
  142.  
  143.  
Название: Re: Аналог команды “Sketch3DProjectCmd” или как передать в команду необходимые объе
Отправлено: mikazakov от 12-07-2019, 11:27:19
anton.gorschnev,
Днища элептические, завод котельный у вас там?
Название: Re: Аналог команды “Sketch3DProjectCmd” или как передать в команду необходимые объе
Отправлено: anton.gorschnev от 12-07-2019, 12:38:36
Завод емкостного и теплообменного оборудования, ZAVKOM Тамбов.
Название: Re: Аналог команды “Sketch3DProjectCmd” или как передать в команду необходимые объе
Отправлено: R.I.Chernov от 26-12-2019, 11:50:40
Скажите, а если абстрагироваться от кода, какой должен быть результат в модели? Вы хотите перегородки трубного пространства теплообменника сделать? Просто выглядит похоже, если я угадал, я бы посоветовал вам совсем по-другому решать задачу.
Название: Re: Аналог команды “Sketch3DProjectCmd” или как передать в команду необходимые объе
Отправлено: R.I.Chernov от 26-12-2019, 12:19:04
Если вдруг двояко прозвучало: я могу рассказать, как решить вышеуказанную мною задачу другим способом. Если вам именно это требуется.