def roundSelection(dict={}): model_1 = apex.currentModel() try: roundRadius = float(dict["roundRadius"]) except: apex.enableShowOutput() print("Invalid radius value!") _target = apex.EntityCollection() for selFace in apex.selection.getCurrentSelection(): for Edge in selFace.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=roundRadius, direction=[7.071067811865475e-01, 7.071067811865475e-01, 0.0]) except: apex.enableShowOutput() print("Rounding failed for \n", selFace.getBody().getPathName())
def CreateMeshPartitions(dict={}): # =================================================================== ## Initializing Apex code apex.setScriptUnitSystem(unitSystemName=r'''mm-kg-s-N''') model_1 = apex.currentModel() ## Collect faces to mesh _targetFine = apex.entityCollection() listOfLengths = [] listOfDiameters = [] MeshSize = float(dict["MeshSize"]) try: listOfTrajectories = model_1.getAssembly("Trajectories").getParts(True) listOfAllParts = [] for Part in model_1.getParts(True): if "Trajectories" not in Part.getPath(): listOfAllParts.append(Part) for Part in listOfTrajectories: if 'RefDiam' in Part.getName(): _, Diam = Part.getName().split('_') listOfDiameters.append(float(Diam)) else: if len(Part.getCurves()) > 0: listOfLengths.append(Part.getCurves()[0].getLength()) maxDiameter = max( listOfDiameters) #Getting the max diameter to use as search range ## Getting all faces from all parts that are not under 'Trajectories' facesToMesh = apex.EntityCollection() for Part in listOfAllParts: for Surface in Part.getSurfaces(): for Face in Surface.getFaces(): if Face.getArea() <= (1.1 * 3.14159 * maxDiameter * maxDiameter): facesToMesh.append(Face) apex.mesh.createSurfaceMesh( name="", target=facesToMesh, meshSize=MeshSize, meshType=apex.mesh.SurfaceMeshElementShape.Mixed, meshMethod=apex.mesh.SurfaceMeshMethod.Pave, mappedMeshDominanceLevel=2, elementOrder=apex.mesh.ElementOrder.Linear, meshUsingPrincipalAxes=False, refineMeshUsingCurvature=True, elementGeometryDeviationRatio=0.10, elementMinEdgeLengthRatio=0.50, createFeatureMeshOnFillets=False, createFeatureMeshOnChamfers=False, createFeatureMeshOnWashers=False, createFeatureMeshOnQuadFaces=False) except: print("Meshing failed or not performed.")
def RemoveEmpty(dict={}): entitiesToRemove = apex.EntityCollection() for Part in model_1.getParts(True): if not Part.getSolids(): entitiesToRemove.append(Part) try: apex.deleteEntities(entitiesToRemove) except: pass entitiesToRemove = apex.EntityCollection() for Assy in model_1.getAssemblies(True): if not Assy.getParts(True): entitiesToRemove.append(Assy) try: apex.deleteEntities(entitiesToRemove) except: pass
def StiffnessOptimizer(dict={}): #apex.disableShowOutput() model_1 = apex.currentModel() try: maxNumPts = int(dict["MaxNumOfPoints"]) except: apex.enableShowOutput() print( "Need a number for the maximum number of points. Please have the correct input." ) raise dummyMaterial = apex.catalog.createMaterial(name="Steel", description="", color=[64, 254, 250]) dummyMaterial.update(elasticModulus=210.e+9, poissonRatio=0.3, density=7.8e-6) newAssyName = datetime.datetime.now().strftime("Test_%Y.%m.%d_%Hh%Mm%Ss") currAssy = model_1.createAssembly(name=newAssyName) for selPart in apex.selection.getCurrentSelection(): _target = apex.EntityCollection() _target.append(selPart) apex.attribute.assignMaterial(material=dummyMaterial, target=_target) selPart.setParent(currAssy) context_ = currAssy study = apex.getPrimaryStudy() study.createScenarioByModelRep( context=context_, simulationType=apex.studies.SimulationType.NormalModes) study = apex.getPrimaryStudy() currScenario = study.getScenario(name="Mode Scenario " + currAssy.getName()) """ simSetting1 = currScenario.simulationSettings simSetting1.partReduction = False simSetting1.freqRangeLower = 1000. simSetting1.freqRangeUpper = float('NaN') simSetting1.stopCalculation = True simSetting1.maxModes = 10 currScenario.simulationSettings = simSetting1 """ model_1.save() currScenario.execute() executedscenario_1 = scenario1.getLastExecutedScenario()
def CreateMeshNONPartitions(dict={}): #=================================================================== ## Initializing Apex code apex.setScriptUnitSystem(unitSystemName = r'''mm-kg-s-N''') model_1 = apex.currentModel() try: MeshSize = float(dict["CoarseMeshSize"]) except: MeshSize = float(dict["MeshSize"]) listOfAllParts = [] for Part in model_1.getParts(True): if "Trajectories" not in Part.getPath(): listOfAllParts.append(Part) ## Getting all faces from all parts that are not under 'Trajectories' listOfNonMeshedFaces = apex.EntityCollection() for Part in listOfAllParts: for Surface in Part.getSurfaces(): for Face in Surface.getFaces(): if not Face.getElements(): listOfNonMeshedFaces.append(Face) ## ----------------------------------------------------------------------------------------------------------- ## ----------------------------------------------------------------------------------------------------------- apex.mesh.createSurfaceMesh( name="", target=listOfNonMeshedFaces, meshSize= MeshSize, meshType=apex.mesh.SurfaceMeshElementShape.Mixed, meshMethod=apex.mesh.SurfaceMeshMethod.Pave, mappedMeshDominanceLevel=0, elementOrder=apex.mesh.ElementOrder.Linear, meshUsingPrincipalAxes=False, refineMeshUsingCurvature=True, elementGeometryDeviationRatio=0.10, elementMinEdgeLengthRatio=0.50, createFeatureMeshOnFillets=False, createFeatureMeshOnChamfers=False, createFeatureMeshOnWashers=False, createFeatureMeshOnQuadFaces=False )
def SplitByTrajectories(dict={}): apex.setScriptUnitSystem(unitSystemName=r'''mm-kg-s-N''') model_1 = apex.currentModel() try: listOfParts = model_1.getParts(True) _target = apex.entityCollection() _face = apex.entityCollection() for Part in listOfParts: if 'Trajectories' in Part.getPath(): for Solid in Part.getSolids(): _face += Solid.getFaces() else: _target += Part.getSurfaces() apex.geometry.splitOnSurface( target=_target, face=_face, splitBehavior=apex.geometry.GeometrySplitBehavior.Partition) entities_1 = apex.EntityCollection() assembly_1 = model_1.getAssembly(pathName="Trajectories") entities_1.append(assembly_1) entities_1.hide() except: print("Split failed or not performed.")
def hatchingLayers(dict={}): listOfNames = [] listOfCenterHeight = [] distLine = float(dict["distanceLine"]) angleType = dict["angleType"] angleValue = dict["angleValue"] pointSpace = float(dict["pointSpacing"]) meshIt = dict["meshIt"] saveToDir = dict["saveToDir"] if angleType == 'Cycle through': from itertools import cycle angleList = angleValue.strip().replace(' ', '').split(',') angleList = [float(x) for x in angleList] anglesCycle = cycle(angleList) def nextAngle(): return next(anglesCycle) #for selObj in apex.selection.getCurrentSelection(): model_1 = apex.currentModel() for Solid in apex.selection.getCurrentSelection(): listOfNames.append(Solid.getPathName()) listOfCenterHeight.append(Solid.getCentroid().z) entities_1 = apex.EntityCollection() entities_1.append(Solid) entities_1.hide() sortedByHeight = [ x for _, x in sorted(zip(listOfCenterHeight, listOfNames)) ] currLayer = 1 for solidPath in sortedByHeight: solidToSlice = apex.getSolid(pathName=solidPath) solidName = solidToSlice.getName() xCenter = solidToSlice.getCentroid().x yCenter = solidToSlice.getCentroid().y zCenter = solidToSlice.getCentroid().z startPos = [xCenter, yCenter, zCenter] entities_1 = apex.EntityCollection() entities_1.append(solidToSlice) entities_1.show() if angleType == 'Single angle': angle = float(angleValue) elif angleType == 'Incremental': angle = float(angleValue) * currLayer elif angleType == 'Cycle through': angle = nextAngle() FullSlicing(bodyToSlice=solidToSlice, cutStartPos=startPos, cutStepping=distLine, cutAngleDeg=angle, maxPointSpacing=pointSpace, dirToSaveFiles=saveToDir, trajName=solidName) currLayer += 1 if meshIt == 'True': for solidPath in sortedByHeight: solidToMesh = apex.getSolid(pathName=solidPath) _target = apex.EntityCollection() _target.append(solidToMesh) _SweepFace = apex.EntityCollection() result = apex.mesh.createHexMesh( name="", target=_target, meshSize=distLine / 3, surfaceMeshMethod=apex.mesh.SurfaceMeshMethod.Mapped, mappedMeshDominanceLevel=3, elementOrder=apex.mesh.ElementOrder.Linear, refineMeshUsingCurvature=False, elementGeometryDeviationRatio=0.10, elementMinEdgeLengthRatio=0.50, createFeatureMeshOnWashers=False, createFeatureMeshOnArbitraryHoles=False, preserveWasherThroughMesh=False, sweepFace=_SweepFace, hexMeshMethod=apex.mesh.HexMeshMethod.Auto)
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: apex.enableShowOutput() print("Part creation with refinement diameter info failed!") allLongEdges = apex.EntityCollection() for selElement in apex.selection.getCurrentSelection(): # If selection is is a Part, go check what is inside if selElement.getVisibility(): if selElement.entityType == apex.EntityType.Part: for Solid in selElement.getSolids(): if Solid.getVisibility(): maxEdgeLength = 0.0 selectedEdge = apex.EntityType.Edge for Edge in Solid.getEdges(): if Edge.getLength() > maxEdgeLength: selectedEdge = Edge maxEdgeLength = Edge.getLength() allLongEdges.append(selectedEdge) for Surface in selElement.getSurfaces(): if Surface.getVisibility(): maxEdgeLength = 0.0 selectedEdge = apex.EntityType.Edge for Edge in Surface.getEdges(): if Edge.getLength() > maxEdgeLength: selectedEdge = Edge maxEdgeLength = Edge.getLength() allLongEdges.append(selectedEdge) # If selection is an Assembly, get the Parts and check what is inside if selElement.entityType == apex.EntityType.Assembly: if selElement.getVisibility(): for Part in selElement.getParts(True): if Part.getVisibility(): for Solid in Part.getSolids(): if Solid.getVisibility(): maxEdgeLength = 0.0 selectedEdge = apex.EntityType.Edge for Edge in Solid.getEdges(): if Edge.getLength() > maxEdgeLength: selectedEdge = Edge maxEdgeLength = Edge.getLength() allLongEdges.append(selectedEdge) for Surface in Part.getSurfaces(): if Surface.getVisibility(): maxEdgeLength = 0.0 selectedEdge = apex.EntityType.Edge for Edge in Surface.getEdges(): if Edge.getLength() > maxEdgeLength: selectedEdge = Edge maxEdgeLength = Edge.getLength() allLongEdges.append(selectedEdge) for selEdge in allLongEdges: CurrPart = TrajAssy.createPart(name="Edge_{0}_{1}mm".format(selEdge.getId(), refDiameter)) maxPointSpacing = 2 #mm if maxPointSpacing > 0: trajStep = int(selEdge.getLength() / maxPointSpacing) trajResolution = trajStep + 1 if trajStep > 2 else 3 else: trajResolution = 4 paramRange = selEdge.getParametricRange() delta = abs(paramRange['uEnd'] - paramRange['uStart']) / trajResolution sampling = [(x * delta) + paramRange['uStart'] for x in range(0, trajResolution + 1)] _PointCollection = apex.IPhysicalCollection() PathPoints = [] for i in range(len(sampling)): pointCoord = apex.Coordinate(selEdge.evaluateEdgeParametricCoordinate(sampling[i]).x , selEdge.evaluateEdgeParametricCoordinate(sampling[i]).y , selEdge.evaluateEdgeParametricCoordinate(sampling[i]).z) _PointCollection.append(pointCoord) PathPoints.append([selEdge.evaluateEdgeParametricCoordinate(sampling[i]).x , selEdge.evaluateEdgeParametricCoordinate(sampling[i]).y , selEdge.evaluateEdgeParametricCoordinate(sampling[i]).z]) newSpline = apex.geometry.createCurve( target=_PointCollection, behavior=apex.geometry.CurveBehavior.Spline ) CircleDone = doCircle(diam=refDiameter) ## Move circle to a new point location _target = apex.EntityCollection() _target.append(CurrPart.getSurfaces()[0]) PathLength = sqrt(pow(PathPoints[0][0], 2) + pow(PathPoints[0][1], 2) + pow(PathPoints[0][2], 2)) apex.transformTranslate(target=_target, direction=[PathPoints[0][0], PathPoints[0][1], PathPoints[0][2]], distance=PathLength, makeCopy=False) ## Rotate the circle TurnAngle = angle([1, 0, 0], [a - b for a, b in zip(PathPoints[1], PathPoints[0])]) if TurnAngle == 180: TurnAngle = 0 apex.transformRotate(target=_target, axisDirection=cross([1, 0, 0], [a - b for a, b in zip(PathPoints[1], PathPoints[0])]), axisPoint=Point3D(PathPoints[0][0], PathPoints[0][1], PathPoints[0][2]), 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 ) CurrPart.getSolids()[0].update(enableTransparency=True, transparencyLevel=50) DelEntities = apex.EntityCollection() for Surface in CurrPart.getSurfaces(): DelEntities.append(Surface) apex.deleteEntities(DelEntities) if dict["extendRegion"] == "True": for Face in CurrPart.getSolids()[0].getFaces(): XSectionArea = 3.14159 * (refDiameter / 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=refDiameter, direction=[1.0, 1.0, 1.0] ) except: print("\nSweep failed!") NewPartName = apex.getPart(selEdge.getBody().getPath()).getName() + "_(failed)" ans = apex.getPart(selEdge.getBody().getPath()).update(name = NewPartName)
def GenerateStudies(dict={}): # =================================================================== ## Initializing Apex code apex.setScriptUnitSystem(unitSystemName=r'''mm-kg-s-N''') model_1 = apex.currentModel() # Check existing material and create generic steel if needed if "SteelGeneric" not in apex.catalog.getMaterialDictionary().keys(): apex.setScriptUnitSystem(unitSystemName=r'''m-kg-s-N''') SteelMaterial = apex.catalog.createMaterial(name="SteelGeneric", description="", color=[64, 254, 250]) SteelMaterial.update(elasticModulus=210.e+9, poissonRatio=0.3, density=7.8e-6) apex.setScriptUnitSystem(unitSystemName=r'''mm-kg-s-N''') #print("Material data for generic steel created") else: #print("Material already exists, skipping...") pass # Assign generic steel material to all Parts GenericMaterial = apex.catalog.getMaterial(name="SteelGeneric") _target = apex.EntityCollection() _target.extend(model_1.getParts(True)) apex.attribute.assignMaterial(material=GenericMaterial, target=_target) # Run body selection for selAssy in apex.selection.getCurrentSelection(): listOfRefSolid = [] listOfRefSolidPaths = [] for Part in selAssy.getParts(True): Part.update(color=[255, 0, 0]) Part.show() for Solid in Part.getSolids(): listOfRefSolidPaths.append(Solid.getPathName()) listOfRefSolid.append(Solid) listOfTargetSolids = apex.EntityCollection() for Part in model_1.getParts(True): for Solid in Part.getSolids(): if Solid.getPathName() not in listOfRefSolidPaths: listOfTargetSolids.append(Solid) Solid.update(color=[0, 0, 255]) Part.addUserAttribute(userAttributeName=Part.getPathName(), stringValue='Self') for refSolid in listOfRefSolid: textDisplay = apex.display.displayText( text=refSolid.getName(), textLocation=refSolid.getCentroid(), graphicsFont="Calibri", graphicsFontColor=apex.ColorRGB(255, 191, 0), graphicsFontSize=16, graphicsFontStyle=apex.display.GraphicsFontStyle.Normal, graphicsFontUnderlineStyle=apex.display. GraphicsFontUnderlineStyle.NoUnderline) distance_ = apex.measureDistance(source=refSolid, target=listOfTargetSolids) listOfTouchedBodies = apex.EntityCollection() try: _ans = refSolid.getParent().removeUserAttributes( userAttributeNames=[]) except: pass refSolid.getParent().addUserAttribute( userAttributeName=refSolid.getParent().getPathName(), stringValue='Self') for k in range(len(distance_)): if distance_[k] <= 0.0: listOfTouchedBodies.append(listOfTargetSolids[k]) refSolid.getParent().addUserAttribute( userAttributeName=listOfTargetSolids[k].getParent( ).getPathName(), stringValue='Touched') apex.display.clearAllGraphicsText() # Organizing Parts and getting ready for modal analysis for refSolid in listOfRefSolid: StudyAssy = model_1.createAssembly(name="StudyAssy") dictInfo = {"Self": "", "Touched": []} solidParent = refSolid.getParent() # Moving Parts to the StudyAssy for Attribute in solidParent.getUserAttributes(): if Attribute.getStringValue() == 'Self': dictInfo[Attribute.getStringValue( )] = Attribute.getAttributeName() else: dictInfo[Attribute.getStringValue()].append( Attribute.getAttributeName()) ans_ = apex.getPart( Attribute.getAttributeName()).setParent( parent=StudyAssy) refSolid.getParent().setParent(parent=StudyAssy) # Creating ties based on touching bodies listOfTies = apex.EntityCollection() BeadPath = StudyAssy.getPart( dictInfo["Self"][dictInfo["Self"].rfind("/") + 1:]).getPathName() for elem in dictInfo["Touched"]: compPath = StudyAssy.getPart(elem[elem.rfind("/") + 1:]).getPathName() _entities = apex.getEntities(pathNames=[BeadPath, compPath]) newTies = apex.attribute.createMeshIndependentTieAutomatic( target=_entities, tiePairTolerance=5., patchToleranceCalculationMethod=apex.AutoManual.Automatic) listOfTies.extend(newTies) # --- Running the modal thing scenaryName = "Scenario for " + solidParent.getName() context_ = StudyAssy study = apex.getPrimaryStudy() study.createScenario( name=scenaryName, description="Generated by the Optimization Toolbox - FO", scenarioConfiguration=apex.studies.ScenarioConfiguration. NormalModes) study = apex.getPrimaryStudy() scenario1 = study.getScenario(name=scenaryName) scenario1.associateModelRep(context_) # study = apex.getPrimaryStudy() # scenario1 = study.getScenario(name=scenaryName) # simSetting1 = scenario1.simulationSettings # simSetting1.partReduction = False # simSetting1.freqRangeLower = 1000. # simSetting1.freqRangeUpper = float('NaN') # simSetting1.stopCalculation = True # simSetting1.maxModes = 3 # scenario1.simulationSettings = simSetting1 #model_1.save() scenario1.execute() # Kick it # --- Done with execution # Deleting ties apex.deleteEntities(listOfTies) # Reset the model tree for Part in StudyAssy.getParts(True): for Attribute in Part.getUserAttributes(): if Attribute.getStringValue() == 'Self': index = Attribute.getAttributeName().rfind("/") ParentAssy = Attribute.getAttributeName()[0:index] Part.setParent(parent=apex.getAssembly(ParentAssy)) # Delete the Assembly used to build the study toDelete = apex.EntityCollection() toDelete.append(StudyAssy) apex.deleteEntities(toDelete) # --- Do postprocessing result = apex.session.displayMeshCracks(False) result = apex.session.display2DSpans(False) result = apex.session.display3DSpans(False) apex.display.hideRotationCenter() result = apex.session.displayMeshCracks(False) result = apex.session.displayInteractionMarkers(True) result = apex.session.displayConnectionMarkers(True) result = apex.session.display2DSpans(False) result = apex.session.display3DSpans(True) result = apex.session.displayLoadsAndBCMarkers(True) result = apex.session.displaySensorMarkers(True) study = apex.getPrimaryStudy() scenario1 = study.getScenario(name=scenaryName) executedscenario_1 = scenario1.getLastExecutedScenario() event1 = executedscenario_1.getEvent( pathName="/Study/{0}<< -1>>/Event 1".format(scenaryName)) stateplot_1 = apex.post.createStatePlot(event=event1, resultDataSetIndex=[7]) visualizationTarget1 = apex.entityCollection() study = apex.getPrimaryStudy() scenario1 = study.getScenario(name=scenaryName) executedscenario_1 = scenario1.getLastExecutedScenario() visualizationTarget1.append( executedscenario_1.getAssembly( pathName=apex.currentModel().name + "/ar:StudyAssy_Default Rep")) deformvisualization_1 = stateplot_1.createDeformVisualization( target=visualizationTarget1, deformScalingMethod=apex.post.DeformScalingMethod.Relative, relativeScalingFactor=2., displayUnit="mm") result = apex.session.displaySensorMarkers(False) colormap_1 = apex.post.createColorMap( name="FringeSpectrum", colorMapSegmentMethod=apex.post.ColorMapSegmentMethod.Linear, start=0.0, end=0.0, isLocked=False, useOutOfRangeColors=False, displayContinuousColors=False) visualizationTarget1 = apex.entityCollection() study = apex.getPrimaryStudy() scenario1 = study.getScenario(name=scenaryName) executedscenario_1 = scenario1.getLastExecutedScenario() visualizationTarget1.append( executedscenario_1.getAssembly( pathName=apex.currentModel().name + "/ar:StudyAssy_Default Rep")) contourvisualization_1 = stateplot_1.createContourVisualization( contourStyle=apex.post.ContourStyle.Fringe, target=visualizationTarget1, resultQuantity=apex.post.ResultQuantity. DisplacementTranslational, resultDerivation=apex.post.ResultDerivation.Magnitude, layerIdentificationMethod=apex.post.LayerIdentificationMethod. Position, layers=["NONE"], layerEnvelopingMethod=apex.post.LayerEnvelopingMethod.Unknown, elementNodalProcessing=apex.post.ElementNodalProcessing. Averaged, coordinateSystemMethod=apex.post.CoordinateSystemMethod.Global, colorMap=colormap_1, displayUnit="mm") contourvisualization_1.update() result = apex.session.display3DSpans(False) result = apex.session.displaySensorMarkers(True) result = apex.session.display2DSpans(False) result = apex.session.display3DSpans(False) result = apex.session.displaySensorMarkers(True) for i in range(4): stateplot_1.update(resultDataSetIndex=[7 + i]) time.sleep(3) capturedImage = apex.display.captureImage( path= r"D:\00-Projects\01-SequenceOptimization\ApexFiles\Images", imageNamePrefix=scenaryName, imageCaptureRegion=apex.display.CaptureRegionType.Viewport, imageFormat=apex.display.ImageType.jpg) apex.post.exitPostProcess()
def ExpandSplit(dict={}): try: distance = float(dict["distance"]) except ValueError: apex.enableShowOutput() print("Non-numeric input for distance, must be a number!") raise model_1 = apex.currentModel() SelectedAssyName = "" _splitter = apex.EntityCollection() for Assembly in apex.selection.getCurrentSelection(): SelectedAssyName = Assembly.getName() for Part in Assembly.getParts(True): for Solid in Part.getSolids(): for Face in Solid.getFaces(): _splitter.append(Face) if dict["splitSolids"] == 'True': includeSolid = True else: includeSolid = False if dict["splitSurfaces"] == 'True': includeSurface = True else: includeSurface = False _target = apex.EntityCollection() for Part in model_1.getParts(True): if SelectedAssyName not in Part.getPathName(): if Part.getVisibility(): if includeSolid: for Solid in Part.getSolids(): if Solid.getVisibility(): _target.append(Solid) if includeSurface: for Surface in Part.getSurfaces(): if Surface.getVisibility(): _target.append(Surface) try: result = apex.geometry.splitEntityWithOffsetFaces( target=_target, splitter=_splitter, offset=( -1.0 * distance ), # Negative value to make it expand outwards, it does inwards otherwise splitBehavior=apex.geometry.GeometrySplitBehavior.Partition) except: print( "Split failed, ty using the Apex builtin tool instead. It is under partitioning, using offset." ) apex.enableShowOutput() if dict["suppressVertices"] == 'True': _target = apex.EntityCollection() for Part in model_1.getParts(True): if SelectedAssyName not in Part.getPathName(): for Surface in Part.getSurfaces(): if Surface.getVisibility(): _target.append(Surface.getVertices()) try: result = apex.geometry.suppressOnly( target=_target, maxEdgeAngle=1.000000000000000e+01, maxFaceAngle=5.000000000000000, keepVerticesAtCurvatureChange=False, cleanupTol=1.000000000000000, forceSuppress=False) except: apex.enableShowOutput() raise
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
b(C.range_b, C.slow_step, -C.br_width), C.v, 0, ptList_p[19]) Curves(ap(C.range_a, C.slow_step, odstep_slupa), b_p(C.range_b, C.slow_step, odstep_slupa), C.v, -1.0, ptList_p[20]) size = len(ptList_p[10]) # Wyznacza ilość przepon new_ptList = [] for i in range(0, size): new_ptList.append( [] ) # Dodaje do nowej tablicy dokładnie tyle pustych tablic ile jest przepon for list in ptList_p: new_ptList[i].append( list[i] ) # Dodaje do tablicy z indeksem [i] znajdującej się w tablicy new_ptList, punkty o indeksie (i) kolejno z każdej tablicy zawartej w tablicy ptList_p for Curve in range(0, len(new_ptList)): Lista = new_ptList[Curve] n = len(Lista) deg = 1 m = n + deg + 1 controlPoints = Lista knotPoints = linspace(0, 1, m) createCurve3DNurb(controlPoints, knotPoints, deg).asCurve() for i in range(22, 39): _target = apex.EntityCollection() part_1 = apex.getPart(pathName="gen/Part 1") curve_1 = part_1.getCurve(name="Curve {}".format(i)) _target.extend(curve_1.getEdges()) result = apex.geometry.fillerSurface(target=_target)
def ShowType(dict={}): model_1 = apex.currentModel() _splitter = apex.EntityCollection() for Elem in apex.selection.getCurrentSelection(): print(type(Elem)) print(Elem.getBody().getPathName())
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 NameAfterAssy(dict={}): entities_1 = apex.EntityCollection() for Part in model_1.getParts(True): if len(Part.getParent().getParts(True)) == 1: Part.update(name=Part.getParent().getName())
def filterFixture(dict={}): #apex.disableShowOutput() model_1 = apex.currentModel() try: distTolerance = float(dict["searchDistance"]) except: raise for selElem in apex.selection.getCurrentSelection(): listOfRefSolid = [] listOfRefSolidPaths = [] if dict["newAssy"] == 'True': ntAssy = model_1.createAssembly( name="Coincident with {0}".format(selElem.getName())) else: ntAssy = None if selElem.entityType == apex.EntityType.Assembly: if ntAssy: ntAssy.setParent(selElem) for Part in selElem.getParts(True): Part.update(color=[0, 0, 255]) Part.show() for Solid in Part.getSolids(): listOfRefSolidPaths.append(Solid.getPathName()) listOfRefSolid.append(Solid) elif selElem.entityType == apex.EntityType.Part: if ntAssy: ntAssy.setParent(selElem.getParent()) selElem.update(color=[0, 0, 255]) selElem.show() for Solid in selElem.getSolids(): listOfRefSolidPaths.append(Solid.getPathName()) listOfRefSolid.append(Solid) listOfTargetSolids = apex.EntityCollection() for Part in model_1.getParts(True): if Part.getVisibility(): for Solid in Part.getSolids(): if Solid.getPathName() not in listOfRefSolidPaths: listOfTargetSolids.append(Solid) listOfTargetSolids.hide() for refSolid in listOfRefSolid: textDisplay = apex.display.displayText( text=refSolid.getName(), textLocation=refSolid.getCentroid(), graphicsFont="Calibri", graphicsFontColor=apex.ColorRGB(255, 191, 0), graphicsFontSize=12, graphicsFontStyle=apex.display.GraphicsFontStyle.Normal, graphicsFontUnderlineStyle=apex.display. GraphicsFontUnderlineStyle.NoUnderline) distance_ = apex.measureDistance(source=refSolid, target=listOfTargetSolids) newList = apex.EntityCollection() for k in range(len(distance_)): if distance_[k] <= distTolerance: listOfTargetSolids[k].getParent().show() if ntAssy: res = listOfTargetSolids[k].getParent().setParent( parent=ntAssy) else: newList.append(listOfTargetSolids[k]) listOfTargetSolids = newList apex.display.clearAllGraphicsText()
def verticalSlicing(dict={}): layerHeight = float(dict['layerHeight']) if dict['layerHeight'] else -1 model_1 = apex.currentModel() for selectedFace in apex.selection.getCurrentSelection(): currCut = layerHeight fCentr = [ selectedFace.getCentroid().x, selectedFace.getCentroid().y, selectedFace.getCentroid().z ] print(fCentr) paramU = selectedFace.evaluatePointOnFace(selectedFace.getCentroid()).u paramV = selectedFace.evaluatePointOnFace(selectedFace.getCentroid()).v normalAtPoint = selectedFace.evaluateNormal(paramU, paramV) normInvDir = [ -1 * normalAtPoint.x, -1 * normalAtPoint.y, -1 * normalAtPoint.z ] print(paramU, paramV) _target = apex.EntityCollection() _target.append(selectedFace.getBody()) while (True): # Loop to split vertically try: vecDir = apex.construct.Vector3D(currCut * normInvDir[0], currCut * normInvDir[1], currCut * normInvDir[2]) point3D = apex.construct.Point3D( (currCut * normInvDir[0]) + fCentr[0], (currCut * normInvDir[1]) + fCentr[1], (currCut * normInvDir[2]) + fCentr[2]) _plane = apex.construct.Plane(point3D, vecDir) if dict["splitBody"] == 'True': result = apex.geometry.splitWithPlane( target=_target, plane=_plane, splitBehavior=apex.geometry.GeometrySplitBehavior. Partition) else: result = apex.geometry.splitWithPlane( target=_target, plane=_plane, splitBehavior=apex.geometry.GeometrySplitBehavior.Split ) currCut += layerHeight except: e = sys.exc_info()[0] print(e) break listOfNames = [] listOfCenterHeight = [] for solid in model_1.getCurrentPart().getSolids(): solid.update(enableTransparency=True, transparencyLevel=50) listOfNames.append(solid.getPathName()) listOfCenterHeight.append(solid.getCentroid().z) sortedByHeight = [ x for _, x in sorted(zip(listOfCenterHeight, listOfNames)) ] newPath = [] for layerNum in range(len(sortedByHeight)): newPath.append( apex.getSolid(pathName=sortedByHeight[layerNum]).getPath() + "/Layer_{0}".format(layerNum)) res = apex.getSolid(pathName=sortedByHeight[layerNum]).update( name="Layer_{0}".format(layerNum))
def Slicer(solidBody="", cutPos=[], cutAngleDeg="", maxPointSpacing=0.0, pathToSaveFile=""): workingSolid = solidBody # -Collect all vertices before partitioning, so I know which ones were created after the cut allEdgesIDBefore = [] for elem in workingSolid.getEdges(): allEdgesIDBefore.append(elem.getId()) # -Create cutting plane location and orientation for partitioning (currently cutting on XY-plane) _plane = apex.construct.Plane( apex.construct.Point3D(float(cutPos[0]), float(cutPos[1]), float(cutPos[2])), apex.construct.Vector3D(cos(radians(cutAngleDeg)), sin(radians(cutAngleDeg)), 0.000000)) _target = apex.EntityCollection() _target.append(workingSolid) # -Create partition result = apex.geometry.splitWithPlane( target=_target, plane=_plane, splitBehavior=apex.geometry.GeometrySplitBehavior.Partition) # -Collect all vertices after partitioning, IDs of old vertices will not change allEdgesIDAfter = [] for elem in workingSolid.getEdges(): allEdgesIDAfter.append(elem.getId()) # -Check which vertices were created by the partitioning operation newEdgesID = (list(set(allEdgesIDAfter) - set(allEdgesIDBefore))) newEdgesHeight = [] for EdgeID in newEdgesID: newEdgesHeight.append( workingSolid.getEdge(id=int(EdgeID)).getMidPoint().z) sortedByHeight = [ int(x) for _, x in sorted(zip(newEdgesHeight, newEdgesID)) ] workingEdge = workingSolid.getEdge(id=sortedByHeight[-1]) workingEdgeLength = workingEdge.getLength() # -Getting faces that are connected to this edge (at least three will come up) proxSearch = apex.utility.ProximitySearch() listOfConnectedFaces = workingEdge.getConnectedFaces() ans = proxSearch.insertCollection(listOfConnectedFaces) # -Find the face on which the edge is lying on top (should be only one) edgeMidpoint = workingEdge.getMidPoint() resSearch = proxSearch.findNearestObjects(location=edgeMidpoint, numObjects=1) selectedFace = "" for elem in resSearch.foundObjects(): selectedFace = elem # -Define trajectory characteristics if maxPointSpacing > 0: trajStep = int(workingEdgeLength / maxPointSpacing) trajResolution = trajStep + 1 if trajStep > 2 else 3 else: trajResolution = 4 paramRange = workingEdge.getParametricRange() delta = abs(paramRange['uEnd'] - paramRange['uStart']) / trajResolution sampling = [(x * delta) + paramRange['uStart'] for x in range(0, trajResolution + 1)] # -Build trajectory information trajInfo = [] for i in range(len(sampling)): pointCoord = [ workingEdge.evaluateEdgeParametricCoordinate(sampling[i]).x / 1000, # Converting to meters workingEdge.evaluateEdgeParametricCoordinate(sampling[i]).y / 1000, # Converting to meters workingEdge.evaluateEdgeParametricCoordinate(sampling[i]).z / 1000 ] # Converting to meters pointResolve = apex.Coordinate( pointCoord[0] * 1000, # Converting to mm pointCoord[1] * 1000, # Converting to mm pointCoord[2] * 1000) # Converting to mm paramU = selectedFace.evaluatePointOnFace(pointResolve).u paramV = selectedFace.evaluatePointOnFace(pointResolve).v normalAtPoint = selectedFace.evaluateNormal(paramU, paramV) pointDir = [normalAtPoint.x, normalAtPoint.y, normalAtPoint.z] trajInfo.append(pointCoord + pointDir) # -Get the correct file header from a Simufact trajectory trajHeader = "# CSV file produced by the DED slicing code" trajHeader += "\n# Date of creation: xx xx xxxx xx:xx:xx" trajHeader += "\n# Length unit: Meter [m]" trajHeader += "\n#" trajHeader += "\n# Orientation: 0 - global vector ; 1 - local vector; 2 - local second point" trajHeader += "\n1" trajHeader += "\n#" trajHeader += "\n# order;activity;x-coordinate;y-coordinate;z-coordinate;x-second point;y-second point;z-second point" trajBuild = trajHeader for i in range(len(trajInfo)): lineBuild = "\n{0};true;{1};{2};{3};0.0;0.0;1.0".format( i + 1, trajInfo[i][0], trajInfo[i][1], trajInfo[i][2]) trajBuild += lineBuild # -Write the trajectory file if pathToSaveFile: with open(pathToSaveFile, 'w') as newTrajFile: newTrajFile.write(trajBuild)
def CreateMeshPartitions(dict={}): # =================================================================== ## Initializing Apex code apex.setScriptUnitSystem(unitSystemName=r'''mm-kg-s-N''') model_1 = apex.currentModel() ## Collect faces to mesh _targetFine = apex.entityCollection() listOfLengths = [] listOfDiameters = [] try: MeshSize = float(dict["MeshSize"]) except: MeshSize = float(dict["FineMeshSize"]) #try: listOfTrajectories = model_1.getAssembly("Refinement regions").getParts( True) listOfAllParts = [] for Part in model_1.getParts(True): if "Refinement regions" not in Part.getPath(): listOfAllParts.append(Part) for Part in listOfTrajectories: if 'RefDiam' in Part.getName(): _, Diam = Part.getName().split('_') listOfDiameters.append(float(Diam)) else: if len(Part.getCurves()) > 0: listOfLengths.append(Part.getCurves()[0].getLength()) maxDiameter = max( listOfDiameters) #Getting the max diameter to use as search range ## Getting all faces from all parts that are not under 'Trajectories' proxSearch = apex.utility.ProximitySearch() listOfAllPartFaces = [] for Part in listOfAllParts: for Surface in Part.getSurfaces(): for Face in Surface.getFaces(): listOfAllPartFaces.append(Face) ## Inserting the list of faces into the proximity search ans = proxSearch.insertList(listOfAllPartFaces) facesToMesh = apex.EntityCollection() ## Perform the search for Part in model_1.getAssembly('Refinement regions').getParts( ): # Add spots and weld beads to perfom the search for Solid in Part.getSolids(): resSearch = proxSearch.findObjectsWithinDistance( location=Solid.getLocation(), distance=1.1 * maxDiameter) for elem in resSearch.foundObjects(): if elem.entityType == apex.EntityType.Face: facesToMesh.append(elem) if listOfLengths: minLength = min(listOfLengths) ## Select everything that is smaller than the minLength * maxDiameter for Assy in model_1.getAssemblies(): if "Refinement regions" not in Assy.getName(): for Part in Assy.getParts(recursive=True): for Surface in Part.getSurfaces(): for Face in Surface.getFaces(): if Face.getArea() <= (0.8 * max(listOfLengths) * maxDiameter): facesToMesh.append(Face) else: ## Select everything that is smaller than the minLength * maxDiameter for Part in listOfAllParts: for Surface in Part.getSurfaces(): for Face in Surface.getFaces(): if Face.getArea() <= (1.1 * 3.14159 * (maxDiameter / 2)**2): facesToMesh.append(Face) apex.mesh.createSurfaceMesh( name="", target=facesToMesh, meshSize=MeshSize, meshType=apex.mesh.SurfaceMeshElementShape.Mixed, meshMethod=apex.mesh.SurfaceMeshMethod.Pave, mappedMeshDominanceLevel=2, elementOrder=apex.mesh.ElementOrder.Linear, meshUsingPrincipalAxes=False, refineMeshUsingCurvature=True, elementGeometryDeviationRatio=0.10, elementMinEdgeLengthRatio=0.50, createFeatureMeshOnFillets=False, createFeatureMeshOnChamfers=False, createFeatureMeshOnWashers=False, createFeatureMeshOnQuadFaces=False) try: pass except: print("Meshing failed or not performed.")
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 build_truss_model(): """Builds a ready-to-solve model of a truss structure and saves the model. """ # Get the current model model = apex.currentModel() # Create a sketch of the truss truss_sketch(model, TRUSS_ENDPOINTS) # Get the part object and part collection part = apex.getPart('{}/Part 1'.format(model.getName())) part_collection = apex.EntityCollection() part_collection.append(part) # Mesh the truss curves curve = part.getCurves()[0] collection = apex.EntityCollection() collection.append(curve) mesh = apex.mesh.createCurveMesh( name='', target=collection, meshSize=10.0, elementOrder=apex.mesh.ElementOrder.Linear).curveMeshes[0] # Apply Constraints constraint_nodes = find_constraint_nodes(mesh.getNodes()) _constraints = [ apex.environment.createDisplacementConstraint( name=f'Constraint {idx+1}', constraintType=apex.attribute.ConstraintType.Clamped, applicationMethod=apex.attribute.ApplicationMethod.Direct, target=node) for idx, node in enumerate(constraint_nodes) ] # Apply Loads load_nodes = find_load_nodes(mesh.getNodes()) _loads = [ apex.environment.createForceMoment( name=f'Load{idx+1}', forceMomentRep=apex.environment. createForceMomentStaticRepByComponent(name='load', description='', forceY=-100.0), applicationMethod=apex.attribute.ApplicationMethod.Direct, target=node, orientation=apex.construct.createOrientation(alpha=0.0, beta=0.0, gamma=0.0)) for idx, node in enumerate(load_nodes) ] # Apply Gravity Load orientation = apex.construct.createOptionOrientation() orientation.GlobalNY = True _gravity_1 = apex.environment.createGravityByG(name='Gravity', gravConstant=386.08858268, orientation=orientation, gravConstantMultiplier=1.0) # Create and assign material material_1 = apex.catalog.createMaterial(name='steel', color=[64, 254, 250]) material_1.update(elasticModulus=30000000.0) material_1.update(poissonRatio=0.3) material_1.update(density=0.000725222171) apex.attribute.assignMaterial(material=material_1, target=part_collection) # Create and apply beam sections beamshape_1 = apex.attribute.createBeamShapeHollowRoundByThickness( name='Beam Shape', outerRadius=2.0, thickness=0.25) _beamspan_1 = apex.attribute.createBeamSpanFree( name='Span', beamTarget=curve.getEdges(), shapeEndA=beamshape_1, shapeEndB=beamshape_1, shapeEndA_orientation=0.0, shapeEndB_orientation=0.0, shapeEndA_offset1=0.0, shapeEndA_offset2=0.0, shapeEndB_offset1=0.0, shapeEndB_offset2=0.0) # Create analysis study = apex.getPrimaryStudy() scenario = study.createScenarioByModelRep( context=part, simulationType=apex.studies.SimulationType.Static) # TODO: Figure out why the following line throws an error # scenario.execute() model_save_name = get_unused_name(model.name, SAVE_DIRECTORY) model.saveAs(model_save_name, SAVE_DIRECTORY)
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 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