/** This plots a poster or chart of various airfoils. All of the airfoils can be downloaded from: https://m-selig.ae.illinois.edu/ads/archives/coord_seligFmt.zip Usage: frink airfoilPoster.frink [filenames] This program is most easily run from the directory where the airfoils are extracted. If no filenames are specified, this will render all .dat files in the current directory: frink airfoilPoster.frink If airfoil filenames are specified, this will render the specified airfoils which can be in a different directory. Most generally, the command-line below will render the airfoils n*.dat. MAKE SURE TO ADJUST ALL PATHS TO MATCH YOUR SYSTEM! /path/to/frink /path/to/airfoilPoster.frink /path/to/airfoils/n*.dat */ use airfoil.frink // The width indicates how many airfoils per column. //width = floor[sqrt[length[ARGS]]] // This gives a square poster width = 8 // Good for SVG chart scale = 100 if length[ARGS] == 0 { println["No filenames specified. Will render all .dat files in the current directory."] filenames = new array for f = select[files["."], {|file| file.getName[] =~ %r/\.dat$/i}] filenames.push[f.getName[]] } else filenames = deepCopy[ARGS] lexicalSort[filenames] poster = new graphics cell = 0 for filename = filenames { url = filenameToURL[filename] println[url] airfoil = Airfoil.loadSelig[url] poly = airfoil.toFilledPolygon[scale, scale] caption = new graphics caption.font["SansSerif", 5] name = airfoil.name name =~ %s/\s+airfoil\b//i // Remove word "AIRFOIL" name =~ %s/(.{7,}?)\s\(/$1\n\(/i // Split before first parentheses name =~ %s/(.{12,}?)\s/$1\n/g // Split lines caption.text[name, scale/2, .3 scale] poster.addCenter[poly, cell mod width, cell div width, .9, .9] poster.addCenter[caption, cell mod width, (cell div width) + .3, .9, .9] cell = cell + 1 } println["$cell airfoils processed."] //poster.show[] poster.write["airfoils.svg", 1000, undef, .995] println["airfoils.svg written."] poster.write["airfoils.html", 1000, undef, .995] println["airfoils.html written."]