예제 #1
0
파일: radutil.py 프로젝트: LBNL-ETA/frads
def glass_prim(mod, ident, tr, tg, tb, refrac=1.52):
    """Generate a glass material.

    Args:
        mod (str): modifier to the primitive
        ident (str): identifier to the primtive
        tr, tg, tb (float): transmmisivity in each channel (0.0 - 1.0)
        refrac (float): refraction index (default=1.52)
    Returns:
        material primtive (dict)

    """
    tmsv_red = util.tmit2tmis(tr)
    tmsv_green = util.tmit2tmis(tg)
    tmsv_blue = util.tmit2tmis(tb)
    real_args = '4 %s %s %s %s' % (tmsv_red, tmsv_green, tmsv_blue, refrac)
    return Primitive(mod, 'glass', ident, '0', real_args)
예제 #2
0
파일: radutil.py 프로젝트: LBNL-ETA/frads
def material_lib():
    mlib = []
    # carpet .2
    mlib.append(neutral_plastic_prim('void', 'carpet_20', .2, 0, 0))
    # Paint .5
    mlib.append(neutral_plastic_prim('void', 'white_paint_50', .5, 0, 0))
    # Paint .7
    mlib.append(neutral_plastic_prim('void', 'white_paint_70', .7, 0, 0))
    # Glass .6
    tmis = util.tmit2tmis(.6)
    mlib.append(glass_prim('void', 'glass_60', tmis, tmis, tmis))
    return mlib
예제 #3
0
 def _windowmaterial_simpleglazingsystem(self, epjs_wndw_mat):
     """Parse EP WindowMaterial:Simpleglazing"""
     wndw_mat_prims = {}
     for key, val in epjs_wndw_mat.items():
         try:
             tmis = util.tmit2tmis(val['visible_transmittance'])
         except KeyError as ke:
             raise Exception(ke, "for", key)
         wndw_mat_prims[key] = self.material(
             Primitive('void', 'glass', key.replace(' ', '_'), '0',
                       "3 {0:.2f} {0:.2f} {0:.2f}".format(tmis)), 0.06)
     return wndw_mat_prims
예제 #4
0
 def _windowmaterial_glazing(self, epjs_wndw_mat):
     """Parse EP WindowMaterial:Glazing"""
     wndw_mat_prims = {}
     for key, val in epjs_wndw_mat.items():
         if val['optical_data_type'].lower() == 'bsdf':
             pass
         else:
             tvis = val['visible_transmittance_at_normal_incidence']
             tmis = util.tmit2tmis(tvis)
             wndw_mat_prims[key] = self.material(
                 Primitive('void', 'glass', key.replace(' ', '_'), '0',
                           "3 {0:.2f} {0:.2f} {0:.2f}".format(tmis)), 0.06)
     return wndw_mat_prims
예제 #5
0
파일: geombsdf.py 프로젝트: LBNL-ETA/frads
def main():
    """Generate a BSDF for macroscopic systems."""
    parser = argparse.ArgumentParser()
    parser.add_argument('-blinds',
                        nargs=3,
                        type=float,
                        metavar=('depth', 'spacing', 'angle'))
    parser.add_argument('-curve', default='')
    parser.add_argument('-custom', nargs=3)
    parser.add_argument('-section', nargs=2)
    parser.add_argument('-gap', type=float, default=0.0)
    parser.add_argument('-ext', action='store_true')
    parser.add_argument('-m',
                        nargs=3,
                        type=float,
                        required=True,
                        metavar=('refl', 'spec', 'rough'))
    parser.add_argument('-g', type=float)
    parser.add_argument('-window')
    parser.add_argument('-env')
    parser.add_argument('-o', default='default_blinds.rad')
    args = parser.parse_args()
    mat_prim = radutil.neutral_plastic_prim('void', 'blindmaterial', *args.m)
    mat_prim_str = radutil.put_primitive(mat_prim)
    if args.custom:
        # Custom periodic geometry
        pass
    elif args.section:
        # Custom section drawing
        pass
    elif args.window:
        primitves = radutil.unpack_primitives(args.window)
        env_primitives = radutil.unpack_primitives(args.env)
        env_identifier = [prim['identifier'] for prim in env_primitives]
        windows = [
            p for p in primitves if p['identifier'].startswith('window')
        ]
        window = windows[0]  # only take the first window primitive
        depth, spacing, angle = args.blinds
        movedown = depth * math.cos(math.radians(float(angle)))
        window_movedown = 0 if args.ext else movedown + args.gap
        # window_polygon = radutil.parse_polygon(window.real_args)
        height, width, angle2negY, translate = radutil.analyze_window(
            window, window_movedown)
        xform_cmd = f'!xform -rz {math.degrees(angle2negY)} -rx -90 -t {translate.x} {translate.y} {translate.z} {args.env}\n'
        xform_cmd += f'!xform -rz {math.degrees(angle2negY)} -rx -90 -t {translate.x} {translate.y} {translate.z} {args.window}\n'
        print(xform_cmd)
        slat_cmd = radutil.gen_blinds(depth, width, height, spacing, angle,
                                      args.curve, movedown)
        print(slat_cmd)
        lower_bound = max(movedown, window_movedown)
        with open("tmp_blinds.rad", 'w') as wtr:
            wtr.write(mat_prim_str)
            wtr.write(xform_cmd)
            wtr.write(slat_cmd)
        cmd = f"genBSDF -n 4 -f +b -c 500 +geom meter -dim {-width/2} {width/2} {-height/2} {height/2} -{lower_bound} 0 tmp_blinds.rad"
        print(cmd)
        _stdout = sp.run(cmd.split(), check=True,
                         stdout=sp.PIPE).stdout.decode()
        xml_name = "{}_blinds_{}_{}_{}.xml".format(window['identifier'], depth,
                                                   spacing, angle)
        with open(xml_name, 'w') as wtr:
            wtr.write(_stdout)
        #move back
        pkgbsdf_cmd = ["pkgBSDF", "-s", xml_name]
        xform_back_cmd = [
            "xform", "-t",
            str(-translate.x),
            str(-translate.y),
            str(-translate.z)
        ]
        xform_back_cmd += ["-rx", "90", "-rz", str(-math.degrees(angle2negY))]
        ps1 = sp.Popen(pkgbsdf_cmd, stdout=sp.PIPE)
        ps2 = sp.Popen(xform_back_cmd, stdin=ps1.stdout, stdout=sp.PIPE)
        ps1.stdout.close()
        _stdout, _ = ps2.communicate()
        result_primitives = radutil.parse_primitive(
            _stdout.decode().splitlines())
        result_primitives = [
            prim for prim in result_primitives
            if prim['identifier'] not in env_identifier
        ]
        with open(args.o, 'w') as wtr:
            [
                wtr.write(radutil.put_primitive(prim))
                for prim in result_primitives
            ]
    else:
        width = 10  # default blinds width
        height = 0.096  # default blinds height
        depth, spacing, angle = args.blinds
        if args.ext:
            glass_z = 0
            movedown = args.gap + depth * math.cos(math.radians(angle))
        else:
            glass_z = args.gap + depth * math.cos(math.radians(angle))
            movedown = depth * math.cos(math.radians(angle))
        lower_bound = min(-glass_z, -movedown)
        genblinds_cmd = radutil.gen_blinds(depth, width, height, spacing,
                                           angle, args.curve, movedown)
        pt1 = radgeom.Vector(-width / 2, height / 2, -glass_z)
        pt2 = radgeom.Vector(-width / 2, -height / 2, -glass_z)
        pt3 = radgeom.Vector(width / 2, -height / 2, -glass_z)
        tmis = util.tmit2tmis(.38)
        glass_prim = radutil.glass_prim('void', 'glass1', tmis, tmis, tmis)
        glazing_polygon = radgeom.Polygon.rectangle3pts(pt1, pt2, pt3)
        glazing_prim_str = radutil.put_primitive(glass_prim)
        glazing_prim_str += radutil.put_primitive(
            radutil.polygon2prim(glazing_polygon, 'glass1', 'window'))
        with open("tmp_blinds.rad", 'w') as wtr:
            wtr.write(mat_prim_str)
            wtr.write(glazing_prim_str)
            wtr.write(genblinds_cmd)
        cmd = f"genBSDF -n 4 +f +b -c 500 -geom meter -dim -0.025 0.025 -0.012 0.012 {lower_bound} 0 tmp_blinds.rad"
        _stdout = sp.run(cmd.split(), check=True,
                         stdout=sp.PIPE).stdout.decode()
        xml_name = "blinds_{}_{}_{}.xml".format(depth, spacing, angle)
        with open(xml_name, 'w') as wtr:
            wtr.write(_stdout)
    os.remove("tmp_blinds.rad")