- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
Hey!
I'm at the final step of my current project and have simply hit a wall...
Using the Extrude API I'm trying to add all my fret sketch profiles to a single collection within a for loop, and then use that profile collection to extrude all of the sketches at once. Currently I'm unable to extrude the entire collection at once. Looking at the results in the UI, which I examine the Extrude Feature in from the Timeline it shows it only extruded 1 profile.
The left side is the results from my script with the right being the desired results (achieved via the UI).
Here's what I have for my script, it's a bit amateur and needs to be cleaned up, but the code in question is at the end of the script.
import adsk.core, adsk.fusion, traceback import math from math import sqrt #User Defined Parameters - To be better organized imp = 2.54 #Imperial unit conversion h = 0.125*imp #Overall depth of fretboard nutWidth = 1.625 #Neck width at nut nutRadius = 10 #Neck Radius endWidth = 2.1875 #Neck Width at end endRadius = 16 #End Radius endCurve = 3 #Fretboard end curve f = 22 #Number of Frets scaleLength = 25.5 tangWidth = 0.025 tangDepth = 0.1 filletRadius = adsk.core.ValueInput.createByReal((.5)) #Equation for fret spacin for fretNumber in range(1,f+2): fretDistance = scaleLength-(scaleLength/(2**(fretNumber/12.0))) #This calculates and rounds the total length of the fretboard using the scale length and number of frets L = ((round((float('%.3f'%(fretDistance)))*4)/4)*2.54) print(L/imp) #Equation for defining the proper radii endR = endRadius-sqrt((endRadius**2-(endWidth/2)**2)) nutR = nutRadius-sqrt((nutRadius**2-(nutWidth/2)**2)) endC = endCurve-sqrt((endCurve**2-(endWidth/2)**2)) # Points defined for curves endTopL = adsk.core.Point3D.create((endWidth/-2)*imp, h-endR*imp, endC) endTopC = adsk.core.Point3D.create(0, h, 0) endTopR = adsk.core.Point3D.create((endWidth/2)*imp, h-endR*imp, endC) endBotL = adsk.core.Point3D.create((endWidth/-2)*imp, 0, endC) endBotC = adsk.core.Point3D.create(0, 0, 0) endBotR = adsk.core.Point3D.create((endWidth/2)*imp, 0, endC) nutTopL = adsk.core.Point3D.create((nutWidth/-2)*imp, h-nutR*imp, L) nutTopC = adsk.core.Point3D.create(0, h, L) nutTopR = adsk.core.Point3D.create((nutWidth/2)*imp, h-nutR*imp, L) 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) rootComp = design.rootComponent sketchesObj = rootComp.sketches #create curve for bridge-end top arc sketch1 = sketchesObj.add(rootComp.yZConstructionPlane) sketchArcsObj1 = sketch1.sketchCurves.sketchArcs sketchArcsObj1.addByThreePoints(endTopL, endTopC, endTopR) test1 = sketchArcsObj1.addByThreePoints(endTopL, endTopC, endTopR) openProfile1 = adsk.fusion.Path.create(test1, adsk.fusion.ChainedCurveOptions.noChainedCurves) sketch1.name = 'Top/Rear Curve' sketch1.isVisible = False #create curve for bridge-end bottom arc sketch2 = sketchesObj.add(rootComp.yZConstructionPlane) sketchArcsObj2 = sketch2.sketchCurves.sketchArcs sketchArcsObj2.addByThreePoints(endBotL, endBotC, endBotR) test2 = sketchArcsObj2.addByThreePoints(endBotL, endBotC, endBotR) openProfile2 = adsk.fusion.Path.create(test2, adsk.fusion.ChainedCurveOptions.noChainedCurves) sketch2.name = 'Bottom/Rear Curve' sketch2.isVisible = False #create curve for nut-end top arc sketch3 = sketchesObj.add(rootComp.yZConstructionPlane) sketchArcsObj3 = sketch3.sketchCurves.sketchArcs sketchArcsObj3.addByThreePoints(nutTopL, nutTopC, nutTopR) test3 = sketchArcsObj3.addByThreePoints(nutTopL, nutTopC, nutTopR) openProfile3 = adsk.fusion.Path.create(test3, adsk.fusion.ChainedCurveOptions.noChainedCurves) sketch3.name = 'Top/Nut Curve' sketch3.isVisible = False #create line for nut-end bottom arc sketch4 = sketchesObj.add(rootComp.yZConstructionPlane) line = sketch4.sketchCurves.sketchLines; nutLine = line.addByTwoPoints(adsk.core.Point3D.create((nutWidth/-2)*imp, 0, L), adsk.core.Point3D.create((nutWidth/2)*imp, 0, L)) openProfile4 = adsk.fusion.Path.create(nutLine, adsk.fusion.ChainedCurveOptions.noChainedCurves) sketch4.name = 'Bottom/Rear Line' sketch4.isVisible = False # Create surface for bridge-end of fretboard loftFeats = rootComp.features.loftFeatures loftInput1 = loftFeats.createInput(adsk.fusion.FeatureOperations.NewBodyFeatureOperation) loftSectionsObj1 = loftInput1.loftSections loftSectionsObj1.add(openProfile2) loftSectionsObj1.add(openProfile1) loftInput1.isSolid = False loft1 = loftFeats.add(loftInput1) l1 = loft1.faces[0] # Create surface for nut-end of fretboard loftInput2 = loftFeats.createInput(adsk.fusion.FeatureOperations.NewBodyFeatureOperation) loftSectionsObj2 = loftInput2.loftSections loftSectionsObj2.add(openProfile3) loftSectionsObj2.add(openProfile4) loftInput2.isSolid = False loft2 = loftFeats.add(loftInput2) l2 = loft2.faces[0] # Create surface using previous surfaces loftInput3 = loftFeats.createInput(adsk.fusion.FeatureOperations.NewBodyFeatureOperation) loftSectionsObj3 = loftInput3.loftSections loftSectionsObj3.add(l1) loftSectionsObj3.add(l2) loftInput3.isSolid = False loft3 = loftFeats.add(loftInput3) l3 = loft3.faces[0] # Get surface bodies and add them to object collection surface1 = loft1.bodies.item(0) surface2 = loft2.bodies.item(0) surface3 = loft3.bodies.item(0) surfaces = adsk.core.ObjectCollection.create() surfaces.add(surface1) surfaces.add(surface2) surfaces.add(surface3) # Define tolerance with 1 mm. tolerance = adsk.core.ValueInput.createByReal(0.1) # Create a stitch input to be able to define the input needed for an stitch. features = rootComp.features stitches = features.stitchFeatures stitchInput = stitches.createInput(surfaces, tolerance, adsk.fusion.FeatureOperations.NewBodyFeatureOperation) # Create a stitch feature. stitch = stitches.add(stitchInput) #Select edges of bridge-end of fretboard to make fillets fretboardEndFace = stitch.bodies.item(0) fretboardEndEdge1 = fretboardEndFace.edges.item(1) fretboardEndEdge2 = fretboardEndFace.edges.item(3) #Create collection endEdges = adsk.core.ObjectCollection.create() endEdges.add(fretboardEndEdge1) endEdges.add(fretboardEndEdge2) #Creating fillets fillets = rootComp.features.filletFeatures filletInput = fillets.createInput() filletInput.addConstantRadiusEdgeSet(endEdges, filletRadius, True) filletInput.isG2 = False filletInput.isRollingBallCorner = True fillet = fillets.add(filletInput) # Get the body created by the stitch face = stitch.bodies.item(0) topFace = face.faces.item(6) # Create input entities for offset feature inputEntities = adsk.core.ObjectCollection.create() inputEntities.add(topFace) # Distance for offset feature distance = adsk.core.ValueInput.createByString('-0.05 in') # Create an input for offset feature offsetFeatures = features.offsetFeatures offsetInput = offsetFeatures.createInput(inputEntities, distance, adsk.fusion.FeatureOperations.NewBodyFeatureOperation) #Get the surface body. extrudeFeature = offsetFeatures.add(offsetInput) surface = extrudeFeature.bodies.item(0) surface.name = 'Reference surface for fret cuts' surface.isVisible = False #Get an edge from surface, and add it to object collection. extend = surface.edges ext = extend.item(0) inputEdges = adsk.core.ObjectCollection.create() inputEdges.add(ext) #Define a distance to extend with 1 cm. distance2 = adsk.core.ValueInput.createByReal(1.0) #Create an extend input to be able to define the input needed for an extend. extendFeatures = features.extendFeatures extendFeatureInput = extendFeatures.createInput(inputEdges, distance2, adsk.fusion.SurfaceExtendTypes.NaturalSurfaceExtendType) #Create an extend feature. extendFeature = extendFeatures.add(extendFeatureInput) #Get extrude features extrudes = rootComp.features.extrudeFeatures #Create distance value inputs mm10 = adsk.core.ValueInput.createByString("0 mm") mm100 = adsk.core.ValueInput.createByString("10 mm") #Create sketch for fret lines sketch5 = sketchesObj.add(rootComp.yZConstructionPlane) frets = sketch5.sketchCurves.sketchLines; sketch5.name = 'Fret Lines [ ' + str(f) + ' frets ]' sketch5.isVisible = True #Create sketch for fret cuts sketch6 = sketchesObj.add(rootComp.xZConstructionPlane) #xY or xZ cuts = sketch6.sketchCurves.sketchLines; sketch6.name = 'Fret Cuts [ ' + str(f) + ' frets ]' sketch6.isVisible = True #Create loop for fret spacing and creation for fretNumber in range(1,f+1): fretDistance = scaleLength-(scaleLength/(2**(fretNumber/12.0))) #Create fret lines for fret spacing reference fretLines = frets.addByTwoPoints(adsk.core.Point3D.create(endWidth*imp/2, h, (-fretDistance*imp+L)), adsk.core.Point3D.create(-endWidth*imp/2, h, (-fretDistance*imp+L))) fretLines.isConstruction = True #Create fret cuts cutLines = cuts.addTwoPointRectangle(adsk.core.Point3D.create((-fretDistance*imp+L-(tangWidth*imp/2)), -endWidth*imp/2, h), adsk.core.Point3D.create((-fretDistance*imp+L+(tangWidth*imp/2)), endWidth*imp/2, h)) #Create an object collection to use an input. profs = adsk.core.ObjectCollection.create() #Add all of the profiles to the collection. for prof in sketch6.profiles: profs.add(prof) print(prof) print('%.3f'%(fretDistance)) #Extrude Sample 3: Create an extrusion that starts from an entity and goes the specified distance. extrudeInput = extrudes.createInput(prof, adsk.fusion.FeatureOperations.CutFeatureOperation) #Create a distance extent definition extent_distance_2 = adsk.fusion.DistanceExtentDefinition.create(mm100) #Create a start extent that starts from a brep face with an offset of 10 mm. start_from = adsk.fusion.FromEntityStartDefinition.create(extendFeature.faces.item(0), mm10) #taperAngle should be 0 because extrude start face is not a planar face in this case extrudeInput.setOneSideExtent(extent_distance_2, adsk.fusion.ExtentDirections.PositiveExtentDirection) extrudeInput.startExtent = start_from #Create the extrusion extrude = extrudes.add(extrudeInput) fretboard = extrude.bodies.item(0) fretboard.name = 'Fretboard with [ ' + str(f) + ' frets ]' # ui.messageBox('Fretboard has been created: \n' + str(f) + ' frets!' '\nTotal length at ' + str(L/imp) + ' ins!') except: if ui: ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
I feel I'm ALMOST there, I'm just not seeing it...
Thanks!
Solved! Go to Solution.