[Python] Design & build airplanes from your specifications.
Component tree replaced with subcomponent list
creator/base.py
@@ -13,33 +13,23 @@
13
13
class Aircraft:
14
14
"""This class tracks all sub-components and is fed to the evaluator."""
15
15
def __init__(self, evaluator, name):
16
Removed:
self.tree = {name: None}
17
Removed:
if type(self).__name__ not in evaluator.tree:
18
Removed:
evaluator.tree[name] = self.tree
19
Removed:
else:
20
Removed:
evaluator.tree[name] = self.tree
16
Added:
evaluator.aircrafts.append(self)
21
17
self.evaluator = evaluator
22
18
self.name = name
19
Added:
self.fuselage = None
20
Added:
self.propulsion = None
21
Added:
self.wing = None
23
22
23
Added:
24
24
class Component:
25
25
"""Basic component providing coordinates, tools and a component tree."""
26
26
def __init__(self, parent, name):
27
Removed:
self.tree = {type(self).__name__: name}
28
Removed:
# print(type(self).__name__)
29
Removed:
if type(self).__name__ not in parent.tree:
30
Removed:
parent.tree.update(self.tree)
31
Removed:
else:
32
Removed:
parent.tree[name] = self.tree
33
27
self.parent = parent
34
28
self.name = name
35
29
self.x = np.array([])
36
30
self.z = np.array([])
37
31
self.material = None
38
32
self.mass = float()
39
Removed:
40
Removed:
def set_material(self, material):
41
Removed:
"""Set the component bulk material."""
42
Removed:
self.material = material
43
33
44
34
def info_print(self, round):
45
35
"""Print all the component's coordinates to the terminal."""
creator/wing.py
@@ -40,14 +40,21 @@
40
40
semi_span=150,
41
41
material=mt.aluminium):
42
42
super().__init__(parent, name)
43
Added:
parent.wing = self
43
44
if chord > 20:
44
45
self.chord = chord
45
46
else:
46
47
self.chord = 20
47
48
logging.debug('Chord too small, using minimum value of 20.')
49
Added:
parent
48
50
self.semi_span = semi_span
49
51
self.material = material
52
Added:
self.spars = []
53
Added:
self.stringers = []
50
54
55
Added:
def __str__(self):
56
Added:
return self.name
57
Added:
51
58
def add_naca(self, naca_num):
52
59
"""Generate surface geometry for a NACA airfoil.
53
60
@@ -139,7 +146,8 @@
139
146
def __init__(self, parent, name, loc_percent=0.30, material=mt.aluminium):
140
147
"""Set spar location as percent of chord length."""
141
148
super().__init__(parent, name)
142
Removed:
super().set_material(material)
149
Added:
parent.spars.append(self)
150
Added:
self.material = material
143
151
self.cap_area = float()
144
152
# bi.bisect_left: returns index of first value in parent.x > loc
145
153
# This ensures that spar geom intersects with airfoil geom.
@@ -165,8 +173,17 @@
165
173
166
174
class Stringer(base.Component):
167
175
"""Contains the coordinates of all stringers."""
168
Removed:
def __init__(self):
176
Added:
def __init__(self, parent, name, den_u, den_l, den_un, den_ul):
177
Added:
"""
178
Added:
parameters:
179
Added:
180
Added:
den_u: upper stringer density
181
Added:
den_l: lower stringer density
182
Added:
den_un: upper nose stringer density
183
Added:
den_ul: upper nose stringer density
184
Added:
"""
169
185
super().__init__()
186
Added:
parent.stringers.append(self)
170
187
self.x_start = []
171
188
self.x_end = []
172
189
self.z_start = []
evaluator/evaluator.py
@@ -17,21 +17,9 @@
17
17
Individual aircrafts must claim an Evaluator object as parent."""
18
18
def __init__(self, name):
19
19
self.name = name
20
Removed:
self.tree = {} # Keys are component names, values are objects
20
Added:
self.aircrafts = []
21
21
self.results = []
22
Removed:
# # Evaluator knows all geometrical info from evaluated airfoil
23
Removed:
# self.airfoil = self.get_airfoil(aircraft)
24
Removed:
# self.spars = self.get_spars(aircraft)
25
Removed:
# self.stringers = self.get_stringers(aircraft)
26
Removed:
# # Lift
27
Removed:
# self.lift_rectangular = []
28
Removed:
# self.lift_elliptical = []
29
Removed:
# self.lift_total = []
30
Removed:
# # Drag
31
Removed:
# self.drag = []
32
Removed:
# # centroid
33
Removed:
# self.centroid = []
34
Removed:
# Inertia terms:
22
Added:
35
23
self.I_ = {'x': 0, 'z': 0, 'xz': 0}
36
24
37
25
def get_lift_rectangular(aircraft, lift):
example_airfoil.py
@@ -62,9 +62,11 @@
62
62
spar3 = creator.wing.Spar(af2, 'spar3', 0.23)
63
63
spar4 = creator.wing.Spar(af2, 'spar4', 0.67)
64
64
65
Removed:
# eval.update_tree()
66
Removed:
# ac2.update_tree()
67
Removed:
print(ac2.tree)
65
Added:
for aircraft in eval.aircrafts:
66
Added:
print(aircraft.wing)
67
Added:
for spar in aircraft.wing.spars:
68
Added:
print(spar.material["name"])
69
Added:
68
70
# eval.info_print(2)
69
71
70
72
# # Create stringer instance