コード例 #1
0
def mesh_readTGS(filename, resObjName):
    #@author Fanwei Kong based on tetgen.tcl
    #@c This function processes a tetgen style meshing
    #@c script file.
    #@a filename:  script filename.
    #@a resObj:  resulting repository MeshObject.
    #@note resObj is not deleted, even if the script file
    #@note specifies deleteModel and deleteMesh.

    if (int(Repository.Exists(resObjName)) != 0):
        raise ValueError("object" + resObjName + "already exists!")
        return

    solid = "/tmp/mesh_readTGS/solid"
    try:
        Repository.Delete(solid)
    except:
        pass
    global guiMMvars
    guiMMvars['meshGenerateVolumeMesh'] = 0
    global guiPDvars
    global guiTGvars
    geom = Solid.pySolidModel()
    resObj = MeshObject.pyMeshObject()
    MeshObject.SetKernel(pc.gOptions['meshing_kernel'])
    resObj.NewObject(resObjName)
    resObj.SetSolidKernel(pc.gOptions['meshing_solid_kernel'])
    # lookup for type
    types = {}
    types[1] = 1
    types[2] = 2
    types['absolute'] = 1
    types['relative'] = 2
    types['abs'] = 1
    types['rel'] = 2
    sides = {}
    sides['negative'] = 0
    sides['positive'] = 1
    sides['both'] = 2
    sides[0] = 0
    sides[1] = 1
    sides[2] = 2
    fp = open(filename, 'r')
    for line in fp:
        # skip comment lines
        if (line[0:2] == "\#"):
            print("ignoring line: <$line>")
            continue
        # supported commands
        if (line.split()[0] == "logon"):
            MeshObject.Logon(line.split()[1])
        elif (line.split()[0] == "logoff"):
            MeshObject.Logoff
        elif (line.split()[0] == "newMesh"):
            resObj.NewMesh()
        elif (line.split()[0] == "generateMesh"):
            resObj.GenerateMesh()
        elif (line.split()[0] == "loadModel"):
            resObj.LoadModel(line.split()[1])
            try:
                Repository.Delete(solid)
            except:
                pass
            solidfn = line.split()[1]
            geom.ReadNative(solid, solidfn)
            #set smasherInputName $solid
            if (pc.gOptions['meshing_solid_kernel'] == "PolyData"):
                global gPolyDataFaceNames
                global gPolyDataFaceNamesInfo
                if (os.path.isfile(line.split()[1] + '.facenames')):
                    with open(line.split()[1] + '.facenames') as f:
                        exec(f.read())
                #import hashlib
                #hashlib.md5(open(line.split()[1],'rb').read()).hexdigest()
            #if {$mymd5 != $gPolyDataFaceNamesInfo(model_file_md5)} {
            #  return -code error "ERROR: polydata model ([lrange $line 1 end]) file doesn't match one used to generate facenames ([lindex $line 1].facenames)!"
            #}
            else:
                print("Getting Solid Boundaries...")
                gInputReturnVar = 50.0
                gInputReturnVar = input(
                    "Boundary Extraction"
                    "Enter Boundary Extraction Angle (0-90 degrees):")
                guiPDvars['angleForBoundaries'] = gInputReturnVar
                geom.GetBoundaryFaces(gInputReturnVar)
                allids = geom.GetFaceIds()
                numfaces = len(allids)
                yesno = input(
                    "The number of surfaces found was: %i.  Is this the correct number of surfaces on your polydata? yes/no"
                    % numfaces)
                if (yesno == "no"):
                    raise ValueError(
                        "Try again with a different boundary extraction angle or check the surface of the polydata for deteriorated elements."
                    )
                    return
                for newid in allids:
                    gPolyDataFaceNames[newid] = "noname_" + str(newid)
        elif (line.split()[0] == "setSolidModel"):
            solidPD = "/tmp/solid/pd"
            try:
                Repository.Delete(solidPD)
            except:
                pass
            #Set the polydatasolid in the mesh object to the current solid model
            geom.GetPolyData(solidPD)
            resObj.SetVtkPolyData(solidPD)
        elif (line.split()[0] == "localSize"):
            facename = line.split()[1]
            if (facename == ""):
                raise ValueError(
                    "ERROR: Must select a face to add local mesh size on !")
                return
            faceids = geom.GetFaceIds()
            for ids in faceids:
                if (gPolyDataFaceNames[ids] == facename):
                    regionid = ids
            resObj.SetMeshOptions("LocalEdgeSize", [float(line.split()[1])])
        elif (line.split()[0] == "useCenterlineRadius"):
            if (int(guiTGvars['meshWallFirst']) != 1):
                raise ValueError(
                    "ERROR: Must select wall faces for centerline extraction")
                return
            cappedsolid = "/tmp/solid/cappedpd"
            try:
                Repository.Delete(cappedsolid)
            except:
                pass
            cappedsolid = PolyDataVMTKGetCenterIds(resObj, "mesh")
            polys = PolyDataVMTKCenterlines(cappedsolid, resObj, "mesh")
            resObj.SetVtkPolyData(polys[0])
        elif (line.split()[0] == "functionBasedMeshing"):
            resObj.SetSizeFunctionBasedMesh(float(line.split()[1]),
                                            float(line.split()[2]))
        elif (line.split()[0] == "sphereRefinement"):
            resObj.SetSphereRefinement(float(line.split()[1]),
                                       float(line.split()[2]),
                                       [float(i) for i in line.split()[3:]])
        elif (line.split()[0] == "wallFaces"):
            guiTGvars['meshWallFirst'] = 1
            resObj.SetMeshOptions("MeshWallFirst", [1])
            walls = []
            for i in range(1, len(line.split())):
                name = line.split()[i]
                name_id = return_face_id(geom, name)
                walls.append(name_id)
            resObj.SetWalls(walls)
        elif (line.split()[0] == "boundaryLayer"):
            if (guiTGvars['meshWallFirst'] != 1):
                raise ValueError(
                    "ERROR: Must select wall faces for boundary layer")
                return
            resObj.SetBoundaryLayer(0, 0, 0, int(line.split()[1]),
                                    [float(i) for i in line.split()[2:]])
        elif (line.split()[0] == "tolerance"):
            resObj.SetTolerance(float(line.split()[1]))
        elif (line.split()[0] == "quality"):
            resObj.SetQuality(line.split()[1])
        elif (line.split()[0] == "writeMesh"):
            resObj.WriteMesh(line.split()[1], int(line.split()[-1]))
        elif (line.split()[0] == "option"):
            if (len(line.split()) == 3):
                if (line.split()[1] == "surface"):
                    resObj.SetMeshOptions("SurfaceMeshFlag",
                                          [int(line.split()[2])])
                elif (line.split()[1] == "volume"):
                    resObj.SetMeshOptions("VolumeMeshFlag",
                                          [int(line.split()[2])])
                    guiMMvars['meshGenerateVolumeMesh'] = 1
                elif (line.split()[1] == "gsize"):
                    resObj.SetMeshOptions("GlobalEdgeSize",
                                          [float(line.split()[2])])
                elif (line.split()[1] == "a"):
                    resObj.SetMeshOptions("GlobalEdgeSize",
                                          [float(line.split()[2])])
                else:
                    #lappend mylist [lindex $line 2]
                    resObj.SetMeshOptions(line.split()[1],
                                          [float(line.split()[2])])
            else:
                for lineval in line.split():
                    resObj.SetMeshOptions(lineval, [1])
        elif (line.split()[0] == "getBoundaries"):
            resObj.GetBoundaryFaces(guiPDvars['angleForBoundaries'])
        else:
            print("ignoring line: " + line)
    fp.close()
    try:
        Repository.Delete(solid)
    except:
        pass
コード例 #2
0
def vis_volRepos(ren, objName):
    if Repository.Exists(objName) == 0:
        raise ValueError("ERROR:  Object does not exist.")
        return
    if Repository.Type(objName) != "StructuredPts":
        raise TypeError("Incorrect object type.")
        return
    caster = [None] * 2
    opacityTransferFunction = [None] * 2
    colorTransferFunction = [None] * 2
    gradientTransferFunction = [None] * 2
    volumeProperty = [None] * 2
    volumeMapper = [None] * 2
    compositeFunction = [None] * 2
    outline = [None] * 2
    outlineMapper = [None] * 2
    outlineProperty = [None] * 2
    lod = [None] * 2

    caster[0] = "vis_vol_caster_" + objName
    opacityTransferFunction[0] = "vis_vol_opacityTransferFunction_" + objName
    colorTransferFunction[0] = "vis_vol_colorTransferFunction_" + objName
    gradientTransferFunction[0] = "vis_vol_gradientTransferFunction_" + objName
    volumeProperty[0] = "vis_vol_volumeProperty_" + objName
    volumeMapper[0] = "vis_vol_volumeMapper_" + objName
    compositeFunction[0] = "vis_vol_compositeFunction_" + objName
    outline[0] = "vis_vol_outline_" + objName
    outlineMapper[0] = "vis_vol_outlineMapper_" + objName
    outlineProperty[0] = "vis_vol_outlineProperty_" + objName
    lod[0] = "vis_vol_lod_" + objName

    caster[1] = vtk.vtkImageCast()
    caster[1].SetOutputScalarTypeToUnsignedShort()
    caster[1].SetInputDataObject(Repository.ExportToVtk(objName))
    caster[1].Update()

    # Create transfer functions for opacity and color
    opacityTransferFunction[1] = vtk.vtkPiecewiseFunction()
    opacityTransferFunction[1].AddPoint(0, 0.)
    opacityTransferFunction[1].AddPoint(80, 0.)
    opacityTransferFunction[1].AddPoint(128, 0.5)
    opacityTransferFunction[1].AddPoint(150, 0.9)
    opacityTransferFunction[1].AddPoint(350, 1.0)

    colorTransferFunction[1] = vtk.vtkColorTransferFunction()
    colorTransferFunction[1].AddRGBPoint(0, 0, 0, 0)
    colorTransferFunction[1].AddRGBPoint(350, 1, 1, 1)

    gradientTransferFunction[1] = vtk.vtkPiecewiseFunction()
    gradientTransferFunction[1].AddPoint(0, 1.0)
    gradientTransferFunction[1].AddPoint(1, 1.0)
    gradientTransferFunction[1].AddPoint(255, 1.0)
    gradientTransferFunction[1].AddPoint(512, 1.0)

    # Create properties, mappers, volume actors, and ray cast function
    volumeProperty[1] = vtk.vtkVolumeProperty()
    volumeProperty[1].SetColor(colorTransferFunction[1])
    volumeProperty[1].SetScalarOpacity(opacityTransferFunction[1])
    volumeProperty[1].SetGradientOpacity(gradientTransferFunction[1])
    volumeProperty[1].SetInterpolationTypeToLinear()

    volumeMapper[1] = vtk.vtkSmartVolumeMapper()
    volumeMapper[1].SetInputDataObject(caster[1].GetOutput())

    lod[1] = vtk.vtkVolume()
    lod[1].SetProperty(volumeProperty[1])
    lod[1].SetMapper(volumeMapper[1])

    ren[1].AddViewProp(lod[1])

    setattr(vis, caster[0], caster)
    setattr(vis, opacityTransferFunction[0], opacityTransferFunction)
    setattr(vis, colorTransferFunction[0], colorTransferFunction)
    setattr(vis, gradientTransferFunction[0], gradientTransferFunction)
    setattr(vis, volumeProperty[0], volumeProperty)
    setattr(vis, volumeMapper[0], volumeMapper)
    setattr(vis, compositeFunction[0], compositeFunction)
    setattr(vis, outline[0], outline)
    setattr(vis, outlineMapper[0], outlineMapper)
    setattr(vis, outlineProperty[0], outlineProperty)
    setattr(vis, lod[0], lod)
    vis.renfun.render(ren)
    return lod