Commence declassification of Evaluator

Pointless to have a separate object for the Evaluator when a collection of evaluator.py methods does the trick.

Commit
5e82dedea4c56eafc1bba4f3ec8677b15f51c03f
Author
blendoit <blendoit@gmail.com>
Author date
Committer
blendoit <blendoit@gmail.com>
Committer date
Changed files
Pipfile
index 00000000..309b2b0f 000000..100644
@@ -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
index 00000000..7ee8515e 000000..100644
@@ -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
index 7662f945..818c7b27 100644..100644
@@ -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
index 75c58f9e..ad4c4432 100644..100644
@@ -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
index 2adc7027..00000000 100644..000000
@@ -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
index 00000000..6eedafce 000000..100644
@@ -0,0 +1,1 @@
1 Added: from .evaluator import Evaluator
evaluator/dP.py
index 00000000..b6aaa3b6 000000..100644
@@ -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
index 00000000..df79e6a3 000000..100644
@@ -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
index 00000000..b2b6e189 000000..100644
@@ -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
index 00000000..fea728c9 000000..100644
@@ -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
index 00000000..6b4363eb 000000..100644
@@ -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
index 00000000..514c59b1 000000..100644
@@ -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
index 6c69bf08..11fd4d51 100644..100644
@@ -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
index 30fc0399..00000000 100644..000000
@@ -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
index 00000000..4f233cbb 000000..100644
@@ -0,0 +1,1 @@
1 Added: from .generator import *
generator/generator.py
index 00000000..3af48505 000000..100644
@@ -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
index e2e1c09e..25e95fd8 100644..100644
@@ -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