Fusion 360 API деталь на Python

Автор: | 04.02.2018

Способы реализации API Fusion 360
Примеры моделирования детали:

Circle by 3 tangents;
BaseFeature;
Fillet;
Mirror Feature;
Constraints (Perpendicular, Parallel and Symmetry)
Simple Revolve Feature;
Two Rail Sweep Feature;
Interference;
Trim Feature;
Unstitch Feature.

Контрольные задания
Пример выполнения задания

Примеры моделирования детали

Создайте скрипт для языка  Python (см. Способы реализации API Fusion 360 ) и используйте для его запуска программные коды, которые приводятся ниже.

Circle by 3 tangents

Согласно теории параметризации касание 2-х линий (на плоскости) заменяет 1 параметр. Окружность представляет 3-х параметрическое множество. Поэтому 3-и касательных к ней определяют окружность.

Ниже Python код  создает на эскизе три линии (отрезка), а затем рисует окружность, касательную к этим линиям. Затем он создает ограничения касания для поддержания этих отношений.

Если, после запуска приложения изменять «перетаскиванием» положение конечных точек линий (отрезков), то будут изменятся и параметры окружности, поскольку линии связаны с окружностью ограничением Tangent (касание).

import adsk.core, adsk.fusion, traceback
def run(context):
 ui = None
 try:
  app = adsk.core.Application.get()
  ui = app.userInterface
  doc = app.documents.add(adsk.core.DocumentTypes.FusionDesignDocumentType)
  design = app.activeProduct
# Get the root component of the active design.
  rootComp = design.rootComponent
# Create a new sketch on the xy plane.
  sketches = rootComp.sketches;
  xyPlane = rootComp.xYConstructionPlane
  sketch = sketches.add(xyPlane)
# Draw three lines.
  lines = sketch.sketchCurves.sketchLines;
  line1 = lines.addByTwoPoints(adsk.core.Point3D.create(0, 0, 0), adsk.core.Point3D.create(3, 1, 0))
  line2 = lines.addByTwoPoints(adsk.core.Point3D.create(4, 3, 0), adsk.core.Point3D.create(2, 4, 0))
  line3 = lines.addByTwoPoints(adsk.core.Point3D.create(-1, 0, 0), adsk.core.Point3D.create(0, 4, 0))
# Draw circle tangent to the lines.
  circles = sketch.sketchCurves.sketchCircles
  circle1 = circles.addByThreeTangents(line1, line2, line3, adsk.core.Point3D.create(0,0,0))
# Apply tangent contstraints to maintain the relationship.
  constraints = sketch.geometricConstraints
  constraints.addTangent(circle1, line1)
  constraints.addTangent(circle1, line2)
  constraints.addTangent(circle1, line3)
 except:
  if ui:   
   ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

Объекты коллекций lines и circles доступны через иерархическую структуру объектной модели в последовательности Application->Documents->Document ->Design->Component->…

Объект Design в объекте Document есть корневым для представления данных моделирования. Все эскизы, особенности (features), объекты конструкционной геометрии, компоненты и т.д., содержатся в нем. Объект класса Design получен из объекта класса Product.

Добавление ограничений между примитивами в эскизе мало чем отличается от того, как это выполняется в Inventor (см. Особенности эскизирования через API).

Не все API функции соотнесены к объектной модели. Например, геометрические точки в приложении создаются через «статические» функции, к которым обращаются непосредственно  через имя класса, описанного в библиотеке adsk.core:

adsk.core.Point3D.create(0, 0, 0)

BaseFeature

Ниже Python код демонстрирует создание тела с помощью инструмента ЕXTRUDE (см.  для сравнения примеры Features в Inventor).

Получен цилиндр путем выдавливания окружности. Последовательность создания цилиндра отражена на рисунках.


import adsk.core, adsk.fusion, traceback
def run(context):
 ui = None
 try:
  app = adsk.core.Application.get()
  ui = app.userInterface
  doc = app.documents.add(adsk.core.DocumentTypes.FusionDesignDocumentType)
  design = app.activeProduct
  design.designType = adsk.fusion.DesignTypes.ParametricDesignType
# Get the root component of the active design.
  rootComp = design.rootComponent
# Create a base feature
  baseFeats = rootComp.features.baseFeatures
  baseFeat = baseFeats.add()
  baseFeat.startEdit()
# Create construction plane in base feature
  planes = rootComp.constructionPlanes
  planeInput = planes.createInput()
  planeInput.targetBaseOrFormFeature = baseFeat
  planeInput.setByOffset(rootComp.xYConstructionPlane, adsk.core.ValueInput.createByReal(1))
  plane = planes.add(planeInput)
# Create sketch in base feature
  sketches = rootComp.sketches
  sketch = sketches.addToBaseOrFormFeature(plane, baseFeat, True)
# Draw a circle.
  circles = sketch.sketchCurves.sketchCircles
  circles.addByCenterRadius(adsk.core.Point3D.create(0, 0, 0), 2)
# Get the profile defined by the circle.
  prof = sketch.profiles.item(0)
# Create an extrusion input to be able to define the input needed for an extrusion
# while specifying the profile and that a new component is to be created
  extrudes = rootComp.features.extrudeFeatures
  extInput = extrudes.createInput(prof, adsk.fusion.FeatureOperations.NewBodyFeatureOperation)
# Define that the extent is a distance extent of 5 cm.
  distance = adsk.core.ValueInput.createByReal(5)
  extInput.setDistanceExtent(False, distance)
  extInput.baseFeature = baseFeat
# Create the extrusion.
  ext = extrudes.add(extInput)
 except:
  if ui:     
   ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

В коде для объекта design определяется параметрический способ моделирования (ParametricDesignType), который фокусируется на отношениях между элементами (features) модели.

Геометрия объекта создается в корневом компоненте:

  • Добавляется объект base feature в коллекцию baseFeatures.
  • Создается конструкционная плоскость plane параллельно плоскости XY корневого компонента, а в ней определяется эскиз sketch, относящийся к объекту base feature. Метод …ValueInput.createByReal(1) определяет расстояние между плоскостями.
  • Создается коллекция окружностей circles и в нее добавляется окружность с началом в точке (0,0,0) и радиусом 2см.
  • Окружность используется для создания профиля prof в эскизе sketch. Обратите внимание, что в отличие от API Inventor профили в API Fusion 360  создаются  автоматически из замкнутых контуров. Доступ к ним реализуется через индекс коллекции профилей эскиза.
  • Создается объект-коллекция extrudes и объект extInput, для которого определяется величина выдавливания (5см).
  • Добавляется объект ext в коллекцию extrudes.

Input-объекты обычно используются для подготовки данных для сложных объектов. Особенности создания Input-объектов см. в разделе Основные концепции Fusion API.

Fillet

Ниже Python код создает сопряжение для выбранного ребра. Для тестирования этой программы выбрана модель цилиндра, которая была создана при запуске предыдущей программы.

import adsk.core, adsk.fusion, traceback
def createFillet():
 ui = None
 try:
# Get the Application object.
  app = adsk.core.Application.get()
# Get various top-level Fusion objects.
  ui  = app.userInterface
  design = app.activeProduct
  root = design.rootComponent 
# Have the edge selected and add it to an ObjectCollection.
  selection = ui.selectEntity("Select edge to fillet", "Edges")
  edge = selection.entity
  edgeCollection = adsk.core.ObjectCollection.create()
  edgeCollection.add(edge)
# Create the FilletInput object.
  fillets = root.features.filletFeatures
  filletInput = fillets.createInput()
  filletInput.addConstantRadiusEdgeSet(edgeCollection, adsk.core.ValueInput.createByString('.25 in'), True)
# Create the fillet.
  fillet = fillets.add(filletInput)
 except:
  if ui:    
   ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
def main():
 createFillet()
main()

Для создания сопряжения между гранями выбранного ребра, в программе были выполнены следующие действия:

  • Получено ребро edge из выборки selection через метод пользовательского интерфейса (app.userInterface.selectEntity).
  • Создана коллекция ребер, куда было добавлено выбранное ребро.
  • Создана коллекция сопряжений fillets, а через нее объект filletInput, в котором были инициализированы параметры сопряжения.
  • Добавлен в коллекцию fillets объект fillet (сопряжение) с соответствующими параметрами.

Mirror Feature

Ниже Python код демонстрирует создание тела с помощью инструмента ЕXTRUDE и зеркального отображения объекта (mirror feature). Последовательность работы программы отражена на рисунках.

import adsk.core, adsk.fusion, traceback
def run(context):
 ui = None
 try:
  app = adsk.core.Application.get()
  ui = app.userInterface
# Create a document.
  doc = app.documents.add(adsk.core.DocumentTypes.FusionDesignDocumentType)
  product = app.activeProduct
  design = adsk.fusion.Design.cast(product)
# Get the root component of the active design.
  rootComp = design.rootComponent
# Create sketch
  sketches = rootComp.sketches
  sketch = sketches.add(rootComp.xZConstructionPlane)
  sketchLines = sketch.sketchCurves.sketchLines
  startPoint = adsk.core.Point3D.create(0, 0, 0)
  endPoint = adsk.core.Point3D.create(5, 5, 0)
  sketchLines.addTwoPointRectangle(startPoint, endPoint)
# Get the profile defined by the rectangle.
  prof = sketch.profiles.item(0)
# Create an extrusion input.
  features = rootComp.features
  extrudes = features.extrudeFeatures
  extInput = extrudes.createInput(prof, adsk.fusion.FeatureOperations.NewBodyFeatureOperation)
# Define that the extent is a distance extent of 5 cm.
  distance = adsk.core.ValueInput.createByReal(5)
  extInput.setDistanceExtent(False, distance)
# Create the extrusion.
  ext = extrudes.add(extInput)
# Get the body created by extrusion
  body = ext.bodies.item(0)
# Get a face of the body
  face = body.faces.item(0)
# Create a construction plane by offset
  planes = rootComp.constructionPlanes
  planeInput = planes.createInput()
  offsetDistance = adsk.core.ValueInput.createByString('5 cm')
  planeInput.setByOffset(face, offsetDistance)
  plane = planes.add(planeInput)
# Create input entities for mirror feature
  inputEntites = adsk.core.ObjectCollection.create()
  inputEntites.add(body)
# Create the input for mirror feature
  mirrorFeatures = features.mirrorFeatures
  mirrorInput = mirrorFeatures.createInput(inputEntites, plane)
# Create the mirror feature
  mirrorFeature = mirrorFeatures.add(mirrorInput)
 except:
  if ui:
   ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

Для создания зеркального отражения в программе были выполнены следующие действия:

  • Создается эскиз sketch в конструкционной плоскости XZ корневого компонента xZConstructionPlane.
  • В коллекцию sketchLines эскиза добавляется прямоугольник (создается по 2-м угловым точкам), на основе которого определяется профиль prof для выдавливания.
  • Создается коллекция extrudes, в которую добавляется extrusion со всеми подготовленными input данными. Получаем тело body
  • Из тела body  через доступ к B-Rep объектам получаем грань (face),
  • На расстоянии 5см от грани создается конструкционная плоскость.
  • Подготавливаются input данные для зеркального отражения mirrorFeature, которое создается  в коллекции mirrorFeatures.

 Constraints (Perpendicular, Parallel and Symmetry)

Ниже Python код демонстрирует создание параллелепипеда  с добавлением условий симметрии и параллельности противоположных сторон для эскиза прямоугольника в основании (см.  для сравнения раздел  Особенности эскизирования через API в Inventor . Последовательность работы программы отражена на рисунках.

 

import adsk.core, adsk.fusion, traceback
def run(context):
 ui = None
 try:
  app = adsk.core.Application.get()
  ui = app.userInterface
# Create a document.
  doc = app.documents.add(adsk.core.DocumentTypes.FusionDesignDocumentType)
  product = app.activeProduct
  design = adsk.fusion.Design.cast(product)
# Get the root component of the active design.
  rootComp = design.rootComponent
 # Create sketch
  sketches = rootComp.sketches
  sketch = sketches.add(rootComp.xZConstructionPlane)
  Lines = sketch.sketchCurves.sketchLines
  startPoint = adsk.core.Point3D.create(-17, -32, 0)
  endPoint = adsk.core.Point3D.create(17, 32, 0)
  Rect=Lines.addTwoPointRectangle(startPoint, endPoint)
  start = adsk.core.Point3D.create(0, 0, 0)
  endx = adsk.core.Point3D.create(5, 0, 0)
  endz = adsk.core.Point3D.create(0, 5, 0)
  lx=Lines.addByTwoPoints(start, endx)
  lz=Lines.addByTwoPoints(lx.startSketchPoint, endz)
  line0=Rect.item(0)
  line1=Rect.item(1)
  line2=Rect.item(2)
  line3=Rect.item(3)
  constraints = sketch.geometricConstraints
  constraints.addPerpendicular (line1,line2)
  constraints.addParallel(line0,line2)
  constraints.addParallel(line1,line3)
  constraints.addSymmetry(line0,line2,lx)
  constraints.addSymmetry(line1,line3,lz)
 # Get the profile defined by the rectangle.
  prof = sketch.profiles.item(0)
# Create an extrusion input.
  features = rootComp.features
  extrudes = features.extrudeFeatures
  extInput = extrudes.createInput(prof, adsk.fusion.FeatureOperations.NewBodyFeatureOperation)
 # Define that the extent is a distance extent of 54 mm.
  distance = adsk.core.ValueInput.createByReal(54)
  extInput.setDistanceExtent(False, distance)
# Create the extrusion.
  ext = extrudes.add(extInput) 
 # Get the body created by extrusion.
  body = ext.bodies.item(0)
 except:
  if ui:
   ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

Simple Revolve Feature

Ниже Python код демонстрирует создание тела с помощью инструмента REVOLVE (см.  для сравнения примеры в разделе Features в Inventor). Тело получается вращением окружности вокруг оси, причем результат помещается в созданный программой компонент. Последовательность работы программы отражена на рисунках.

import adsk.core, adsk.fusion, math, traceback
def run(context):
 ui = None
 try:
  app = adsk.core.Application.get()
  ui = app.userInterface
  doc = app.documents.add(adsk.core.DocumentTypes.FusionDesignDocumentType)
  design = app.activeProduct
# Get the root component of the active design.
  rootComp = design.rootComponent
# Create a new sketch on the xy plane.
  sketches = rootComp.sketches;
  xyPlane = rootComp.xYConstructionPlane;
  sketch = sketches.add(xyPlane)
# Draw a circle.
  circles = sketch.sketchCurves.sketchCircles
  circle1 = circles.addByCenterRadius (adsk.core.Point3D.create(0, 0, 0), 2)
# Draw a line to use as the axis of revolution.
  lines = sketch.sketchCurves.sketchLines
  AxisLine = lines.addByTwoPoints(adsk.core.Point3D.create(-1, -5, 0), adsk.core.Point3D.create(1, -5, 0))
# Get the profile defined by the circle.
  prof = sketch.profiles.item(0)
# Create an revolution input to be able to define the input needed for a revolution
# while specifying the profile and that a new component is to be created
  revolves = rootComp.features.revolveFeatures
  revInput = revolves.createInput(prof, AxisLine, adsk.fusion.FeatureOperations.NewComponentFeatureOperation)
# Define that the extent is an angle of pi to get half of a torus.
  angle = adsk.core.ValueInput.createByReal(math.pi)
  revInput.setAngleExtent(False, angle)
# Create the extrusion.
  ext = revolves.add(revInput) 
 except:
  if ui: 
   ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

Для создания тела вращения в программе выполняются следующие действия:

  • Создается эскиз sketch в конструкционной плоскости XY корневого компонента rootComp.xYConstructionPlane.
  • На эскизе sketch определяются объекты circle1 и AxisLine. Объект circle1 используется в качестве профиля для создания тела, а объект AxisLine как ось вращения.
  • В объекте revInput инкапсулируются данные для создания тела вращения – профиль, ось и угол вращения. Последний параметр функции createInput определяет, что тело вращения будет создано в новом компоненте.
  • Создается тело вращения ext.

Two Rail Sweep Feature

Ниже Python код демонстрирует создание тела (усеченного конуса) с помощью инструмента SWEEP. Здесь конус задается образующей (окружностью) и 2-я направляющими (отрезками). Одна направляющая определяет перемещение центра окружности, вторая – изменение радиуса окружности. Последовательность работы программы отражена на рисунках.

import adsk.core, adsk.fusion, traceback
def run(context):
 ui = None
 try:
  app = adsk.core.Application.get()
  ui = app.userInterface
# Create a document.
  doc = app.documents.add(adsk.core.DocumentTypes.FusionDesignDocumentType)
  product = app.activeProduct
  design = adsk.fusion.Design.cast(product)
# Get the root component of the active design.
  rootComp = design.rootComponent
# Create sketch
  sketches = rootComp.sketches
  sketch = sketches.add(rootComp.xYConstructionPlane)
  sketchCircles = sketch.sketchCurves.sketchCircles
  centerPoint = adsk.core.Point3D.create(0, 0, 0)
  circle = sketchCircles.addByCenterRadius(centerPoint, 3.0)
# Get the profile defined by the circle.
  prof = sketch.profiles.item(0)
# Create a vertical sketch and add two lines on it
  sketchVertical = sketches.add(rootComp.xZConstructionPlane)
  sketchLines = sketchVertical.sketchCurves.sketchLines
  startPtOne = adsk.core.Point3D.create(0, 0, 0)
  endPtOne = adsk.core.Point3D.create(0, 10, 0)
  startPtTwo = adsk.core.Point3D.create(3, 0, 0)
  endPtTwo = adsk.core.Point3D.create(6, 10, 0)
  line1 = sketchLines.addByTwoPoints(startPtOne, endPtOne)
  line2 = sketchLines.addByTwoPoints(startPtTwo, endPtTwo)
# Create a path
  path = rootComp.features.createPath(line1)
# Create guid rail path
  guidRailPath = rootComp.features.createPath(line2)
# Create a sweep input
  sweeps = rootComp.features.sweepFeatures
  sweepInput = sweeps.createInput(prof, path, adsk.fusion.FeatureOperations.NewBodyFeatureOperation)
  sweepInput.guideRail = guidRailPath
  sweepInput.isDirectionFlipped = False
  sweepInput.profileScaling = adsk.fusion.SweepProfileScalingOptions.SweepProfileScaleOption
# Create the sweep.
  sweeps.add(sweepInput)
 except:
  if ui:
   ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

Для создания конуса в программе выполняются следующие действия:

  • Создается эскиз в плоскости XY корневого компонента, в этом эскизе – окружность, которая определяет профиль prof для конуса .
  • Создается эскиз в плоскости XZ корневого компонента, в этом эскизе определяются направляющие path и guidRailPath, заданные двумя отрезками line1 и line2, по которым будет перемещаться профиль prof при создании конуса.
  • Подготавливаются sweepInput данные.
  • Создается sweep объект .

Interference

Ниже Python код демонстрирует создание тела  из 2-х тел с помощью инструмента INTERFERENCE. Последовательность работы программы отражена на рисунках.

import adsk.core, adsk.fusion, traceback
def run(context):
 ui = None
 try:
  app = adsk.core.Application.get()
  ui  = app.userInterface
# Create a document.
  doc = app.documents.add(adsk.core.DocumentTypes.FusionDesignDocumentType)
  product = app.activeProduct
  design = adsk.fusion.Design.cast(product)
  design.designType = adsk.fusion.DesignTypes.DirectDesignType
# Get the root component of the active design.
  rootComp = design.rootComponent
  features = rootComp.features
# Create sketch circle on the xz plane.
  sketches = rootComp.sketches
  sketch = sketches.add(rootComp.xZConstructionPlane)
  sketchCircles = sketch.sketchCurves.sketchCircles
  centerPoint = adsk.core.Point3D.create(0, 0, 0)
  sketchCircles.addByCenterRadius(centerPoint, 10)
# Create a collection of entities for extrude
  entities0 = adsk.core.ObjectCollection.create()
  entities0.add(sketch.profiles.item(0))
# Create a cylinder with ExtrudeFeature using the profile above.
  extrudeFeats = features.extrudeFeatures
  extrudeFeatureInput = extrudeFeats.createInput(entities0, adsk.fusion.FeatureOperations.NewBodyFeatureOperation)
  extrudeFeatureInput.isSolid = True
  extrudeFeatureInput.setDistanceExtent(False, adsk.core.ValueInput.createByReal(2.5))
  extrudeFeature = extrudeFeats.add(extrudeFeatureInput)
# Create second body to do interference
  sketch = sketches.add(rootComp.xZConstructionPlane)
  sketchCircles = sketch.sketchCurves.sketchCircles
  centerPoint = adsk.core.Point3D.create(5, 0, 0)
  sketchCircles.addByCenterRadius(centerPoint, 10)
  entities0.clear()
  entities0.add(sketch.profiles.item(0))
# Create a cylinder with ExtrudeFeature using the profile above.
  extrudeFeatureInput = extrudeFeats.createInput(entities0, adsk.fusion.FeatureOperations.NewBodyFeatureOperation)
  extrudeFeatureInput.isSolid = True
  extrudeFeatureInput.setDistanceExtent(False, adsk.core.ValueInput.createByReal(2.5))
  extrudeFeature = extrudeFeats.add(extrudeFeatureInput)
# Create a collection of bodies
  bodies = adsk.core.ObjectCollection.create()
  for body in rootComp.bRepBodies:
   bodies.add(body)
# Create InterferenceInput
  input = design.createInterferenceInput(bodies)
# Analyze interference
  results = design.analyzeInterference(input)
# Create bodies
  results.createBodies(True)
 except:
  if ui: 
   ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

Для создания тела  с помощью инструмента INTERFERENCE в программе были выполнены следующие действия:

  • Создаются два цилиндрических тела в корневом компоненте rootComp с помощью инструмента ЕXTRUDE.
  • Оба тела из коллекции bRepBodies, куда они были помещены автоматически при их создании, добавляются в созданную коллекцию bodies.
  • Создаются Input данные для инструмента INTERFERENCE и появляется тело body1 во вхождении Intersections1:1.

Trim Feature

Ниже Python код демонстрирует обрезание тела  с помощью инструмента TRIM. Последовательность работы программы отражена на рисунках.

import adsk.core, adsk.fusion, traceback
def run(context):
 ui = None
 try:
  app = adsk.core.Application.get()
  ui = app.userInterface
# Create a document.
  doc = app.documents.add(adsk.core.DocumentTypes.FusionDesignDocumentType)
  product = app.activeProduct
  design = adsk.fusion.Design.cast(product)
# Get the root component of the active design.
  rootComp = design.rootComponent
# Create sketch
  sketches = rootComp.sketches
  sketch = sketches.add(rootComp.xZConstructionPlane)
  sketchCircles = sketch.sketchCurves.sketchCircles
  centerPoint = adsk.core.Point3D.create(0, 0, 0)
  sketchCircle = sketchCircles.addByCenterRadius(centerPoint, 3.0)
# Create a open profile for extrusion.
  openProfile = rootComp.createOpenProfile(sketchCircle)
# Create an extrusion input.
  features = rootComp.features
  extrudes = features.extrudeFeatures
  extrudeInput = extrudes.createInput(openProfile, adsk.fusion.FeatureOperations.NewBodyFeatureOperation)
  extrudeInput.isSolid = False
# Define the extent with a distance extent of 3 cm.
  distance = adsk.core.ValueInput.createByReal(3.0)
  extrudeInput.setDistanceExtent(False, distance)
# Create the extrusion.
  extrude = extrudes.add(extrudeInput)
# Get the body created by extrusion
  body = extrude.bodies[0]
# Create sketch 2.
  sketch2 = sketches.add(rootComp.xYConstructionPlane);
  sketchLines = sketch2.sketchCurves.sketchLines;
  startPoint = adsk.core.Point3D.create(-5, 0, 0);
  endPoint = adsk.core.Point3D.create(5, 0, 0);
  sketchLine = sketchLines.addByTwoPoints(startPoint, endPoint);
  openProfile2 = rootComp.createOpenProfile(sketchLine);
# Create a open profile for extrusion.
  extrudeInput2 = extrudes.createInput(openProfile2, adsk.fusion.FeatureOperations.NewBodyFeatureOperation)
  extrudeInput2.isSolid = False
# Define the extent
  distance2 = adsk.core.ValueInput.createByReal(5.0)
  extrudeInput2.setDistanceExtent(False, distance2)
# Create the extrusion.
  extrudes.add(extrudeInput2)
# Create trim feature
  trims = features.trimFeatures
  trimInput = trims.createInput(body)
  cells = trimInput.bRepCells
  cells[0].isSelected = True
  trims.add(trimInput)
 except:
  if ui:
   ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

Для создания тела  с помощью инструмента TRIM в программе были выполнены следующие действия:

  • Создается эскиз окружности в плоскости XZ корневого компонента, через который определяется профиль openProfile для цилиндра. Подготавливаются Input данные для выдавливания и создается тело цилиндра.
  • Создается эскиз отрезка в плоскости XY корневого компонента, через который определяется профиль openProfile2 для плоскости. Подготавливаются Input данные для выдавливания и создается тело плоскости.
  • Создается кромка обрезания (trim feature), для которой в качестве Input данных используется поверхность тела цилиндра (объект body). В коллекцию trims добавляется обрезанное тело, в этом примере тело плоской грани. В браузере тело плоскости body2 заменяется на тело обрезанной плоскости.

Unstitch Feature

Ниже Python код демонстрирует распарывание объекта (создание 6 граней)  с помощью инструмента UNSTITCH. Последовательность работы программы отражена на рисунках.

import adsk.core, adsk.fusion, traceback
def run(context):
 ui = None
 try:
  app = adsk.core.Application.get()
  ui  = app.userInterface
# Create a document.
  doc = app.documents.add(adsk.core.DocumentTypes.FusionDesignDocumentType)
  product = app.activeProduct
  design = adsk.fusion.Design.cast(product)
# Get the root component of the active design.
  rootComp = design.rootComponent
# Create sketch
  sketches = rootComp.sketches
  sketch = sketches.add(rootComp.xZConstructionPlane)
  sketchLines = sketch.sketchCurves.sketchLines
  startPoint = adsk.core.Point3D.create(0, 0, 0)
  endPoint = adsk.core.Point3D.create(5, 5, 0)
  sketchLines.addTwoPointRectangle(startPoint, endPoint)
# Get the profile defined by the rectangle.
  prof = sketch.profiles.item(0)
# Create an extrusion input.
  features = rootComp.features
  extrudes = features.extrudeFeatures
  extInput = extrudes.createInput(prof, adsk.fusion.FeatureOperations.NewBodyFeatureOperation)
# Define that the extent is a distance extent of 5 cm.
  distance = adsk.core.ValueInput.createByReal(5)
  extInput.setDistanceExtent(False, distance)
# Create the extrusion.
  ext = extrudes.add(extInput)
# Get the body created by extrusion.
  body = ext.bodies.item(0)
# Create unstitch feature.
  unstitchFeatures = features.unstitchFeatures
  entities = adsk.core.ObjectCollection.create()
  entities.add(body)
  unstitch = unstitchFeatures.add(entities)
 except:
  if ui:
   ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

Для создания граней  с помощью инструмента UNSTITCH в программе были выполнены следующие действия:

  • Создается эскиз прямоугольника в плоскости XZ корневого компонента, через который определяется профиль prof.
  • Создается куб, как элемент выдавливания ext. Из коллекции тел bodies получаем тело куба и запоминаем его под именем body.
  • В коллекцию unstitchFeatures добавляется объект, который содержит тела из коллекции entities (в нее помещено тело body). В итоге создаются 6 тел, представляющих грани куба.

Контрольные задания

Задание 1

Разработать Python приложение для создания пространственной модели детали.

Порядок выполнения задания

Приложение будем разрабатывать, решая проблемы в следующей последовательности.

Прежде всего оценим, какие геометрические условия (Constraints) присутствуют в этой модели. Это — перпендикулярность, параллельность, симметричное расположение элементов, одинаковый диаметр симметричных отверстий. Попытаемся по возможности учесть эти условия на этапе эскизирования.

Выбираем исходное приложение Constraints (Perpendicular, Parallel and Symmetry), которое есть наиболее близким по содержанию работы.

В приложение добавляем создание отверстий в том же эскизе, а также условия (Constraints) их симметричного расположения.  Немного пошаманив с кодом приходим к выводу, что возможности определения ограничений на эскизе не обеспечивают синхронное изменение диаметра симметричной окружности.  Изменение диаметра одного отверстия оставляет без изменений другое отверстие.

import adsk.core, adsk.fusion, traceback
def run(context):
 ui = None
 try:
 app = adsk.core.Application.get()
 ui = app.userInterface
# Create a document.
 doc = app.documents.add(adsk.core.DocumentTypes.FusionDesignDocumentType)
 product = app.activeProduct
 design = adsk.fusion.Design.cast(product)
# Get the root component of the active design.
 rootComp = design.rootComponent
 # Create sketch
 sketches = rootComp.sketches
 sketch = sketches.add(rootComp.xZConstructionPlane)
 Lines = sketch.sketchCurves.sketchLines
 
 startPoint = adsk.core.Point3D.create(-17, -32, 0)
 endPoint = adsk.core.Point3D.create(17, 32, 0)
 
 Rect=Lines.addTwoPointRectangle(startPoint, endPoint)
 start = adsk.core.Point3D.create(0, 0, 0)
 endx = adsk.core.Point3D.create(5, 0, 0)
 endz = adsk.core.Point3D.create(0, 25, 0)
 endz1 = adsk.core.Point3D.create(0, -25, 0)
 lx=Lines.addByTwoPoints(start, endx)
 lz=Lines.addByTwoPoints(start, endz)
 lz1=Lines.addByTwoPoints(start, endz1)
 
 circles = sketch.sketchCurves.sketchCircles
 oCirc = circles.addByCenterRadius( lz.endSketchPoint, 4)
 oCirc1 = circles.addByCenterRadius( lz1.endSketchPoint, 4)
 
 line0=Rect.item(0)
 line1=Rect.item(1)
 line2=Rect.item(2)
 line3=Rect.item(3)
 constraints = sketch.geometricConstraints
 constraints.addPerpendicular (line1,line2)
 constraints.addParallel(line0,line2)
 constraints.addParallel(line1,line3)
 constraints.addSymmetry(line0,line2,lx)
 constraints.addSymmetry(line1,line3,lz)
 constraints.addCoincident(lx.startSketchPoint, lz.startSketchPoint)
 constraints.addCoincident(lx.startSketchPoint, lz1.startSketchPoint)
 constraints.addSymmetry ( lz.endSketchPoint, lz1.endSketchPoint, lx)
 
 # Get the profile defined by the rectangle.
 prof = sketch.profiles.item(0)
# Create an extrusion input.
 features = rootComp.features
 extrudes = features.extrudeFeatures
 extInput = extrudes.createInput(prof, adsk.fusion.FeatureOperations.NewBodyFeatureOperation)
 # Define that the extent is a distance extent of 54 mm.
 distance = adsk.core.ValueInput.createByReal(54)
 extInput.setDistanceExtent(False, distance)
# Create the extrusion.
 ext = extrudes.add(extInput) 
 # Get the body created by extrusion.
 body = ext.bodies.item(0)
 except:
 if ui:
 ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

Попытаемся решить задачу немного по другому. Оставим необходимые ограничения только для одной половины детали. Вторую часть детали получим зеркальным отображением (см. программу  Mirror Feature).

В эскизе sketch расположены прямоугольник с отверстием внутри, из этих фигур в коллекции профилей sketch.profiles автоматически образуются 2 профиля. Индекс профиля для выдавливания sketch.profiles.item(1) определяется тестовыми запусками программы. Точно также определен индекс плоскости тела body.faces.item(2), относительно которой реализуется зеркальное отражение.

import adsk.core, adsk.fusion, traceback
def run(context):
 ui = None
 try:
  app = adsk.core.Application.get()
  ui = app.userInterface
# Create a document.
  doc = app.documents.add(adsk.core.DocumentTypes.FusionDesignDocumentType)
  product = app.activeProduct
  design = adsk.fusion.Design.cast(product)
# Get the root component of the active design.
  rootComp = design.rootComponent
# Create sketch
  sketches = rootComp.sketches
  sketch = sketches.add(rootComp.xZConstructionPlane)
  Lines = sketch.sketchCurves.sketchLines
 
  startPoint = adsk.core.Point3D.create(-17, 0, 0)
  endPoint = adsk.core.Point3D.create(17, -32, 0) 
  start = adsk.core.Point3D.create(0, 0, 0)
  endz = adsk.core.Point3D.create(0, -25, 0) 
  lz=Lines.addByTwoPoints(start, endz)
 
  circles = sketch.sketchCurves.sketchCircles
  oCirc = circles.addByCenterRadius( lz.endSketchPoint, 4)
  Rect=Lines.addTwoPointRectangle(startPoint, endPoint)
  line0=Rect.item(0)
  line1=Rect.item(1)
  line2=Rect.item(2)
  line3=Rect.item(3)
  constraints = sketch.geometricConstraints
  constraints.addPerpendicular (line1,line2)
  constraints.addParallel(line0,line2)
  constraints.addParallel(line1,line3)
  constraints.addSymmetry(line1,line3,lz)
# Get the profile defined by the rectangle.
  prof = sketch.profiles.item(1)
# Create an extrusion input.
  features = rootComp.features
  extrudes = features.extrudeFeatures
  extInput = extrudes.createInput(prof, adsk.fusion.FeatureOperations.NewBodyFeatureOperation)
# Define that the extent is a distance extent of 54 mm.
  distance = adsk.core.ValueInput.createByReal(54)
  extInput.setDistanceExtent(False, distance)
# Create the extrusion.
  ext = extrudes.add(extInput) 
# Get the body created by extrusion.
  body = ext.bodies.item(0)
# Get a face of the body
  face = body.faces.item(2)
# Create a construction plane by offset
  planes = rootComp.constructionPlanes
  planeInput = planes.createInput()
  offsetDistance = adsk.core.ValueInput.createByString('0 cm')
  planeInput.setByOffset(face, offsetDistance)
  plane = planes.add(planeInput)
# Create input entities for mirror feature
  inputEntites = adsk.core.ObjectCollection.create()
  inputEntites.add(body)
# Create the input for mirror feature
  mirrorFeatures = features.mirrorFeatures
  mirrorInput = mirrorFeatures.createInput(inputEntites, plane)
# Create the mirror feature
  mirrorFeature = mirrorFeatures.add(mirrorInput)
 except:
  if ui:
   ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

Выполним продольное отверстие в детали. Для выдавливания был создан профиль окружности на эскизе в плоскости симметрии plane.

 sketch1 = sketches.add(plane)
 circles1 = sketch1.sketchCurves.sketchCircles
 CentPoint = adsk.core.Point3D.create(0, -11, 0)
 oCirc = circles1.addByCenterRadius(CentPoint, 10)
# Get the profile defined by the rectangle.
 prof1 = sketch1.profiles.item(0)
 extInput = extrudes.createInput(prof1, adsk.fusion.FeatureOperations.CutFeatureOperation)
# Define that the extent is a distance extent of 64 (32*2).
 distance = adsk.core.ValueInput.createByReal(32)
 extInput.setDistanceExtent(True, distance)
# Create the extrusion.
 ext = extrudes.add(extInput)

Добавим недостающую часть детали, выполнив ее через выдавливание профиля, созданного в одном эскизе.

  sketch2 = sketches.add(rootComp.yZConstructionPlane)
  Lines = sketch2.sketchCurves.sketchLines
  Arcs = sketch2.sketchCurves.sketchArcs
 
  oPoint1 = adsk.core.Point3D.create(-22, 38, 0)
  oPoint2 = adsk.core.Point3D.create(-22, 0, 0)
  oPoint3 = adsk.core.Point3D.create(22, 0, 0)
  oPoint4 = adsk.core.Point3D.create(22, 38, 0)
 
  oline0 = Lines.addByTwoPoints (oPoint1,oPoint2)
  oline1 = Lines.addByTwoPoints (oline0.endSketchPoint,oPoint3)
  oline2 = Lines.addByTwoPoints (oline1.endSketchPoint,oPoint4)
  oArc = Arcs.addFillet(oline0,oPoint1,oline2,oPoint4,22)
 
  circles2 = sketch2.sketchCurves.sketchCircles
  CentPoint = adsk.core.Point3D.create(0, 38, 0)
  oCirc = circles2.addByCenterRadius(oArc.centerSketchPoint, 14)
 
  prof2 = sketch2.profiles.item(0)
  extInput = extrudes.createInput(prof2, adsk.fusion.FeatureOperations.JoinFeatureOperation)
# Define that the extent is a distance extent of 48 (24*2).
  distance = adsk.core.ValueInput.createByReal(24)
  extInput.setDistanceExtent(True, distance)
# Create the extrusion.
  ext = extrudes.add(extInput)

Программа еще не завершена. Отсутствуют вырезы внизу детали. Не установлены все условия параллельности и перпендикулярности. Внешние части блоков детали перекрыли ранее подготовленные отверстия. Доработайте программу самостоятельно.

Задание 2

По аналогии с предыдущим заданием разработать приложение  для создания пространственной модели детали по варианту задания:

 

Пример выполнения задания

import adsk.core, adsk.fusion, traceback
def run(context):
 ui = None
 try:
  app = adsk.core.Application.get()
  ui = app.userInterface
# Create a document.
  doc = app.documents.add(adsk.core.DocumentTypes.FusionDesignDocumentType)
  product = app.activeProduct
  design = adsk.fusion.Design.cast(product)
# Get the root component of the active design.
  rootComp = design.rootComponent
# Create sketch
  sketches = rootComp.sketches
  sketch = sketches.add(rootComp.xZConstructionPlane)
  Lines = sketch.sketchCurves.sketchLines
 
  startPoint = adsk.core.Point3D.create(-17, 0, 0)
  endPoint = adsk.core.Point3D.create(17, -32, 0)
 
  start = adsk.core.Point3D.create(0, 0, 0)
  endz = adsk.core.Point3D.create(0, -25, 0) 
  lz=Lines.addByTwoPoints(start, endz)
 
  circles = sketch.sketchCurves.sketchCircles
  oCirc = circles.addByCenterRadius( lz.endSketchPoint, 4)
 
  Rect=Lines.addTwoPointRectangle(startPoint, endPoint)
  line0=Rect.item(0)
  line1=Rect.item(1)
  line2=Rect.item(2)
  line3=Rect.item(3)
  constraints = sketch.geometricConstraints
  constraints.addPerpendicular (line1,line2)
  constraints.addParallel(line0,line2)
  constraints.addParallel(line1,line3)
  constraints.addSymmetry(line1,line3,lz)
 
# Get the profile defined by the rectangle.
  prof = sketch.profiles.item(1)
# Create an extrusion input.
  features = rootComp.features
  extrudes = features.extrudeFeatures
  extInput = extrudes.createInput(prof, adsk.fusion.FeatureOperations.NewBodyFeatureOperation)
# Define that the extent is a distance extent of 54 mm.
  distance = adsk.core.ValueInput.createByReal(54)
  extInput.setDistanceExtent(False, distance)
# Create the extrusion.
  ext = extrudes.add(extInput) 
# Get the body created by extrusion.
  body = ext.bodies.item(0)
# Get a face of the body
  face = body.faces.item(2)
# Create a construction plane by offset
  planes = rootComp.constructionPlanes
  planeInput = planes.createInput()
  offsetDistance = adsk.core.ValueInput.createByString('0 cm')
  planeInput.setByOffset(face, offsetDistance)
  plane = planes.add(planeInput)
# Create input entities for mirror feature
  inputEntites = adsk.core.ObjectCollection.create()
  inputEntites.add(body)
# Create the input for mirror feature
  omirrorFeatures = features.mirrorFeatures
  mirrorInput = omirrorFeatures.createInput(inputEntites, plane)
# Create the mirror feature
  omirrorFeature = omirrorFeatures.add(mirrorInput)
 
  sketch2 = sketches.add(rootComp.yZConstructionPlane)
  Lines = sketch2.sketchCurves.sketchLines
  Arcs = sketch2.sketchCurves.sketchArcs
 
  oPoint1 = adsk.core.Point3D.create(-22, 38, 0)
  oPoint2 = adsk.core.Point3D.create(-22, 0, 0)
  oPoint3 = adsk.core.Point3D.create(22, 0, 0)
  oPoint4 = adsk.core.Point3D.create(22, 38, 0)
 
  oline0 = Lines.addByTwoPoints (oPoint1,oPoint2)
  oline1 = Lines.addByTwoPoints (oline0.endSketchPoint,oPoint3)
  oline2 = Lines.addByTwoPoints (oline1.endSketchPoint,oPoint4)
  oArc = Arcs.addFillet(oline0,oPoint1,oline2,oPoint4,22)
 
  circles2 = sketch2.sketchCurves.sketchCircles
  CentPoint = adsk.core.Point3D.create(0, 38, 0)
  oCirc = circles2.addByCenterRadius(oArc.centerSketchPoint, 14)
 
  prof2 = sketch2.profiles.item(0)
  extInput = extrudes.createInput(prof2, adsk.fusion.FeatureOperations.JoinFeatureOperation)
# Define that the extent is a distance extent of 48 (24*2).
  distance = adsk.core.ValueInput.createByReal(24)
  extInput.setDistanceExtent(True, distance)
# Create the extrusion.
  ext = extrudes.add(extInput) 
 
  sketch1 = sketches.add(plane)
  circles1 = sketch1.sketchCurves.sketchCircles
  CentPoint = adsk.core.Point3D.create(0, -11, 0)
  oCirc = circles1.addByCenterRadius(CentPoint, 10)
# Get the profile defined by the rectangle.
  prof1 = sketch1.profiles.item(0)
  extInput = extrudes.createInput(prof1, adsk.fusion.FeatureOperations.CutFeatureOperation)
# Define that the extent is a distance extent of 64 (32*2).
  distance = adsk.core.ValueInput.createByReal(32)
  extInput.setDistanceExtent(True, distance)
# Create the extrusion.
  ext = extrudes.add(extInput)

 except:
   if ui:
    ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

Автор: Николай Свирневский

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *