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)
Esempio n. 2
0
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'),
Esempio n. 5
0
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,\
Esempio n. 7
0
    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()