Аналог команды “Sketch3DProjectCmd” или как передать в команду необходимые объе

Автор Тема: Аналог команды “Sketch3DProjectCmd” или как передать в команду необходимые объе  (Прочитано 3888 раз)

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

Оффлайн anton.gorschnevАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 3
   Добрый день. Возникло затруднение с проецированием, средствами 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

Ожидаемый результат в вложении.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Нужно юзать : 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

Вот такая у меня моделька была для теста


Оффлайн anton.gorschnevАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 3
Спасибо за ответ, но это не та команда.
Предложенное Вами решение аналог команды "Кривая силуэта".
Результат использования этой команды
Код - Visual Basic [Выбрать]
  1. Call oSketch3D.SilhouetteCurves.Add(oCompDef.SurfaceBodies.Item(1), oSketch.SketchLines.Item(2), True)
отличается от требуемого.


Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
В общем так, спросим у разработчиков. Но для этого:
сделайте модельку ТОЛЬКО под нужную операцию, и картинку что должно получится
так чтобы люди поняли что нам нужно и ничего лишнего не было. Приаттачте это всё.
Я им туда переправлю.

Оффлайн anton.gorschnevАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 3
Спасибо за помощь.
И так задача. Средствами API спроецировать прямые (кривые) выделенные красным цветом на поверхности выделенные зеленым цветом.
Исходное состояние рис.1, требуемый результат рис.2.
Картинки и модель см. вложения.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
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 , то пользователь её никогда не увидит ни в пространстве трёхмера ни в браузере. Но для построения кривой пересечения эллиптической поверхности и рабочей плоскости, такая рабочая плоскость вполне сгодится, в вашем случае. можно построить не только рабочую плоскость но и криволинейную поверхность и уже с ней находить пересечения элипса

Оффлайн anton.gorschnevАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 3
Спасибо за инфу. Попробую с пересечением поверхностей, дерево конечно разрастется, как результат получу тогда выложу, может кому полезен будет.

Оффлайн anton.gorschnevАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 3
Выкладываю рабочий код проецирования кривых на тело через пересечение построенной дополнительной поверхности.

Код - 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.  

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
anton.gorschnev,
Днища элептические, завод котельный у вас там?

Оффлайн anton.gorschnevАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 3
Завод емкостного и теплообменного оборудования, ZAVKOM Тамбов.

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Скажите, а если абстрагироваться от кода, какой должен быть результат в модели? Вы хотите перегородки трубного пространства теплообменника сделать? Просто выглядит похоже, если я угадал, я бы посоветовал вам совсем по-другому решать задачу.
В программировании я новичок...но ненадолго! ;)

Оффлайн R.I.Chernov

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