def OrganizeSolids(dict={}): #=================================================================== ## Initializing Apex code apex.setScriptUnitSystem(unitSystemName=r'''mm-kg-s-N''') try: numOfSolidsChanged = 0 for Part in apex.currentModel().getParts(recursive=True): if len(Part.getSolids()) > 1: for Solid in Part.getSolids()[1:]: if Solid.getVisibility(): if dict["useSolidName"] == 'True': newPart = apex.createPart(name=Solid.getName()) Solid.setParent(newPart) numOfSolidsChanged += 1 if Part.getParent(): newPart.setParent(Part.getParent()) else: newPart = apex.createPart(name=Part.getName()) Solid.setParent(newPart) numOfSolidsChanged += 1 if Part.getParent(): newPart.setParent(Part.getParent()) print("Reorganized {0} solids.".format(numOfSolidsChanged)) except: print("Operation failed or not performed.")
def CreateSpotGroup(CSVPath="Path", RefineDiam=8.0): model_1 = apex.currentModel() if "/" in CSVPath: TrajectoryName = CSVPath[CSVPath.rfind("/") + 1:-4] else: TrajectoryName = CSVPath[CSVPath.rfind("\\") + 1:-4] try: TrajAssy = model_1.getAssembly(pathName="Trajectories") except: TrajAssy = model_1.createAssembly(name="Trajectories") WeldPositions = [] ScalingToMM = 1.0 with open(CSVPath, 'r') as CSVFile: for line in CSVFile: if "Length unit:" in line: unit = line.strip().split('[')[-1].replace("]", "") if unit == "mm": ScalingToMM = 1.0 elif unit == "m": ScalingToMM = 1000.0 elif uni == "in": ScalingToMM = 25.40 if ('true' in line) or ('false' in line): WeldPositions.append([ ScalingToMM * float(x) for x in line.strip().split(';')[2:5] ]) for spotPoint in WeldPositions: result = apex.geometry.createSphereByLocationOrientation( name='', description='', radius=RefineDiam / 2.0, origin=apex.Coordinate(spotPoint[0], spotPoint[1], spotPoint[2]), orientation=apex.construct.createOrientation(alpha=0.0, beta=0.0, gamma=0.0)) model_1.getCurrentPart().update(name=TrajectoryName) ans = model_1.getCurrentPart().setParent(parent=TrajAssy) try: if model_1.getAssembly("Trajectories").getPart( name="RefDiam_{0}".format(RefineDiam)): pass else: SpecifiedDiameter = apex.createPart( name="RefDiam_{0}".format(RefineDiam)) SpecifiedDiameter.setParent( model_1.getAssembly("Trajectories")) except: print("Part creation failed!")
def buildLapJoint(dict={}): # - Get the data from the dictionary HorizWidth = float(dict["HorizWidth"]) HorizLength = float(dict["HorizLength"]) HorizThick = float(dict["HorizThick"]) VertHeight = float(dict["VertHeight"]) VertLength = float(dict["VertLength"]) VertThick = float(dict["VertThick"]) ## Define max and min thickness if VertThick >= HorizThick: maxThick = VertThick minThick = HorizThick else: maxThick = HorizThick minThick = VertThick avgThick = (maxThick + minThick) / 2.0 Sheet01 = apex.createPart() ParentAssy = model_1.createAssembly(name="LapJoint") # - Build the horizontal plate result = apex.geometry.createBoxByLocationOrientation( name='Sheet01', description='', length=HorizLength, # Length height=HorizWidth, # Width depth=HorizThick, # Thickness origin=apex.Coordinate(0.0, 0.0, 0.0), orientation=apex.construct.createOrientation(alpha=0.0, beta=0.0, gamma=0.0)) res = Sheet01.setParent(ParentAssy) res = Sheet01.update(name='BottomSheet') # - Build the vertical plate Sheet02 = apex.createPart() result = apex.geometry.createBoxByLocationOrientation( name='Sheet02', description='', length=VertLength, # Length height=VertHeight, # Width depth=VertThick, # Thickness origin=apex.Coordinate(0.0, 0.0, HorizThick), orientation=apex.construct.createOrientation(alpha=0.0, beta=0.0, gamma=0.0)) res = Sheet02.setParent(ParentAssy) res = Sheet02.update(name='UpperSheet') # - Translate vertical plate to the middle of horizontal plate _translateSheet = apex.EntityCollection() _translateSheet.append(Sheet02.getSolids()[0]) newEntities = apex.transformTranslate(target=_translateSheet, direction=[0.0, 1.0, 0.0], distance=(HorizWidth - 2.0 * HorizThick), makeCopy=False) # Save joint info for reference JointInfoAssy = model_1.createAssembly("Joint info") res = JointInfoAssy.createPart(name="Sheet 01 = {0}mm".format(HorizThick)) res = JointInfoAssy.createPart(name="Sheet 02 = {0}mm".format(VertThick)) res = JointInfoAssy.createPart(name="Width = {0}mm".format(HorizWidth)) res = JointInfoAssy.createPart(name="Length = {0}mm".format(HorizLength)) # Creating split regions ## Split sheet 01 (horizontal sheet) _target = apex.EntityCollection() _target.append(Sheet01.getSolids()[0]) listOfDist = [-4.0, -5.0, -6.0] for cutDist in listOfDist: _plane = apex.construct.Plane( apex.construct.Point3D(0.0, (HorizWidth + cutDist * avgThick), 0.0), apex.construct.Vector3D(0.0, 1.0, 0.0)) result = apex.geometry.splitWithPlane( target=_target, plane=_plane, splitBehavior=apex.geometry.GeometrySplitBehavior.Partition) ## Split sheet 02 (vertical sheet) _target = apex.EntityCollection() _target.append(Sheet02.getSolids()[0]) listOfDist = [0.0, 2.0, 3.0] for cutDist in listOfDist: _plane = apex.construct.Plane( apex.construct.Point3D(0.0, (HorizWidth + cutDist * avgThick), 0.0), apex.construct.Vector3D(0.0, 1.0, 0.0)) result = apex.geometry.splitWithPlane( target=_target, plane=_plane, splitBehavior=apex.geometry.GeometrySplitBehavior.Partition) ## - Perform meshing if requested if dict["MeshForMe"] == 'True': # - Meshing Sheet 01 refPoint = apex.Coordinate(HorizLength / 2.0, HorizWidth - 2.0 * HorizThick, 0.0) proxSearch = apex.utility.ProximitySearch() ans = proxSearch.insertList(list(Sheet01.getSolids()[0].getCells())) resSearch = proxSearch.findNearestObjects(location=refPoint, numObjects=2) cellsToMesh = apex.EntityCollection() for elem in resSearch.foundObjects(): cellsToMesh.append(elem) _SweepFace = apex.EntityCollection() result = apex.mesh.createHexMesh( name="", target=cellsToMesh, meshSize=(minThick / 2), surfaceMeshMethod=apex.mesh.SurfaceMeshMethod.Pave, mappedMeshDominanceLevel=2, elementOrder=apex.mesh.ElementOrder.Linear, refineMeshUsingCurvature=False, elementGeometryDeviationRatio=0.10, elementMinEdgeLengthRatio=0.20, createFeatureMeshOnWashers=False, createFeatureMeshOnArbitraryHoles=False, preserveWasherThroughMesh=True, sweepFace=_SweepFace, hexMeshMethod=apex.mesh.HexMeshMethod.Auto) resSearch = proxSearch.findNearestObjects(location=refPoint, numObjects=4) cellsToMesh = apex.EntityCollection() for elem in resSearch.foundObjects(): if len(elem.getElements()) > 0: # Check if it has a mesh already pass else: cellsToMesh.append(elem) seedEdge = apex.EntityCollection() for Edge in elem.getEdges(): if 0.9 * HorizThick <= Edge.getLength( ) <= 1.1 * HorizThick: seedEdge.append(Edge) result = apex.mesh.createEdgeSeedUniformByNumber( target=seedEdge, numberElementEdges=1) for Cell in cellsToMesh: vecFaces = Cell.getFaces() for Face in vecFaces: paramU = Face.evaluatePointOnFace(Face.getCentroid()).u paramV = Face.evaluatePointOnFace(Face.getCentroid()).v normalAtPoint = Face.evaluateNormal(paramU, paramV) if abs(normalAtPoint.z ) == 1: # -Extrusion direction for meshing _SweepFace = apex.EntityCollection() _SweepFace.append(Face) meshCell = apex.EntityCollection() meshCell.append(Cell) result = apex.mesh.createHexMesh( name="", target=meshCell, meshSize=maxThick, surfaceMeshMethod=apex.mesh.SurfaceMeshMethod.Pave, mappedMeshDominanceLevel=2, elementOrder=apex.mesh.ElementOrder.Linear, refineMeshUsingCurvature=False, elementGeometryDeviationRatio=0.10, elementMinEdgeLengthRatio=0.20, createFeatureMeshOnWashers=False, createFeatureMeshOnArbitraryHoles=False, preserveWasherThroughMesh=True, sweepFace=_SweepFace, hexMeshMethod=apex.mesh.HexMeshMethod.Auto) break # - Meshing Sheet 02 refPoint = apex.Coordinate(HorizLength / 2.0, HorizWidth - 2.0 * HorizThick, 0.0) proxSearch = apex.utility.ProximitySearch() ans = proxSearch.insertList(list(Sheet02.getSolids()[0].getCells())) resSearch = proxSearch.findNearestObjects(location=refPoint, numObjects=2) cellsToMesh = apex.EntityCollection() for elem in resSearch.foundObjects(): cellsToMesh.append(elem) _SweepFace = apex.EntityCollection() result = apex.mesh.createHexMesh( name="", target=cellsToMesh, meshSize=(minThick / 2), surfaceMeshMethod=apex.mesh.SurfaceMeshMethod.Pave, mappedMeshDominanceLevel=2, elementOrder=apex.mesh.ElementOrder.Linear, refineMeshUsingCurvature=False, elementGeometryDeviationRatio=0.10, elementMinEdgeLengthRatio=0.20, createFeatureMeshOnWashers=False, createFeatureMeshOnArbitraryHoles=False, preserveWasherThroughMesh=True, sweepFace=_SweepFace, hexMeshMethod=apex.mesh.HexMeshMethod.Auto) resSearch = proxSearch.findNearestObjects(location=refPoint, numObjects=4) cellsToMesh = apex.EntityCollection() for elem in resSearch.foundObjects(): if len(elem.getElements()) > 0: # Check if it has a mesh already pass else: cellsToMesh.append(elem) seedEdge = apex.EntityCollection() for Edge in elem.getEdges(): if 0.9 * VertThick <= Edge.getLength() <= 1.1 * VertThick: seedEdge.append(Edge) print(Edge.getLength()) result = apex.mesh.createEdgeSeedUniformByNumber( target=seedEdge, numberElementEdges=1) for Cell in cellsToMesh: vecFaces = Cell.getFaces() for Face in vecFaces: paramU = Face.evaluatePointOnFace(Face.getCentroid()).u paramV = Face.evaluatePointOnFace(Face.getCentroid()).v normalAtPoint = Face.evaluateNormal(paramU, paramV) if abs(normalAtPoint.z ) == 1: # -Extrusion direction for meshing _SweepFace = apex.EntityCollection() _SweepFace.append(Face) meshCell = apex.EntityCollection() meshCell.append(Cell) result = apex.mesh.createHexMesh( name="", target=meshCell, meshSize=maxThick, surfaceMeshMethod=apex.mesh.SurfaceMeshMethod.Pave, mappedMeshDominanceLevel=2, elementOrder=apex.mesh.ElementOrder.Linear, refineMeshUsingCurvature=False, elementGeometryDeviationRatio=0.10, elementMinEdgeLengthRatio=0.20, createFeatureMeshOnWashers=False, createFeatureMeshOnArbitraryHoles=False, preserveWasherThroughMesh=True, sweepFace=_SweepFace, hexMeshMethod=apex.mesh.HexMeshMethod.Auto) break
def CreateWeldBead(CSVPath="NoPath", RefineDiam=4.0, UnitType="None"): model_1 = apex.currentModel() if "/" in CSVPath: TrajectoryName = CSVPath[CSVPath.rfind("/") + 1:-4] else: TrajectoryName = CSVPath[CSVPath.rfind("\\") + 1:-4] try: TrajAssy = model_1.getAssembly(pathName="Refinement regions") except: TrajAssy = model_1.createAssembly(name="Refinement regions") CurrPart = apex.createPart(name=TrajectoryName) CurrPart.setParent(model_1.getAssembly("Refinement regions")) vecLine = [] with open(CSVPath, 'r') as CSVContent: if UnitType == 'Millimeters': convRatio = 1.0 elif UnitType == 'Meters': convRatio = 1000.0 elif UnitType == 'Inches': convRatio = 2.54 for line in CSVContent: if ('true' in line) or ('false' in line): vecLine.append([ convRatio * float(X) for X in line.strip().split(';')[2:5] ]) ## Creating points at the location in the CSV file, these will guide the spline creation _iphysicalCollection = apex.IPhysicalCollection() for i in range(len(vecLine)): _iphysicalCollection.append( apex.Coordinate(vecLine[i][0], vecLine[i][1], vecLine[i][2])) ## Create spline based on the list of points given by the CSV file result = apex.geometry.createCurve( target=_iphysicalCollection, behavior=apex.geometry.CurveBehavior.Spline) def doCircle(diam=8.0): part_1 = model_1.getCurrentPart() if part_1 is None: part_1 = model_1.createPart() sketch_1 = part_1.createSketchOnGlobalPlane( name='Sketch 1', plane=apex.construct.GlobalPlane.YZ, alignSketchViewWithViewport=True) circle_1 = sketch_1.createCircleCenterPoint( name="Circle 1", centerPoint=Point2D(0, 0), pointOnCircle=Point2D(0, diam / 2)) return sketch_1.completeSketch(fillSketches=True) CircleDone = doCircle(diam=RefineDiam) ## Move circle to a new point location part_2 = model_1.getCurrentPart() for Surf in part_2.getSurfaces(): CurrPath = Surf.getPathName() CurrPath = CurrPath[CurrPath.find('/') + 1:] _entities = model_1.getEntities(pathNames=[CurrPath]) PathLength = sqrt( pow(vecLine[0][0], 2) + pow(vecLine[0][1], 2) + pow(vecLine[0][2], 2)) apex.transformTranslate(target=_entities, direction=vecLine[0], distance=PathLength, makeCopy=False) ## Rotate the circle _entities = model_1.getEntities(pathNames=[CurrPath]) TurnAngle = angle([1, 0, 0], [a - b for a, b in zip(vecLine[1], vecLine[0])]) if TurnAngle == 180: TurnAngle = 0 apex.transformRotate( target=_entities, axisDirection=cross( [1, 0, 0], [a - b for a, b in zip(vecLine[1], vecLine[0])]), axisPoint=Point3D(vecLine[0][0], vecLine[0][1], vecLine[0][2]), angle=TurnAngle, makeCopy=False) _target = apex.EntityCollection() _target.append(model_1.getCurrentPart().getSurfaces()[0]) _path = apex.EntityCollection() _path.append(model_1.getCurrentPart().getCurves()[0]) _lockDirection = apex.construct.Vector3D(0.0, 0.0, 0.0) try: result = apex.geometry.createGeometrySweepPath( target=_target, path=_path, scale=0.0, twist=0.0, profileSweepAlignmentMethod=apex.geometry. SweepProfileAlignmentMethod.Normal, islocked=False, lockDirection=_lockDirection, profileClamp=apex.geometry.SweepProfileClampingMethod.Smooth) GotBead = True except: print("Sweep failed...") GotBead = False ## Clean up the supporting geometries (points, curves, surfaces, etc.) DelEntities = apex.EntityCollection() ## Do NOT delete curves, they are used to get weld bead length """ DelCurves = model_1.getCurrentPart().getCurves() for Curve in DelCurves: DelEntities.append(Curve) DelPoints = model_1.getCurrentPart().getPoints() for Point in DelPoints: DelEntities.append(Point) """ if GotBead: DelSurfaces = model_1.getCurrentPart().getSurfaces() for Surface in DelSurfaces: DelEntities.append(Surface) apex.deleteEntities(DelEntities) ## Rename part and solid if GotBead: updateSolidName = model_1.getCurrentPart().getSolids()[0].update( name=TrajectoryName) if dict["ExtendBead"] == "True": #Push-pull the extremities by the diameter amount try: for Face in model_1.getCurrentPart().getSolids( )[0].getFaces(): XSectionArea = 3.14159 * (RefineDiam / 2)**2 if (0.9 * XSectionArea) < Face.getArea() < ( 1.1 * XSectionArea): _target = apex.EntityCollection() _target.append(Face) result = apex.geometry.pushPull( target=_target, method=apex.geometry.PushPullMethod.Normal, behavior=apex.geometry.PushPullBehavior. FollowShape, removeInnerLoops=False, createBooleanUnion=False, distance=RefineDiam, direction=[1.0, 1.0, 1.0]) except: updatePartName = model_1.getCurrentPart().update( name=TrajectoryName + "_ExtendFailed") else: updatePartName = model_1.getCurrentPart().update( name=TrajectoryName + "_SweepFailed") try: if model_1.getAssembly("Refinement regions").getPart( name="RefDiam_{0}".format(RefineDiam)): pass else: SpecifiedDiameter = apex.createPart( name="RefDiam_{0}".format(RefineDiam)) SpecifiedDiameter.setParent( model_1.getAssembly("Refinement regions")) except: print("Part creation failed!")
def buildCrossTension(dict={}): # - Get the data from the dictionary HorizWidth = float(dict["HorizWidth"]) HorizLength = float(dict["HorizLength"]) LowerThick = float(dict["HorizThick"]) VertHeight = float(dict["VertHeight"]) VertLength = float(dict["VertLength"]) UpperThick = float(dict["VertThick"]) spotSize = float(dict["SpotSize"]) ## Define max and min thickness if LowerThick >= UpperThick: maxThick = LowerThick minThick = UpperThick else: maxThick = UpperThick minThick = LowerThick avgThick = (maxThick + minThick) / 2.0 model_1 = apex.currentModel() ParentAssy = model_1.createAssembly(name="CrossTension") Sheet01 = apex.createPart() # - Build the bottom plate result = apex.geometry.createBoxByLocationOrientation( name='Sheet01', description='', length=HorizLength, # Length height=HorizWidth, # Width depth=LowerThick, # Thickness origin=apex.Coordinate(0.0, 0.0, 0.0), orientation=apex.construct.createOrientation(alpha=0.0, beta=0.0, gamma=0.0)) res = Sheet01.setParent(ParentAssy) res = Sheet01.update(name='LowerSheet') # - Build the upper plate Sheet02 = apex.createPart() result = apex.geometry.createBoxByLocationOrientation( name='Sheet02', description='', length=VertHeight, # Length height=VertLength, # Width depth=UpperThick, # Thickness origin=apex.Coordinate(0.0, 0.0, LowerThick), orientation=apex.construct.createOrientation(alpha=0.0, beta=0.0, gamma=0.0)) res = Sheet02.setParent(ParentAssy) res = Sheet02.update(name='UpperSheet') # - Translate sheet _translateSheet = apex.EntityCollection() _translateSheet.append(Sheet02.getSolids()[0]) newEntities = apex.transformTranslate(target=_translateSheet, direction=[1.0, 0.0, 0.0], distance=(HorizLength / 2.0 - VertHeight / 2.0), makeCopy=False) _translateSheet = apex.EntityCollection() _translateSheet.append(Sheet02.getSolids()[0]) newEntities = apex.transformTranslate(target=_translateSheet, direction=[0.0, -1.0, 0.0], distance=(HorizLength / 2.0 - HorizWidth / 2.0), makeCopy=False) # Save joint info for reference JointInfoAssy = model_1.createAssembly("Joint info") res = JointInfoAssy.createPart(name="Sheet 01 = {0}mm".format(LowerThick)) res = JointInfoAssy.createPart(name="Sheet 02 = {0}mm".format(UpperThick)) res = JointInfoAssy.createPart(name="Width = {0}mm".format(HorizWidth)) res = JointInfoAssy.createPart(name="Length = {0}mm".format(HorizLength)) # Creating split regions cylPart = model_1.createPart(name="Cylinder") result = apex.geometry.createCylinderByLocationOrientation( name='', description='', length=(maxThick + minThick), radius=spotSize, sweepangle=360.0, origin=apex.Coordinate(HorizLength / 2.0, HorizWidth / 2.0, 0.0), orientation=apex.construct.createOrientation(alpha=0.0, beta=0.0, gamma=0.0)) entities_1 = apex.EntityCollection() entities_1.append(result) entities_1.hide() result = apex.geometry.createCylinderByLocationOrientation( name='', description='', length=(maxThick + minThick), radius=1.5 * spotSize, sweepangle=360.0, origin=apex.Coordinate(HorizLength / 2.0, HorizWidth / 2.0, 0.0), orientation=apex.construct.createOrientation(alpha=0.0, beta=0.0, gamma=0.0)) entities_1 = apex.EntityCollection() entities_1.append(result) entities_1.hide() result = apex.geometry.createCylinderByLocationOrientation( name='', description='', length=(maxThick + minThick), radius=2.0 * spotSize, sweepangle=360.0, origin=apex.Coordinate(HorizLength / 2.0, HorizWidth / 2.0, 0.0), orientation=apex.construct.createOrientation(alpha=0.0, beta=0.0, gamma=0.0)) ## Split sheets _target = apex.EntityCollection() _target.append(Sheet01.getSolids()[0]) _target.append(Sheet02.getSolids()[0]) _splitter = apex.EntityCollection() for Solid in cylPart.getSolids(): _splitter.extend(Solid.getFaces()) result = apex.geometry.split( target=_target, splitter=_splitter, splitBehavior=apex.geometry.GeometrySplitBehavior.Partition) entities_1 = apex.EntityCollection() entities_1.append(cylPart) apex.deleteEntities(entities_1) _plane = apex.construct.Plane( apex.construct.Point3D(HorizLength / 2.0, HorizWidth / 2.0, 0.0), apex.construct.Vector3D(1.0, 0.0, 0.0)) result = apex.geometry.splitWithPlane( target=_target, plane=_plane, splitBehavior=apex.geometry.GeometrySplitBehavior.Partition) ## - Perform meshing if requested if dict["MeshForMe"] == 'True': # - Meshing Sheet 01 and Sheet 02 refPoint = apex.Coordinate(HorizLength / 2.0, HorizWidth / 2.0, 0.0) listOfSolids = [Sheet01.getSolids()[0], Sheet02.getSolids()[0]] for i in range(len(listOfSolids)): proxSearch = apex.utility.ProximitySearch() ans = proxSearch.insertList(list(listOfSolids[i].getCells())) resSearch = proxSearch.findNearestObjects(location=refPoint, numObjects=4) cellsToMesh = apex.EntityCollection() for elem in resSearch.foundObjects(): cellsToMesh.append(elem) _SweepFace = apex.EntityCollection() result = apex.mesh.createHexMesh( name="", target=cellsToMesh, meshSize=(minThick / 4.0), surfaceMeshMethod=apex.mesh.SurfaceMeshMethod.Pave, mappedMeshDominanceLevel=2, elementOrder=apex.mesh.ElementOrder.Linear, refineMeshUsingCurvature=False, elementGeometryDeviationRatio=0.10, elementMinEdgeLengthRatio=0.20, createFeatureMeshOnWashers=False, createFeatureMeshOnArbitraryHoles=False, preserveWasherThroughMesh=True, sweepFace=_SweepFace, hexMeshMethod=apex.mesh.HexMeshMethod.Auto) resSearch = proxSearch.findNearestObjects(location=refPoint, numObjects=8) cellsToMesh = apex.EntityCollection() for elem in resSearch.foundObjects(): if len(elem.getElements() ) > 0: # Check if it has a mesh already pass else: cellsToMesh.append(elem) seedEdge = apex.EntityCollection() for Edge in elem.getEdges(): if i == 0: if 0.9 * LowerThick <= Edge.getLength( ) <= 1.1 * LowerThick: seedEdge.append(Edge) else: if 0.9 * UpperThick <= Edge.getLength( ) <= 1.1 * UpperThick: seedEdge.append(Edge) result = apex.mesh.createEdgeSeedUniformByNumber( target=seedEdge, numberElementEdges=2) for Cell in cellsToMesh: vecFaces = Cell.getFaces() for Face in vecFaces: paramU = Face.evaluatePointOnFace(Face.getCentroid()).u paramV = Face.evaluatePointOnFace(Face.getCentroid()).v normalAtPoint = Face.evaluateNormal(paramU, paramV) if abs(normalAtPoint.z ) == 1: # -Extrusion direction for meshing _SweepFace = apex.EntityCollection() _SweepFace.append(Face) meshCell = apex.EntityCollection() meshCell.append(Cell) result = apex.mesh.createHexMesh( name="", target=meshCell, meshSize=maxThick / 1.5, surfaceMeshMethod=apex.mesh.SurfaceMeshMethod.Pave, mappedMeshDominanceLevel=2, elementOrder=apex.mesh.ElementOrder.Linear, refineMeshUsingCurvature=False, elementGeometryDeviationRatio=0.10, elementMinEdgeLengthRatio=0.20, createFeatureMeshOnWashers=False, createFeatureMeshOnArbitraryHoles=False, preserveWasherThroughMesh=True, sweepFace=_SweepFace, hexMeshMethod=apex.mesh.HexMeshMethod.Auto) break ############################################################################################################################# ############################################################################################################################# #############################################################################################################################
def buildLapShear(dict={}): # - Get the data from the dictionary try: Thick01 = float(dict["Thick01"]) Thick02 = float(dict["Thick02"]) GapSize = float(dict["GapSize"]) spotSize = float(dict["SpotSize"]) except: apex.enableShowOutput() print("Please use only numbers as input in the fields.") ## Define max and min thickness if Thick01 >= Thick02: maxThick = Thick01 minThick = Thick02 else: maxThick = Thick02 minThick = Thick01 avgThick = (maxThick + minThick) / 2.0 if maxThick < 1.30: CouponLength = 105 CouponWidth = 45 CouponOverlap = 35 SampleLength = 175 GrippedLength = 40 UnclampedLength = 95 else: CouponLength = 138 CouponWidth = 60 CouponOverlap = 45 SampleLength = 230 GrippedLength = 62.5 UnclampedLength = 105 model_1 = apex.currentModel() ParentAssy = model_1.createAssembly(name="AWS-RSW-LapShear") # -- Build Upper sheet Sheet01 = apex.createPart() result = apex.geometry.createBoxByLocationOrientation( name='Sheet01', description='', length=CouponLength, # Length height=CouponWidth, # Width depth=Thick02, # Thickness origin=apex.Coordinate(0.0, 0.0, Thick01), orientation=apex.construct.createOrientation(alpha=0.0, beta=0.0, gamma=0.0) ) res = Sheet01.setParent(ParentAssy) res = Sheet01.update(name=f'UpperSheet-{Thick02}mm') # -- Build lower sheet Sheet02 = apex.createPart() result = apex.geometry.createBoxByLocationOrientation( name='Sheet02', description='', length=CouponLength, # Length height=CouponWidth, # Width depth=Thick01, # Thickness origin=apex.Coordinate(0.0, 0.0, 0.0), orientation=apex.construct.createOrientation(alpha=0.0, beta=0.0, gamma=0.0) ) res = Sheet02.setParent(ParentAssy) res = Sheet02.update(name=f'LowerSheet-{Thick01}mm') # -- Translate sheet to the correct overlap length _translateSheet = apex.EntityCollection() _translateSheet.append(Sheet02.getSolids()[0]) newEntities = apex.transformTranslate( target=_translateSheet, direction=[-1.0, 0.0, 0.0], distance=(CouponLength - CouponOverlap), makeCopy=False ) # -- Creating split regions cylPart = model_1.createPart(name="Cylinder") result = apex.geometry.createCylinderByLocationOrientation( name='', description='', length=(maxThick + minThick), radius=spotSize, sweepangle=360.0, origin=apex.Coordinate(CouponOverlap / 2.0, CouponWidth / 2.0, 0.0), orientation=apex.construct.createOrientation(alpha=0.0, beta=0.0, gamma=0.0) ) entities_1 = apex.EntityCollection() entities_1.append(result) entities_1.hide() result = apex.geometry.createCylinderByLocationOrientation( name='', description='', length=(maxThick + minThick), radius=1.5 * spotSize, sweepangle=360.0, origin=apex.Coordinate(CouponOverlap / 2.0, CouponWidth / 2.0, 0.0), orientation=apex.construct.createOrientation(alpha=0.0, beta=0.0, gamma=0.0) ) entities_1 = apex.EntityCollection() entities_1.append(result) entities_1.hide() result = apex.geometry.createCylinderByLocationOrientation( name='', description='', length=(maxThick + minThick), radius=2.0 * spotSize, sweepangle=360.0, origin=apex.Coordinate(CouponOverlap / 2.0, CouponWidth / 2.0, 0.0), orientation=apex.construct.createOrientation(alpha=0.0, beta=0.0, gamma=0.0) ) # -- Split sheets _target = apex.EntityCollection() _target.append( Sheet01.getSolids()[0] ) _target.append( Sheet02.getSolids()[0] ) _splitter = apex.EntityCollection() for Solid in cylPart.getSolids(): _splitter.extend(Solid.getFaces()) result = apex.geometry.split( target = _target, splitter = _splitter, splitBehavior = apex.geometry.GeometrySplitBehavior.Partition ) entities_1 = apex.EntityCollection() entities_1.append(cylPart) #apex.deleteEntities(entities_1) _plane = apex.construct.Plane( apex.construct.Point3D(CouponOverlap / 2.0, CouponWidth / 2.0, 0.0), apex.construct.Vector3D(1.0, 0.0, 0.0) ) result = apex.geometry.splitWithPlane( target=_target, plane=_plane, splitBehavior=apex.geometry.GeometrySplitBehavior.Partition ) # -- Translate _translateSheet = apex.EntityCollection() _translateSheet.append(Sheet01.getSolids()[0]) newPosition = apex.transformTranslate( target=_translateSheet, direction=[0.0, 0.0, 1.0], distance=GapSize, makeCopy=False ) # -- Create grippers if dict["CreateGrippers"] == 'True': # -- Build Upper gripper UpperGripper = apex.createPart() result = apex.geometry.createBoxByLocationOrientation( name='UpperGripper', description='', length=1.2 * GrippedLength, # Length height=CouponWidth, # Width depth=3 * Thick02, # Thickness origin=apex.Coordinate(0.0, 0.0, Thick01), orientation=apex.construct.createOrientation(alpha=0.0, beta=0.0, gamma=0.0) ) res = UpperGripper.setParent(ParentAssy) res = UpperGripper.update(name=f'UpperGripper') # -- Translate _translateSheet = apex.EntityCollection() _translateSheet.append(UpperGripper.getSolids()[0]) newPosition = apex.transformTranslate( target=_translateSheet, direction=[1.0, 0.0, 0.0], distance=(CouponLength - GrippedLength), makeCopy=False ) newPosition = apex.transformTranslate( target=_translateSheet, direction=[0.0, 0.0, -1.0], distance=(Thick02 + GapSize), makeCopy=False ) _target = apex.EntityCollection() _target.append(UpperGripper.getSolids()[0]) _subtractingEntities = apex.EntityCollection() _subtractingEntities.append(Sheet01.getSolids()[0]) result = apex.geometry.subtractBoolean( target=_target, subtractingEntity=_subtractingEntities, retainOriginalBodies=True ) # -- Build Lower gripper LowerGripper = apex.createPart() result = apex.geometry.createBoxByLocationOrientation( name='LowerGripper', description='', length=1.2 * GrippedLength, # Length height=CouponWidth, # Width depth=3 * Thick01, # Thickness origin=apex.Coordinate(0.0, 0.0, Thick01), orientation=apex.construct.createOrientation(alpha=0.0, beta=0.0, gamma=0.0) ) res = LowerGripper.setParent(ParentAssy) res = LowerGripper.update(name=f'LowerGripper') # -- Translate _translateSheet = apex.EntityCollection() _translateSheet.append(LowerGripper.getSolids()[0]) newPosition = apex.transformTranslate( target=_translateSheet, direction=[-1.0, 0.0, 0.0], distance=(CouponLength - CouponOverlap + 0.2 * GrippedLength), makeCopy=False ) newPosition = apex.transformTranslate( target=_translateSheet, direction=[0.0, 0.0, -1.0], distance=(Thick01 + Thick02), makeCopy=False ) _target = apex.EntityCollection() _target.append(LowerGripper.getSolids()[0]) _subtractingEntities = apex.EntityCollection() _subtractingEntities.append(Sheet02.getSolids()[0]) result = apex.geometry.subtractBoolean( target=_target, subtractingEntity=_subtractingEntities, retainOriginalBodies=True ) _target = apex.EntityCollection() for Edge in UpperGripper.getSolids()[0].getEdges(): _target.append(Edge) for Edge in LowerGripper.getSolids()[0].getEdges(): _target.append(Edge) try: result = apex.geometry.pushPull( target=_target, method=apex.geometry.PushPullMethod.Fillet, behavior=apex.geometry.PushPullBehavior.FollowShape, removeInnerLoops=False, createBooleanUnion=False, distance=0.05, direction=[7.071067811865475e-01, 7.071067811865475e-01, 0.0] ) except: pass # -- Perform meshing if requested if dict["Meshing"] != 'No mesh': if dict["Meshing"] == "For weld": refLevel = 4.0 # Ref level for weld only else: refLevel = 8.0 # Ref level for pull test # - Meshing Sheet 01 and Sheet 02 refPoint = apex.Coordinate(CouponOverlap / 2.0, CouponWidth / 2.0, 0.0) listOfSolids = [Sheet01.getSolids()[0], Sheet02.getSolids()[0]] for i in range(len(listOfSolids)): proxSearch = apex.utility.ProximitySearch() ans = proxSearch.insertList(list(listOfSolids[i].getCells())) resSearch = proxSearch.findNearestObjects(location=refPoint, numObjects=4) cellsToMesh = apex.EntityCollection() for elem in resSearch.foundObjects(): cellsToMesh.append(elem) _SweepFace = apex.EntityCollection() result = apex.mesh.createHexMesh( name="", target=cellsToMesh, meshSize=(minThick / refLevel), surfaceMeshMethod=apex.mesh.SurfaceMeshMethod.Pave, mappedMeshDominanceLevel=2, elementOrder=apex.mesh.ElementOrder.Linear, refineMeshUsingCurvature=False, elementGeometryDeviationRatio=0.10, elementMinEdgeLengthRatio=0.20, createFeatureMeshOnWashers=False, createFeatureMeshOnArbitraryHoles=False, preserveWasherThroughMesh=True, sweepFace=_SweepFace, hexMeshMethod=apex.mesh.HexMeshMethod.Auto ) resSearch = proxSearch.findNearestObjects(location=refPoint, numObjects=8) cellsToMesh = apex.EntityCollection() for elem in resSearch.foundObjects(): if len(elem.getElements()) > 0: # Check if it has a mesh already pass else: cellsToMesh.append(elem) seedEdge = apex.EntityCollection() for Edge in elem.getEdges(): if i == 0: if 0.9 * Thick02 <= Edge.getLength() <= 1.1 * Thick02: seedEdge.append(Edge) else: if 0.9 * Thick01 <= Edge.getLength() <= 1.1 * Thick01: seedEdge.append(Edge) result = apex.mesh.createEdgeSeedUniformByNumber( target=seedEdge, numberElementEdges=2 ) for Cell in cellsToMesh: vecFaces = Cell.getFaces() for Face in vecFaces: paramU = Face.evaluatePointOnFace(Face.getCentroid()).u paramV = Face.evaluatePointOnFace(Face.getCentroid()).v normalAtPoint = Face.evaluateNormal(paramU, paramV) if abs(normalAtPoint.z) == 1: # -Extrusion direction for meshing _SweepFace = apex.EntityCollection() _SweepFace.append(Face) meshCell = apex.EntityCollection() meshCell.append(Cell) result = apex.mesh.createHexMesh( name="", target=meshCell, meshSize=maxThick/1.5, surfaceMeshMethod=apex.mesh.SurfaceMeshMethod.Pave, mappedMeshDominanceLevel=2, elementOrder=apex.mesh.ElementOrder.Linear, refineMeshUsingCurvature=False, elementGeometryDeviationRatio=0.10, elementMinEdgeLengthRatio=0.20, createFeatureMeshOnWashers=False, createFeatureMeshOnArbitraryHoles=False, preserveWasherThroughMesh=True, sweepFace=_SweepFace, hexMeshMethod=apex.mesh.HexMeshMethod.Auto ) break _target = apex.EntityCollection() _target.append(LowerGripper.getSolids()[0]) _target.append(UpperGripper.getSolids()[0]) featuremeshtypes_2 = apex.mesh.FeatureMeshTypeVector() result = apex.mesh.createSurfaceMesh( name="", target=_target, meshSize=minThick, meshType=apex.mesh.SurfaceMeshElementShape.Quadrilateral, meshMethod=apex.mesh.SurfaceMeshMethod.Auto, mappedMeshDominanceLevel=2, elementOrder=apex.mesh.ElementOrder.Linear, refineMeshUsingCurvature=False, elementGeometryDeviationRatio=0.10, elementMinEdgeLengthRatio=0.20, growFaceMeshSize=False, faceMeshGrowthRatio=1.2, createFeatureMeshes=False, featureMeshTypes=featuremeshtypes_2, projectMidsideNodesToGeometry=True, useMeshFlowOptimization=True, meshFlow=apex.mesh.MeshFlow.Grid )
def createRefRegion(dict={}): model_1 = apex.currentModel() ### Math functions needed when numpy is not available def multip3D(v1, k): # Addition of two ponts in 3D return [x * k for x in v1] def add3D(v1, v2): # Addition of two ponts in 3D return [x + y for x, y in zip(v1, v2)] def subtract3D(v1, v2): # Subtraction of two ponts in 3D return [x - y for x, y in zip(v1, v2)] def distance3D(v1, v2): # Distance between two points in 3D return sqrt(abs(sum((a - b) for a, b in zip(v1, v2)))) def dotproduct(v1, v2): # Dot product of two vectors (list), cosine of the angle return sum((a * b) for a, b in zip(v1, v2)) def length(v): # Length of a vector (list) return sqrt(dotproduct(v, v)) def angle(v1, v2): # Angle between two vectors in degrees (lists) return degrees(acos(dotproduct(v1, v2) / (length(v1) * length(v2)))) # Return the angle in degrees def cross(a, b): # Cross-product (orthogonal vector) of two vectors (list) c = [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]] return c # List of three components (x,y,z) of the orthogonal vector def doCircle(diam=8.0): part_1 = model_1.getCurrentPart() if part_1 is None: part_1 = model_1.createPart() sketch_1 = part_1.createSketchOnGlobalPlane( name='', plane=apex.construct.GlobalPlane.YZ, alignSketchViewWithViewport=True ) circle_1 = sketch_1.createCircleCenterPoint( name="", centerPoint=Point2D(0, 0), pointOnCircle=Point2D(0, diam / 2) ) return sketch_1.completeSketch(fillSketches=True) try: refDiameter = float(dict["refDiam"]) except: apex.enableShowOutput() print("\nInvalid diameter value!") raise try: TrajAssy = model_1.getAssembly(pathName="Refinement regions") except: TrajAssy = model_1.createAssembly(name="Refinement regions") try: if TrajAssy.getPart(name=f"RefDiam_{refDiameter}"): pass else: SpecifiedDiameter = TrajAssy.createPart(name=f"RefDiam_{refDiameter}") except: print("Part creation failed!") CurrPart = apex.createPart(name=f"FromEdge_{refDiameter}mm") CurrPart.setParent(TrajAssy) # - Merge contiguous edges into curves _edgeCollection = apex.geometry.EdgeCollection() _curveCollection = apex.geometry.CurveCollection() for selElem in apex.selection.getCurrentSelection(): if selElem.entityType == apex.EntityType.Edge: _edgeCollection.append(selElem) elif selElem.entityType == apex.EntityType.Curve: _curveCollection.append(selElem) result_ = apex.geometry.createCurvesFromEdges(edges=_edgeCollection) result_.extend(_curveCollection) for k in range(len(result_)): thisCurve = result_[k] CurrPart = apex.createPart(name=f"FromEdge_L={int(thisCurve.getLength())}mm_D={refDiameter}mm") CurrPart.setParent(TrajAssy) thisCurve.setParent(CurrPart) CircleDone = doCircle(diam=refDiameter) StartPoint = thisCurve.getExteriorVertices()[0] ## Move circle to a new point location _target = apex.EntityCollection() _target.append(CurrPart.getSurfaces()[0]) PathLength = sqrt(pow(StartPoint.getX(), 2) + pow(StartPoint.getY(), 2) + pow(StartPoint.getZ(), 2)) apex.transformTranslate(target=_target, direction=[StartPoint.getX(), StartPoint.getY(), StartPoint.getZ()], distance=PathLength, makeCopy=False) ## Rotate the circle tangVec = thisCurve.evaluateTangent(StartPoint) TurnAngle = angle([1, 0, 0], [tangVec.getX(), tangVec.getY(), tangVec.getZ()]) axisDir = cross([1, 0, 0], [tangVec.getX(), tangVec.getY(), tangVec.getZ()]) if TurnAngle == 180: TurnAngle = 0 apex.transformRotate(target=_target, axisDirection=axisDir, axisPoint=StartPoint, angle=TurnAngle, makeCopy=False) ## Do the sweep _target = apex.EntityCollection() _target.append(CurrPart.getSurfaces()[0]) _path = apex.EntityCollection() _path.append(CurrPart.getCurves()[0]) _lockDirection = apex.construct.Vector3D(0.0, 0.0, 0.0) try: result = apex.geometry.createGeometrySweepPath( target=_target, path=_path, scale=0.0, twist=0.0, profileSweepAlignmentMethod=apex.geometry.SweepProfileAlignmentMethod.Normal, islocked=False, lockDirection=_lockDirection, profileClamp=apex.geometry.SweepProfileClampingMethod.Smooth ) DelEntities = apex.EntityCollection() for Surface in CurrPart.getSurfaces(): DelEntities.append(Surface) apex.deleteEntities(DelEntities) if dict["extendRegion"] == "True": for pointLocation in thisCurve.getExteriorVertices(): result = apex.geometry.createSphereByLocationOrientation( name='Sphere', description='', radius=refDiameter/2.0, origin=pointLocation, orientation=apex.construct.createOrientation(alpha=0.0, beta=0.0, gamma=0.0) ) _target = apex.EntityCollection() _target.extend(CurrPart.getSolids()) result = apex.geometry.mergeBoolean( target=_target, retainOriginalBodies=False, mergeSolidsAsCells=False ) CurrPart.getSolids()[0].update(enableTransparency=True, transparencyLevel=50) except: print("\nSweep failed!") raise