sys.path.insert(0, os.path.abspath(os.path.split(os.path.abspath(__file__))[0]+'/../lib')) import airfoil import contour import layout rchord = 8.0 tchord = 5.0 twist = 0 width = 8.5 height = 11 print "coutouts demo" layout = layout.Layout( 'demo-cutouts', width, height ) root = airfoil.Airfoil("naca633618", 1000, True) tip = airfoil.Airfoil("naca0015", 1000, True); steps = 8 dp = 1.0 / steps for p in range(0, steps+1): print "Making rib " + str(p) percent = p*dp blend = airfoil.blend( root, tip, percent ) blend.fit( 500, 0.0001 ) size = rchord * (1.0 - percent) + tchord * percent blend.scale( size, size ) blend.move(-size / 3.0, 0)
import sys import airfoil if len(sys.argv) < 2: print('Usage:') print(' python3 {} <airfoil data directory>'.format(sys.argv[0])) sys.exit(0) inputdir = sys.argv[1] try: a = airfoil.Airfoil(inputdir) except RuntimeError as e: print('ERROR: {}'.format(e)) sys.exit(2) print(a)
def load_airfoils(self, root, tip=None): self.root = airfoil.Airfoil(root, self.airfoil_samples, True) if tip: self.tip = airfoil.Airfoil(tip, self.airfoil_samples, True)
except ImportError: # if airfoil is not 'installed' append parent dir of __file__ to sys.path import sys, os sys.path.insert(0, os.path.abspath(os.path.split(os.path.abspath(__file__))[0]+'/../lib')) import airfoil import layout chord = 8.0 width = 8.5 height = 11 print "resampling and adaptive fit demo" layout = layout.Layout( 'demo-fit', width, height ) root = airfoil.Airfoil("naca633618", 0, False) rib = copy.deepcopy(root) rib.scale( chord, chord ) tx = chord/3.0 ty = rib.simple_interp(rib.top, tx) by = rib.simple_interp(rib.bottom, tx) vd = (ty - by) hy = by + vd / 2.0 rib.add_label( tx, hy, 14, 0, "Original Points" ) layout.draw_part_vertices( rib ) rib = copy.deepcopy(root) rib.resample(1000, True) rib.scale( chord, chord ) rib.fit( 200, 0.00005 )
import sys import airfoil if len(sys.argv) < 2: print("Usage:") print(" $ python %s <airfoil_data_directory>" % sys.argv[0]) sys.exit(0) input_dir = sys.argv[1] try: a = airfoil.Airfoil(input_dir) except RuntimeError as e: print("ERROR: %s" % e) sys.exit(2) print(a)
def __init__(self, root, windowName): """ INITIALIZE THE UI CLASS """ # SET UP VARIABLES self.CWINX = 500 self.CWINY = 350 self.fileName = "" self.NPTS = "" self.foil = airfoil.Airfoil() # WIDGET VARIABLES self.foilNameLbl = Tkinter.StringVar() self.foilTypeOpt = Tkinter.StringVar() # INITIALIZE LABEL VALUES self.updateFoilName("") self.updateFoilType("n4") # SET N4 AS DEFAULT # SET ROOT WINDOW NAME root.title(windowName) # SET WINDOW TO NOT RESIZE root.resizable(width="NO", height="NO") # SET UP MENU # CODE TAKEN FROM EFFBOT.ORG # MODIFIED FOR USE WITH THIS PROGRAM self.menuBar = Tkinter.Menu(root) # create a pulldown menu, and add it to the menu bar self.fileMenu = Tkinter.Menu(self.menuBar, tearoff=0) self.fileMenu.add_command(label="Open", command=lambda: self.fileOpen(root)) self.fileMenu.add_command(label="Save", command=lambda: self.fileSaveAs(root)) self.fileMenu.add_separator() self.fileMenu.add_command(label="Exit", command=root.quit) self.menuBar.add_cascade(label="File", menu=self.fileMenu) # create more pulldown menus self.modifierMenu = Tkinter.Menu(self.menuBar, tearoff=0) self.modifierMenu.add_command( label="Invert", command=lambda: self.foilModsWrapper("invert")) self.modifierMenu.add_command(label="Scale", command=hello) self.modifierMenu.add_command( label="Rotate") #, command=lambda: self.foilModsWrapper("rotate")) self.menuBar.add_cascade(label="Modifiers", menu=self.modifierMenu) self.helpMenu = Tkinter.Menu(self.menuBar, tearoff=0) self.helpMenu.add_command(label="About", command=hello) self.menuBar.add_cascade(label="Help", menu=self.helpMenu) # display the menu root.config(menu=self.menuBar) # SET UP GUI # ====================================================================== # FRAME FL - HOLDER FOR CANVAS self.FL = Tkinter.Frame(root, height=self.CWINY, width=self.CWINX) self.FL.pack(side=Tkinter.LEFT, fill=Tkinter.Y) # SETUP CANVAS self.plot = Tkinter.Canvas(self.FL, height=self.CWINY, width=self.CWINX, bg="#000000") self.plot.pack(side=Tkinter.TOP) # FRAME FLA - HOLDER FOR AIRFOIL BUTTONS THAT CONTROL FLIPBOOK self.FLA = Tkinter.Frame(self.FL, width=self.CWINX) self.FLA.pack(fill=Tkinter.X) # SET UP ANGLE OF ATTACK SLIDER IN FLA #self.foilRotate = Tkinter.Scale(self.FLA,from_=-50,to=50,resolution=1,label="Angle of Attack",orient=Tkinter.HORIZONTAL) #self.foilRotate.pack(side=Tkinter.LEFT,fill=Tkinter.X) # SETUP FOIL NAME LABEL self.lblFoilName = Tkinter.Label(self.FLA, justify="center", textvariable=self.foilNameLbl) self.lblFoilName.pack(side=Tkinter.LEFT, fill=Tkinter.X) # FRAME FLA - HOLDER FOR AIRFOIL BUTTONS THAT CONTROL FLIPBOOK self.FLB = Tkinter.Frame(self.FL, width=self.CWINX) self.FLB.pack(side=Tkinter.BOTTOM, fill=Tkinter.X) # FRAME FR - MAIN FRAME FOR FLIPPABLE FRAME AND BUTTONS self.FR = Tkinter.Frame(root, height=275, width=200) self.FR.pack(side=Tkinter.RIGHT, fill=Tkinter.Y) # CREATE FLIPPING FRAME HOLDER self.FRA = Tkinter.Frame(self.FR) self.FRA.pack(fill=Tkinter.BOTH) # CREATE FLIPPABLE FRAMES - DO NOT PACK FRAMES THEMSELVES, ONLY WIDGETS ON THEM # ============================================== # ========================================================================== # ************************************************************************** # ************************************************************************** # ========================================================================== # ============================================== # NACA 4 PAGE self.FRA2 = Tkinter.Frame(self.FRA) # NACA 4 MAX CAMBER SLIDER self.n4CPlace = Tkinter.Scale(self.FRA2, from_=2, to=9, resolution=1, label="Maximum Camber", orient=Tkinter.HORIZONTAL) self.n4CPlace.pack(side=Tkinter.TOP, fill=Tkinter.X) # NACA 4 MAX CAMBER POSITION SLIDER self.n4MCLPos = Tkinter.Scale(self.FRA2, from_=2, to=9, resolution=1, label="Max Camber Position", orient=Tkinter.HORIZONTAL) self.n4MCLPos.pack(side=Tkinter.TOP, fill=Tkinter.X) # NACA 4 AIRFOIL THICKNESS SLIDER self.n4TCRatio = Tkinter.Scale(self.FRA2, from_=0.02, to=0.99, resolution=.01, label="Airfoil Thickness Ratio", orient=Tkinter.HORIZONTAL) self.n4TCRatio.pack(side=Tkinter.TOP, fill=Tkinter.X) # PACK THE FLIPPING FRAME AND SET AS HIDDEN self.FRA2.pack(fill=Tkinter.BOTH, expand=1) self.active_fr = self.FRA2 # ============================================== # NACA 5 PAGE self.FRA3 = Tkinter.Frame(self.FRA) # NACA 5 TYPE SLIDER self.n5MCLPos = Tkinter.Scale(self.FRA3, from_=210, to=250, resolution=10, label="NACA 5 Type", orient=Tkinter.HORIZONTAL) self.n5MCLPos.pack(side=Tkinter.TOP, fill=Tkinter.X) # NACA 5 AIRFOIL THICKNESS SLIDER self.n5TCRatio = Tkinter.Scale(self.FRA3, from_=0.02, to=0.99, resolution=.01, label="Airfoil Thickness Ratio", orient=Tkinter.HORIZONTAL) self.n5TCRatio.pack(side=Tkinter.TOP, fill=Tkinter.X) # PACK THE FLIPPING FRAME AND SET AS HIDDEN self.FRA3.pack(fill=Tkinter.BOTH, expand=1) self.FRA3.forget() # ============================================== # BICONVEX PAGE self.FRA4 = Tkinter.Frame(self.FRA) # BICONVEX THICKNESS SLIDER self.bxTCRatio = Tkinter.Scale(self.FRA4, from_=0.02, to=0.99, resolution=.01, label="Airfoil Thickness Ratio", orient=Tkinter.HORIZONTAL) self.bxTCRatio.pack(side=Tkinter.TOP, fill=Tkinter.X) # PACK THE FLIPPING FRAME AND SET AS HIDDEN self.FRA4.pack(fill=Tkinter.BOTH, expand=1) self.FRA4.forget() # ============================================== # JOUKOWSKI PAGE self.FRA5 = Tkinter.Frame(self.FRA) # JOUKOWSKI MR VALUE SLIDER - SET FOR CHORD = 1 self.juMR = Tkinter.Scale(self.FRA5, from_=0.001, to=0.04, resolution=0.001, label="MR Value", orient=Tkinter.HORIZONTAL) self.juMR.pack(side=Tkinter.TOP, fill=Tkinter.X) # JOUKOWSKI ML VALUE SLIDER - SET FOR CHORD = 1 self.juML = Tkinter.Scale(self.FRA5, from_=0.001, to=0.04, resolution=0.001, label="ML Value", orient=Tkinter.HORIZONTAL) self.juML.pack(side=Tkinter.TOP, fill=Tkinter.X) # PACK THE FLIPPING FRAME AND SET AS HIDDEN self.FRA5.pack(fill=Tkinter.BOTH, expand=1) self.FRA5.forget() # SET UP RADIO BUTTONS FOR AIRFOIL TYPE - PUT INTO FLB # ========================================================================== # ************************************************************************** # ************************************************************************** # ========================================================================== self.foilN4 = Tkinter.Radiobutton( self.FLB, text="NACA 4", variable=self.foilTypeOpt, value="n4", command=lambda: self.display(self.FRA2)) self.foilN4.pack(side=Tkinter.LEFT, fill=Tkinter.X) self.foilN5 = Tkinter.Radiobutton( self.FLB, text="NACA 5", variable=self.foilTypeOpt, value="n5", command=lambda: self.display(self.FRA3)) self.foilN5.pack(side=Tkinter.LEFT, fill=Tkinter.X) self.foilBX = Tkinter.Radiobutton( self.FLB, text="Biconvex", variable=self.foilTypeOpt, value="bx", command=lambda: self.display(self.FRA4)) self.foilBX.pack(side=Tkinter.LEFT, fill=Tkinter.X) self.foilJU = Tkinter.Radiobutton( self.FLB, text="Joukowski", variable=self.foilTypeOpt, value="ju", command=lambda: self.display(self.FRA5)) self.foilJU.pack(side=Tkinter.LEFT, fill=Tkinter.X) # FRAME FRB - RIGHT SUBFRAME FOR FOIL TYPES AND BUTTONS self.FRB = Tkinter.Frame(self.FR, bg="#FCFCFC") self.FRB.pack(side=Tkinter.BOTTOM, fill=Tkinter.X) # AIRFOIL NUMBER OF POINTS self.foilNPtsLbl = Tkinter.Label(self.FRB, justify="center", text="\nNumber of Points") self.foilNPtsLbl.pack(fill=Tkinter.X) self.foilNPts = Tkinter.Spinbox(self.FRB, from_=51, to=1001, increment=10, command=self.updateNPTS) self.foilNPts.pack(fill=Tkinter.X) # UPDATE NUMBER OF POINTS RIGHT AFTER CREATION self.updateNPTS() # SET UP COMMAND BUTTONS IN FRB self.spacerLbl = Tkinter.Label(self.FRB, justify="center") self.spacerLbl.pack(fill=Tkinter.X) self.btnGenFoil = Tkinter.Button(self.FRB, text="Generate Airfoil", command=self.genFoil) self.btnGenFoil.pack(fill=Tkinter.X)
"""Just some testing.""" from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from base import Base import blade import airfoil import flosim import flosolver engine = create_engine('sqlite:///my_test_db.sqlite3') Session = sessionmaker(bind=engine) session = Session() # Create table Base.metadata.create_all(engine) myblade = blade.Blade() myairfoil = airfoil.Airfoil(airfoil_name='jfoil') airfoil2 = airfoil.Airfoil(airfoil_name='bfoil') myblade.airfoils.append(myairfoil) myblade.airfoils.append(airfoil2) session.add(myblade) session.commit()