def SetUpAZP(self): # --------------------Initial Variable Names and Settings-------------------- #self.reply = Aba.getWarningReply(message='Press YES for sheet body \nPress NO for solid body', # buttons=(AbaCon.YES, AbaCon.NO)) self.r = float(getInput('Enter the propeller radius(mm):')) # --------------------Prompt user for which radii to inspect-------------------- fields = (('R= ', '0.5'), ('R= ', '0.6'), ('R= ', '0.7'), ('R= ', '0.8'), ('R= ', '0.9'), ('R= ', ''), ('R= ', ''), ('R= ', ''), ('R= ', ''), ('R= ', '')) self.r_input = getInputs( fields=fields, label= 'Enter percentages of the propeller radius(0.5, 0.6,...etc.):', dialogTitle='Inspected radii', ) # filter out empty and duplicate inputs self.r_val = [] for i in range(len(self.r_input)): duplicate = 0 if self.r_input[i] != '': self.r_val.append(float(self.r_input[i])) for j in range(len(self.r_val) - 1): if self.r_val[-1] == self.r_val[j]: duplicate = 1 if duplicate == 1: self.r_val.remove(self.r_val[-1]) self.r_val.sort() # --------------------Save list of radii and set names to C:\temp-------------------- self.r_name = [] # Used throughout the script to name sets self.set_name = [] for i in range(len(self.r_val)): self.r_name.append('R_' + str(self.r_val[i])[2:]) self.set_name.append('PROFILE-' + self.r_name[i]) self.npz_name = 'parameters_for_plot.npz' np.savez(self.npz_name, r_val=self.r_val, set_name=self.set_name) npzfile = np.load(self.npz_name) # --------------------Import-------------------- self.step = mdb.openStep(self.file_path, scaleFromFile=OFF) self.model.PartFromGeometryFile(name=self.part_name, geometryFile=self.step, combine=True, retainBoundary=True, mergeSolidRegions=True, dimensionality=THREE_D, type=DEFORMABLE_BODY) p = self.model.parts[self.part_name] session.viewports['Viewport: 1'].setValues(displayedObject=p) # --------------------Make instance-------------------- a = self.model.rootAssembly a.DatumCsysByDefault(CARTESIAN) a.Instance(name=self.file, part=p, dependent=OFF) # --------------------Particion Settings-------------------- a.DatumPlaneByPrincipalPlane(principalPlane=YZPLANE, offset=200.0) d1 = a.datums e1 = a.instances[self.file].edges a.Set(name='prePartiti', edges=e1) t = a.MakeSketchTransform(sketchPlane=d1[4], sketchUpEdge=e1[2], sketchPlaneSide=SIDE1, origin=(200.0, 0.0, 0.0)) s = self.model.ConstrainedSketch(name='__profile__', sheetSize=1926.91, gridSpacing=48.17, transform=t) g, v, d1, c = s.geometry, s.vertices, s.dimensions, s.constraints s.setPrimaryObject(option=SUPERIMPOSE) a = self.model.rootAssembly a.projectReferencesOntoSketch(sketch=s, filter=COPLANAR_EDGES) # --------------------Draw Radius circles-------------------- for i in range(len(self.r_val)): s.CircleByCenterPerimeter(center=(0.0, 0.0), point1=(self.r * self.r_val[i], 0.0)) # --------------------Make Partition-------------------- a = self.model.rootAssembly f1 = a.instances[self.file].faces d21 = a.datums e11 = a.instances[self.file].edges a.PartitionFaceBySketchThruAll(sketchPlane=d21[4], sketchUpEdge=e11[2], faces=f1, sketchPlaneSide=SIDE1, sketch=s) s.unsetPrimaryObject() del self.model.sketches['__profile__'] e1 = a.instances[self.file].edges a.Set(name='postPartiti', edges=e1) a.SetByBoolean(name='r_edges', sets=(a.sets['postPartiti'], a.sets['prePartiti']), operation=DIFFERENCE) e1 = a.instances[self.file].edges # --------------------MESH-------------------- # Sheet mesh if self.reply == YES: session.viewports['Viewport: 1'].assemblyDisplay.setValues(mesh=ON) session.viewports[ 'Viewport: 1'].assemblyDisplay.meshOptions.setValues( meshTechnique=ON) a = self.model.rootAssembly f1 = a.instances[self.file].faces a.setMeshControls( regions=f1, elemShape=TRI) # Choose between: QUAD, QUAD_DOMINATED, TRI partInstances = (a.instances[self.file], ) a.seedPartInstance(regions=partInstances, size=10.0, deviationFactor=0.1, minSizeFactor=0.1) elemType1 = mesh.ElemType(elemCode=S8R, elemLibrary=STANDARD) elemType2 = mesh.ElemType(elemCode=STRI65, elemLibrary=STANDARD) pickedRegions = (f1, ) a.setElementType(regions=pickedRegions, elemTypes=(elemType1, elemType2)) partInstances = (a.instances[self.file], ) a.generateMesh(regions=partInstances) # Solid mesh if self.reply == NO: session.viewports['Viewport: 1'].assemblyDisplay.setValues(mesh=ON) session.viewports[ 'Viewport: 1'].assemblyDisplay.meshOptions.setValues( meshTechnique=ON) a = self.model.rootAssembly partInstances = (a.instances[self.file], ) a.seedPartInstance(regions=partInstances, size=10.0, deviationFactor=0.1, minSizeFactor=0.1) c1 = a.instances[self.file].cells a.setMeshControls(regions=c1, elemShape=TET, technique=FREE) elemType1 = mesh.ElemType(elemCode=C3D20R, elemLibrary=STANDARD) elemType2 = mesh.ElemType(elemCode=C3D15, elemLibrary=STANDARD) elemType3 = mesh.ElemType(elemCode=C3D10, elemLibrary=STANDARD) pickedRegions = (c1, ) a.setElementType(regions=pickedRegions, elemTypes=(elemType1, elemType2, elemType3)) a.generateMesh(regions=partInstances) # --------------------NodeSets-------------------- for i in range(len(self.r_name)): edges = e1.getByBoundingCylinder((-1000, 0, 0), (1000, 0, 0), self.r * self.r_val[i] + self.tol) a.Set(edges=edges, name=self.r_name[i] + '+tol') edges = e1.getByBoundingCylinder((-1000, 0, 0), (1000, 0, 0), self.r * self.r_val[i] - self.tol) a.Set(edges=edges, name=self.r_name[i] + '-tol') a.SetByBoolean(name='Area', sets=(a.sets[self.r_name[i] + '+tol'], a.sets[self.r_name[i] + '-tol']), operation=DIFFERENCE) a.SetByBoolean(name=self.set_name[i], sets=(a.sets['Area'], a.sets['r_edges']), operation=INTERSECTION) del a.sets['Area'] del a.sets[self.r_name[i] + '+tol'] del a.sets[self.r_name[i] + '-tol'] n_labels = [] for j in range(len(a.sets[self.set_name[i]].nodes)): node = a.sets[self.set_name[i]].nodes[j].label n_labels.append(node) n_labels = np.array(n_labels) a.SetFromNodeLabels( name='nodes_' + self.r_name[i], nodeLabels=((self.file, n_labels), ), ) # --------------------Step-------------------- self.model.StaticStep(name='Step-1', previous='Initial', initialInc=0.001, maxInc=0.1) session.viewports['Viewport: 1'].assemblyDisplay.setValues( step='Step-1') session.viewports['Viewport: 1'].assemblyDisplay.setValues( loads=ON, bcs=ON, predefinedFields=ON, connectors=ON, adaptiveMeshConstraints=OFF) # --------------------Load-------------------- readfile = open(self.pressure_field_path, "r") reading = readfile.read() pressuredist = reading.split('\n') len_s = len(pressuredist) empty_rows = [] for i in range(len_s): if len(pressuredist[i]) == 0: empty_rows.append(i) t = pressuredist[i].split('\t') for j in range(len(t)): t[j] = float(t[j]) pressuredist[i] = t if len(empty_rows) > 0: for i in range(len(empty_rows)): del pressuredist[empty_rows[i]] self.model.MappedField(name='AnalyticalField-1', description='', regionType=POINT, partLevelData=False, localCsys=None, pointDataFormat=XYZ, fieldDataType=SCALAR, xyzPointData=pressuredist) a = self.model.rootAssembly s1 = a.instances[self.file].faces region = a.Surface(side1Faces=s1, name='Surf-1') self.model.Pressure(name='Load-1', createStepName='Step-1', region=region, distributionType=FIELD, field='AnalyticalField-1', magnitude=1.0, amplitude=UNSET) # --------------------BC-------------------- a = self.model.rootAssembly e1 = a.instances[self.file].edges edges = e1.getByBoundingCylinder( (1000, 0, 0), # Top #This is only correct for AzP65C (-1000, 0, 0), # Bottom self.r * 0.408) # Radius a.Set(edges=edges, name='BC_edges_extra') edges = e1.getByBoundingCylinder( (-254, -262, -7), # Top #This is only correct for AzP65C (-254, -262, -20), # Bottom 15) # Radius a.Set(edges=edges, name='BC_edges_single') region = a.SetByBoolean(name='BC-Edges', sets=(a.sets['BC_edges_extra'], a.sets['BC_edges_single']), operation=DIFFERENCE) self.model.DisplacementBC(name='BC-1', createStepName='Initial', region=region, u1=0.0, u2=0.0, u3=0.0, ur1=0.0, ur2=0.0, ur3=0.0, amplitude=UNSET, fixed=OFF, distributionType=UNIFORM, fieldName='', localCsys=None) session.viewports['Viewport: 1'].setValues(displayedObject=p) session.viewports['Viewport: 1'].setValues(displayedObject=a)
def createVirtualXrays(odbName,bRegionSetName,BMDfoname,showImplant,iRegionSetName, iDensity,stepList,csysName,resGrid,imageNameBase,preferredXraySize, imageFormat,smooth=False,manualImageScaling=False): """Creates virtual x-rays from an ABAQUS odb file. The odb file should contain \n""" + \ """a number of steps with a fieldoutput variable representing bone mineral density (BMD)""" # User message print '\npyvXRAY: Create virtual x-rays plugin' # Check dependencies if not checkDependencies(): print 'Error: Virtual x-rays not created\n' return # Process inputs resGrid = float(resGrid) stepList = [int(s) for s in stepList.replace(',',' ').split()] preferredXraySize = int(preferredXraySize) # Set variables dx,dy,dz = (resGrid,)*3 iDensity /= 1000. odb = session.odbs[odbName] ec = dict([(ename,eclass()) for ename,eclass in et.seTypes.items()]) # Get transformation matrix to convert from global to local coordinate system TM = getTMfromCsys(odb,csysName) print '\nX-ray views will be relative to %s' % csysName # Get part data and create a bounding box. The bounding box should include the implant if specified bRegion,bElemData,bNodeList,bBBox = getPartData(odb,bRegionSetName,TM) if showImplant: iRegion,iElemData,iNodeList,iBBox = getPartData(odb,iRegionSetName,TM) bbLow = np.min((bBBox[0],iBBox[0]),axis=0) bbUpp = np.max((bBBox[1],iBBox[1]),axis=0) else: bbLow,bbUpp = bBBox border = 0.05*(bbUpp-bbLow) bbLow = bbLow - border bbUpp = bbUpp + border bbSides = bbUpp - bbLow x0,y0,z0 = bbLow xN,yN,zN = bbUpp lx,ly,lz = bbSides # Generate Xray grid NX = int(np.ceil(lx/dx+1)) x = np.linspace(x0,xN,NX) NY = int(np.ceil(ly/dy+1)) y = np.linspace(y0,yN,NY) NZ = int(np.ceil(lz/dz+1)) z = np.linspace(z0,zN,NZ) # Create element map for the implant, map to 3D space array and then project onto 3 planes if showImplant: # Get a map for each instance and element type. Then combine maps together iElementMap=np.zeros((NX*NY*NZ),dtype=[('inst','|a80'),('cte',int),('g',float),('h',float),('r',float)]) for instName in iElemData.keys(): for etype in iElemData[instName].keys(): edata = iElemData[instName][etype] emap = createElementMap(iNodeList[instName],edata['label'],edata['econn'],ec[etype].numNodes,x,y,z) indx = np.where(emap['cte']>0) iElementMap['inst'][indx] = instName iElementMap['cte'][indx] = emap['cte'][indx] iElementMap['g'][indx] = emap['g'][indx] iElementMap['h'][indx] = emap['h'][indx] iElementMap['r'][indx] = emap['r'][indx] # Mask 3D array iMask = np.zeros((NX,NY,NZ),dtype=np.float64) for gpi in xrange(iElementMap.size): gridPoint = iElementMap[gpi] if gridPoint['cte'] > 0: i,j,k = convert1Dto3Dindex(gpi,NX,NY,NZ) iMask[i,j,k] = iDensity # Create projections of 3D space array onto planes iProjectedXY = projectXrayPlane(iMask,'xy') iProjectedYZ = projectXrayPlane(iMask,'yz') iProjectedXZ = projectXrayPlane(iMask,'xz') # Create xrays of implant without bone iprojXY = iProjectedXY.copy() iprojYZ = iProjectedYZ.copy() iprojXZ = iProjectedXZ.copy() prXY = [np.min(iprojXY),np.max(iprojXY)] prYZ = [np.min(iprojYZ),np.max(iprojYZ)] prXZ = [np.min(iprojXZ),np.max(iprojXZ)] iprojXY[:,:] = (iprojXY[:,:]-prXY[0])/(prXY[1]-prXY[0])*255. iprojYZ[:,:] = (iprojYZ[:,:]-prYZ[0])/(prYZ[1]-prYZ[0])*255. iprojXZ[:,:] = (iprojXZ[:,:]-prXZ[0])/(prXZ[1]-prXZ[0])*255. #writeImageFile('implant_XY',iprojXY,preferredXraySize,imageFormat,smooth) #writeImageFile('implant_YZ',iprojYZ,preferredXraySize,imageFormat,smooth) #writeImageFile('implant_XZ',iprojXZ,preferredXraySize,imageFormat,smooth) # Create the element map for the bone bElementMap=np.zeros((NX*NY*NZ),dtype=[('inst','|a80'),('cte',int),('g',float),('h',float),('r',float)]) for instName in bElemData.keys(): for etype in bElemData[instName].keys(): edata = bElemData[instName][etype] emap = createElementMap(bNodeList[instName],edata['label'],edata['econn'],ec[etype].numNodes,x,y,z) indx = np.where(emap['cte']>0) bElementMap['inst'][indx] = instName bElementMap['cte'][indx] = emap['cte'][indx] bElementMap['g'][indx] = emap['g'][indx] bElementMap['h'][indx] = emap['h'][indx] bElementMap['r'][indx] = emap['r'][indx] # Interpolate HU values from tet mesh onto grid using quadratic tet shape function # (a) Get HU values from frame numSteps = len(stepList) xraysXY = np.zeros((numSteps,NX,NY),dtype=np.float64) xraysYZ = np.zeros((numSteps,NY,NZ),dtype=np.float64) xraysXZ = np.zeros((numSteps,NX,NZ),dtype=np.float64) mappedBMD = np.zeros((NX,NY,NZ),dtype=np.float64) # Initialise BMDvalues BMDvalues = dict([(k,{}) for k in bElemData.keys()]) for instName,instData in bElemData.items(): for etype,eData in instData.items(): for i in xrange(eData.size): BMDvalues[instName][eData[i]['label']] = et.seTypes[etype]() for s in xrange(numSteps): # Step details stepId = stepList[s] stepName = "Step-%i" % (stepId) frame = odb.steps[stepName].frames[-1] # Get BMD data for bRegion in current frame print 'Getting BMDvalues in %s' % stepName BMDfov = frame.fieldOutputs[BMDfoname].getSubset(region=bRegion, position=ELEMENT_NODAL).values cel = 0 for i in xrange(len(BMDfov)): val = BMDfov[i] instanceName = val.instance.name elementLabel = val.elementLabel if elementLabel!=cel: cel=elementLabel indx=0 else: indx+=1 BMDvalues[instanceName][elementLabel].setNodalValueByIndex(indx,val.data) # Perform the interpolation from elementMap to 3D space array print 'Mapping BMD values in %s' % stepName for gpi in xrange(bElementMap.size): gridPoint = bElementMap[gpi] instName = gridPoint['inst'] cte = gridPoint['cte'] if cte > 0: ipc = [gridPoint['g'],gridPoint['h'],gridPoint['r']] i,j,k = convert1Dto3Dindex(gpi,NX,NY,NZ) mappedBMD[i,j,k] = BMDvalues[instName][cte].interp(ipc) # Project onto orthogonal planes xraysXY[s] = projectXrayPlane(mappedBMD,'xy') xraysYZ[s] = projectXrayPlane(mappedBMD,'yz') xraysXZ[s] = projectXrayPlane(mappedBMD,'xz') # Get min/max pixel values. Use zero for lower limit (corresponding to background) prXY = [0.,np.max(xraysXY)] prYZ = [0.,np.max(xraysYZ)] prXZ = [0.,np.max(xraysXZ)] # Allow user to change scale factors if desired if manualImageScaling: fields = (('X-Y','%.6f'%prXY[1]),('Y-Z','%.6f'%prYZ[1]),('X-Z','%.6f'%prXZ[1])) usf = getInputs(fields=fields,label='X-ray image scale factors:') if usf[0] != None: try: usf = [float(sf) for sf in usf] except: print 'Error in user supplied X-ray image scale factors. Using pyvXRAY values' else: prXY[1],prYZ[1],prXZ[1] = usf
def SetUpHW(self): # --------------------Initial Variable Names and Settings-------------------- self.reply = getWarningReply( message='Press YES for sheet body \nPress NO for solid body', buttons=(YES, NO)) self.r = float(getInput('Enter the propeller radius(mm):')) # --------------------Prompt user for which radii to inspect-------------------- self.fields = (('R= ', '0.5'), ('R= ', '0.6'), ('R= ', '0.7'), ('R= ', '0.8'), ('R= ', '0.9'), ('R= ', ''), ('R= ', ''), ('R= ', ''), ('R= ', ''), ('R= ', '')) self.r_input = getInputs( fields=self.fields, label= 'Enter percentages of the propeller radius(0.5, 0.6,...etc.):', dialogTitle='Inspected radii', ) # filter out empty and duplicate inputs self.r_val = [] for i in range(len(self.r_input)): duplicate = 0 if self.r_input[i] != '': self.r_val.append(float(self.r_input[i])) for j in range(len(self.r_val) - 1): if self.r_val[-1] == self.r_val[j]: duplicate = 1 if duplicate == 1: self.r_val.remove(self.r_val[-1]) self.r_val.sort() # r_val = [0.5, 0.6, 0.7, 0.8, 0.9, 0.95] #If all radii are predefined, uncomment this line, add the percentages to the list and comment out the previous 15 lines # --------------------Save list of radii and set names to C:\temp-------------------- self.r_name = [] # Used throughout the script to name sets self.set_name = [] for i in range(len(self.r_val)): self.r_name.append('R_' + str(self.r_val[i])[2:]) self.set_name.append('PROFILE-' + self.r_name[i]) npz_name = 'parameters_for_plot.npz' self.np.savez(npz_name, r_val=self.r_val, set_name=self.set_name) npzfile = self.np.load(npz_name) # --------------------Import-------------------- self.step = mdb.openStep(file_path, scaleFromFile=OFF) self.model.PartFromGeometryFile(name=self.part_name, geometryFile=self.step, combine=True, retainBoundary=True, mergeSolidRegions=True, dimensionality=THREE_D, type=DEFORMABLE_BODY) p = self.model.parts[self.part_name] session.viewports['Viewport: 1'].setValues(displayedObject=p) # --------------------Material-------------------- # model.Material(name='CF-UD') # model.materials['CF-UD'].Elastic(type=ENGINEERING_CONSTANTS, # table=((140000.0, 10000.0, 10000.0, # E1, E2, E3 # 0.28, 0.28, 0.5, # v12, v13, v23 # 3300.0, 3300.0, 3500.0),)) # G12, G13, G23 # --------------------Make instance-------------------- a = self.model.rootAssembly a.DatumCsysByDefault(CARTESIAN) a.Instance(name=self.file, part=p, dependent=OFF) # --------------------Partition Settings-------------------- a.DatumPlaneByPrincipalPlane(principalPlane=YZPLANE, offset=200.0) d1 = a.datums e1 = a.instances[self.file].edges a.Set(name='prePartiti', edges=e1) t = a.MakeSketchTransform(sketchPlane=d1[4], sketchUpEdge=d1[1].axis3, sketchPlaneSide=SIDE1, origin=(200.0, 0.0, 0.0)) s = self.model.ConstrainedSketch(name='__profile__', sheetSize=1926.91, gridSpacing=48.17, transform=t) g, v, d1, c = s.geometry, s.vertices, s.dimensions, s.constraints s.setPrimaryObject(option=SUPERIMPOSE) a = self.model.rootAssembly a.projectReferencesOntoSketch(sketch=s, filter=COPLANAR_EDGES) # --------------------Draw Radius circles-------------------- s.ConstructionLine(point1=(-26.25, 0.0), point2=(18.75, 0.0)) s.HorizontalConstraint(entity=g[2], addUndoState=False) s.ConstructionLine(point1=(0.0, 17.5), point2=(0.0, -10.0)) s.VerticalConstraint(entity=g[3], addUndoState=False) s.FixedConstraint(entity=g[3]) s.FixedConstraint(entity=g[2]) for line in range(len(self.r_val)): s.Line(point1=(-15.0, 15.0), point2=(13.75, 15.0)) s.HorizontalConstraint(entity=g[line + 4], addUndoState=False) s.ObliqueDimension(vertex1=v[2 * line], vertex2=v[2 * line + 1], textPoint=(-4.73760223388672, 9.81308364868164), value=1000) s.DistanceDimension(entity1=g[line + 4], entity2=g[2], textPoint=(29.0790710449219, 5.39719390869141), value=self.r_val[line] * self.r) s.DistanceDimension(entity1=v[2 * line], entity2=g[3], textPoint=(22.0712547302246, 49.0563049316406), value=500) # --------------------Make Partition-------------------- a = self.model.rootAssembly f1 = a.instances[self.file].faces d21 = a.datums e11 = a.instances[self.file].edges a.PartitionFaceBySketchThruAll(sketchPlane=d21[4], sketchUpEdge=d21[1].axis3, faces=f1, sketchPlaneSide=SIDE1, sketch=s) s.unsetPrimaryObject() del self.model.sketches['__profile__'] e1 = a.instances[self.file].edges a.Set(name='postPartiti', edges=e1) a.SetByBoolean(name='r_edges', sets=(a.sets['postPartiti'], a.sets['prePartiti']), operation=DIFFERENCE) e1 = a.instances[self.file].edges # --------------------MESH-------------------- # Sheet mesh if self.reply == YES: session.viewports['Viewport: 1'].assemblyDisplay.setValues(mesh=ON) session.viewports[ 'Viewport: 1'].assemblyDisplay.meshOptions.setValues( meshTechnique=ON) a = self.model.rootAssembly f1 = a.instances[self.file].faces a.setMeshControls( regions=f1, elemShape=TRI) # Choose between: QUAD, QUAD_DOMINATED, TRI partInstances = (a.instances[self.file], ) a.seedPartInstance(regions=partInstances, size=10.0, deviationFactor=0.1, minSizeFactor=0.1) elemType1 = mesh.ElemType(elemCode=S8R, elemLibrary=STANDARD) elemType2 = mesh.ElemType(elemCode=STRI65, elemLibrary=STANDARD) pickedRegions = (f1, ) a.setElementType(regions=pickedRegions, elemTypes=(elemType1, elemType2)) partInstances = (a.instances[self.file], ) a.generateMesh(regions=partInstances) # Solid mesh if self.reply == NO: session.viewports['Viewport: 1'].assemblyDisplay.setValues(mesh=ON) session.viewports[ 'Viewport: 1'].assemblyDisplay.meshOptions.setValues( meshTechnique=ON) a = self.model.rootAssembly partInstances = (a.instances[self.file], ) a.seedPartInstance(regions=partInstances, size=10.0, deviationFactor=0.1, minSizeFactor=0.1) c1 = a.instances[self.file].cells a.setMeshControls(regions=c1, elemShape=TET, technique=FREE) elemType1 = mesh.ElemType(elemCode=C3D20R, elemLibrary=STANDARD) elemType2 = mesh.ElemType(elemCode=C3D15, elemLibrary=STANDARD) elemType3 = mesh.ElemType(elemCode=C3D10, elemLibrary=STANDARD) pickedRegions = (c1, ) a.setElementType(regions=pickedRegions, elemTypes=(elemType1, elemType2, elemType3)) a.generateMesh(regions=partInstances) # --------------------NodeSets-------------------- for i in range(len(self.r_name)): edges = e1.getByBoundingBox(-1000, -1000, self.r_val[i] * self.r - self.tol, 1000, 1000, self.r_val[i] * self.r + self.tol) a.Set(edges=edges, name='Area') a.SetByBoolean(name=self.set_name[i], sets=(a.sets['Area'], a.sets['r_edges']), operation=INTERSECTION) del a.sets['Area'] n_labels = [] for j in range(len(a.sets[self.set_name[i]].nodes)): node = a.sets[self.set_name[i]].nodes[j].label n_labels.append(node) n_labels = np.array(n_labels) a.SetFromNodeLabels( name='nodes_' + self.r_name[i], nodeLabels=((self.file, n_labels), ), ) # --------------------Step-------------------- self.model.StaticStep(name='Step-1', previous='Initial', initialInc=0.001, maxInc=0.1) session.viewports['Viewport: 1'].assemblyDisplay.setValues( step='Step-1') session.viewports['Viewport: 1'].assemblyDisplay.setValues( loads=ON, bcs=ON, predefinedFields=ON, connectors=ON, adaptiveMeshConstraints=OFF) # --------------------Load-------------------- readfile = open(pressure_field_path, "r") reading = readfile.read() pressuredist = reading.split('\n') len_s = len(pressuredist) for i in range(len_s): t = pressuredist[i].split('\t') for j in range(len(t)): t[j] = float(t[j]) pressuredist[i] = t self.model.MappedField(name='AnalyticalField-1', description='', regionType=POINT, partLevelData=False, localCsys=None, pointDataFormat=XYZ, fieldDataType=SCALAR, xyzPointData=pressuredist) a = self.model.rootAssembly s1 = a.instances[self.file].faces region = a.Surface(side1Faces=s1, name='Surf-1') self.model.Pressure(name='Load-1', createStepName='Step-1', region=region, distributionType=FIELD, field='AnalyticalField-1', magnitude=1.0, amplitude=UNSET) # --------------------BC-------------------- a = self.model.rootAssembly d1 = a.datums a.AttachmentPoints(name='Attachment Points-1', points=(d1[1].origin, ), setName='Attachment Points-1-Set-1') v1 = a.vertices verts1 = v1.getByBoundingBox(-1, -1, -1, 1, 1, 1) region1 = a.Set(vertices=verts1, name='m_Set-14') s1 = a.instances[self.file].faces side1Faces1 = s1.getByBoundingBox(-100, -150, 98, 100, 100, 102) region2 = a.Surface(side1Faces=side1Faces1, name='s_Surf-1') mdb.models['Model-1'].Coupling(name='Constraint-1', controlPoint=region1, surface=region2, influenceRadius=WHOLE_SURFACE, couplingType=KINEMATIC, localCsys=None, u1=ON, u2=ON, u3=ON, ur1=ON, ur2=ON, ur3=ON) self.model.DisplacementBC(name='BC-1', createStepName='Initial', region=region1, u1=0.0, u2=0.0, u3=0.0, ur1=0, ur2=0, ur3=0, amplitude=UNSET, fixed=OFF, distributionType=UNIFORM, fieldName='', localCsys=None) session.viewports['Viewport: 1'].setValues(displayedObject=p) session.viewports['Viewport: 1'].setValues(displayedObject=a)
executeOnCaeStartup() Mdb() #----------------------------------------------------------------- # model and basic element dimensions # GET USER REQUIREMENTS FOR UPPER CAPPING AND LOWER CAPPING THE CONTOUR DISPLAY LEGEND LEVELS from abaqus import getInputs fields = ( ('Model_origin_x:', '0'), ('Model_origin_y:', '0'), ('Model_enddim_x:', '100'), ('Model_enddim_y:', '6'), ('Model_enddim_z:', '1'), ) Model_origin_x, Model_origin_y, Model_enddim_x,\ Model_enddim_y, Model_enddim_z, \ = getInputs(fields = fields, label = 'Specify Checkerboard model dimsnions:', dialogTitle = 'Keep origin at (0, 0) for now', ) Model_origin_x = float(Model_origin_x) Model_origin_y = float(Model_origin_y) Model_enddim_x = float(Model_enddim_x) Model_enddim_y = float(Model_enddim_y) Model_enddim_z = float(Model_enddim_z) del fields #----------------------------------------------------------------- # Acquire level 0 solution metadata odbinfo = ( ('Location', 'B'), ('Calibration iteration number(as: 00n, 0mn, mno', '009'), ('ODB_FileName (enter without the .odb):', 'Loc_B_009'), ('# of frames:', '16'), ('# of grains along x:', '24'), ('# of grains along y:', '4'),
from abaqus import * from abaqusConstants import * import regionToolset session.viewports['Viewport: 1'].setValues(displayedObject=None) FrameModel = mdb.models['Model-1'] import sketch import part from abaqus import getInputs Ac=(('X','0,6000,12000'),('Y','0,6000,12000'),('Z','0,3000,6000')) a,b,c =getInputs(fields=Ac,label='Axis coordinates',dialogTitle='Creat axis net',) a,b,c=eval(a),eval(b),eval(c) Na, Nb, Nc = len(a),len(b),len(c) point1 =() for k in range(1,Nc): for i in range(Na): point2 = (((a[i],b[0],c[k]),(a[i],b[Nb-1],c[k])),) point1 = point1 + point2 for j in range(Nb): point2 = (((a[0],b[j],c[k]),(a[Na-1],b[j],c[k])),) point1 = point1 + point2 for i in range(Na): for j in range(Nb): point2 = (((a[i],b[j],c[0]),(a[i],b[j],c[Nc-1])),) point1 = point1 + point2 framePart = FrameModel.Part(name='Frame',dimensionality=THREE_D,type=DEFORMABLE_BODY) framePart.WirePolyLine(mergeType=MERGE, meshable=ON, points=point1)
RandomNumber_END_MATLAB_OUTPUT = str(9948322254) #-------------------------------------------------------- # GET USER REQUIREMENTS FOR UPPER CAPPING AND LOWER CAPPING THE CONTOUR DISPLAY LEGEND LEVELS from abaqus import getInputs fields = ( ('S11_contour_label_max_MPa:', '+1000'), ('S11_contour_label_min_MPa:', '+0000'), ('S22_contour_label_max_MPa:', '+0100'), ('S22_contour_label_min_MPa:', '-0100'), ('S12_contour_label_max_MPa:', '+0050'), ('S12_contour_label_min_MPa:', '-0050'), ) S11_contour_label_max_MPa, S11_contour_label_min_MPa,\ S22_contour_label_max_MPa, S22_contour_label_min_MPa,\ S12_contour_label_max_MPa, S12_contour_label_min_MPa, \ = getInputs(fields = fields, label = 'Specify UPPER AND LOWER CAPPING LEVELS FOR CONTOUR LEGEND:', dialogTitle = 'Legend limits: STRESS', ) S11_contour_label_max_MPa = float(S11_contour_label_max_MPa) S11_contour_label_min_MPa = float(S11_contour_label_min_MPa) S22_contour_label_max_MPa = float(S22_contour_label_max_MPa) S22_contour_label_min_MPa = float(S22_contour_label_min_MPa) S12_contour_label_max_MPa = float(S12_contour_label_max_MPa) S12_contour_label_min_MPa = float(S12_contour_label_min_MPa) del fields #-------------------------------------------------------- # PRINT FLAGS TO SPECIFY WHTHER IMAGES ARE TO BE PRINTED TO PNG FILES fields = ( ('Print_S11_Contours_File:', '0'), ('Print_S22_Contours_File:', '0'), ('Print_S12_Contours_File:', '0'), ) Print_S11_Contours_File, Print_S22_Contours_File,\
part_type = 1 #part_name = str(getInput('Write part name here: ')) part_name = 'AzP65C' file = part_name + '-1' model = mdb.models['Model-1'] tol = 0.01 r = float(getInput('Enter the propeller radius(mm):')) #r = 650 #--------------------Prompt user for which radii to inspect-------------------- fields = (('R= ', '0.5'), ('R= ', ''), ('R= ', ''), ('R= ', ''), ('R= ', ''), ('R= ', ''), ('R= ', ''), ('R= ', ''), ('R= ', ''), ('R= ', '')) r_input = getInputs( fields=fields, label='Enter percentages of the propeller radius(0.5, 0.6,...etc.):', dialogTitle='Inspected radii', ) #filter out empty and duplicate inputs r_val = [] for i in range(len(r_input)): duplicate = 0 if r_input[i] != '': r_val.append(float(r_input[i])) for j in range(len(r_val) - 1): if r_val[-1] == r_val[j]: duplicate = 1 if duplicate == 1: r_val.remove(r_val[-1]) r_val.sort()