#Author-Saeed Hamza #Description-Normalizing a surface by selection import adsk.core, adsk.fusion, adsk.cam, traceback def CreateEdgeDefinitionByCurve(brepBodyDef, crv, startPoint, endPoint): edgeDef = adsk.fusion.BRepEdgeDefinition.cast(None) # Create vertex definition startVertexDef = brepBodyDef.createVertexDefinition(startPoint) endVertexDef = brepBodyDef.createVertexDefinition(endPoint) # Create edge definition by curve edgeDef = brepBodyDef.createEdgeDefinitionByCurve(startVertexDef, endVertexDef, crv) return edgeDef def CreateFaceForBodyDefination(brepBodyDef, surface, edgeDefs): faceDef = adsk.fusion.BRepFaceDefinition.cast(None) # Create lump definition lumpDefs = brepBodyDef.lumpDefinitions lumpDef = lumpDefs.add() # Create shell definition shellDefs = lumpDef.shellDefinitions shellDef = shellDefs.add() # Create face definition faceDefs = shellDef.faceDefinitions faceDef = faceDefs.add(surface, True) # Create loop definition loopDefs = faceDef.loopDefinitions loopdef = loopDefs.add() # Create coEdge definitions brepCoEdgeDefs = loopdef.bRepCoEdgeDefinitions for edgeDef in edgeDefs: brepCoEdgeDefs.add(edgeDef, True) return faceDef def CalcualteKnotVector( degree, nPoints, IsUniform): if degree + 1 > nPoints or nPoints == 0 : return outText = [] n = nPoints m = n + degree + 1 divisor = m - 1 - 2 * degree if IsUniform == True : outText.append(0) for i in range(0,m,1) : if i >= m-1 : outText.append(1.0) else : dividend = m-1 outText.append(i / dividend) else : for i in range(0,m,1) : if i <= degree : outText.append(0.0) elif i >= m-degree-1 : outText.append(1.0) else : dividend = i - degree outText.append(dividend / divisor) # print("n = " + str(n)) # print("m = " + str(m)) # print("divisor = " + str(divisor)) return outText def run(context): ui = None try: app = adsk.core.Application.get() ui = app.userInterface design = adsk.fusion.Design.cast(app.activeProduct) rootComp = design.rootComponent features = rootComp.features sketches = rootComp.sketches sele_list = [] selections = ui.activeSelections for selection in selections: sele_list.append(selection.entity) for sele in range(0,len(sele_list),1) : sele_entity = sele_list[sele] for sele in sele_list : # surface_sele = sele.geometry original_surface = sele.geometry (_, degreeU, degreeV, controlPointCountU, controlPointCountV, controlPoints, knotsU, knotsV, weights, propertiesU, propertiesV) = original_surface.getData() # print(degreeU) # print(degreeV) print(controlPointCountU) print(controlPointCountV) # print(len(controlPoints)) # print(knotsU) # print(knotsV) # print(weights) # print(propertiesU) # print(propertiesV) sketch = sketches.add(rootComp.xYConstructionPlane) points = sketch.sketchPoints edge1_controlPoints = [] edge2_controlPoints = [] edge3_controlPoints = [] edge4_controlPoints = [] loop_crvs = [] for point in range(0,controlPointCountV,1) : edge1_controlPoints.append(controlPoints[point]) for point in range(len(controlPoints)-1, len(controlPoints)-controlPointCountV-1,-1) : edge2_controlPoints.append(controlPoints[point]) for point in range(0,len(controlPoints),controlPointCountV) : edge3_controlPoints.append(controlPoints[point]) for point in range(controlPointCountV-1,len(controlPoints),controlPointCountV) : edge4_controlPoints.append(controlPoints[point]) try : nPoints = len(edge1_controlPoints) IsUniform = False knots = CalcualteKnotVector( degreeU, nPoints, IsUniform) isPeriodic = False nurbsCurve1 = adsk.core.NurbsCurve3D.createNonRational(edge1_controlPoints, degreeV, knots, isPeriodic) except : nPoints = len(edge3_controlPoints) IsUniform = False knots = CalcualteKnotVector( degreeU, nPoints, IsUniform) isPeriodic = False nurbsCurve1 = adsk.core.NurbsCurve3D.createNonRational(edge3_controlPoints, degreeV, knots, isPeriodic) loop_crvs.append(nurbsCurve1) try : nPoints = len(edge3_controlPoints) IsUniform = False knots = CalcualteKnotVector( degreeU, nPoints, IsUniform) isPeriodic = False nurbsCurve2 = adsk.core.NurbsCurve3D.createNonRational(edge3_controlPoints, degreeV, knots, isPeriodic) except : nPoints = len(edge1_controlPoints) IsUniform = False knots = CalcualteKnotVector( degreeU, nPoints, IsUniform) isPeriodic = False nurbsCurve2 = adsk.core.NurbsCurve3D.createNonRational(edge1_controlPoints, degreeV, knots, isPeriodic) loop_crvs.append(nurbsCurve2) try : nPoints = len(edge2_controlPoints) IsUniform = False knots = CalcualteKnotVector( degreeU, nPoints, IsUniform) isPeriodic = False nurbsCurve3 = adsk.core.NurbsCurve3D.createNonRational(edge2_controlPoints, degreeV, knots, isPeriodic) except : nPoints = len(edge4_controlPoints) IsUniform = False knots = CalcualteKnotVector( degreeU, nPoints, IsUniform) isPeriodic = False nurbsCurve3 = adsk.core.NurbsCurve3D.createNonRational(edge4_controlPoints, degreeV, knots, isPeriodic) loop_crvs.append(nurbsCurve3) try : nPoints = len(edge4_controlPoints) IsUniform = False knots = CalcualteKnotVector( degreeU, nPoints, IsUniform) isPeriodic = False nurbsCurve4 = adsk.core.NurbsCurve3D.createNonRational(edge4_controlPoints, degreeV, knots, isPeriodic) except : nPoints = len(edge2_controlPoints) IsUniform = False knots = CalcualteKnotVector( degreeU, nPoints, IsUniform) isPeriodic = False nurbsCurve4 = adsk.core.NurbsCurve3D.createNonRational(edge2_controlPoints, degreeV, knots, isPeriodic) loop_crvs.append(nurbsCurve4) brepBodyDef = adsk.fusion.BRepBodyDefinition.create() edgeDefs = [] for crv in loop_crvs : edge_eval = crv.evaluator (_, startPoint, endPoint) = edge_eval.getEndPoints() edgedef = CreateEdgeDefinitionByCurve(brepBodyDef, crv, startPoint, endPoint) edgeDefs.append(edgedef) CreateFaceForBodyDefination(brepBodyDef, original_surface, edgeDefs) recreation_body = brepBodyDef.createBody() face = recreation_body.faces[0] face_eval = face.evaluator u_subdiv = 20 v_subdiv = 20 isUDirection = True isVDirection = False u_iso_list = [] # v_iso_list = [] splines = sketch.sketchCurves.sketchFittedSplines lines = sketch.sketchCurves.sketchLines # u_iso_list.append(face.edges[0].geometry) flip = False loft_crvs = [] loft_rails = [] face = recreation_body.faces[0] sections_start_edge = face.edges[1] crv = sections_start_edge.geometry crv_eval = crv.evaluator # sections_start_edge = face.edges[1] # crv1 = sections_start_edge.geometry # crv1_eval = crv1.evaluator # (_, startParameter, endParameter) = crv1_eval.getParameterExtents() # (_, length) = crv1_eval.getLengthAtParameter(startParameter, endParameter) # step = 0 # gap = length / v_subdiv # sp_points = [] # for para in range(0, v_subdiv+1, 1) : # (_, parameter) = crv1_eval.getParameterAtLength(startParameter, step) # (_, point) = crv1_eval.getPointAtParameter(parameter) # # points.add(point) # sp_points.append(point) # step += gap # nPoints = len(sp_points) # IsUniform = False # knots = CalcualteKnotVector( degreeU, nPoints, IsUniform) # isPeriodic = False # nurbsCurve1 = adsk.core.NurbsCurve3D.createNonRational(sp_points, degreeU, knots, isPeriodic) # loft_crvs.append(splines.addByNurbsCurve(nurbsCurve1)) (_, startParameter, endParameter) = crv_eval.getParameterExtents() (_, length) = crv_eval.getLengthAtParameter(startParameter, endParameter) gap = length / u_subdiv step = 0 for para in range(0, u_subdiv, 1) : if para != 0 and para != u_subdiv : (_, parameter) = crv_eval.getParameterAtLength(startParameter, step) (_, point) = crv_eval.getPointAtParameter(parameter) (_, parameter) = face_eval.getParameterAtPoint(point) u_iso = face_eval.getIsoCurve(parameter.x, isVDirection) for iso in u_iso : loft_crvs.append(splines.addByNurbsCurve(iso)) step += gap # sections_start_edge = face.edges[3] # crv1 = sections_start_edge.geometry # crv1_eval = crv1.evaluator # (_, startParameter, endParameter) = crv1_eval.getParameterExtents() # (_, length) = crv1_eval.getLengthAtParameter(startParameter, endParameter) # step = 0 # gap = length / v_subdiv # sp_points = [] # for para in range(0, v_subdiv+1, 1) : # (_, parameter) = crv1_eval.getParameterAtLength(startParameter, step) # (_, point) = crv1_eval.getPointAtParameter(parameter) # # points.add(point) # sp_points.append(point) # step += gap # nPoints = len(sp_points) # IsUniform = False # knots = CalcualteKnotVector( degreeU, nPoints, IsUniform) # isPeriodic = False # nurbsCurve1 = adsk.core.NurbsCurve3D.createNonRational(sp_points, degreeU, knots, isPeriodic) # loft_crvs.append(splines.addByNurbsCurve(nurbsCurve1)) rails_edge = face.edges[0] crv = rails_edge.geometry crv_eval = crv.evaluator (_, startParameter, endParameter) = crv_eval.getParameterExtents() (_, length) = crv_eval.getLengthAtParameter(startParameter, endParameter) (_, startPoint1, endPoint1) = crv_eval.getEndPoints() rails_edge = face.edges[2] crv = rails_edge.geometry crv_eval = crv.evaluator (_, startParameter, endParameter) = crv_eval.getParameterExtents() (_, length) = crv_eval.getLengthAtParameter(startParameter, endParameter) (_, startPoint2, endPoint2) = crv_eval.getEndPoints() gap = length / v_subdiv step = 0 start_trick_points = [] end_trick_points = [] start_trick_points.append(endPoint1) end_trick_points.append(startPoint2) for para in range(0, v_subdiv, 1) : if para != 0 and para != v_subdiv : (_, parameter) = crv_eval.getParameterAtLength(startParameter, step) (_, point) = crv_eval.getPointAtParameter(parameter) (_, parameter) = face_eval.getParameterAtPoint(point) v_iso = face_eval.getIsoCurve(parameter.y, isUDirection) for iso in v_iso : sk_spline = splines.addByNurbsCurve(iso) loft_rails.append(sk_spline) start_trick_points.append(sk_spline.startSketchPoint.geometry) end_trick_points.append(sk_spline.endSketchPoint.geometry) step += gap start_trick_points.append(startPoint1) end_trick_points.append(endPoint2) print(len(start_trick_points)) print(len(end_trick_points)) sketch2 = sketches.add(rootComp.xYConstructionPlane) splines = sketch2.sketchCurves.sketchFittedSplines nPoints = len(start_trick_points) IsUniform = False knots = CalcualteKnotVector( degreeU, nPoints, IsUniform) isPeriodic = False nurbsCurve1 = adsk.core.NurbsCurve3D.createNonRational(start_trick_points, degreeU, knots, isPeriodic) loft_crvs.insert(0 ,splines.addByNurbsCurve(nurbsCurve1)) nPoints = len(end_trick_points) IsUniform = False knots = CalcualteKnotVector( degreeU, nPoints, IsUniform) isPeriodic = False nurbsCurve1 = adsk.core.NurbsCurve3D.createNonRational(end_trick_points, degreeU, knots, isPeriodic) loft_crvs.append(splines.addByNurbsCurve(nurbsCurve1)) print(knots) path_sections = [] for spline in loft_crvs : section = adsk.fusion.Path.create(spline, 0) path_sections.append(section) loftFeatures = rootComp.features.loftFeatures input = loftFeatures.createInput(adsk.fusion.FeatureOperations.NewBodyFeatureOperation) loftSections = input.loftSections for section in path_sections : loftSections.add(section) loftCenterLineOrRails = input.centerLineOrRails for rail in loft_rails : loftCenterLineOrRails.addRail(rail) input.isSolid = False loftFeature = loftFeatures.add(input) sketch.isLightBulbOn = False except: if ui: ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))