def __init__(self, pol2D, frames, name='TMP', **kwargs): pol = pol2D # If it is closed, the first and last points are the same close_polyline = False if pol.is_closed: pol.pop() close_polyline = True # the number of points of the polyline. Npt = len(pol) dphys = {} if ('mode' in kwargs) and (kwargs['mode'] == 'profile'): dphys['extrados'] = {'indices': [0, Npt / 2], 'surfaces': []} dphys['intrados'] = {'indices': [Npt / 2, Npt], 'surfaces': []} dphys['default'] = {'surfaces': []} geom = pg.built_in.Geometry() # there is one more quaternion/frame than slices Nslices = len(frames) - 1 if 'close_caps' in kwargs: if kwargs['close_caps'] == True: cap_ends = True else: cap_ends = False if ('scales' in kwargs) and (len(kwargs['scales']) == len(frames)): scales = kwargs['scales'] else: scales = [1. for i in range(len(frames))] # get the first polyline first = pol.to_frame(frames[0], scale=scales[0]) l_first = first.pop_to_geom(geom) l_second = None # l_first contains the GMSH segments of the first polyline # the j-th segment's first/second point l_first[j].points[0/1] ... # FIRST CAP (IF POLYLINE IS CLOSED) if cap_ends and close_polyline: loop = [] for iseg, segment in enumerate(l_first): loop.append(segment) loop.append( geom.add_line(l_first[-1].points[1], l_first[0].points[0])) lloop_first = geom.add_line_loop(loop) cap_first = geom.add_plane_surface(lloop_first) dphys['default']['surfaces'].append(cap_first) for i in range(Nslices): second = pol.to_frame(frames[i + 1], scale=scales[i + 1]) l_second = second.pop_to_geom(geom) # extrusion of the OPEN polyline for j in range(len(l_first)): l0 = -l_first[j] l1 = geom.add_line(l_first[j].points[0], l_second[j].points[0]) l2 = l_second[j] l3 = geom.add_line(l_second[j].points[1], l_first[j].points[1]) lloop = geom.add_line_loop([l0, l1, l2, l3]) sf = geom.add_surface(lloop) to_physical = False for k in dphys.keys(): if ('indices' in dphys[k]) and (len(dphys[k]['indices']) == 2): start = min(dphys[k]['indices']) end = max(dphys[k]['indices']) if (j >= start) and ( j < end ): # append the surface to the right physical group... dphys[k]['surfaces'].append(sf) to_physical = True if not to_physical: dphys['default']['surfaces'].append(sf) if close_polyline: # CLOSE THE POLYLINE l0 = geom.add_line(l_first[0].points[0], l_first[-1].points[1]) l1 = geom.add_line(l_first[-1].points[1], l_second[-1].points[1]) l2 = geom.add_line(l_second[-1].points[1], l_second[0].points[0]) l3 = geom.add_line(l_second[0].points[0], l_first[0].points[0]) lloop = geom.add_line_loop([l0, l1, l2, l3]) sf = geom.add_surface(lloop) dphys['default']['surfaces'].append(sf) first = second l_first = l_second if cap_ends and close_polyline: # LAST CAP (IF POLYLINE IS CLOSED) # l_second is now the last polyline : loop = [] for segment in l_second: loop.append(-segment) loop.append( geom.add_line(l_second[0].points[0], l_second[-1].points[1])) lloop_last = geom.add_line_loop(loop) cap_last = geom.add_plane_surface(lloop_last) dphys['default']['surfaces'].append(cap_last) for k in dphys.keys(): geom.add_physical_surface(dphys[k]['surfaces'], label=k) write_geo(name, geom) import subprocess exe_gmsh = '/home/fon/gmsh-3.0.3-git-Linux/bin/gmsh' subprocess.call([ exe_gmsh, name + '.geo', '-2', '-o', name + '.msh', '>', name + '.mshlog' ]) tri = read_msh_file(name) super(TriangulatedExtrusion, self).__init__(vertices=tri['vertices'], faces=tri['faces'])
ndisc = 20 fa = spline.frame_array(mode=Vector([0., 0., 1.]), n=ndisc) for f in fa: pp = pol.to_frame(f, scale=0.2) pp.pop_to_geom(geom) cpol = spline.control_polyline pol_gen = spline.discretize(ndisc) sym = spline.symmetrize() fasym = sym.frame_array(mode=Vector([0., 0., 1.]), n=ndisc) sym_pol_gen = sym.discretize(ndisc) for i, f in enumerate(fa): bas = f[1] new_bas = [[-bas[0][0], -bas[0][1], -bas[0][1]], [bas[1][0], bas[1][1], bas[1][1]], [bas[2][0], bas[2][1], bas[2][1]]] fmirror = Frame([fasym[i][0], new_bas]) pp = pol.to_frame(fmirror, scale=0.2) pp.pop_to_geom(geom) cpol.pop_to_geom(geom) pol_gen.pop_to_geom(geom) sym.control_polyline.pop_to_geom(geom) sym_pol_gen.pop_to_geom(geom) write_geo('toto', geom)
fin_rot = lambda s: 0. fin_gen = ParametricCurve3D(finX, finY, finZ) fin = Extrusion(fin_pol, fin_gen, mode=Vector([0., 1., 0.]), scale=fin_scale, rotate=fin_rot, n=13) print fin medax.pop_to_geom(geom) aft_wing.pop_to_geom(geom) fore_wing.pop_to_geom(geom) fin.pop_to_geom(geom) write_geo('medax', geom) import sys #fore_cad = extrusion_to_ruled_surfaces(fore_wing, cap = True) #aft_cad = extrusion_to_ruled_surfaces(aft_wing, cap = True) wing1 = extrusion_to_solid(fore_wing, 'fore') wing2 = extrusion_to_solid(aft_wing, 'aft') med_ax = extrusion_to_solid(medax, 'med') fin_s = extrusion_to_solid(fin, 'fin') #bb, boundaries = named_cartesian_box(xmin = -10., xmax = 10. , ymin = 0., ymax = 10., zmin=-5., zmax=5.) def merge_dicts(*largs): d = {} for dico in largs[0]: for key in dico:
#display.DisplayShape(wire_extrados.Shape(), update=True) #display.DisplayShape(wire_intrados.Shape(), update=True) display.DisplayShape(wire.Shape(), update=True) generator_extrados.AddWire(wire_extrados.Wire()) generator_intrados.AddWire(wire_intrados.Wire()) generator_trailing_edge.AddWire(wire_trailing_edge.Wire()) generator.AddWire(wire.Wire()) #start_display() generator_extrados.Build() extrados_shape = generator_extrados.Shape() generator_intrados.Build() intrados_shape = generator_intrados.Shape() generator_trailing_edge.Build() trailing_edge_shape = generator_trailing_edge.Shape() intrados_trailing_edge = generator_trailing_edge.Shape() display.DisplayShape(extrados_shape) display.DisplayShape(intrados_shape) display.DisplayShape(trailing_edge_shape) generator.Build() #display.DisplayShape(generator.Shape()) step_writer.Transfer(extrados_shape, STEPControl_AsIs) step_writer.Transfer(intrados_shape, STEPControl_AsIs) #step_writer.Transfer(generator.Shape(), STEPControl_AsIs) status = step_writer.Write("surface.stp") start_display() write_geo('foil', geom)
for i, pt in enumerate(face[:-1]): p0 = geom.add_point((pt[0], pt[1], pt[2]), 1.) pts.append(p0) for i, p in enumerate(pts[:-1]): li = geom.add_line(p, pts[i + 1]) lloop.append(li) li = geom.add_line(pts[-1], pts[0]) lloop.append(li) ll = geom.add_line_loop(lloop) sf = geom.add_plane_surface(ll) heat_phys.append(sf) geom.add_physical_surface(heat_phys, label='heats') name = 'maison' write_geo(name, geom) import subprocess from youbastard.geometry.Triangulation import Triangulation, read_msh_file exe_gmsh = '/home/fon/gmsh-3.0.3-git-Linux/bin/gmsh' subprocess.call([ exe_gmsh, name + '.geo', '-2', '-o', name + '.msh', '>', name + '.mshlog' ]) tri = read_msh_file(name) print tri['faces']['windows'] tri.write_fms_file(name) print house.keys() d = {} d['faces'] = house['faces']
] fore_generator = Spline3D(fore_gen_point) fore_wing = Extrusion(fore_pol, fore_generator, scale=fore_chordf, rotate=fore_rot_fun) fore_wing.pop_to_geom(geom) if aft_pol.is_closed: open_pol = aft_pol[:-1] else: open_pol = aft_pol npt = len(open_pol) aft_pol = { 'extrados': Polyline2D(open_pol[:(npt - 1) / 2 + 1]), 'intrados': Polyline2D(open_pol[(npt - 1) / 2:]), 'trailing_edge': Polyline2D([open_pol[-1], open_pol[0]]) } aft_generator = Spline3D(aft_gen_point) aft_wing = Extrusion(aft_pol, aft_generator, scale=aft_chordf, rotate=aft_rot_fun, n=20) aft_wing.pop_to_geom(geom) write_geo('testex', geom)