def UpdateGeometry(self, actions): # OpenVSP Script Part os.chdir("/home/simonx/Documents/Udacity/ML/Projects/capstone/OpenVSP") stdout = vsp.cvar.cstdout errorMgr = vsp.ErrorMgrSingleton_getInstance() # WingBodyTestCase vsp.VSPRenew() errorMgr.PopErrorAndPrint(stdout) # Add Wing WingBody = vsp.AddGeom("WING", "") # Insert A Couple More Sections InsertXSec(WingBody, 1, XS_FOUR_SERIES) InsertXSec(WingBody, 1, XS_FOUR_SERIES) InsertXSec(WingBody, 1, XS_FOUR_SERIES) # Cut The Original Section CutXSec(WingBody, 1) # Change Driver SetDriverGroup(WingBody, 1, AREA_WSECT_DRIVER, ROOTC_WSECT_DRIVER, TIPC_WSECT_DRIVER) SetParmVal(WingBody, "RotateAirfoilMatchDideralFlag", "WingGeom", 1.0) # Change Some Parameters 1st Section SetParmVal(WingBody, "Root_Chord", "XSec_1", 7.0) SetParmVal(WingBody, "Tip_Chord", "XSec_1", 3.0) SetParmVal(WingBody, "Area", "XSec_1", actions[0]) SetParmVal(WingBody, "Sweep", "XSec_1", actions[1]) # Because Sections Are Connected Change One Section At A Time Then Update Update() # Change Some Parameters 2nd Section SetParmVal(WingBody, "Tip_Chord", "XSec_2", 2.0) SetParmVal(WingBody, "Sweep", "XSec_2", 60.0) SetParmVal(WingBody, "Dihedral", "XSec_2", 30.0) Update() # Change Some Parameters 3rd Section SetParmVal(WingBody, "Sweep", "XSec_3", 60.0) SetParmVal(WingBody, "Dihedral", "XSec_3", 80.0) Update() # Change Airfoil SetParmVal(WingBody, "Camber", "XSecCurve_0", 0.02) Update() # print "All geoms in Vehicle." geoms = vsp.FindGeoms() print geoms # File basename baseName = "WingBody" csvName = baseName + "_Dege nGeom.csv" stlName = baseName + "_DegenGeom.stl" vspName = baseName + ".vsp3" # Set File Name SetComputationFileName(DEGEN_GEOM_CSV_TYPE, csvName) SetComputationFileName(CFD_STL_TYPE, stlName) WriteVSPFile(vspName) # ComputeDegenGeom( SET_ALL, DEGEN_GEOM_CSV_TYPE ); # ComputeCFDMesh( SET_ALL, CFD_STL_TYPE ); # Mesh # Check for errors num_err = errorMgr.GetNumTotalErrors() for i in range(0, num_err): err = errorMgr.PopLastError() print "error = ", err.m_ErrorString
"""Test the OpenVSP Python Interface.""" from __future__ import print_function import vsp as vsp stdout = vsp.cvar.cstdout errorMgr = vsp.ErrorMgrSingleton_getInstance() # ==== Test Enums ==== # print("SET_ALL = ", vsp.SET_ALL) print("SET_SHOWN = ", vsp.SET_SHOWN) print("SET_NOT_SHOWN = ", vsp.SET_NOT_SHOWN) print("SET_FIRST_USER = "******"EXPORT_FELISA = ", vsp.EXPORT_FELISA) print("EXPORT_XSEC = ", vsp.EXPORT_XSEC) print("EXPORT_STL = ", vsp.EXPORT_STL) print("EXPORT_AWAVE = ", vsp.EXPORT_AWAVE) print("EXPORT_NASCART = ", vsp.EXPORT_NASCART) print("EXPORT_POVRAY = ", vsp.EXPORT_POVRAY) print("EXPORT_CART3D = ", vsp.EXPORT_CART3D) print("EXPORT_VORXSEC = ", vsp.EXPORT_VORXSEC) print("EXPORT_XSECGEOM = ", vsp.EXPORT_XSECGEOM) print("EXPORT_GMSH = ", vsp.EXPORT_GMSH) print("EXPORT_X3D = ", vsp.EXPORT_X3D) print("EXPORT_STEP = ", vsp.EXPORT_STEP) print("VSP_OK = ", vsp.VSP_OK) print("VSP_INVALID_PTR = ", vsp.VSP_INVALID_PTR) print("VSP_CANT_FIND_TYPE = ", vsp.VSP_CANT_FIND_TYPE) print("VSP_CANT_FIND_PARM = ", vsp.VSP_CANT_FIND_PARM) print("VSP_CANT_FIND_NAME = ", vsp.VSP_CANT_FIND_NAME) print("VSP_INVALID_GEOM_ID = ", vsp.VSP_INVALID_GEOM_ID)
def write_vsp_fuselage(fuselage,area_tags, main_wing, fuel_tank_set_ind, OML_set_ind): """This writes a fuselage into OpenVSP format. Assumptions: None Source: N/A Inputs: fuselage width [m] lengths.total [m] heights. maximum [m] at_quarter_length [m] at_wing_root_quarter_chord [m] at_three_quarters_length [m] effective_diameter [m] fineness.nose [-] ratio of nose section length to fuselage width fineness.tail [-] ratio of tail section length to fuselage width tag <string> OpenVSP_values. (optional) nose.top.angle [degrees] nose.top.strength [-] this determines how much the specified angle influences that shape nose.side.angle [degrees] nose.side.strength [-] nose.TB_Sym <boolean> determines if top angle is mirrored on bottom nose.z_pos [-] z position of the nose as a percentage of fuselage length (.1 is 10%) tail.top.angle [degrees] tail.top.strength [-] tail.z_pos (optional, 0.02 default) [-] z position of the tail as a percentage of fuselage length (.1 is 10%) Segments. (optional) width [m] height [m] percent_x_location [-] .1 is 10% length percent_z_location [-] .1 is 10% length area_tags <dict> used to keep track of all tags needed in wetted area computation main_wing.origin [m] main_wing.chords.root [m] fuel_tank_set_index <int> OpenVSP object set containing the fuel tanks Outputs: Operates on the active OpenVSP model, no direct output Properties Used: N/A """ num_segs = len(fuselage.Segments) length = fuselage.lengths.total fuse_x = fuselage.origin[0][0] fuse_y = fuselage.origin[0][1] fuse_z = fuselage.origin[0][2] fuse_x_rotation = fuselage.x_rotation fuse_y_rotation = fuselage.y_rotation fuse_z_rotation = fuselage.z_rotation if num_segs==0: # SUAVE default fuselage shaping width = fuselage.width hmax = fuselage.heights.maximum height1 = fuselage.heights.at_quarter_length height2 = fuselage.heights.at_wing_root_quarter_chord height3 = fuselage.heights.at_three_quarters_length effdia = fuselage.effective_diameter n_fine = fuselage.fineness.nose t_fine = fuselage.fineness.tail try: if main_wing != None: w_origin = main_wing.origin w_c_4 = main_wing.chords.root/4. else: w_origin = 0.5*length w_c_4 = 0.5*length except AttributeError: raise AttributeError('Main wing not detected. Fuselage must have specified sections in this configuration.') # Figure out the location x location of each section, 3 sections, end of nose, wing origin, and start of tail x1 = n_fine*width/length x2 = (w_origin[0][0]+w_c_4)/length x3 = 1-t_fine*width/length end_ind = 4 else: # Fuselage shaping based on sections widths = [] heights = [] x_poses = [] z_poses = [] segs = fuselage.Segments for seg in segs: widths.append(seg.width) heights.append(seg.height) x_poses.append(seg.percent_x_location) z_poses.append(seg.percent_z_location) end_ind = num_segs-1 fuse_id = vsp.AddGeom("FUSELAGE") vsp.SetGeomName(fuse_id, fuselage.tag) area_tags[fuselage.tag] = ['fuselages',fuselage.tag] tail_z_pos = 0.02 # default value # set fuselage relative location and rotation vsp.SetParmVal( fuse_id,'X_Rel_Rotation','XForm',fuse_x_rotation) vsp.SetParmVal( fuse_id,'Y_Rel_Rotation','XForm',fuse_y_rotation) vsp.SetParmVal( fuse_id,'Z_Rel_Rotation','XForm',fuse_z_rotation) vsp.SetParmVal( fuse_id,'X_Rel_Location','XForm',fuse_x) vsp.SetParmVal( fuse_id,'Y_Rel_Location','XForm',fuse_y) vsp.SetParmVal( fuse_id,'Z_Rel_Location','XForm',fuse_z) if 'OpenVSP_values' in fuselage: vals = fuselage.OpenVSP_values # for wave drag testing fuselage.OpenVSP_ID = fuse_id # Nose vsp.SetParmVal(fuse_id,"TopLAngle","XSec_0",vals.nose.top.angle) vsp.SetParmVal(fuse_id,"TopLStrength","XSec_0",vals.nose.top.strength) vsp.SetParmVal(fuse_id,"RightLAngle","XSec_0",vals.nose.side.angle) vsp.SetParmVal(fuse_id,"RightLStrength","XSec_0",vals.nose.side.strength) vsp.SetParmVal(fuse_id,"TBSym","XSec_0",vals.nose.TB_Sym) vsp.SetParmVal(fuse_id,"ZLocPercent","XSec_0",vals.nose.z_pos) if not vals.nose.TB_Sym: vsp.SetParmVal(fuse_id,"BottomLAngle","XSec_0",vals.nose.bottom.angle) vsp.SetParmVal(fuse_id,"BottomLStrength","XSec_0",vals.nose.bottom.strength) # Tail # Below can be enabled if AllSym (below) is removed #vsp.SetParmVal(fuse_id,"RightLAngle","XSec_4",vals.tail.side.angle) #vsp.SetParmVal(fuse_id,"RightLStrength","XSec_4",vals.tail.side.strength) #vsp.SetParmVal(fuse_id,"TBSym","XSec_4",vals.tail.TB_Sym) #vsp.SetParmVal(fuse_id,"BottomLAngle","XSec_4",vals.tail.bottom.angle) #vsp.SetParmVal(fuse_id,"BottomLStrength","XSec_4",vals.tail.bottom.strength) if 'z_pos' in vals.tail: tail_z_pos = vals.tail.z_pos else: pass # use above default if num_segs == 0: vsp.SetParmVal(fuse_id,"Length","Design",length) vsp.SetParmVal(fuse_id,"Diameter","Design",width) vsp.SetParmVal(fuse_id,"XLocPercent","XSec_1",x1) vsp.SetParmVal(fuse_id,"XLocPercent","XSec_2",x2) vsp.SetParmVal(fuse_id,"XLocPercent","XSec_3",x3) vsp.SetParmVal(fuse_id,"ZLocPercent","XSec_4",tail_z_pos) vsp.SetParmVal(fuse_id, "Ellipse_Width", "XSecCurve_1", width) vsp.SetParmVal(fuse_id, "Ellipse_Width", "XSecCurve_2", width) vsp.SetParmVal(fuse_id, "Ellipse_Width", "XSecCurve_3", width) vsp.SetParmVal(fuse_id, "Ellipse_Height", "XSecCurve_1", height1); vsp.SetParmVal(fuse_id, "Ellipse_Height", "XSecCurve_2", height2); vsp.SetParmVal(fuse_id, "Ellipse_Height", "XSecCurve_3", height3); else: # OpenVSP vals do not exist: vals = Data() vals.nose = Data() vals.tail = Data() vals.tail.top = Data() vals.nose.z_pos = 0.0 vals.tail.top.angle = 0.0 vals.tail.top.strength = 0.0 if len(np.unique(x_poses)) != len(x_poses): raise ValueError('Duplicate fuselage section positions detected.') vsp.SetParmVal(fuse_id,"Length","Design",length) if num_segs != 5: # reduce to only nose and tail vsp.CutXSec(fuse_id,1) # remove extra default section vsp.CutXSec(fuse_id,1) # remove extra default section vsp.CutXSec(fuse_id,1) # remove extra default section for i in range(num_segs-2): # add back the required number of sections vsp.InsertXSec(fuse_id, 0, vsp.XS_ELLIPSE) vsp.Update() for i in range(num_segs-2): # Bunch sections to allow proper length settings in the next step # This is necessary because OpenVSP will not move a section past an adjacent section vsp.SetParmVal(fuse_id, "XLocPercent", "XSec_"+str(i+1),1e-6*(i+1)) vsp.Update() if x_poses[1] < (num_segs-2)*1e-6: print('Warning: Second fuselage section is too close to the nose. OpenVSP model may not be accurate.') for i in reversed(range(num_segs-2)): # order is reversed because sections are initially bunched in the front and cannot be extended passed the next vsp.SetParmVal(fuse_id, "XLocPercent", "XSec_"+str(i+1),x_poses[i+1]) vsp.SetParmVal(fuse_id, "ZLocPercent", "XSec_"+str(i+1),z_poses[i+1]) vsp.SetParmVal(fuse_id, "Ellipse_Width", "XSecCurve_"+str(i+1), widths[i+1]) vsp.SetParmVal(fuse_id, "Ellipse_Height", "XSecCurve_"+str(i+1), heights[i+1]) vsp.Update() set_section_angles(i, vals.nose.z_pos, tail_z_pos, x_poses, z_poses, heights, widths,length,end_ind,fuse_id) vsp.SetParmVal(fuse_id, "XLocPercent", "XSec_"+str(0),x_poses[0]) vsp.SetParmVal(fuse_id, "ZLocPercent", "XSec_"+str(0),z_poses[0]) vsp.SetParmVal(fuse_id, "XLocPercent", "XSec_"+str(end_ind),x_poses[-1]) vsp.SetParmVal(fuse_id, "ZLocPercent", "XSec_"+str(end_ind),z_poses[-1]) # Tail if heights[-1] > 0.: stdout = vsp.cvar.cstdout errorMgr = vsp.ErrorMgrSingleton_getInstance() errorMgr.PopErrorAndPrint(stdout) pos = len(heights)-1 vsp.InsertXSec(fuse_id, pos-1, vsp.XS_ELLIPSE) vsp.Update() vsp.SetParmVal(fuse_id, "Ellipse_Width", "XSecCurve_"+str(pos), widths[-1]) vsp.SetParmVal(fuse_id, "Ellipse_Height", "XSecCurve_"+str(pos), heights[-1]) vsp.SetParmVal(fuse_id, "XLocPercent", "XSec_"+str(pos),x_poses[-1]) vsp.SetParmVal(fuse_id, "ZLocPercent", "XSec_"+str(pos),z_poses[-1]) xsecsurf = vsp.GetXSecSurf(fuse_id,0) vsp.ChangeXSecShape(xsecsurf,pos+1,vsp.XS_POINT) vsp.Update() vsp.SetParmVal(fuse_id, "XLocPercent", "XSec_"+str(pos+1),x_poses[-1]) vsp.SetParmVal(fuse_id, "ZLocPercent", "XSec_"+str(pos+1),z_poses[-1]) # update strengths to make end flat vsp.SetParmVal(fuse_id,"TopRStrength","XSec_"+str(pos), 0.) vsp.SetParmVal(fuse_id,"RightRStrength","XSec_"+str(pos), 0.) vsp.SetParmVal(fuse_id,"BottomRStrength","XSec_"+str(pos), 0.) vsp.SetParmVal(fuse_id,"TopLStrength","XSec_"+str(pos+1), 0.) vsp.SetParmVal(fuse_id,"RightLStrength","XSec_"+str(pos+1), 0.) else: vsp.SetParmVal(fuse_id,"TopLAngle","XSec_"+str(end_ind),vals.tail.top.angle) vsp.SetParmVal(fuse_id,"TopLStrength","XSec_"+str(end_ind),vals.tail.top.strength) vsp.SetParmVal(fuse_id,"AllSym","XSec_"+str(end_ind),1) vsp.Update() if 'z_pos' in vals.tail: tail_z_pos = vals.tail.z_pos else: pass # use above default if 'Fuel_Tanks' in fuselage: for tank in fuselage.Fuel_Tanks: write_fuselage_conformal_fuel_tank(fuse_id, tank, fuel_tank_set_ind) vsp.SetSetFlag(fuse_id, OML_set_ind, True) return area_tags