[Python] Design & build airplanes from your specifications.
Commence declassification of Evaluator
Pointless to have a separate object for the Evaluator when a collection of evaluator.py methods does the trick.
Changed files
Pipfile
@@ -0,0 +1,13 @@
1
Added:
[[source]]
2
Added:
name = "pypi"
3
Added:
url = "https://pypi.org/simple"
4
Added:
verify_ssl = true
5
Added:
6
Added:
[dev-packages]
7
Added:
8
Added:
[packages]
9
Added:
numpy = "*"
10
Added:
matplotlib = "*"
11
Added:
12
Added:
[requires]
13
Added:
python_version = "3.7"
Pipfile.lock
@@ -0,0 +1,124 @@
1
Added:
{
2
Added:
"_meta": {
3
Added:
"hash": {
4
Added:
"sha256": "a67dca5f16ddc46fb13b6e907c6a3a310410154c905c1fbffcc496db0d7ccd87"
5
Added:
},
6
Added:
"pipfile-spec": 6,
7
Added:
"requires": {
8
Added:
"python_version": "3.7"
9
Added:
},
10
Added:
"sources": [
11
Added:
{
12
Added:
"name": "pypi",
13
Added:
"url": "https://pypi.org/simple",
14
Added:
"verify_ssl": true
15
Added:
}
16
Added:
]
17
Added:
},
18
Added:
"default": {
19
Added:
"cycler": {
20
Added:
"hashes": [
21
Added:
"sha256:1d8a5ae1ff6c5cf9b93e8811e581232ad8920aeec647c37316ceac982b08cb2d",
22
Added:
"sha256:cd7b2d1018258d7247a71425e9f26463dfb444d411c39569972f4ce586b0c9d8"
23
Added:
],
24
Added:
"version": "==0.10.0"
25
Added:
},
26
Added:
"kiwisolver": {
27
Added:
"hashes": [
28
Added:
"sha256:05b5b061e09f60f56244adc885c4a7867da25ca387376b02c1efc29cc16bcd0f",
29
Added:
"sha256:26f4fbd6f5e1dabff70a9ba0d2c4bd30761086454aa30dddc5b52764ee4852b7",
30
Added:
"sha256:3b2378ad387f49cbb328205bda569b9f87288d6bc1bf4cd683c34523a2341efe",
31
Added:
"sha256:400599c0fe58d21522cae0e8b22318e09d9729451b17ee61ba8e1e7c0346565c",
32
Added:
"sha256:47b8cb81a7d18dbaf4fed6a61c3cecdb5adec7b4ac292bddb0d016d57e8507d5",
33
Added:
"sha256:53eaed412477c836e1b9522c19858a8557d6e595077830146182225613b11a75",
34
Added:
"sha256:58e626e1f7dfbb620d08d457325a4cdac65d1809680009f46bf41eaf74ad0187",
35
Added:
"sha256:5a52e1b006bfa5be04fe4debbcdd2688432a9af4b207a3f429c74ad625022641",
36
Added:
"sha256:5c7ca4e449ac9f99b3b9d4693debb1d6d237d1542dd6a56b3305fe8a9620f883",
37
Added:
"sha256:682e54f0ce8f45981878756d7203fd01e188cc6c8b2c5e2cf03675390b4534d5",
38
Added:
"sha256:79bfb2f0bd7cbf9ea256612c9523367e5ec51d7cd616ae20ca2c90f575d839a2",
39
Added:
"sha256:7f4dd50874177d2bb060d74769210f3bce1af87a8c7cf5b37d032ebf94f0aca3",
40
Added:
"sha256:8944a16020c07b682df861207b7e0efcd2f46c7488619cb55f65882279119389",
41
Added:
"sha256:8aa7009437640beb2768bfd06da049bad0df85f47ff18426261acecd1cf00897",
42
Added:
"sha256:939f36f21a8c571686eb491acfffa9c7f1ac345087281b412d63ea39ca14ec4a",
43
Added:
"sha256:9733b7f64bd9f807832d673355f79703f81f0b3e52bfce420fc00d8cb28c6a6c",
44
Added:
"sha256:a02f6c3e229d0b7220bd74600e9351e18bc0c361b05f29adae0d10599ae0e326",
45
Added:
"sha256:a0c0a9f06872330d0dd31b45607197caab3c22777600e88031bfe66799e70bb0",
46
Added:
"sha256:acc4df99308111585121db217681f1ce0eecb48d3a828a2f9bbf9773f4937e9e",
47
Added:
"sha256:b64916959e4ae0ac78af7c3e8cef4becee0c0e9694ad477b4c6b3a536de6a544",
48
Added:
"sha256:d3fcf0819dc3fea58be1fd1ca390851bdb719a549850e708ed858503ff25d995",
49
Added:
"sha256:d52e3b1868a4e8fd18b5cb15055c76820df514e26aa84cc02f593d99fef6707f",
50
Added:
"sha256:db1a5d3cc4ae943d674718d6c47d2d82488ddd94b93b9e12d24aabdbfe48caee",
51
Added:
"sha256:e3a21a720791712ed721c7b95d433e036134de6f18c77dbe96119eaf7aa08004",
52
Added:
"sha256:e8bf074363ce2babeb4764d94f8e65efd22e6a7c74860a4f05a6947afc020ff2",
53
Added:
"sha256:f16814a4a96dc04bf1da7d53ee8d5b1d6decfc1a92a63349bb15d37b6a263dd9",
54
Added:
"sha256:f2b22153870ca5cf2ab9c940d7bc38e8e9089fa0f7e5856ea195e1cf4ff43d5a",
55
Added:
"sha256:f790f8b3dff3d53453de6a7b7ddd173d2e020fb160baff578d578065b108a05f"
56
Added:
],
57
Added:
"version": "==1.1.0"
58
Added:
},
59
Added:
"matplotlib": {
60
Added:
"hashes": [
61
Added:
"sha256:1febd22afe1489b13c6749ea059d392c03261b2950d1d45c17e3aed812080c93",
62
Added:
"sha256:31a30d03f39528c79f3a592857be62a08595dec4ac034978ecd0f814fa0eec2d",
63
Added:
"sha256:4442ce720907f67a79d45de9ada47be81ce17e6c2f448b3c64765af93f6829c9",
64
Added:
"sha256:796edbd1182cbffa7e1e7a97f1e141f875a8501ba8dd834269ae3cd45a8c976f",
65
Added:
"sha256:934e6243df7165aad097572abf5b6003c77c9b6c480c3c4de6f2ef1b5fdd4ec0",
66
Added:
"sha256:bab9d848dbf1517bc58d1f486772e99919b19efef5dd8596d4b26f9f5ee08b6b",
67
Added:
"sha256:c1fe1e6cdaa53f11f088b7470c2056c0df7d80ee4858dadf6cbe433fcba4323b",
68
Added:
"sha256:e5b8aeca9276a3a988caebe9f08366ed519fff98f77c6df5b64d7603d0e42e36",
69
Added:
"sha256:ec6bd0a6a58df3628ff269978f4a4b924a0d371ad8ce1f8e2b635b99e482877a"
70
Added:
],
71
Added:
"index": "pypi",
72
Added:
"version": "==3.1.1"
73
Added:
},
74
Added:
"numpy": {
75
Added:
"hashes": [
76
Added:
"sha256:0b0dd8f47fb177d00fa6ef2d58783c4f41ad3126b139c91dd2f7c4b3fdf5e9a5",
77
Added:
"sha256:25ffe71f96878e1da7e014467e19e7db90ae7d4e12affbc73101bcf61785214e",
78
Added:
"sha256:26efd7f7d755e6ca966a5c0ac5a930a87dbbaab1c51716ac26a38f42ecc9bc4b",
79
Added:
"sha256:28b1180c758abf34a5c3fea76fcee66a87def1656724c42bb14a6f9717a5bdf7",
80
Added:
"sha256:2e418f0a59473dac424f888dd57e85f77502a593b207809211c76e5396ae4f5c",
81
Added:
"sha256:30c84e3a62cfcb9e3066f25226e131451312a044f1fe2040e69ce792cb7de418",
82
Added:
"sha256:4650d94bb9c947151737ee022b934b7d9a845a7c76e476f3e460f09a0c8c6f39",
83
Added:
"sha256:4dd830a11e8724c9c9379feed1d1be43113f8bcce55f47ea7186d3946769ce26",
84
Added:
"sha256:4f2a2b279efde194877aff1f76cf61c68e840db242a5c7169f1ff0fd59a2b1e2",
85
Added:
"sha256:62d22566b3e3428dfc9ec972014c38ed9a4db4f8969c78f5414012ccd80a149e",
86
Added:
"sha256:669795516d62f38845c7033679c648903200980d68935baaa17ac5c7ae03ae0c",
87
Added:
"sha256:75fcd60d682db3e1f8fbe2b8b0c6761937ad56d01c1dc73edf4ef2748d5b6bc4",
88
Added:
"sha256:9395b0a41e8b7e9a284e3be7060db9d14ad80273841c952c83a5afc241d2bd98",
89
Added:
"sha256:9e37c35fc4e9410093b04a77d11a34c64bf658565e30df7cbe882056088a91c1",
90
Added:
"sha256:a0678793096205a4d784bd99f32803ba8100f639cf3b932dc63b21621390ea7e",
91
Added:
"sha256:b46554ad4dafb2927f88de5a1d207398c5385edbb5c84d30b3ef187c4a3894d8",
92
Added:
"sha256:c867eeccd934920a800f65c6068acdd6b87e80d45cd8c8beefff783b23cdc462",
93
Added:
"sha256:dd0667f5be56fb1b570154c2c0516a528e02d50da121bbbb2cbb0b6f87f59bc2",
94
Added:
"sha256:de2b1c20494bdf47f0160bd88ed05f5e48ae5dc336b8de7cfade71abcc95c0b9",
95
Added:
"sha256:f1df7b2b7740dd777571c732f98adb5aad5450aee32772f1b39249c8a50386f6",
96
Added:
"sha256:ffca69e29079f7880c5392bf675eb8b4146479d976ae1924d01cd92b04cccbcc"
97
Added:
],
98
Added:
"index": "pypi",
99
Added:
"version": "==1.17.3"
100
Added:
},
101
Added:
"pyparsing": {
102
Added:
"hashes": [
103
Added:
"sha256:6f98a7b9397e206d78cc01df10131398f1c8b8510a2f4d97d9abd82e1aacdd80",
104
Added:
"sha256:d9338df12903bbf5d65a0e4e87c2161968b10d2e489652bb47001d82a9b028b4"
105
Added:
],
106
Added:
"version": "==2.4.2"
107
Added:
},
108
Added:
"python-dateutil": {
109
Added:
"hashes": [
110
Added:
"sha256:7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fb",
111
Added:
"sha256:c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9e"
112
Added:
],
113
Added:
"version": "==2.8.0"
114
Added:
},
115
Added:
"six": {
116
Added:
"hashes": [
117
Added:
"sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c",
118
Added:
"sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73"
119
Added:
],
120
Added:
"version": "==1.12.0"
121
Added:
}
122
Added:
},
123
Added:
"develop": {}
124
Added:
}
creator/__init__.py
@@ -2,7 +2,3 @@
2
2
from . import fuselage
3
3
from . import propulsion
4
4
from . import wing
5
Removed:
# import creator.base
6
Removed:
# import creator.fuselage
7
Removed:
# import creator.propulsion
8
Removed:
# import creator.wing
creator/base.py
@@ -19,6 +19,7 @@
19
19
self.fuselage = None
20
20
self.propulsion = None
21
21
self.wing = None
22
Added:
self.results = {}
22
23
23
24
def __str__(self):
24
25
return self.name
evaluator.py
@@ -1,353 +0,0 @@
1
Removed:
"""
2
Removed:
The evaluator.py module contains a single Evaluator class,
3
Removed:
which knows all the attributes of a specified Aircraft instance,
4
Removed:
and contains functions to analyse the airfoil's geometrical
5
Removed:
& structural properties.
6
Removed:
"""
7
Removed:
8
Removed:
import sys
9
Removed:
import os.path
10
Removed:
import numpy as np
11
Removed:
from math import sqrt
12
Removed:
import matplotlib.pyplot as plt
13
Removed:
import concurrent.futures
14
Removed:
import logging
15
Removed:
16
Removed:
logging.basicConfig(filename='log_eval.txt',
17
Removed:
level=logging.DEBUG,
18
Removed:
format='%(asctime)s - %(levelname)s - %(message)s')
19
Removed:
20
Removed:
21
Removed:
class Evaluator:
22
Removed:
"""Performs structural evaluations on aircrafts.
23
Removed:
Individual aircrafts must claim an Evaluator object as parent."""
24
Removed:
def __init__(self, name):
25
Removed:
self.name = name
26
Removed:
self.aircrafts = []
27
Removed:
self.results = []
28
Removed:
29
Removed:
self.I_ = {'x': 0, 'z': 0, 'xz': 0}
30
Removed:
31
Removed:
def _get_lift_rectangular(aircraft, lift=50):
32
Removed:
L_prime = np.array([
33
Removed:
lift / (aircraft.wing.semi_span * 2)
34
Removed:
for _ in range(aircraft.wing.semi_span)
35
Removed:
])
36
Removed:
return L_prime
37
Removed:
38
Removed:
def _get_lift_elliptical(aircraft, L_0=3.2):
39
Removed:
L_prime = np.array([
40
Removed:
0.5 * L_0 / (aircraft.wing.semi_span * 2) *
41
Removed:
sqrt(1 - (y / aircraft.wing.semi_span)**2)
42
Removed:
for y in range(aircraft.wing.semi_span)
43
Removed:
])
44
Removed:
return L_prime
45
Removed:
46
Removed:
def get_lift_total(self, aircraft):
47
Removed:
"""Combination of rectangular and elliptical lift."""
48
Removed:
# F_z = self._get_lift_rectangular(aircraft) + self._get_lift_elliptical(
49
Removed:
# aircraft)
50
Removed:
# F_z = self._get_lift_rectangular(
51
Removed:
# aircraft) + self._get_lift_elliptical(aircraft) / 2
52
Removed:
# F_z = [i + j for i, j in self._get_lift_rectangular]
53
Removed:
# return F_z
54
Removed:
return 420
55
Removed:
56
Removed:
def get_mass_distribution(self, total_mass):
57
Removed:
F_z = [total_mass / self.semi_span for x in range(0, self.semi_span)]
58
Removed:
return F_z
59
Removed:
60
Removed:
def get_mass_total(self, aircraft):
61
Removed:
"""Get the total aircraft mass."""
62
Removed:
return 2000
63
Removed:
64
Removed:
def get_drag(aircraft, drag):
65
Removed:
# Transform semi-span integer into list
66
Removed:
semi_span = [x for x in range(0, aircraft.wing.semi_span)]
67
Removed:
68
Removed:
# Drag increases after 80% of the semi_span
69
Removed:
cutoff = round(0.8 * aircraft.wing.span)
70
Removed:
71
Removed:
# Drag increases by 25% after 80% of the semi_span
72
Removed:
F_x = [drag for x in semi_span[0:cutoff]]
73
Removed:
F_x.extend([1.25 * drag for x in semi_span[cutoff:]])
74
Removed:
return F_x
75
Removed:
76
Removed:
def get_drag_total(self, aircraft):
77
Removed:
"""Get total drag force acting on the aircraft."""
78
Removed:
return 500
79
Removed:
80
Removed:
def get_centroid(aircraft):
81
Removed:
"""Return the coordinates of the centroid."""
82
Removed:
stringer_area = aircraft.stringer.area
83
Removed:
cap_area = aircraft.spar.cap_area
84
Removed:
85
Removed:
caps_x = [value for spar in aircraft.spar.x for value in spar]
86
Removed:
caps_z = [value for spar in aircraft.spar.z for value in spar]
87
Removed:
stringers_x = aircraft.stringer.x
88
Removed:
stringers_z = aircraft.stringer.z
89
Removed:
90
Removed:
denominator = float(
91
Removed:
len(caps_x) * cap_area + len(stringers_x) * stringer_area)
92
Removed:
93
Removed:
centroid_x = float(
94
Removed:
sum([x * cap_area for x in caps_x]) +
95
Removed:
sum([x * stringer_area for x in stringers_x]))
96
Removed:
centroid_x = centroid_x / denominator
97
Removed:
98
Removed:
centroid_z = float(
99
Removed:
sum([z * cap_area for z in caps_z]) +
100
Removed:
sum([z * stringer_area for z in stringers_z]))
101
Removed:
centroid_z = centroid_z / denominator
102
Removed:
103
Removed:
return (centroid_x, centroid_z)
104
Removed:
105
Removed:
def get_inertia_terms(self):
106
Removed:
"""Obtain all inertia terms."""
107
Removed:
stringer_area = self.stringer.area
108
Removed:
cap_area = self.spar.cap_area
109
Removed:
110
Removed:
# Adds upper and lower components' coordinates to list
111
Removed:
x_stringers = self.stringer.x
112
Removed:
z_stringers = self.stringer.z
113
Removed:
x_spars = self.spar.x[:][0] + self.spar.x[:][1]
114
Removed:
z_spars = self.spar.z[:][0] + self.spar.z[:][1]
115
Removed:
stringer_count = range(len(x_stringers))
116
Removed:
spar_count = range(len(self.spar.x))
117
Removed:
118
Removed:
# I_x is the sum of the contributions of the spar caps and stringers
119
Removed:
# TODO: replace list indices with dictionary value
120
Removed:
I_x = sum([
121
Removed:
cap_area * (z_spars[i] - self.centroid[1])**2 for i in spar_count
122
Removed:
])
123
Removed:
I_x += sum([
124
Removed:
stringer_area * (z_stringers[i] - self.centroid[1])**2
125
Removed:
for i in stringer_count
126
Removed:
])
127
Removed:
128
Removed:
I_z = sum([
129
Removed:
cap_area * (x_spars[i] - self.centroid[0])**2 for i in spar_count
130
Removed:
])
131
Removed:
I_z += sum([
132
Removed:
stringer_area * (x_stringers[i] - self.centroid[0])**2
133
Removed:
for i in stringer_count
134
Removed:
])
135
Removed:
136
Removed:
I_xz = sum([
137
Removed:
cap_area * (x_spars[i] - self.centroid[0]) *
138
Removed:
(z_spars[i] - self.centroid[1]) for i in spar_count
139
Removed:
])
140
Removed:
I_xz += sum([
141
Removed:
stringer_area * (x_stringers[i] - self.centroid[0]) *
142
Removed:
(z_stringers[i] - self.centroid[1]) for i in stringer_count
143
Removed:
])
144
Removed:
return (I_x, I_z, I_xz)
145
Removed:
146
Removed:
def get_dx(self, component):
147
Removed:
return [x - self.centroid[0] for x in component.x_start]
148
Removed:
149
Removed:
def get_dz(self, component):
150
Removed:
return [x - self.centroid[1] for x in component.x_start]
151
Removed:
152
Removed:
def get_dP(self, xDist, zDist, V_x, V_z, area):
153
Removed:
I_x = self.I_['x']
154
Removed:
I_z = self.I_['z']
155
Removed:
I_xz = self.I_['xz']
156
Removed:
denom = float(I_x * I_z - I_xz**2)
157
Removed:
z = float()
158
Removed:
for _ in range(len(xDist)):
159
Removed:
z += float(-area * xDist[_] * (I_x * V_x - I_xz * V_z) / denom -
160
Removed:
area * zDist[_] * (I_z * V_z - I_xz * V_x) / denom)
161
Removed:
return z
162
Removed:
163
Removed:
def analyze(self, aircraft):
164
Removed:
"""Analyze a single aircraft."""
165
Removed:
aircraft.results = {}
166
Removed:
aircraft.results.update({'Lift': self.get_lift_total(aircraft)})
167
Removed:
aircraft.results.update({'Drag': self.get_drag_total(aircraft)})
168
Removed:
aircraft.results.update({'Mass': self.get_mass_total(aircraft)})
169
Removed:
print(aircraft.results)
170
Removed:
return None
171
Removed:
172
Removed:
def analyze_all(self):
173
Removed:
"""Perform all analysis calculations on a all aircraft in evaluator."""
174
Removed:
with concurrent.futures.ProcessPoolExecutor() as executor:
175
Removed:
executor.map(self.analyze, self.aircrafts)
176
Removed:
return None
177
Removed:
178
Removed:
# def analysis(self, V_x, V_z):
179
Removed:
# """Perform all analysis calculations and store in class instance."""
180
Removed:
181
Removed:
# self.drag = self.get_drag(10)
182
Removed:
# self.lift_rectangular = self.get_lift_rectangular(13.7)
183
Removed:
# self.lift_elliptical = self.get_lift_elliptical(15)
184
Removed:
# self.lift_total = self.get_lift_total()
185
Removed:
# self.mass_dist = self.get_mass_distribution(self.mass_total)
186
Removed:
# self.centroid = self.get_centroid()
187
Removed:
# self.I_['x'] = self.get_inertia_terms()[0]
188
Removed:
# self.I_['z'] = self.get_inertia_terms()[1]
189
Removed:
# self.I_['xz'] = self.get_inertia_terms()[2]
190
Removed:
# spar_dx = self.get_dx(self.spar)
191
Removed:
# spar_dz = self.get_dz(self.spar)
192
Removed:
# self.spar.dP_x = self.get_dP(spar_dx, spar_dz, V_x, 0,
193
Removed:
# self.spar.cap_area)
194
Removed:
# self.spar.dP_z = self.get_dP(spar_dx, spar_dz, 0, V_z,
195
Removed:
# self.spar.cap_area)
196
Removed:
# print("yayyyyy")
197
Removed:
# return None
198
Removed:
199
Removed:
# print(f"Analysis results for {aircraft.name}:\n", results)
200
Removed:
# self.results = self.get_lift_total(aircraft)
201
Removed:
202
Removed:
# self.drag = self.get_drag(10)
203
Removed:
# self.lift_rectangular = self.get_lift_rectangular(13.7)
204
Removed:
# self.lift_elliptical = self.get_lift_elliptical(15)
205
Removed:
# self.lift_total = self.get_lift_total()
206
Removed:
# self.mass_dist = self.get_mass_distribution(self.mass_total)
207
Removed:
# self.centroid = self.get_centroid()
208
Removed:
# self.I_['x'] = self.get_inertia_terms()[0]
209
Removed:
# self.I_['z'] = self.get_inertia_terms()[1]
210
Removed:
# self.I_['xz'] = self.get_inertia_terms()[2]
211
Removed:
# spar_dx = self.get_dx(self.spar)
212
Removed:
# spar_dz = self.get_dz(self.spar)
213
Removed:
# self.spar.dP_x = self.get_dP(spar_dx, spar_dz, V_x, 0,
214
Removed:
# self.spar.cap_area)
215
Removed:
# self.spar.dP_z = self.get_dP(spar_dx, spar_dz, 0, V_z,
216
Removed:
# self.spar.cap_area)
217
Removed:
# return None
218
Removed:
219
Removed:
def tree_print(self, *aircrafts):
220
Removed:
"""Print the list of subcomponents."""
221
Removed:
name = f" TREE FOR {[i.name for i in aircrafts]} IN {self.name} "
222
Removed:
num_of_dashes = len(name)
223
Removed:
print(num_of_dashes * '-')
224
Removed:
print(name)
225
Removed:
for aircraft in aircrafts:
226
Removed:
print(".")
227
Removed:
print(f"`-- {aircraft}")
228
Removed:
print(f" |--{aircraft.wing}")
229
Removed:
print(f" | |-- {aircraft.wing.stringers}")
230
Removed:
for spar in aircraft.wing.spars[:-1]:
231
Removed:
print(f" | |-- {spar}")
232
Removed:
print(f" | `-- {aircraft.wing.spars[-1]}")
233
Removed:
print(f" |-- {aircraft.fuselage}")
234
Removed:
print(f" `-- {aircraft.propulsion}")
235
Removed:
print(num_of_dashes * '-')
236
Removed:
return None
237
Removed:
238
Removed:
def tree_save(self,
239
Removed:
*aircrafts,
240
Removed:
save_path='/home/blendux/Projects/Aircraft_Studio/save'):
241
Removed:
"""Save the evaluator's tree to a file."""
242
Removed:
for aircraft in aircrafts:
243
Removed:
file_name = f"{aircraft.name}_tree.txt"
244
Removed:
full_path = os.path.join(save_path, file_name)
245
Removed:
with open(full_path, 'w') as f:
246
Removed:
try:
247
Removed:
f.write(".\n")
248
Removed:
f.write(f"`-- {aircraft}\n")
249
Removed:
f.write(f" |--{aircraft.wing}\n")
250
Removed:
for spar in aircraft.wing.spars[:-1]:
251
Removed:
f.write(f" | |-- {spar}\n")
252
Removed:
f.write(f" | `-- {aircraft.wing.spars[-1]}\n")
253
Removed:
f.write(f" |-- {aircraft.fuselage}\n")
254
Removed:
f.write(f" `-- {aircraft.propulsion}\n")
255
Removed:
logging.debug(f'Successfully wrote to file {full_path}')
256
Removed:
257
Removed:
except IOError:
258
Removed:
print(
259
Removed:
f'Unable to write {file_name} to specified directory.',
260
Removed:
'Was the full path passed to the function?')
261
Removed:
return None
262
Removed:
263
Removed:
def info_save(self, save_path, number):
264
Removed:
"""Save all the object's coordinates (must be full path)."""
265
Removed:
file_name = 'airfoil_{}_eval.txt'.format(number)
266
Removed:
full_path = os.path.join(save_path, file_name)
267
Removed:
try:
268
Removed:
with open(full_path, 'w') as sys.stdout:
269
Removed:
self.info_print(6)
270
Removed:
# This line required to reset behavior of sys.stdout
271
Removed:
sys.stdout = sys.__stdout__
272
Removed:
print('Successfully wrote to file {}'.format(full_path))
273
Removed:
except IOError:
274
Removed:
print(
275
Removed:
'Unable to write {} to specified directory.\n'.format(
276
Removed:
file_name), 'Was the full path passed to the function?')
277
Removed:
return None
278
Removed:
279
Removed:
280
Removed:
def plot_geom(evaluator):
281
Removed:
"""This function plots analysis results over the airfoil's geometry."""
282
Removed:
# Plot chord
283
Removed:
x_chord = [0, evaluator.chord]
284
Removed:
y_chord = [0, 0]
285
Removed:
plt.plot(x_chord, y_chord, linewidth='1')
286
Removed:
# Plot quarter chord
287
Removed:
plt.plot(evaluator.chord / 4,
288
Removed:
0,
289
Removed:
'.',
290
Removed:
color='g',
291
Removed:
markersize=24,
292
Removed:
label='Quarter-chord')
293
Removed:
# Plot airfoil surfaces
294
Removed:
x = [0.98 * x for x in evaluator.airfoil.x]
295
Removed:
y = [0.98 * z for z in evaluator.airfoil.z]
296
Removed:
plt.fill(x, y, color='w', linewidth='1', fill=False)
297
Removed:
x = [1.02 * x for x in evaluator.airfoil.x]
298
Removed:
y = [1.02 * z for z in evaluator.airfoil.z]
299
Removed:
plt.fill(x, y, color='b', linewidth='1', fill=False)
300
Removed:
301
Removed:
# Plot spars
302
Removed:
try:
303
Removed:
for _ in range(len(evaluator.spar.x)):
304
Removed:
x = (evaluator.spar.x[_])
305
Removed:
y = (evaluator.spar.z[_])
306
Removed:
plt.plot(x, y, '-', color='b')
307
Removed:
except AttributeError:
308
Removed:
print('No spars to plot.')
309
Removed:
# Plot stringers
310
Removed:
try:
311
Removed:
for _ in range(0, len(evaluator.stringer.x)):
312
Removed:
x = evaluator.stringer.x[_]
313
Removed:
y = evaluator.stringer.z[_]
314
Removed:
plt.plot(x, y, '.', color='y', markersize=12)
315
Removed:
except AttributeError:
316
Removed:
print('No stringers to plot.')
317
Removed:
318
Removed:
# Plot centroid
319
Removed:
x = evaluator.centroid[0]
320
Removed:
y = evaluator.centroid[1]
321
Removed:
plt.plot(x, y, '.', color='r', markersize=24, label='centroid')
322
Removed:
323
Removed:
# Graph formatting
324
Removed:
plt.xlabel('X axis')
325
Removed:
plt.ylabel('Z axis')
326
Removed:
327
Removed:
plot_bound = max(evaluator.airfoil.x)
328
Removed:
plt.xlim(-0.10 * plot_bound, 1.10 * plot_bound)
329
Removed:
plt.ylim(-(1.10 * plot_bound / 2), (1.10 * plot_bound / 2))
330
Removed:
plt.gca().set_aspect('equal', adjustable='box')
331
Removed:
plt.gca().legend()
332
Removed:
plt.grid(axis='both', linestyle=':', linewidth=1)
333
Removed:
plt.show()
334
Removed:
return None
335
Removed:
336
Removed:
337
Removed:
def plot_lift(evaluator):
338
Removed:
x = range(evaluator.semi_span)
339
Removed:
y_1 = evaluator.lift_rectangular
340
Removed:
y_2 = evaluator.lift_elliptical
341
Removed:
y_3 = evaluator.lift_total
342
Removed:
plt.plot(x, y_1, '.', color='b', markersize=4, label='Rectangular lift')
343
Removed:
plt.plot(x, y_2, '.', color='g', markersize=4, label='Elliptical lift')
344
Removed:
plt.plot(x, y_3, '.', color='r', markersize=4, label='Total lift')
345
Removed:
346
Removed:
# Graph formatting
347
Removed:
plt.xlabel('Semi-span location')
348
Removed:
plt.ylabel('Lift')
349
Removed:
350
Removed:
plt.gca().legend()
351
Removed:
plt.grid(axis='both', linestyle=':', linewidth=1)
352
Removed:
plt.show()
353
Removed:
return None
evaluator/__init__.py
@@ -0,0 +1,1 @@
1
Added:
from .evaluator import Evaluator
evaluator/dP.py
@@ -0,0 +1,18 @@
1
Added:
def get_dx(self, component):
2
Added:
return [x - self.centroid[0] for x in component.x_start]
3
Added:
4
Added:
5
Added:
def get_dz(self, component):
6
Added:
return [x - self.centroid[1] for x in component.x_start]
7
Added:
8
Added:
9
Added:
def get_dP(self, xDist, zDist, V_x, V_z, area):
10
Added:
I_x = self.I_['x']
11
Added:
I_z = self.I_['z']
12
Added:
I_xz = self.I_['xz']
13
Added:
denom = float(I_x * I_z - I_xz**2)
14
Added:
z = float()
15
Added:
for _ in range(len(xDist)):
16
Added:
z += float(-area * xDist[_] * (I_x * V_x - I_xz * V_z) / denom -
17
Added:
area * zDist[_] * (I_z * V_z - I_xz * V_x) / denom)
18
Added:
return z
evaluator/drag.py
@@ -0,0 +1,16 @@
1
Added:
def get_drag(aircraft, drag):
2
Added:
# Transform semi-span integer into list
3
Added:
semi_span = [x for x in range(0, aircraft.wing.semi_span)]
4
Added:
5
Added:
# Drag increases after 80% of the semi_span
6
Added:
cutoff = round(0.8 * aircraft.wing.span)
7
Added:
8
Added:
# Drag increases by 25% after 80% of the semi_span
9
Added:
F_x = [drag for x in semi_span[0:cutoff]]
10
Added:
F_x.extend([1.25 * drag for x in semi_span[cutoff:]])
11
Added:
return F_x
12
Added:
13
Added:
14
Added:
def get_drag_total(self, aircraft):
15
Added:
"""Get total drag force acting on the aircraft."""
16
Added:
return 500
evaluator/evaluator.py
@@ -0,0 +1,206 @@
1
Added:
"""
2
Added:
The evaluator.py module contains a single Evaluator class,
3
Added:
which knows all the attributes of a specified Aircraft instance,
4
Added:
and contains functions to analyse the airfoil's geometrical
5
Added:
& structural properties.
6
Added:
"""
7
Added:
8
Added:
import sys
9
Added:
import os.path
10
Added:
import matplotlib.pyplot as plt
11
Added:
import concurrent.futures
12
Added:
import logging
13
Added:
14
Added:
from . import drag, inertia, lift, mass
15
Added:
import generator
16
Added:
17
Added:
logging.basicConfig(filename='log_eval.txt',
18
Added:
level=logging.DEBUG,
19
Added:
format='%(asctime)s - %(levelname)s - %(message)s')
20
Added:
21
Added:
22
Added:
class Evaluator:
23
Added:
"""Performs structural evaluations on aircrafts.
24
Added:
Individual aircrafts must claim an Evaluator object as parent."""
25
Added:
def __init__(self, name):
26
Added:
self.name = name
27
Added:
self.aircrafts = []
28
Added:
self.results = []
29
Added:
30
Added:
self.I_ = {'x': 0, 'z': 0, 'xz': 0}
31
Added:
32
Added:
def analyze(self, aircraft):
33
Added:
"""Analyze a single aircraft."""
34
Added:
aircraft.results.update({'Lift': lift.get_lift_total(aircraft)})
35
Added:
aircraft.results.update({'Drag': drag.get_drag_total(aircraft)})
36
Added:
aircraft.results.update({'Mass': mass.get_mass_total(aircraft)})
37
Added:
aircraft.results.update({'Centroid': inertia.get_centroid(aircraft)})
38
Added:
return aircraft.results
39
Added:
40
Added:
def analyze_all(self):
41
Added:
"""Perform all analysis calculations on a all aircraft in evaluator."""
42
Added:
with concurrent.futures.ProcessPoolExecutor() as executor:
43
Added:
executor.map(self.analyze, self.aircrafts)
44
Added:
45
Added:
return None
46
Added:
47
Added:
# def analysis(self, V_x, V_z):
48
Added:
# """Perform all analysis calculations and store in class instance."""
49
Added:
50
Added:
# self.drag = self.get_drag(10)
51
Added:
# self.lift_rectangular = self.get_lift_rectangular(13.7)
52
Added:
# self.lift_elliptical = self.get_lift_elliptical(15)
53
Added:
# self.lift_total = self.get_lift_total()
54
Added:
# self.mass_dist = self.get_mass_distribution(self.mass_total)
55
Added:
# self.centroid = self.get_centroid()
56
Added:
# self.I_['x'] = self.get_inertia_terms()[0]
57
Added:
# self.I_['z'] = self.get_inertia_terms()[1]
58
Added:
# self.I_['xz'] = self.get_inertia_terms()[2]
59
Added:
# spar_dx = self.get_dx(self.spar)
60
Added:
# spar_dz = self.get_dz(self.spar)
61
Added:
# self.spar.dP_x = self.get_dP(spar_dx, spar_dz, V_x, 0,
62
Added:
# self.spar.cap_area)
63
Added:
# self.spar.dP_z = self.get_dP(spar_dx, spar_dz, 0, V_z,
64
Added:
# self.spar.cap_area)
65
Added:
# print("yayyyyy")
66
Added:
# return None
67
Added:
68
Added:
# print(f"Analysis results for {aircraft.name}:\n", results)
69
Added:
# self.results = self.get_lift_total(aircraft)
70
Added:
71
Added:
# self.drag = self.get_drag(10)
72
Added:
# self.lift_rectangular = self.get_lift_rectangular(13.7)
73
Added:
# self.lift_elliptical = self.get_lift_elliptical(15)
74
Added:
# self.lift_total = self.get_lift_total()
75
Added:
# self.mass_dist = self.get_mass_distribution(self.mass_total)
76
Added:
# self.centroid = self.get_centroid()
77
Added:
# self.I_['x'] = self.get_inertia_terms()[0]
78
Added:
# self.I_['z'] = self.get_inertia_terms()[1]
79
Added:
# self.I_['xz'] = self.get_inertia_terms()[2]
80
Added:
# spar_dx = self.get_dx(self.spar)
81
Added:
# spar_dz = self.get_dz(self.spar)
82
Added:
# self.spar.dP_x = self.get_dP(spar_dx, spar_dz, V_x, 0,
83
Added:
# self.spar.cap_area)
84
Added:
# self.spar.dP_z = self.get_dP(spar_dx, spar_dz, 0, V_z,
85
Added:
# self.spar.cap_area)
86
Added:
# return None
87
Added:
88
Added:
def tree_print(self, *aircrafts):
89
Added:
"""Print the list of subcomponents."""
90
Added:
name = f" TREE FOR {[i.name for i in aircrafts]} IN {self.name} "
91
Added:
num_of_dashes = len(name)
92
Added:
print(num_of_dashes * '-')
93
Added:
print(name)
94
Added:
for aircraft in aircrafts:
95
Added:
print(".")
96
Added:
print(f"`-- {aircraft}")
97
Added:
print(f" |--{aircraft.wing}")
98
Added:
print(f" | |-- {aircraft.wing.stringers}")
99
Added:
for spar in aircraft.wing.spars[:-1]:
100
Added:
print(f" | |-- {spar}")
101
Added:
print(f" | `-- {aircraft.wing.spars[-1]}")
102
Added:
print(f" |-- {aircraft.fuselage}")
103
Added:
print(f" `-- {aircraft.propulsion}")
104
Added:
print(num_of_dashes * '-')
105
Added:
return None
106
Added:
107
Added:
def tree_save(self,
108
Added:
*aircrafts,
109
Added:
save_path='/home/blendux/Projects/Aircraft_Studio/save'):
110
Added:
"""Save the evaluator's tree to a file."""
111
Added:
for aircraft in aircrafts:
112
Added:
file_name = f"{aircraft.name}_tree.txt"
113
Added:
full_path = os.path.join(save_path, file_name)
114
Added:
with open(full_path, 'w') as f:
115
Added:
try:
116
Added:
f.write(".\n")
117
Added:
f.write(f"`-- {aircraft}\n")
118
Added:
f.write(f" |--{aircraft.wing}\n")
119
Added:
for spar in aircraft.wing.spars[:-1]:
120
Added:
f.write(f" | |-- {spar}\n")
121
Added:
f.write(f" | `-- {aircraft.wing.spars[-1]}\n")
122
Added:
f.write(f" |-- {aircraft.fuselage}\n")
123
Added:
f.write(f" `-- {aircraft.propulsion}\n")
124
Added:
logging.debug(f'Successfully wrote to file {full_path}')
125
Added:
126
Added:
except IOError:
127
Added:
print(
128
Added:
f'Unable to write {file_name} to specified directory.',
129
Added:
'Was the full path passed to the function?')
130
Added:
return None
131
Added:
132
Added:
133
Added:
def plot_geom(evaluator):
134
Added:
"""This function plots analysis results over the airfoil's geometry."""
135
Added:
# Plot chord
136
Added:
x_chord = [0, evaluator.chord]
137
Added:
y_chord = [0, 0]
138
Added:
plt.plot(x_chord, y_chord, linewidth='1')
139
Added:
# Plot quarter chord
140
Added:
plt.plot(evaluator.chord / 4,
141
Added:
0,
142
Added:
'.',
143
Added:
color='g',
144
Added:
markersize=24,
145
Added:
label='Quarter-chord')
146
Added:
# Plot airfoil surfaces
147
Added:
x = [0.98 * x for x in evaluator.airfoil.x]
148
Added:
y = [0.98 * z for z in evaluator.airfoil.z]
149
Added:
plt.fill(x, y, color='w', linewidth='1', fill=False)
150
Added:
x = [1.02 * x for x in evaluator.airfoil.x]
151
Added:
y = [1.02 * z for z in evaluator.airfoil.z]
152
Added:
plt.fill(x, y, color='b', linewidth='1', fill=False)
153
Added:
154
Added:
# Plot spars
155
Added:
try:
156
Added:
for _ in range(len(evaluator.spar.x)):
157
Added:
x = (evaluator.spar.x[_])
158
Added:
y = (evaluator.spar.z[_])
159
Added:
plt.plot(x, y, '-', color='b')
160
Added:
except AttributeError:
161
Added:
print('No spars to plot.')
162
Added:
# Plot stringers
163
Added:
try:
164
Added:
for _ in range(0, len(evaluator.stringer.x)):
165
Added:
x = evaluator.stringer.x[_]
166
Added:
y = evaluator.stringer.z[_]
167
Added:
plt.plot(x, y, '.', color='y', markersize=12)
168
Added:
except AttributeError:
169
Added:
print('No stringers to plot.')
170
Added:
171
Added:
# Plot centroid
172
Added:
x = evaluator.centroid[0]
173
Added:
y = evaluator.centroid[1]
174
Added:
plt.plot(x, y, '.', color='r', markersize=24, label='centroid')
175
Added:
176
Added:
# Graph formatting
177
Added:
plt.xlabel('X axis')
178
Added:
plt.ylabel('Z axis')
179
Added:
180
Added:
plot_bound = max(evaluator.airfoil.x)
181
Added:
plt.xlim(-0.10 * plot_bound, 1.10 * plot_bound)
182
Added:
plt.ylim(-(1.10 * plot_bound / 2), (1.10 * plot_bound / 2))
183
Added:
plt.gca().set_aspect('equal', adjustable='box')
184
Added:
plt.gca().legend()
185
Added:
plt.grid(axis='both', linestyle=':', linewidth=1)
186
Added:
plt.show()
187
Added:
return None
188
Added:
189
Added:
190
Added:
def plot_lift(evaluator):
191
Added:
x = range(evaluator.semi_span)
192
Added:
y_1 = evaluator.lift_rectangular
193
Added:
y_2 = evaluator.lift_elliptical
194
Added:
y_3 = evaluator.lift_total
195
Added:
plt.plot(x, y_1, '.', color='b', markersize=4, label='Rectangular lift')
196
Added:
plt.plot(x, y_2, '.', color='g', markersize=4, label='Elliptical lift')
197
Added:
plt.plot(x, y_3, '.', color='r', markersize=4, label='Total lift')
198
Added:
199
Added:
# Graph formatting
200
Added:
plt.xlabel('Semi-span location')
201
Added:
plt.ylabel('Lift')
202
Added:
203
Added:
plt.gca().legend()
204
Added:
plt.grid(axis='both', linestyle=':', linewidth=1)
205
Added:
plt.show()
206
Added:
return None
evaluator/inertia.py
@@ -0,0 +1,64 @@
1
Added:
def get_centroid(aircraft):
2
Added:
"""Return the coordinates of the centroid."""
3
Added:
stringer_area = aircraft.stringer.area
4
Added:
cap_area = aircraft.spar.cap_area
5
Added:
6
Added:
caps_x = [value for spar in aircraft.spar.x for value in spar]
7
Added:
caps_z = [value for spar in aircraft.spar.z for value in spar]
8
Added:
stringers_x = aircraft.stringer.x
9
Added:
stringers_z = aircraft.stringer.z
10
Added:
11
Added:
denominator = float(
12
Added:
len(caps_x) * cap_area + len(stringers_x) * stringer_area)
13
Added:
14
Added:
centroid_x = float(
15
Added:
sum([x * cap_area
16
Added:
for x in caps_x]) + sum([x * stringer_area for x in stringers_x]))
17
Added:
centroid_x = centroid_x / denominator
18
Added:
19
Added:
centroid_z = float(
20
Added:
sum([z * cap_area
21
Added:
for z in caps_z]) + sum([z * stringer_area for z in stringers_z]))
22
Added:
centroid_z = centroid_z / denominator
23
Added:
24
Added:
return (centroid_x, centroid_z)
25
Added:
26
Added:
27
Added:
def get_inertia_terms(self):
28
Added:
"""Obtain all inertia terms."""
29
Added:
stringer_area = self.stringer.area
30
Added:
cap_area = self.spar.cap_area
31
Added:
32
Added:
# Adds upper and lower components' coordinates to list
33
Added:
x_stringers = self.stringer.x
34
Added:
z_stringers = self.stringer.z
35
Added:
x_spars = self.spar.x[:][0] + self.spar.x[:][1]
36
Added:
z_spars = self.spar.z[:][0] + self.spar.z[:][1]
37
Added:
stringer_count = range(len(x_stringers))
38
Added:
spar_count = range(len(self.spar.x))
39
Added:
40
Added:
# I_x is the sum of the contributions of the spar caps and stringers
41
Added:
# TODO: replace list indices with dictionary value
42
Added:
I_x = sum(
43
Added:
[cap_area * (z_spars[i] - self.centroid[1])**2 for i in spar_count])
44
Added:
I_x += sum([
45
Added:
stringer_area * (z_stringers[i] - self.centroid[1])**2
46
Added:
for i in stringer_count
47
Added:
])
48
Added:
49
Added:
I_z = sum(
50
Added:
[cap_area * (x_spars[i] - self.centroid[0])**2 for i in spar_count])
51
Added:
I_z += sum([
52
Added:
stringer_area * (x_stringers[i] - self.centroid[0])**2
53
Added:
for i in stringer_count
54
Added:
])
55
Added:
56
Added:
I_xz = sum([
57
Added:
cap_area * (x_spars[i] - self.centroid[0]) *
58
Added:
(z_spars[i] - self.centroid[1]) for i in spar_count
59
Added:
])
60
Added:
I_xz += sum([
61
Added:
stringer_area * (x_stringers[i] - self.centroid[0]) *
62
Added:
(z_stringers[i] - self.centroid[1]) for i in stringer_count
63
Added:
])
64
Added:
return (I_x, I_z, I_xz)
evaluator/lift.py
@@ -0,0 +1,30 @@
1
Added:
import numpy as np
2
Added:
from math import sqrt
3
Added:
4
Added:
5
Added:
def _get_lift_rectangular(aircraft, lift=50):
6
Added:
L_prime = np.array([
7
Added:
lift / (aircraft.wing.semi_span * 2)
8
Added:
for _ in range(aircraft.wing.semi_span)
9
Added:
])
10
Added:
return L_prime
11
Added:
12
Added:
13
Added:
def _get_lift_elliptical(aircraft, L_0=3.2):
14
Added:
L_prime = np.array([
15
Added:
0.5 * L_0 / (aircraft.wing.semi_span * 2) *
16
Added:
sqrt(1 - (y / aircraft.wing.semi_span)**2)
17
Added:
for y in range(aircraft.wing.semi_span)
18
Added:
])
19
Added:
return L_prime
20
Added:
21
Added:
22
Added:
def get_lift_total(self, aircraft):
23
Added:
"""Combination of rectangular and elliptical lift."""
24
Added:
# F_z = self._get_lift_rectangular(aircraft) + self._get_lift_elliptical(
25
Added:
# aircraft)
26
Added:
# F_z = self._get_lift_rectangular(
27
Added:
# aircraft) + self._get_lift_elliptical(aircraft) / 2
28
Added:
# F_z = [i + j for i, j in self._get_lift_rectangular]
29
Added:
# return F_z
30
Added:
return 420
evaluator/mass.py
@@ -0,0 +1,8 @@
1
Added:
def get_mass_distribution(self, total_mass):
2
Added:
F_z = [total_mass / self.semi_span for x in range(0, self.semi_span)]
3
Added:
return F_z
4
Added:
5
Added:
6
Added:
def get_mass_total(self, aircraft):
7
Added:
"""Get the total aircraft mass."""
8
Added:
return 2000
example_airfoil.py
@@ -42,33 +42,35 @@
42
42
43
43
eval = evaluator.Evaluator("eval")
44
44
45
Removed:
ac = creator.base.Aircraft(eval, "ac")
46
Removed:
af = creator.wing.Airfoil(ac, 'af')
47
Removed:
af.add_naca(2412)
48
Removed:
spar1 = creator.wing.Spar(af, 'spar1')
49
Removed:
spar2 = creator.wing.Spar(af, 'spar2', 0.57)
50
Removed:
# spar2 = creator.wing.Spar(af, 'spar2', 0.7)
51
Removed:
stringer = creator.wing.Stringer(af, 'stringer', 5, 6, 5, 4)
52
Removed:
stringer.info_save(SAVE_PATH)
45
Added:
# ac = creator.base.Aircraft(eval, "ac")
46
Added:
# af = creator.wing.Airfoil(ac, 'af')
47
Added:
# af.add_naca(2412)
48
Added:
# spar1 = creator.wing.Spar(af, 'spar1')
49
Added:
# spar2 = creator.wing.Spar(af, 'spar2', 0.57)
50
Added:
# # spar2 = creator.wing.Spar(af, 'spar2', 0.7)
51
Added:
# stringer = creator.wing.Stringer(af, 'stringer', 5, 6, 5, 4)
52
Added:
# stringer.info_save(SAVE_PATH)
53
53
54
Removed:
ac2 = creator.base.Aircraft(eval, "ac2")
55
Removed:
af2 = creator.wing.Airfoil(ac2, 'af2')
56
Removed:
af2.add_naca(3412)
57
Removed:
af2.info_save()
58
Removed:
spar3 = creator.wing.Spar(af2, 'spar3', 0.23)
59
Removed:
spar4 = creator.wing.Spar(af2, 'spar4', 0.67)
60
Removed:
stringer2 = creator.wing.Stringer(af2, 'stringer2')
61
Removed:
stringer2.info_save(SAVE_PATH)
54
Added:
# ac2 = creator.base.Aircraft(eval, "ac2")
55
Added:
# af2 = creator.wing.Airfoil(ac2, 'af2')
56
Added:
# af2.add_naca(3412)
57
Added:
# af2.info_save()
58
Added:
# spar3 = creator.wing.Spar(af2, 'spar3', 0.23)
59
Added:
# spar4 = creator.wing.Spar(af2, 'spar4', 0.67)
60
Added:
# stringer2 = creator.wing.Stringer(af2, 'stringer2')
61
Added:
# stringer2.info_save(SAVE_PATH)
62
62
63
Removed:
64
63
for _ in range(100):
65
64
aircraft = generator.default_aircraft(eval)
66
65
# eval.tree_print(aircraft)
67
66
68
67
eval.analyze_all()
69
68
70
Removed:
# creator.wing.plot_geom(generator.default_aircraft(eval).wing)
71
Removed:
eval.tree_print(generator.default_aircraft(eval))
69
Added:
# for i in eval.aircrafts:
70
Added:
# print(i.name)
71
Added:
72
Added:
# for i in eval.aircrafts:
73
Added:
# print(i.results)
72
74
73
75
# Final execution time
74
76
final_time = time.time() - start_time
generator.py
@@ -1,47 +0,0 @@
1
Removed:
"""
2
Removed:
The generator.py module contains classes describing genetic populations
3
Removed:
and methods to generate default aircraft.
4
Removed:
"""
5
Removed:
6
Removed:
import random
7
Removed:
import concurrent.futures
8
Removed:
9
Removed:
import creator
10
Removed:
11
Removed:
12
Removed:
def default_aircraft(evaluator):
13
Removed:
"""Generate a default aircraft with a random name."""
14
Removed:
name = 'default_aircraft_' + str(random.randrange(1000, 9999))
15
Removed:
aircraft = creator.base.Aircraft(evaluator, name)
16
Removed:
airfoil = creator.wing.Airfoil(aircraft, 'default_airfoil')
17
Removed:
airfoil.add_naca(2412)
18
Removed:
soar1 = creator.wing.Spar(airfoil, 'default_spar_1', 0.30)
19
Removed:
soar2 = creator.wing.Spar(airfoil, 'default_spar_2', 0.60)
20
Removed:
stringer = creator.wing.Stringer(airfoil, 'default_stringer')
21
Removed:
return aircraft
22
Removed:
23
Removed:
24
Removed:
def default_fuselage():
25
Removed:
pass
26
Removed:
27
Removed:
28
Removed:
def default_propulsion():
29
Removed:
pass
30
Removed:
31
Removed:
32
Removed:
class Population():
33
Removed:
"""Collection of random airfoils."""
34
Removed:
def __init__(self, size):
35
Removed:
af = creator.Airfoil
36
Removed:
# print(af)
37
Removed:
self.size = size
38
Removed:
self.gen_number = 0 # incremented for every generation
39
Removed:
40
Removed:
def mutate(self, prob_mt):
41
Removed:
"""Randomly mutate the genes of prob_mt % of the population."""
42
Removed:
def crossover(self, prob_cx):
43
Removed:
"""Combine the genes of prob_cx % of the population."""
44
Removed:
def reproduce(self, prob_rp):
45
Removed:
"""Pass on the genes of the fittest prob_rp % of the population."""
46
Removed:
def fitness():
47
Removed:
"""Rate the fitness of an individual on a relative scale (0-100)"""
generator/__init__.py
@@ -0,0 +1,1 @@
1
Added:
from .generator import *
generator/generator.py
@@ -0,0 +1,47 @@
1
Added:
"""
2
Added:
The generator.py module contains classes describing genetic populations
3
Added:
and methods to generate default aircraft.
4
Added:
"""
5
Added:
6
Added:
import random
7
Added:
8
Added:
import creator
9
Added:
import evaluator
10
Added:
11
Added:
12
Added:
def default_aircraft(evaluator_instance):
13
Added:
"""Generate a default aircraft with a random name."""
14
Added:
name = 'default_aircraft_' + str(random.randrange(1000, 9999))
15
Added:
aircraft = creator.base.Aircraft(evaluator_instance, name)
16
Added:
airfoil = creator.wing.Airfoil(aircraft, 'default_airfoil')
17
Added:
airfoil.add_naca(2412)
18
Added:
soar1 = creator.wing.Spar(airfoil, 'default_spar_1', 0.30)
19
Added:
soar2 = creator.wing.Spar(airfoil, 'default_spar_2', 0.60)
20
Added:
stringer = creator.wing.Stringer(airfoil, 'default_stringer')
21
Added:
return aircraft
22
Added:
23
Added:
24
Added:
def default_fuselage():
25
Added:
pass
26
Added:
27
Added:
28
Added:
def default_propulsion():
29
Added:
pass
30
Added:
31
Added:
32
Added:
class Population():
33
Added:
"""Collection of random airfoils."""
34
Added:
def __init__(self, size):
35
Added:
af = creator.Airfoil
36
Added:
# print(af)
37
Added:
self.size = size
38
Added:
self.gen_number = 0 # incremented for every generation
39
Added:
40
Added:
def mutate(self, prob_mt):
41
Added:
"""Randomly mutate the genes of prob_mt % of the population."""
42
Added:
def crossover(self, prob_cx):
43
Added:
"""Combine the genes of prob_cx % of the population."""
44
Added:
def reproduce(self, prob_rp):
45
Added:
"""Pass on the genes of the fittest prob_rp % of the population."""
46
Added:
def fitness():
47
Added:
"""Rate the fitness of an individual on a relative scale (0-100)"""
log_base.txt
@@ -11168,3 +11168,168 @@
11168
11168
2019-10-19 18:44:05,033 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11169
11169
2019-10-19 18:44:05,052 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11170
11170
2019-10-19 18:44:05,053 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11171
Added:
2019-10-20 16:35:55,069 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11172
Added:
2019-10-20 16:35:55,090 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11173
Added:
2019-10-20 16:35:55,091 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11174
Added:
2019-10-20 16:36:33,165 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11175
Added:
2019-10-20 16:36:33,184 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11176
Added:
2019-10-20 16:36:33,185 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11177
Added:
2019-10-20 17:16:42,212 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11178
Added:
2019-10-20 17:16:42,231 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11179
Added:
2019-10-20 17:16:42,233 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11180
Added:
2019-10-20 17:16:53,314 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11181
Added:
2019-10-20 17:16:53,334 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11182
Added:
2019-10-20 17:16:53,335 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11183
Added:
2019-10-20 17:18:21,479 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11184
Added:
2019-10-20 17:18:21,499 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11185
Added:
2019-10-20 17:18:21,500 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11186
Added:
2019-10-20 17:52:09,050 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11187
Added:
2019-10-20 17:52:09,068 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11188
Added:
2019-10-20 17:52:09,069 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11189
Added:
2019-10-20 17:52:17,872 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11190
Added:
2019-10-20 17:52:17,890 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11191
Added:
2019-10-20 17:52:17,891 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11192
Added:
2019-10-20 17:53:54,657 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11193
Added:
2019-10-20 17:53:54,675 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11194
Added:
2019-10-20 17:53:54,676 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11195
Added:
2019-10-20 17:55:08,034 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11196
Added:
2019-10-20 17:55:08,052 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11197
Added:
2019-10-20 17:55:08,053 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11198
Added:
2019-10-20 17:55:13,302 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11199
Added:
2019-10-20 17:55:13,321 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11200
Added:
2019-10-20 17:55:13,322 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11201
Added:
2019-10-20 17:55:37,090 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11202
Added:
2019-10-20 17:55:37,109 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11203
Added:
2019-10-20 17:55:37,110 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11204
Added:
2019-10-20 17:55:41,154 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11205
Added:
2019-10-20 17:55:41,173 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11206
Added:
2019-10-20 17:55:41,174 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11207
Added:
2019-10-20 18:05:32,332 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11208
Added:
2019-10-20 18:05:32,350 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11209
Added:
2019-10-20 18:05:32,351 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11210
Added:
2019-10-20 18:22:19,488 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11211
Added:
2019-10-20 18:22:19,507 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11212
Added:
2019-10-20 18:22:19,508 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11213
Added:
2019-10-20 18:25:32,877 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11214
Added:
2019-10-20 18:25:32,896 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11215
Added:
2019-10-20 18:25:32,897 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11216
Added:
2019-10-20 18:25:37,652 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11217
Added:
2019-10-20 18:25:37,671 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11218
Added:
2019-10-20 18:25:37,672 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11219
Added:
2019-10-20 18:25:44,602 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11220
Added:
2019-10-20 18:25:44,621 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11221
Added:
2019-10-20 18:25:44,622 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11222
Added:
2019-10-20 18:26:07,410 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11223
Added:
2019-10-20 18:26:07,429 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11224
Added:
2019-10-20 18:26:07,430 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11225
Added:
2019-10-20 18:40:34,777 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11226
Added:
2019-10-20 18:40:34,796 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11227
Added:
2019-10-20 18:40:34,797 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11228
Added:
2019-10-20 18:41:10,388 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11229
Added:
2019-10-20 18:41:10,407 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11230
Added:
2019-10-20 18:41:10,408 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11231
Added:
2019-10-20 18:41:29,529 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11232
Added:
2019-10-20 18:41:29,549 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11233
Added:
2019-10-20 18:41:29,550 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11234
Added:
2019-10-20 18:43:19,906 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11235
Added:
2019-10-20 18:43:19,927 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11236
Added:
2019-10-20 18:43:19,928 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11237
Added:
2019-10-20 18:46:42,716 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11238
Added:
2019-10-20 18:46:42,736 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11239
Added:
2019-10-20 18:46:42,737 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11240
Added:
2019-10-20 18:48:14,657 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11241
Added:
2019-10-20 18:48:14,677 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11242
Added:
2019-10-20 18:48:14,678 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11243
Added:
2019-10-20 18:48:23,582 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11244
Added:
2019-10-20 18:48:23,600 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11245
Added:
2019-10-20 18:48:23,601 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11246
Added:
2019-10-20 18:50:09,424 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11247
Added:
2019-10-20 18:50:09,444 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11248
Added:
2019-10-20 18:50:09,445 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11249
Added:
2019-10-20 18:50:38,429 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11250
Added:
2019-10-20 18:50:38,448 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11251
Added:
2019-10-20 18:50:38,449 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11252
Added:
2019-10-20 18:52:43,896 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11253
Added:
2019-10-20 18:52:43,916 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11254
Added:
2019-10-20 18:52:43,916 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11255
Added:
2019-10-20 18:53:10,207 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11256
Added:
2019-10-20 18:53:10,226 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11257
Added:
2019-10-20 18:53:10,227 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11258
Added:
2019-10-20 18:54:18,035 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11259
Added:
2019-10-20 18:54:18,055 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11260
Added:
2019-10-20 18:54:18,056 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11261
Added:
2019-10-20 18:55:01,440 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11262
Added:
2019-10-20 18:55:01,459 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11263
Added:
2019-10-20 18:55:01,460 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11264
Added:
2019-10-20 18:58:28,691 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11265
Added:
2019-10-20 18:58:28,710 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11266
Added:
2019-10-20 18:58:28,711 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11267
Added:
2019-10-20 18:58:37,012 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11268
Added:
2019-10-20 18:58:37,032 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11269
Added:
2019-10-20 18:58:37,033 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11270
Added:
2019-10-20 18:59:24,354 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11271
Added:
2019-10-20 18:59:24,373 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11272
Added:
2019-10-20 18:59:24,374 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11273
Added:
2019-10-20 18:59:26,853 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11274
Added:
2019-10-20 18:59:26,873 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11275
Added:
2019-10-20 18:59:26,874 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11276
Added:
2019-10-20 18:59:34,308 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11277
Added:
2019-10-20 18:59:34,327 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11278
Added:
2019-10-20 18:59:34,328 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11279
Added:
2019-10-20 18:59:41,748 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11280
Added:
2019-10-20 18:59:41,767 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11281
Added:
2019-10-20 18:59:41,768 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11282
Added:
2019-10-20 19:00:09,987 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11283
Added:
2019-10-20 19:00:10,006 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11284
Added:
2019-10-20 19:00:10,007 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11285
Added:
2019-10-20 19:00:53,583 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11286
Added:
2019-10-20 19:00:53,603 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11287
Added:
2019-10-20 19:00:53,604 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11288
Added:
2019-10-20 19:01:49,388 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11289
Added:
2019-10-20 19:01:49,408 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11290
Added:
2019-10-20 19:01:49,409 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11291
Added:
2019-10-20 19:01:59,113 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11292
Added:
2019-10-20 19:01:59,133 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11293
Added:
2019-10-20 19:01:59,134 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11294
Added:
2019-10-20 19:05:00,700 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11295
Added:
2019-10-20 19:05:00,719 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11296
Added:
2019-10-20 19:05:00,720 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11297
Added:
2019-10-20 19:05:16,953 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11298
Added:
2019-10-20 19:05:16,973 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11299
Added:
2019-10-20 19:05:16,974 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11300
Added:
2019-10-20 19:08:59,952 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11301
Added:
2019-10-20 19:08:59,972 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11302
Added:
2019-10-20 19:08:59,973 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11303
Added:
2019-10-20 19:09:31,123 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11304
Added:
2019-10-20 19:09:31,141 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11305
Added:
2019-10-20 19:09:31,142 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11306
Added:
2019-10-20 19:10:46,989 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11307
Added:
2019-10-20 19:10:47,009 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11308
Added:
2019-10-20 19:10:47,010 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11309
Added:
2019-10-20 19:12:17,772 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11310
Added:
2019-10-20 19:12:17,792 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11311
Added:
2019-10-20 19:12:17,793 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11312
Added:
2019-10-20 19:12:40,442 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11313
Added:
2019-10-20 19:12:40,462 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11314
Added:
2019-10-20 19:12:40,463 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11315
Added:
2019-10-20 19:13:27,072 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11316
Added:
2019-10-20 19:13:27,091 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11317
Added:
2019-10-20 19:13:27,092 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11318
Added:
2019-10-20 19:14:55,494 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11319
Added:
2019-10-20 19:14:55,513 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11320
Added:
2019-10-20 19:14:55,513 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11321
Added:
2019-10-20 19:15:55,311 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11322
Added:
2019-10-20 19:15:55,331 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11323
Added:
2019-10-20 19:15:55,332 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11324
Added:
2019-10-20 19:16:34,705 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11325
Added:
2019-10-20 19:16:34,723 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11326
Added:
2019-10-20 19:16:34,724 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11327
Added:
2019-10-20 19:16:59,725 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11328
Added:
2019-10-20 19:16:59,745 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11329
Added:
2019-10-20 19:16:59,746 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11330
Added:
2019-10-20 19:17:11,409 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11331
Added:
2019-10-20 19:17:11,429 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11332
Added:
2019-10-20 19:17:11,430 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt
11333
Added:
2019-10-20 19:18:40,265 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer_info.txt
11334
Added:
2019-10-20 19:18:40,285 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/af2_info.txt
11335
Added:
2019-10-20 19:18:40,286 - DEBUG - Successfully wrote to file /home/blendux/Projects/Aircraft_Studio/save/stringer2_info.txt