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)
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
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
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
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")