├── .gitignore ├── CAD ├── FrontPanel.stl ├── PlanetGear.stl ├── Pointer.stl ├── RearPanel.stl ├── RearSupport.stl ├── RingGear.stl ├── STEP │ ├── FrontPanel.step │ ├── PlanetGear.step │ ├── Pointer.step │ ├── RearPanel.step │ ├── RearSupport.step │ ├── RingGear.step │ ├── StandBottom.step │ ├── StandTop.step │ ├── Upright.step │ └── WireCover.step ├── StandBottom.stl ├── StandTop.stl ├── Upright.stl └── WireCover.stl ├── README.md ├── Schematic.png └── iss-tracker ├── arduino_secrets.h ├── coord.cpp ├── coord.h ├── defs.h ├── display_utils.h ├── iss-tracker.ino ├── math_utils.cpp ├── math_utils.h ├── orbit_utils.cpp ├── orbit_utils.h ├── pedestal.cpp ├── pedestal.h ├── wgs84.h ├── wifi_utils.cpp └── wifi_utils.h /.gitignore: -------------------------------------------------------------------------------- 1 | .pio 2 | .vscode/.browse.c_cpp.db* 3 | .vscode/c_cpp_properties.json 4 | .vscode/launch.json 5 | .vscode/ipch 6 | -------------------------------------------------------------------------------- /CAD/FrontPanel.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dpelgrift/ISS-Tracker/ed156a5c9b999c7eab7671b51ed43e5d86ebc045/CAD/FrontPanel.stl -------------------------------------------------------------------------------- /CAD/PlanetGear.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dpelgrift/ISS-Tracker/ed156a5c9b999c7eab7671b51ed43e5d86ebc045/CAD/PlanetGear.stl -------------------------------------------------------------------------------- /CAD/Pointer.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dpelgrift/ISS-Tracker/ed156a5c9b999c7eab7671b51ed43e5d86ebc045/CAD/Pointer.stl -------------------------------------------------------------------------------- /CAD/RearPanel.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dpelgrift/ISS-Tracker/ed156a5c9b999c7eab7671b51ed43e5d86ebc045/CAD/RearPanel.stl -------------------------------------------------------------------------------- /CAD/RearSupport.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dpelgrift/ISS-Tracker/ed156a5c9b999c7eab7671b51ed43e5d86ebc045/CAD/RearSupport.stl -------------------------------------------------------------------------------- /CAD/RingGear.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dpelgrift/ISS-Tracker/ed156a5c9b999c7eab7671b51ed43e5d86ebc045/CAD/RingGear.stl -------------------------------------------------------------------------------- /CAD/STEP/RearPanel.step: -------------------------------------------------------------------------------- 1 | ISO-10303-21; 2 | HEADER; 3 | /* Generated by software containing ST-Developer 4 | * from STEP Tools, Inc. (www.steptools.com) 5 | */ 6 | /* OPTION: using custom renumber hook */ 7 | 8 | FILE_DESCRIPTION( 9 | /* description */ ('STEP AP242', 10 | 'CAx-IF Rec.Pracs.---Representation and Presentation of Product Manufa 11 | cturing Information (PMI)---4.0---2014-10-13', 12 | 'CAx-IF Rec.Pracs.---3D Tessellated Geometry---0.4---2014-09-14','2;1'), 13 | 14 | /* implementation_level */ '2;1'); 15 | 16 | FILE_NAME( 17 | /* name */ '642362bf06b4aa79901b45a5', 18 | /* time_stamp */ '2023-03-28T21:57:19+00:00', 19 | /* author */ (''), 20 | /* organization */ (''), 21 | /* preprocessor_version */ 'ST-DEVELOPER v18.102', 22 | /* originating_system */ ' ', 23 | /* authorisation */ ' '); 24 | 25 | FILE_SCHEMA (('AP242_MANAGED_MODEL_BASED_3D_ENGINEERING_MIM_LF { 1 0 10303 442 1 1 4 }')); 26 | ENDSEC; 27 | 28 | DATA; 29 | #10=SHAPE_REPRESENTATION_RELATIONSHIP('','',#845,#11); 30 | #11=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#843),#1363); 31 | #12=CYLINDRICAL_SURFACE('',#888,0.006); 32 | #13=CYLINDRICAL_SURFACE('',#889,0.006); 33 | #14=CYLINDRICAL_SURFACE('',#890,0.006); 34 | #15=CYLINDRICAL_SURFACE('',#891,0.006); 35 | #16=CYLINDRICAL_SURFACE('',#892,0.00635); 36 | #17=CYLINDRICAL_SURFACE('',#894,0.00635); 37 | #18=CYLINDRICAL_SURFACE('',#896,0.00365); 38 | #19=CYLINDRICAL_SURFACE('',#907,0.00145); 39 | #20=CYLINDRICAL_SURFACE('',#908,0.00145); 40 | #21=CIRCLE('',#848,0.00635); 41 | #22=CIRCLE('',#849,0.00635); 42 | #23=CIRCLE('',#851,0.006); 43 | #24=CIRCLE('',#852,0.006); 44 | #25=CIRCLE('',#855,0.00365); 45 | #26=CIRCLE('',#856,0.00635); 46 | #27=CIRCLE('',#857,0.00635); 47 | #28=CIRCLE('',#860,0.00145); 48 | #29=CIRCLE('',#861,0.00145); 49 | #30=CIRCLE('',#862,0.006); 50 | #31=CIRCLE('',#863,0.006); 51 | #32=CIRCLE('',#864,0.006); 52 | #33=CIRCLE('',#865,0.006); 53 | #34=CIRCLE('',#870,0.006); 54 | #35=CIRCLE('',#871,0.006); 55 | #36=CIRCLE('',#879,0.00145); 56 | #37=CIRCLE('',#887,0.00145); 57 | #38=CIRCLE('',#897,0.00365); 58 | #39=ORIENTED_EDGE('',*,*,#263,.T.); 59 | #40=ORIENTED_EDGE('',*,*,#264,.T.); 60 | #41=ORIENTED_EDGE('',*,*,#265,.T.); 61 | #42=ORIENTED_EDGE('',*,*,#266,.T.); 62 | #43=ORIENTED_EDGE('',*,*,#267,.T.); 63 | #44=ORIENTED_EDGE('',*,*,#268,.F.); 64 | #45=ORIENTED_EDGE('',*,*,#269,.F.); 65 | #46=ORIENTED_EDGE('',*,*,#270,.T.); 66 | #47=ORIENTED_EDGE('',*,*,#271,.F.); 67 | #48=ORIENTED_EDGE('',*,*,#272,.T.); 68 | #49=ORIENTED_EDGE('',*,*,#273,.T.); 69 | #50=ORIENTED_EDGE('',*,*,#274,.T.); 70 | #51=ORIENTED_EDGE('',*,*,#275,.F.); 71 | #52=ORIENTED_EDGE('',*,*,#276,.T.); 72 | #53=ORIENTED_EDGE('',*,*,#277,.T.); 73 | #54=ORIENTED_EDGE('',*,*,#278,.F.); 74 | #55=ORIENTED_EDGE('',*,*,#279,.F.); 75 | #56=ORIENTED_EDGE('',*,*,#280,.T.); 76 | #57=ORIENTED_EDGE('',*,*,#281,.T.); 77 | #58=ORIENTED_EDGE('',*,*,#282,.T.); 78 | #59=ORIENTED_EDGE('',*,*,#283,.T.); 79 | #60=ORIENTED_EDGE('',*,*,#284,.T.); 80 | #61=ORIENTED_EDGE('',*,*,#285,.T.); 81 | #62=ORIENTED_EDGE('',*,*,#286,.T.); 82 | #63=ORIENTED_EDGE('',*,*,#287,.T.); 83 | #64=ORIENTED_EDGE('',*,*,#288,.T.); 84 | #65=ORIENTED_EDGE('',*,*,#289,.T.); 85 | #66=ORIENTED_EDGE('',*,*,#268,.T.); 86 | #67=ORIENTED_EDGE('',*,*,#290,.T.); 87 | #68=ORIENTED_EDGE('',*,*,#291,.T.); 88 | #69=ORIENTED_EDGE('',*,*,#292,.T.); 89 | #70=ORIENTED_EDGE('',*,*,#293,.F.); 90 | #71=ORIENTED_EDGE('',*,*,#294,.F.); 91 | #72=ORIENTED_EDGE('',*,*,#295,.T.); 92 | #73=ORIENTED_EDGE('',*,*,#296,.F.); 93 | #74=ORIENTED_EDGE('',*,*,#297,.F.); 94 | #75=ORIENTED_EDGE('',*,*,#298,.T.); 95 | #76=ORIENTED_EDGE('',*,*,#299,.F.); 96 | #77=ORIENTED_EDGE('',*,*,#300,.F.); 97 | #78=ORIENTED_EDGE('',*,*,#301,.F.); 98 | #79=ORIENTED_EDGE('',*,*,#302,.T.); 99 | #80=ORIENTED_EDGE('',*,*,#294,.T.); 100 | #81=ORIENTED_EDGE('',*,*,#303,.F.); 101 | #82=ORIENTED_EDGE('',*,*,#304,.T.); 102 | #83=ORIENTED_EDGE('',*,*,#305,.T.); 103 | #84=ORIENTED_EDGE('',*,*,#281,.F.); 104 | #85=ORIENTED_EDGE('',*,*,#306,.T.); 105 | #86=ORIENTED_EDGE('',*,*,#270,.F.); 106 | #87=ORIENTED_EDGE('',*,*,#307,.F.); 107 | #88=ORIENTED_EDGE('',*,*,#301,.T.); 108 | #89=ORIENTED_EDGE('',*,*,#308,.F.); 109 | #90=ORIENTED_EDGE('',*,*,#309,.F.); 110 | #91=ORIENTED_EDGE('',*,*,#293,.T.); 111 | #92=ORIENTED_EDGE('',*,*,#310,.T.); 112 | #93=ORIENTED_EDGE('',*,*,#311,.T.); 113 | #94=ORIENTED_EDGE('',*,*,#312,.F.); 114 | #95=ORIENTED_EDGE('',*,*,#313,.T.); 115 | #96=ORIENTED_EDGE('',*,*,#265,.F.); 116 | #97=ORIENTED_EDGE('',*,*,#314,.T.); 117 | #98=ORIENTED_EDGE('',*,*,#315,.T.); 118 | #99=ORIENTED_EDGE('',*,*,#316,.T.); 119 | #100=ORIENTED_EDGE('',*,*,#317,.T.); 120 | #101=ORIENTED_EDGE('',*,*,#304,.F.); 121 | #102=ORIENTED_EDGE('',*,*,#303,.T.); 122 | #103=ORIENTED_EDGE('',*,*,#307,.T.); 123 | #104=ORIENTED_EDGE('',*,*,#269,.T.); 124 | #105=ORIENTED_EDGE('',*,*,#295,.F.); 125 | #106=ORIENTED_EDGE('',*,*,#302,.F.); 126 | #107=ORIENTED_EDGE('',*,*,#315,.F.); 127 | #108=ORIENTED_EDGE('',*,*,#318,.T.); 128 | #109=ORIENTED_EDGE('',*,*,#279,.T.); 129 | #110=ORIENTED_EDGE('',*,*,#319,.T.); 130 | #111=ORIENTED_EDGE('',*,*,#320,.F.); 131 | #112=ORIENTED_EDGE('',*,*,#321,.T.); 132 | #113=ORIENTED_EDGE('',*,*,#312,.T.); 133 | #114=ORIENTED_EDGE('',*,*,#322,.T.); 134 | #115=ORIENTED_EDGE('',*,*,#323,.F.); 135 | #116=ORIENTED_EDGE('',*,*,#324,.F.); 136 | #117=ORIENTED_EDGE('',*,*,#325,.F.); 137 | #118=ORIENTED_EDGE('',*,*,#326,.F.); 138 | #119=ORIENTED_EDGE('',*,*,#327,.F.); 139 | #120=ORIENTED_EDGE('',*,*,#328,.F.); 140 | #121=ORIENTED_EDGE('',*,*,#291,.F.); 141 | #122=ORIENTED_EDGE('',*,*,#329,.T.); 142 | #123=ORIENTED_EDGE('',*,*,#320,.T.); 143 | #124=ORIENTED_EDGE('',*,*,#330,.T.); 144 | #125=ORIENTED_EDGE('',*,*,#331,.T.); 145 | #126=ORIENTED_EDGE('',*,*,#323,.T.); 146 | #127=ORIENTED_EDGE('',*,*,#332,.T.); 147 | #128=ORIENTED_EDGE('',*,*,#333,.T.); 148 | #129=ORIENTED_EDGE('',*,*,#334,.F.); 149 | #130=ORIENTED_EDGE('',*,*,#328,.T.); 150 | #131=ORIENTED_EDGE('',*,*,#335,.T.); 151 | #132=ORIENTED_EDGE('',*,*,#336,.T.); 152 | #133=ORIENTED_EDGE('',*,*,#332,.F.); 153 | #134=ORIENTED_EDGE('',*,*,#327,.T.); 154 | #135=ORIENTED_EDGE('',*,*,#337,.T.); 155 | #136=ORIENTED_EDGE('',*,*,#338,.T.); 156 | #137=ORIENTED_EDGE('',*,*,#335,.F.); 157 | #138=ORIENTED_EDGE('',*,*,#326,.T.); 158 | #139=ORIENTED_EDGE('',*,*,#339,.T.); 159 | #140=ORIENTED_EDGE('',*,*,#340,.T.); 160 | #141=ORIENTED_EDGE('',*,*,#337,.F.); 161 | #142=ORIENTED_EDGE('',*,*,#325,.T.); 162 | #143=ORIENTED_EDGE('',*,*,#341,.T.); 163 | #144=ORIENTED_EDGE('',*,*,#342,.T.); 164 | #145=ORIENTED_EDGE('',*,*,#339,.F.); 165 | #146=ORIENTED_EDGE('',*,*,#324,.T.); 166 | #147=ORIENTED_EDGE('',*,*,#334,.T.); 167 | #148=ORIENTED_EDGE('',*,*,#343,.T.); 168 | #149=ORIENTED_EDGE('',*,*,#341,.F.); 169 | #150=ORIENTED_EDGE('',*,*,#344,.T.); 170 | #151=ORIENTED_EDGE('',*,*,#333,.F.); 171 | #152=ORIENTED_EDGE('',*,*,#336,.F.); 172 | #153=ORIENTED_EDGE('',*,*,#338,.F.); 173 | #154=ORIENTED_EDGE('',*,*,#340,.F.); 174 | #155=ORIENTED_EDGE('',*,*,#342,.F.); 175 | #156=ORIENTED_EDGE('',*,*,#343,.F.); 176 | #157=ORIENTED_EDGE('',*,*,#345,.T.); 177 | #158=ORIENTED_EDGE('',*,*,#346,.F.); 178 | #159=ORIENTED_EDGE('',*,*,#347,.F.); 179 | #160=ORIENTED_EDGE('',*,*,#285,.F.); 180 | #161=ORIENTED_EDGE('',*,*,#348,.T.); 181 | #162=ORIENTED_EDGE('',*,*,#349,.F.); 182 | #163=ORIENTED_EDGE('',*,*,#345,.F.); 183 | #164=ORIENTED_EDGE('',*,*,#284,.F.); 184 | #165=ORIENTED_EDGE('',*,*,#350,.T.); 185 | #166=ORIENTED_EDGE('',*,*,#351,.F.); 186 | #167=ORIENTED_EDGE('',*,*,#348,.F.); 187 | #168=ORIENTED_EDGE('',*,*,#289,.F.); 188 | #169=ORIENTED_EDGE('',*,*,#352,.T.); 189 | #170=ORIENTED_EDGE('',*,*,#353,.F.); 190 | #171=ORIENTED_EDGE('',*,*,#350,.F.); 191 | #172=ORIENTED_EDGE('',*,*,#288,.F.); 192 | #173=ORIENTED_EDGE('',*,*,#354,.T.); 193 | #174=ORIENTED_EDGE('',*,*,#355,.F.); 194 | #175=ORIENTED_EDGE('',*,*,#352,.F.); 195 | #176=ORIENTED_EDGE('',*,*,#287,.F.); 196 | #177=ORIENTED_EDGE('',*,*,#347,.T.); 197 | #178=ORIENTED_EDGE('',*,*,#356,.F.); 198 | #179=ORIENTED_EDGE('',*,*,#354,.F.); 199 | #180=ORIENTED_EDGE('',*,*,#286,.F.); 200 | #181=ORIENTED_EDGE('',*,*,#357,.T.); 201 | #182=ORIENTED_EDGE('',*,*,#346,.T.); 202 | #183=ORIENTED_EDGE('',*,*,#349,.T.); 203 | #184=ORIENTED_EDGE('',*,*,#351,.T.); 204 | #185=ORIENTED_EDGE('',*,*,#353,.T.); 205 | #186=ORIENTED_EDGE('',*,*,#355,.T.); 206 | #187=ORIENTED_EDGE('',*,*,#356,.T.); 207 | #188=ORIENTED_EDGE('',*,*,#358,.F.); 208 | #189=ORIENTED_EDGE('',*,*,#330,.F.); 209 | #190=ORIENTED_EDGE('',*,*,#322,.F.); 210 | #191=ORIENTED_EDGE('',*,*,#311,.F.); 211 | #192=ORIENTED_EDGE('',*,*,#331,.F.); 212 | #193=ORIENTED_EDGE('',*,*,#358,.T.); 213 | #194=ORIENTED_EDGE('',*,*,#310,.F.); 214 | #195=ORIENTED_EDGE('',*,*,#292,.F.); 215 | #196=ORIENTED_EDGE('',*,*,#359,.F.); 216 | #197=ORIENTED_EDGE('',*,*,#282,.F.); 217 | #198=ORIENTED_EDGE('',*,*,#305,.F.); 218 | #199=ORIENTED_EDGE('',*,*,#317,.F.); 219 | #200=ORIENTED_EDGE('',*,*,#283,.F.); 220 | #201=ORIENTED_EDGE('',*,*,#359,.T.); 221 | #202=ORIENTED_EDGE('',*,*,#316,.F.); 222 | #203=ORIENTED_EDGE('',*,*,#319,.F.); 223 | #204=ORIENTED_EDGE('',*,*,#360,.T.); 224 | #205=ORIENTED_EDGE('',*,*,#297,.T.); 225 | #206=ORIENTED_EDGE('',*,*,#361,.F.); 226 | #207=ORIENTED_EDGE('',*,*,#272,.F.); 227 | #208=ORIENTED_EDGE('',*,*,#361,.T.); 228 | #209=ORIENTED_EDGE('',*,*,#300,.T.); 229 | #210=ORIENTED_EDGE('',*,*,#362,.F.); 230 | #211=ORIENTED_EDGE('',*,*,#273,.F.); 231 | #212=ORIENTED_EDGE('',*,*,#362,.T.); 232 | #213=ORIENTED_EDGE('',*,*,#299,.T.); 233 | #214=ORIENTED_EDGE('',*,*,#363,.F.); 234 | #215=ORIENTED_EDGE('',*,*,#274,.F.); 235 | #216=ORIENTED_EDGE('',*,*,#271,.T.); 236 | #217=ORIENTED_EDGE('',*,*,#363,.T.); 237 | #218=ORIENTED_EDGE('',*,*,#298,.F.); 238 | #219=ORIENTED_EDGE('',*,*,#360,.F.); 239 | #220=ORIENTED_EDGE('',*,*,#364,.F.); 240 | #221=ORIENTED_EDGE('',*,*,#296,.T.); 241 | #222=ORIENTED_EDGE('',*,*,#275,.T.); 242 | #223=ORIENTED_EDGE('',*,*,#365,.T.); 243 | #224=ORIENTED_EDGE('',*,*,#366,.F.); 244 | #225=ORIENTED_EDGE('',*,*,#367,.F.); 245 | #226=ORIENTED_EDGE('',*,*,#367,.T.); 246 | #227=ORIENTED_EDGE('',*,*,#368,.T.); 247 | #228=ORIENTED_EDGE('',*,*,#369,.F.); 248 | #229=ORIENTED_EDGE('',*,*,#276,.F.); 249 | #230=ORIENTED_EDGE('',*,*,#369,.T.); 250 | #231=ORIENTED_EDGE('',*,*,#370,.T.); 251 | #232=ORIENTED_EDGE('',*,*,#371,.F.); 252 | #233=ORIENTED_EDGE('',*,*,#277,.F.); 253 | #234=ORIENTED_EDGE('',*,*,#278,.T.); 254 | #235=ORIENTED_EDGE('',*,*,#371,.T.); 255 | #236=ORIENTED_EDGE('',*,*,#372,.F.); 256 | #237=ORIENTED_EDGE('',*,*,#365,.F.); 257 | #238=ORIENTED_EDGE('',*,*,#366,.T.); 258 | #239=ORIENTED_EDGE('',*,*,#372,.T.); 259 | #240=ORIENTED_EDGE('',*,*,#370,.F.); 260 | #241=ORIENTED_EDGE('',*,*,#368,.F.); 261 | #242=ORIENTED_EDGE('',*,*,#364,.T.); 262 | #243=ORIENTED_EDGE('',*,*,#306,.F.); 263 | #244=ORIENTED_EDGE('',*,*,#280,.F.); 264 | #245=ORIENTED_EDGE('',*,*,#373,.F.); 265 | #246=ORIENTED_EDGE('',*,*,#263,.F.); 266 | #247=ORIENTED_EDGE('',*,*,#373,.T.); 267 | #248=ORIENTED_EDGE('',*,*,#318,.F.); 268 | #249=ORIENTED_EDGE('',*,*,#314,.F.); 269 | #250=ORIENTED_EDGE('',*,*,#264,.F.); 270 | #251=ORIENTED_EDGE('',*,*,#290,.F.); 271 | #252=ORIENTED_EDGE('',*,*,#267,.F.); 272 | #253=ORIENTED_EDGE('',*,*,#374,.F.); 273 | #254=ORIENTED_EDGE('',*,*,#329,.F.); 274 | #255=ORIENTED_EDGE('',*,*,#374,.T.); 275 | #256=ORIENTED_EDGE('',*,*,#266,.F.); 276 | #257=ORIENTED_EDGE('',*,*,#313,.F.); 277 | #258=ORIENTED_EDGE('',*,*,#321,.F.); 278 | #259=ORIENTED_EDGE('',*,*,#357,.F.); 279 | #260=ORIENTED_EDGE('',*,*,#308,.T.); 280 | #261=ORIENTED_EDGE('',*,*,#344,.F.); 281 | #262=ORIENTED_EDGE('',*,*,#309,.T.); 282 | #263=EDGE_CURVE('',#375,#376,#451,.T.); 283 | #264=EDGE_CURVE('',#376,#377,#452,.T.); 284 | #265=EDGE_CURVE('',#377,#378,#453,.T.); 285 | #266=EDGE_CURVE('',#378,#379,#454,.T.); 286 | #267=EDGE_CURVE('',#379,#380,#455,.T.); 287 | #268=EDGE_CURVE('',#381,#380,#456,.T.); 288 | #269=EDGE_CURVE('',#382,#381,#457,.T.); 289 | #270=EDGE_CURVE('',#382,#375,#458,.T.); 290 | #271=EDGE_CURVE('',#383,#384,#459,.T.); 291 | #272=EDGE_CURVE('',#383,#385,#21,.T.); 292 | #273=EDGE_CURVE('',#385,#386,#460,.T.); 293 | #274=EDGE_CURVE('',#386,#384,#22,.T.); 294 | #275=EDGE_CURVE('',#387,#388,#461,.T.); 295 | #276=EDGE_CURVE('',#387,#389,#462,.T.); 296 | #277=EDGE_CURVE('',#389,#390,#463,.T.); 297 | #278=EDGE_CURVE('',#388,#390,#464,.T.); 298 | #279=EDGE_CURVE('',#391,#392,#465,.T.); 299 | #280=EDGE_CURVE('',#391,#393,#466,.T.); 300 | #281=EDGE_CURVE('',#393,#394,#467,.T.); 301 | #282=EDGE_CURVE('',#394,#395,#23,.T.); 302 | #283=EDGE_CURVE('',#395,#392,#24,.T.); 303 | #284=EDGE_CURVE('',#396,#397,#468,.T.); 304 | #285=EDGE_CURVE('',#397,#398,#469,.T.); 305 | #286=EDGE_CURVE('',#398,#399,#470,.T.); 306 | #287=EDGE_CURVE('',#399,#400,#471,.T.); 307 | #288=EDGE_CURVE('',#400,#401,#472,.T.); 308 | #289=EDGE_CURVE('',#401,#396,#473,.T.); 309 | #290=EDGE_CURVE('',#380,#402,#474,.T.); 310 | #291=EDGE_CURVE('',#402,#403,#475,.T.); 311 | #292=EDGE_CURVE('',#403,#404,#476,.T.); 312 | #293=EDGE_CURVE('',#405,#404,#477,.T.); 313 | #294=EDGE_CURVE('',#406,#405,#478,.T.); 314 | #295=EDGE_CURVE('',#406,#381,#479,.T.); 315 | #296=EDGE_CURVE('',#407,#407,#25,.T.); 316 | #297=EDGE_CURVE('',#408,#409,#26,.T.); 317 | #298=EDGE_CURVE('',#408,#410,#480,.T.); 318 | #299=EDGE_CURVE('',#411,#410,#27,.T.); 319 | #300=EDGE_CURVE('',#409,#411,#481,.T.); 320 | #301=EDGE_CURVE('',#412,#413,#482,.T.); 321 | #302=EDGE_CURVE('',#412,#406,#483,.T.); 322 | #303=EDGE_CURVE('',#413,#405,#484,.T.); 323 | #304=EDGE_CURVE('',#413,#414,#485,.T.); 324 | #305=EDGE_CURVE('',#414,#394,#486,.F.); 325 | #306=EDGE_CURVE('',#393,#375,#487,.T.); 326 | #307=EDGE_CURVE('',#412,#382,#488,.T.); 327 | #308=EDGE_CURVE('',#415,#415,#28,.F.); 328 | #309=EDGE_CURVE('',#416,#416,#29,.F.); 329 | #310=EDGE_CURVE('',#404,#417,#30,.F.); 330 | #311=EDGE_CURVE('',#417,#418,#31,.F.); 331 | #312=EDGE_CURVE('',#419,#418,#489,.T.); 332 | #313=EDGE_CURVE('',#419,#378,#490,.F.); 333 | #314=EDGE_CURVE('',#377,#420,#491,.T.); 334 | #315=EDGE_CURVE('',#420,#421,#492,.T.); 335 | #316=EDGE_CURVE('',#421,#422,#32,.F.); 336 | #317=EDGE_CURVE('',#422,#414,#33,.F.); 337 | #318=EDGE_CURVE('',#420,#391,#493,.T.); 338 | #319=EDGE_CURVE('',#392,#421,#494,.T.); 339 | #320=EDGE_CURVE('',#423,#424,#495,.T.); 340 | #321=EDGE_CURVE('',#423,#419,#496,.T.); 341 | #322=EDGE_CURVE('',#418,#424,#497,.F.); 342 | #323=EDGE_CURVE('',#425,#426,#498,.T.); 343 | #324=EDGE_CURVE('',#427,#425,#499,.T.); 344 | #325=EDGE_CURVE('',#428,#427,#500,.T.); 345 | #326=EDGE_CURVE('',#429,#428,#501,.T.); 346 | #327=EDGE_CURVE('',#430,#429,#502,.T.); 347 | #328=EDGE_CURVE('',#426,#430,#503,.T.); 348 | #329=EDGE_CURVE('',#402,#423,#504,.T.); 349 | #330=EDGE_CURVE('',#424,#431,#34,.T.); 350 | #331=EDGE_CURVE('',#431,#403,#35,.T.); 351 | #332=EDGE_CURVE('',#426,#432,#505,.T.); 352 | #333=EDGE_CURVE('',#432,#433,#506,.T.); 353 | #334=EDGE_CURVE('',#425,#433,#507,.T.); 354 | #335=EDGE_CURVE('',#430,#434,#508,.T.); 355 | #336=EDGE_CURVE('',#434,#432,#509,.T.); 356 | #337=EDGE_CURVE('',#429,#435,#510,.T.); 357 | #338=EDGE_CURVE('',#435,#434,#511,.T.); 358 | #339=EDGE_CURVE('',#428,#436,#512,.T.); 359 | #340=EDGE_CURVE('',#436,#435,#513,.T.); 360 | #341=EDGE_CURVE('',#427,#437,#514,.T.); 361 | #342=EDGE_CURVE('',#437,#436,#515,.T.); 362 | #343=EDGE_CURVE('',#433,#437,#516,.T.); 363 | #344=EDGE_CURVE('',#438,#438,#36,.F.); 364 | #345=EDGE_CURVE('',#397,#439,#517,.T.); 365 | #346=EDGE_CURVE('',#440,#439,#518,.T.); 366 | #347=EDGE_CURVE('',#398,#440,#519,.T.); 367 | #348=EDGE_CURVE('',#396,#441,#520,.T.); 368 | #349=EDGE_CURVE('',#439,#441,#521,.T.); 369 | #350=EDGE_CURVE('',#401,#442,#522,.T.); 370 | #351=EDGE_CURVE('',#441,#442,#523,.T.); 371 | #352=EDGE_CURVE('',#400,#443,#524,.T.); 372 | #353=EDGE_CURVE('',#442,#443,#525,.T.); 373 | #354=EDGE_CURVE('',#399,#444,#526,.T.); 374 | #355=EDGE_CURVE('',#443,#444,#527,.T.); 375 | #356=EDGE_CURVE('',#444,#440,#528,.T.); 376 | #357=EDGE_CURVE('',#445,#445,#37,.F.); 377 | #358=EDGE_CURVE('',#431,#417,#529,.F.); 378 | #359=EDGE_CURVE('',#395,#422,#530,.T.); 379 | #360=EDGE_CURVE('',#383,#408,#531,.T.); 380 | #361=EDGE_CURVE('',#385,#409,#532,.T.); 381 | #362=EDGE_CURVE('',#386,#411,#533,.T.); 382 | #363=EDGE_CURVE('',#384,#410,#534,.T.); 383 | #364=EDGE_CURVE('',#446,#446,#38,.T.); 384 | #365=EDGE_CURVE('',#388,#447,#535,.T.); 385 | #366=EDGE_CURVE('',#448,#447,#536,.T.); 386 | #367=EDGE_CURVE('',#387,#448,#537,.T.); 387 | #368=EDGE_CURVE('',#448,#449,#538,.T.); 388 | #369=EDGE_CURVE('',#389,#449,#539,.T.); 389 | #370=EDGE_CURVE('',#449,#450,#540,.T.); 390 | #371=EDGE_CURVE('',#390,#450,#541,.T.); 391 | #372=EDGE_CURVE('',#447,#450,#542,.T.); 392 | #373=EDGE_CURVE('',#376,#391,#543,.F.); 393 | #374=EDGE_CURVE('',#423,#379,#544,.T.); 394 | #375=VERTEX_POINT('',#1132); 395 | #376=VERTEX_POINT('',#1133); 396 | #377=VERTEX_POINT('',#1135); 397 | #378=VERTEX_POINT('',#1137); 398 | #379=VERTEX_POINT('',#1139); 399 | #380=VERTEX_POINT('',#1141); 400 | #381=VERTEX_POINT('',#1143); 401 | #382=VERTEX_POINT('',#1145); 402 | #383=VERTEX_POINT('',#1148); 403 | #384=VERTEX_POINT('',#1149); 404 | #385=VERTEX_POINT('',#1151); 405 | #386=VERTEX_POINT('',#1153); 406 | #387=VERTEX_POINT('',#1156); 407 | #388=VERTEX_POINT('',#1157); 408 | #389=VERTEX_POINT('',#1159); 409 | #390=VERTEX_POINT('',#1161); 410 | #391=VERTEX_POINT('',#1165); 411 | #392=VERTEX_POINT('',#1166); 412 | #393=VERTEX_POINT('',#1168); 413 | #394=VERTEX_POINT('',#1170); 414 | #395=VERTEX_POINT('',#1172); 415 | #396=VERTEX_POINT('',#1175); 416 | #397=VERTEX_POINT('',#1176); 417 | #398=VERTEX_POINT('',#1178); 418 | #399=VERTEX_POINT('',#1180); 419 | #400=VERTEX_POINT('',#1182); 420 | #401=VERTEX_POINT('',#1184); 421 | #402=VERTEX_POINT('',#1188); 422 | #403=VERTEX_POINT('',#1190); 423 | #404=VERTEX_POINT('',#1192); 424 | #405=VERTEX_POINT('',#1194); 425 | #406=VERTEX_POINT('',#1196); 426 | #407=VERTEX_POINT('',#1200); 427 | #408=VERTEX_POINT('',#1202); 428 | #409=VERTEX_POINT('',#1203); 429 | #410=VERTEX_POINT('',#1205); 430 | #411=VERTEX_POINT('',#1207); 431 | #412=VERTEX_POINT('',#1210); 432 | #413=VERTEX_POINT('',#1211); 433 | #414=VERTEX_POINT('',#1216); 434 | #415=VERTEX_POINT('',#1222); 435 | #416=VERTEX_POINT('',#1224); 436 | #417=VERTEX_POINT('',#1226); 437 | #418=VERTEX_POINT('',#1228); 438 | #419=VERTEX_POINT('',#1230); 439 | #420=VERTEX_POINT('',#1233); 440 | #421=VERTEX_POINT('',#1235); 441 | #422=VERTEX_POINT('',#1237); 442 | #423=VERTEX_POINT('',#1245); 443 | #424=VERTEX_POINT('',#1246); 444 | #425=VERTEX_POINT('',#1251); 445 | #426=VERTEX_POINT('',#1252); 446 | #427=VERTEX_POINT('',#1254); 447 | #428=VERTEX_POINT('',#1256); 448 | #429=VERTEX_POINT('',#1258); 449 | #430=VERTEX_POINT('',#1260); 450 | #431=VERTEX_POINT('',#1264); 451 | #432=VERTEX_POINT('',#1268); 452 | #433=VERTEX_POINT('',#1270); 453 | #434=VERTEX_POINT('',#1274); 454 | #435=VERTEX_POINT('',#1278); 455 | #436=VERTEX_POINT('',#1282); 456 | #437=VERTEX_POINT('',#1286); 457 | #438=VERTEX_POINT('',#1292); 458 | #439=VERTEX_POINT('',#1295); 459 | #440=VERTEX_POINT('',#1297); 460 | #441=VERTEX_POINT('',#1301); 461 | #442=VERTEX_POINT('',#1305); 462 | #443=VERTEX_POINT('',#1309); 463 | #444=VERTEX_POINT('',#1313); 464 | #445=VERTEX_POINT('',#1319); 465 | #446=VERTEX_POINT('',#1336); 466 | #447=VERTEX_POINT('',#1339); 467 | #448=VERTEX_POINT('',#1341); 468 | #449=VERTEX_POINT('',#1345); 469 | #450=VERTEX_POINT('',#1349); 470 | #451=LINE('',#1131,#545); 471 | #452=LINE('',#1134,#546); 472 | #453=LINE('',#1136,#547); 473 | #454=LINE('',#1138,#548); 474 | #455=LINE('',#1140,#549); 475 | #456=LINE('',#1142,#550); 476 | #457=LINE('',#1144,#551); 477 | #458=LINE('',#1146,#552); 478 | #459=LINE('',#1147,#553); 479 | #460=LINE('',#1152,#554); 480 | #461=LINE('',#1155,#555); 481 | #462=LINE('',#1158,#556); 482 | #463=LINE('',#1160,#557); 483 | #464=LINE('',#1162,#558); 484 | #465=LINE('',#1164,#559); 485 | #466=LINE('',#1167,#560); 486 | #467=LINE('',#1169,#561); 487 | #468=LINE('',#1174,#562); 488 | #469=LINE('',#1177,#563); 489 | #470=LINE('',#1179,#564); 490 | #471=LINE('',#1181,#565); 491 | #472=LINE('',#1183,#566); 492 | #473=LINE('',#1185,#567); 493 | #474=LINE('',#1187,#568); 494 | #475=LINE('',#1189,#569); 495 | #476=LINE('',#1191,#570); 496 | #477=LINE('',#1193,#571); 497 | #478=LINE('',#1195,#572); 498 | #479=LINE('',#1197,#573); 499 | #480=LINE('',#1204,#574); 500 | #481=LINE('',#1208,#575); 501 | #482=LINE('',#1209,#576); 502 | #483=LINE('',#1212,#577); 503 | #484=LINE('',#1213,#578); 504 | #485=LINE('',#1215,#579); 505 | #486=LINE('',#1217,#580); 506 | #487=LINE('',#1218,#581); 507 | #488=LINE('',#1219,#582); 508 | #489=LINE('',#1229,#583); 509 | #490=LINE('',#1231,#584); 510 | #491=LINE('',#1232,#585); 511 | #492=LINE('',#1234,#586); 512 | #493=LINE('',#1241,#587); 513 | #494=LINE('',#1242,#588); 514 | #495=LINE('',#1244,#589); 515 | #496=LINE('',#1247,#590); 516 | #497=LINE('',#1248,#591); 517 | #498=LINE('',#1250,#592); 518 | #499=LINE('',#1253,#593); 519 | #500=LINE('',#1255,#594); 520 | #501=LINE('',#1257,#595); 521 | #502=LINE('',#1259,#596); 522 | #503=LINE('',#1261,#597); 523 | #504=LINE('',#1262,#598); 524 | #505=LINE('',#1267,#599); 525 | #506=LINE('',#1269,#600); 526 | #507=LINE('',#1271,#601); 527 | #508=LINE('',#1273,#602); 528 | #509=LINE('',#1275,#603); 529 | #510=LINE('',#1277,#604); 530 | #511=LINE('',#1279,#605); 531 | #512=LINE('',#1281,#606); 532 | #513=LINE('',#1283,#607); 533 | #514=LINE('',#1285,#608); 534 | #515=LINE('',#1287,#609); 535 | #516=LINE('',#1289,#610); 536 | #517=LINE('',#1294,#611); 537 | #518=LINE('',#1296,#612); 538 | #519=LINE('',#1298,#613); 539 | #520=LINE('',#1300,#614); 540 | #521=LINE('',#1302,#615); 541 | #522=LINE('',#1304,#616); 542 | #523=LINE('',#1306,#617); 543 | #524=LINE('',#1308,#618); 544 | #525=LINE('',#1310,#619); 545 | #526=LINE('',#1312,#620); 546 | #527=LINE('',#1314,#621); 547 | #528=LINE('',#1316,#622); 548 | #529=LINE('',#1321,#623); 549 | #530=LINE('',#1324,#624); 550 | #531=LINE('',#1327,#625); 551 | #532=LINE('',#1328,#626); 552 | #533=LINE('',#1330,#627); 553 | #534=LINE('',#1332,#628); 554 | #535=LINE('',#1338,#629); 555 | #536=LINE('',#1340,#630); 556 | #537=LINE('',#1342,#631); 557 | #538=LINE('',#1344,#632); 558 | #539=LINE('',#1346,#633); 559 | #540=LINE('',#1348,#634); 560 | #541=LINE('',#1350,#635); 561 | #542=LINE('',#1352,#636); 562 | #543=LINE('',#1355,#637); 563 | #544=LINE('',#1358,#638); 564 | #545=VECTOR('',#913,1.); 565 | #546=VECTOR('',#914,1.); 566 | #547=VECTOR('',#915,1.); 567 | #548=VECTOR('',#916,1.); 568 | #549=VECTOR('',#917,1.); 569 | #550=VECTOR('',#918,1.); 570 | #551=VECTOR('',#919,1.); 571 | #552=VECTOR('',#920,1.); 572 | #553=VECTOR('',#921,1.); 573 | #554=VECTOR('',#924,1.); 574 | #555=VECTOR('',#927,1.); 575 | #556=VECTOR('',#928,1.); 576 | #557=VECTOR('',#929,1.); 577 | #558=VECTOR('',#930,1.); 578 | #559=VECTOR('',#933,1.); 579 | #560=VECTOR('',#934,1.); 580 | #561=VECTOR('',#935,1.); 581 | #562=VECTOR('',#940,1.); 582 | #563=VECTOR('',#941,1.); 583 | #564=VECTOR('',#942,1.); 584 | #565=VECTOR('',#943,1.); 585 | #566=VECTOR('',#944,1.); 586 | #567=VECTOR('',#945,1.); 587 | #568=VECTOR('',#948,1.); 588 | #569=VECTOR('',#949,1.); 589 | #570=VECTOR('',#950,1.); 590 | #571=VECTOR('',#951,1.); 591 | #572=VECTOR('',#952,1.); 592 | #573=VECTOR('',#953,1.); 593 | #574=VECTOR('',#960,1.); 594 | #575=VECTOR('',#963,1.); 595 | #576=VECTOR('',#964,1.); 596 | #577=VECTOR('',#965,1.); 597 | #578=VECTOR('',#966,1.); 598 | #579=VECTOR('',#969,1.); 599 | #580=VECTOR('',#970,1.); 600 | #581=VECTOR('',#971,1.); 601 | #582=VECTOR('',#972,1.); 602 | #583=VECTOR('',#983,1.); 603 | #584=VECTOR('',#984,1.); 604 | #585=VECTOR('',#985,1.); 605 | #586=VECTOR('',#986,1.); 606 | #587=VECTOR('',#995,1.); 607 | #588=VECTOR('',#996,1.); 608 | #589=VECTOR('',#999,1.); 609 | #590=VECTOR('',#1000,1.); 610 | #591=VECTOR('',#1001,1.); 611 | #592=VECTOR('',#1004,1.); 612 | #593=VECTOR('',#1005,1.); 613 | #594=VECTOR('',#1006,1.); 614 | #595=VECTOR('',#1007,1.); 615 | #596=VECTOR('',#1008,1.); 616 | #597=VECTOR('',#1009,1.); 617 | #598=VECTOR('',#1010,1.); 618 | #599=VECTOR('',#1017,1.); 619 | #600=VECTOR('',#1018,1.); 620 | #601=VECTOR('',#1019,1.); 621 | #602=VECTOR('',#1022,1.); 622 | #603=VECTOR('',#1023,1.); 623 | #604=VECTOR('',#1026,1.); 624 | #605=VECTOR('',#1027,1.); 625 | #606=VECTOR('',#1030,1.); 626 | #607=VECTOR('',#1031,1.); 627 | #608=VECTOR('',#1034,1.); 628 | #609=VECTOR('',#1035,1.); 629 | #610=VECTOR('',#1038,1.); 630 | #611=VECTOR('',#1045,1.); 631 | #612=VECTOR('',#1046,1.); 632 | #613=VECTOR('',#1047,1.); 633 | #614=VECTOR('',#1050,1.); 634 | #615=VECTOR('',#1051,1.); 635 | #616=VECTOR('',#1054,1.); 636 | #617=VECTOR('',#1055,1.); 637 | #618=VECTOR('',#1058,1.); 638 | #619=VECTOR('',#1059,1.); 639 | #620=VECTOR('',#1062,1.); 640 | #621=VECTOR('',#1063,1.); 641 | #622=VECTOR('',#1066,1.); 642 | #623=VECTOR('',#1073,1.); 643 | #624=VECTOR('',#1078,1.); 644 | #625=VECTOR('',#1083,1.); 645 | #626=VECTOR('',#1084,1.); 646 | #627=VECTOR('',#1087,1.); 647 | #628=VECTOR('',#1090,1.); 648 | #629=VECTOR('',#1099,1.); 649 | #630=VECTOR('',#1100,1.); 650 | #631=VECTOR('',#1101,1.); 651 | #632=VECTOR('',#1104,1.); 652 | #633=VECTOR('',#1105,1.); 653 | #634=VECTOR('',#1108,1.); 654 | #635=VECTOR('',#1109,1.); 655 | #636=VECTOR('',#1112,1.); 656 | #637=VECTOR('',#1117,1.); 657 | #638=VECTOR('',#1122,1.); 658 | #639=EDGE_LOOP('',(#39,#40,#41,#42,#43,#44,#45,#46)); 659 | #640=EDGE_LOOP('',(#47,#48,#49,#50)); 660 | #641=EDGE_LOOP('',(#51,#52,#53,#54)); 661 | #642=EDGE_LOOP('',(#55,#56,#57,#58,#59)); 662 | #643=EDGE_LOOP('',(#60,#61,#62,#63,#64,#65)); 663 | #644=EDGE_LOOP('',(#66,#67,#68,#69,#70,#71,#72)); 664 | #645=EDGE_LOOP('',(#73)); 665 | #646=EDGE_LOOP('',(#74,#75,#76,#77)); 666 | #647=EDGE_LOOP('',(#78,#79,#80,#81)); 667 | #648=EDGE_LOOP('',(#82,#83,#84,#85,#86,#87,#88)); 668 | #649=EDGE_LOOP('',(#89)); 669 | #650=EDGE_LOOP('',(#90)); 670 | #651=EDGE_LOOP('',(#91,#92,#93,#94,#95,#96,#97,#98,#99,#100,#101,#102)); 671 | #652=EDGE_LOOP('',(#103,#104,#105,#106)); 672 | #653=EDGE_LOOP('',(#107,#108,#109,#110)); 673 | #654=EDGE_LOOP('',(#111,#112,#113,#114)); 674 | #655=EDGE_LOOP('',(#115,#116,#117,#118,#119,#120)); 675 | #656=EDGE_LOOP('',(#121,#122,#123,#124,#125)); 676 | #657=EDGE_LOOP('',(#126,#127,#128,#129)); 677 | #658=EDGE_LOOP('',(#130,#131,#132,#133)); 678 | #659=EDGE_LOOP('',(#134,#135,#136,#137)); 679 | #660=EDGE_LOOP('',(#138,#139,#140,#141)); 680 | #661=EDGE_LOOP('',(#142,#143,#144,#145)); 681 | #662=EDGE_LOOP('',(#146,#147,#148,#149)); 682 | #663=EDGE_LOOP('',(#150)); 683 | #664=EDGE_LOOP('',(#151,#152,#153,#154,#155,#156)); 684 | #665=EDGE_LOOP('',(#157,#158,#159,#160)); 685 | #666=EDGE_LOOP('',(#161,#162,#163,#164)); 686 | #667=EDGE_LOOP('',(#165,#166,#167,#168)); 687 | #668=EDGE_LOOP('',(#169,#170,#171,#172)); 688 | #669=EDGE_LOOP('',(#173,#174,#175,#176)); 689 | #670=EDGE_LOOP('',(#177,#178,#179,#180)); 690 | #671=EDGE_LOOP('',(#181)); 691 | #672=EDGE_LOOP('',(#182,#183,#184,#185,#186,#187)); 692 | #673=EDGE_LOOP('',(#188,#189,#190,#191)); 693 | #674=EDGE_LOOP('',(#192,#193,#194,#195)); 694 | #675=EDGE_LOOP('',(#196,#197,#198,#199)); 695 | #676=EDGE_LOOP('',(#200,#201,#202,#203)); 696 | #677=EDGE_LOOP('',(#204,#205,#206,#207)); 697 | #678=EDGE_LOOP('',(#208,#209,#210,#211)); 698 | #679=EDGE_LOOP('',(#212,#213,#214,#215)); 699 | #680=EDGE_LOOP('',(#216,#217,#218,#219)); 700 | #681=EDGE_LOOP('',(#220)); 701 | #682=EDGE_LOOP('',(#221)); 702 | #683=EDGE_LOOP('',(#222,#223,#224,#225)); 703 | #684=EDGE_LOOP('',(#226,#227,#228,#229)); 704 | #685=EDGE_LOOP('',(#230,#231,#232,#233)); 705 | #686=EDGE_LOOP('',(#234,#235,#236,#237)); 706 | #687=EDGE_LOOP('',(#238,#239,#240,#241)); 707 | #688=EDGE_LOOP('',(#242)); 708 | #689=EDGE_LOOP('',(#243,#244,#245,#246)); 709 | #690=EDGE_LOOP('',(#247,#248,#249,#250)); 710 | #691=EDGE_LOOP('',(#251,#252,#253,#254)); 711 | #692=EDGE_LOOP('',(#255,#256,#257,#258)); 712 | #693=EDGE_LOOP('',(#259)); 713 | #694=EDGE_LOOP('',(#260)); 714 | #695=EDGE_LOOP('',(#261)); 715 | #696=EDGE_LOOP('',(#262)); 716 | #697=FACE_BOUND('',#639,.T.); 717 | #698=FACE_BOUND('',#640,.T.); 718 | #699=FACE_BOUND('',#641,.T.); 719 | #700=FACE_BOUND('',#642,.T.); 720 | #701=FACE_BOUND('',#643,.T.); 721 | #702=FACE_BOUND('',#644,.T.); 722 | #703=FACE_BOUND('',#645,.T.); 723 | #704=FACE_BOUND('',#646,.T.); 724 | #705=FACE_BOUND('',#647,.T.); 725 | #706=FACE_BOUND('',#648,.T.); 726 | #707=FACE_BOUND('',#649,.T.); 727 | #708=FACE_BOUND('',#650,.T.); 728 | #709=FACE_BOUND('',#651,.T.); 729 | #710=FACE_BOUND('',#652,.T.); 730 | #711=FACE_BOUND('',#653,.T.); 731 | #712=FACE_BOUND('',#654,.T.); 732 | #713=FACE_BOUND('',#655,.T.); 733 | #714=FACE_BOUND('',#656,.T.); 734 | #715=FACE_BOUND('',#657,.T.); 735 | #716=FACE_BOUND('',#658,.T.); 736 | #717=FACE_BOUND('',#659,.T.); 737 | #718=FACE_BOUND('',#660,.T.); 738 | #719=FACE_BOUND('',#661,.T.); 739 | #720=FACE_BOUND('',#662,.T.); 740 | #721=FACE_BOUND('',#663,.T.); 741 | #722=FACE_BOUND('',#664,.T.); 742 | #723=FACE_BOUND('',#665,.T.); 743 | #724=FACE_BOUND('',#666,.T.); 744 | #725=FACE_BOUND('',#667,.T.); 745 | #726=FACE_BOUND('',#668,.T.); 746 | #727=FACE_BOUND('',#669,.T.); 747 | #728=FACE_BOUND('',#670,.T.); 748 | #729=FACE_BOUND('',#671,.T.); 749 | #730=FACE_BOUND('',#672,.T.); 750 | #731=FACE_BOUND('',#673,.T.); 751 | #732=FACE_BOUND('',#674,.T.); 752 | #733=FACE_BOUND('',#675,.T.); 753 | #734=FACE_BOUND('',#676,.T.); 754 | #735=FACE_BOUND('',#677,.T.); 755 | #736=FACE_BOUND('',#678,.T.); 756 | #737=FACE_BOUND('',#679,.T.); 757 | #738=FACE_BOUND('',#680,.T.); 758 | #739=FACE_BOUND('',#681,.T.); 759 | #740=FACE_BOUND('',#682,.T.); 760 | #741=FACE_BOUND('',#683,.T.); 761 | #742=FACE_BOUND('',#684,.T.); 762 | #743=FACE_BOUND('',#685,.T.); 763 | #744=FACE_BOUND('',#686,.T.); 764 | #745=FACE_BOUND('',#687,.T.); 765 | #746=FACE_BOUND('',#688,.T.); 766 | #747=FACE_BOUND('',#689,.T.); 767 | #748=FACE_BOUND('',#690,.T.); 768 | #749=FACE_BOUND('',#691,.T.); 769 | #750=FACE_BOUND('',#692,.T.); 770 | #751=FACE_BOUND('',#693,.T.); 771 | #752=FACE_BOUND('',#694,.T.); 772 | #753=FACE_BOUND('',#695,.T.); 773 | #754=FACE_BOUND('',#696,.T.); 774 | #755=PLANE('',#847); 775 | #756=PLANE('',#850); 776 | #757=PLANE('',#853); 777 | #758=PLANE('',#854); 778 | #759=PLANE('',#858); 779 | #760=PLANE('',#859); 780 | #761=PLANE('',#866); 781 | #762=PLANE('',#867); 782 | #763=PLANE('',#868); 783 | #764=PLANE('',#869); 784 | #765=PLANE('',#872); 785 | #766=PLANE('',#873); 786 | #767=PLANE('',#874); 787 | #768=PLANE('',#875); 788 | #769=PLANE('',#876); 789 | #770=PLANE('',#877); 790 | #771=PLANE('',#878); 791 | #772=PLANE('',#880); 792 | #773=PLANE('',#881); 793 | #774=PLANE('',#882); 794 | #775=PLANE('',#883); 795 | #776=PLANE('',#884); 796 | #777=PLANE('',#885); 797 | #778=PLANE('',#886); 798 | #779=PLANE('',#893); 799 | #780=PLANE('',#895); 800 | #781=PLANE('',#898); 801 | #782=PLANE('',#899); 802 | #783=PLANE('',#900); 803 | #784=PLANE('',#901); 804 | #785=PLANE('',#902); 805 | #786=PLANE('',#903); 806 | #787=PLANE('',#904); 807 | #788=PLANE('',#905); 808 | #789=PLANE('',#906); 809 | #790=ADVANCED_FACE('',(#697,#698,#699),#755,.F.); 810 | #791=ADVANCED_FACE('',(#700,#701),#756,.T.); 811 | #792=ADVANCED_FACE('',(#702),#757,.T.); 812 | #793=ADVANCED_FACE('',(#703,#704,#705),#758,.T.); 813 | #794=ADVANCED_FACE('',(#706),#759,.F.); 814 | #795=ADVANCED_FACE('',(#707,#708,#709),#760,.F.); 815 | #796=ADVANCED_FACE('',(#710),#761,.T.); 816 | #797=ADVANCED_FACE('',(#711),#762,.T.); 817 | #798=ADVANCED_FACE('',(#712),#763,.F.); 818 | #799=ADVANCED_FACE('',(#713,#714),#764,.T.); 819 | #800=ADVANCED_FACE('',(#715),#765,.F.); 820 | #801=ADVANCED_FACE('',(#716),#766,.F.); 821 | #802=ADVANCED_FACE('',(#717),#767,.F.); 822 | #803=ADVANCED_FACE('',(#718),#768,.F.); 823 | #804=ADVANCED_FACE('',(#719),#769,.F.); 824 | #805=ADVANCED_FACE('',(#720),#770,.F.); 825 | #806=ADVANCED_FACE('',(#721,#722),#771,.T.); 826 | #807=ADVANCED_FACE('',(#723),#772,.T.); 827 | #808=ADVANCED_FACE('',(#724),#773,.T.); 828 | #809=ADVANCED_FACE('',(#725),#774,.T.); 829 | #810=ADVANCED_FACE('',(#726),#775,.T.); 830 | #811=ADVANCED_FACE('',(#727),#776,.T.); 831 | #812=ADVANCED_FACE('',(#728),#777,.T.); 832 | #813=ADVANCED_FACE('',(#729,#730),#778,.T.); 833 | #814=ADVANCED_FACE('',(#731),#12,.T.); 834 | #815=ADVANCED_FACE('',(#732),#13,.T.); 835 | #816=ADVANCED_FACE('',(#733),#14,.T.); 836 | #817=ADVANCED_FACE('',(#734),#15,.T.); 837 | #818=ADVANCED_FACE('',(#735),#16,.F.); 838 | #819=ADVANCED_FACE('',(#736),#779,.F.); 839 | #820=ADVANCED_FACE('',(#737),#17,.F.); 840 | #821=ADVANCED_FACE('',(#738),#780,.T.); 841 | #822=ADVANCED_FACE('',(#739,#740),#18,.F.); 842 | #823=ADVANCED_FACE('',(#741),#781,.T.); 843 | #824=ADVANCED_FACE('',(#742),#782,.F.); 844 | #825=ADVANCED_FACE('',(#743),#783,.F.); 845 | #826=ADVANCED_FACE('',(#744),#784,.T.); 846 | #827=ADVANCED_FACE('',(#745,#746),#785,.F.); 847 | #828=ADVANCED_FACE('',(#747),#786,.F.); 848 | #829=ADVANCED_FACE('',(#748),#787,.F.); 849 | #830=ADVANCED_FACE('',(#749),#788,.F.); 850 | #831=ADVANCED_FACE('',(#750),#789,.T.); 851 | #832=ADVANCED_FACE('',(#751,#752),#19,.F.); 852 | #833=ADVANCED_FACE('',(#753,#754),#20,.F.); 853 | #834=CLOSED_SHELL('',(#790,#791,#792,#793,#794,#795,#796,#797,#798,#799, 854 | #800,#801,#802,#803,#804,#805,#806,#807,#808,#809,#810,#811,#812,#813,#814, 855 | #815,#816,#817,#818,#819,#820,#821,#822,#823,#824,#825,#826,#827,#828,#829, 856 | #830,#831,#832,#833)); 857 | #835=STYLED_ITEM('',(#836),#843); 858 | #836=PRESENTATION_STYLE_ASSIGNMENT((#837)); 859 | #837=SURFACE_STYLE_USAGE(.BOTH.,#838); 860 | #838=SURFACE_SIDE_STYLE('',(#839)); 861 | #839=SURFACE_STYLE_FILL_AREA(#840); 862 | #840=FILL_AREA_STYLE('',(#841)); 863 | #841=FILL_AREA_STYLE_COLOUR('',#842); 864 | #842=COLOUR_RGB('',0.980392156862745,0.713725490196078,0.00392156862745098); 865 | #843=MANIFOLD_SOLID_BREP('RearPanel',#834); 866 | #844=SHAPE_DEFINITION_REPRESENTATION(#1368,#845); 867 | #845=SHAPE_REPRESENTATION('RearPanel',(#846),#1363); 868 | #846=AXIS2_PLACEMENT_3D('',#1129,#909,#910); 869 | #847=AXIS2_PLACEMENT_3D('',#1130,#911,#912); 870 | #848=AXIS2_PLACEMENT_3D('',#1150,#922,#923); 871 | #849=AXIS2_PLACEMENT_3D('',#1154,#925,#926); 872 | #850=AXIS2_PLACEMENT_3D('',#1163,#931,#932); 873 | #851=AXIS2_PLACEMENT_3D('',#1171,#936,#937); 874 | #852=AXIS2_PLACEMENT_3D('',#1173,#938,#939); 875 | #853=AXIS2_PLACEMENT_3D('',#1186,#946,#947); 876 | #854=AXIS2_PLACEMENT_3D('',#1198,#954,#955); 877 | #855=AXIS2_PLACEMENT_3D('',#1199,#956,#957); 878 | #856=AXIS2_PLACEMENT_3D('',#1201,#958,#959); 879 | #857=AXIS2_PLACEMENT_3D('',#1206,#961,#962); 880 | #858=AXIS2_PLACEMENT_3D('',#1214,#967,#968); 881 | #859=AXIS2_PLACEMENT_3D('',#1220,#973,#974); 882 | #860=AXIS2_PLACEMENT_3D('',#1221,#975,#976); 883 | #861=AXIS2_PLACEMENT_3D('',#1223,#977,#978); 884 | #862=AXIS2_PLACEMENT_3D('',#1225,#979,#980); 885 | #863=AXIS2_PLACEMENT_3D('',#1227,#981,#982); 886 | #864=AXIS2_PLACEMENT_3D('',#1236,#987,#988); 887 | #865=AXIS2_PLACEMENT_3D('',#1238,#989,#990); 888 | #866=AXIS2_PLACEMENT_3D('',#1239,#991,#992); 889 | #867=AXIS2_PLACEMENT_3D('',#1240,#993,#994); 890 | #868=AXIS2_PLACEMENT_3D('',#1243,#997,#998); 891 | #869=AXIS2_PLACEMENT_3D('',#1249,#1002,#1003); 892 | #870=AXIS2_PLACEMENT_3D('',#1263,#1011,#1012); 893 | #871=AXIS2_PLACEMENT_3D('',#1265,#1013,#1014); 894 | #872=AXIS2_PLACEMENT_3D('',#1266,#1015,#1016); 895 | #873=AXIS2_PLACEMENT_3D('',#1272,#1020,#1021); 896 | #874=AXIS2_PLACEMENT_3D('',#1276,#1024,#1025); 897 | #875=AXIS2_PLACEMENT_3D('',#1280,#1028,#1029); 898 | #876=AXIS2_PLACEMENT_3D('',#1284,#1032,#1033); 899 | #877=AXIS2_PLACEMENT_3D('',#1288,#1036,#1037); 900 | #878=AXIS2_PLACEMENT_3D('',#1290,#1039,#1040); 901 | #879=AXIS2_PLACEMENT_3D('',#1291,#1041,#1042); 902 | #880=AXIS2_PLACEMENT_3D('',#1293,#1043,#1044); 903 | #881=AXIS2_PLACEMENT_3D('',#1299,#1048,#1049); 904 | #882=AXIS2_PLACEMENT_3D('',#1303,#1052,#1053); 905 | #883=AXIS2_PLACEMENT_3D('',#1307,#1056,#1057); 906 | #884=AXIS2_PLACEMENT_3D('',#1311,#1060,#1061); 907 | #885=AXIS2_PLACEMENT_3D('',#1315,#1064,#1065); 908 | #886=AXIS2_PLACEMENT_3D('',#1317,#1067,#1068); 909 | #887=AXIS2_PLACEMENT_3D('',#1318,#1069,#1070); 910 | #888=AXIS2_PLACEMENT_3D('',#1320,#1071,#1072); 911 | #889=AXIS2_PLACEMENT_3D('',#1322,#1074,#1075); 912 | #890=AXIS2_PLACEMENT_3D('',#1323,#1076,#1077); 913 | #891=AXIS2_PLACEMENT_3D('',#1325,#1079,#1080); 914 | #892=AXIS2_PLACEMENT_3D('',#1326,#1081,#1082); 915 | #893=AXIS2_PLACEMENT_3D('',#1329,#1085,#1086); 916 | #894=AXIS2_PLACEMENT_3D('',#1331,#1088,#1089); 917 | #895=AXIS2_PLACEMENT_3D('',#1333,#1091,#1092); 918 | #896=AXIS2_PLACEMENT_3D('',#1334,#1093,#1094); 919 | #897=AXIS2_PLACEMENT_3D('',#1335,#1095,#1096); 920 | #898=AXIS2_PLACEMENT_3D('',#1337,#1097,#1098); 921 | #899=AXIS2_PLACEMENT_3D('',#1343,#1102,#1103); 922 | #900=AXIS2_PLACEMENT_3D('',#1347,#1106,#1107); 923 | #901=AXIS2_PLACEMENT_3D('',#1351,#1110,#1111); 924 | #902=AXIS2_PLACEMENT_3D('',#1353,#1113,#1114); 925 | #903=AXIS2_PLACEMENT_3D('',#1354,#1115,#1116); 926 | #904=AXIS2_PLACEMENT_3D('',#1356,#1118,#1119); 927 | #905=AXIS2_PLACEMENT_3D('',#1357,#1120,#1121); 928 | #906=AXIS2_PLACEMENT_3D('',#1359,#1123,#1124); 929 | #907=AXIS2_PLACEMENT_3D('',#1360,#1125,#1126); 930 | #908=AXIS2_PLACEMENT_3D('',#1361,#1127,#1128); 931 | #909=DIRECTION('',(0.,0.,1.)); 932 | #910=DIRECTION('',(1.,0.,0.)); 933 | #911=DIRECTION('',(0.,1.,0.)); 934 | #912=DIRECTION('',(0.,0.,1.)); 935 | #913=DIRECTION('',(1.,0.,0.)); 936 | #914=DIRECTION('',(0.,0.,-1.)); 937 | #915=DIRECTION('',(1.,0.,0.)); 938 | #916=DIRECTION('',(0.,0.,1.)); 939 | #917=DIRECTION('',(1.,0.,0.)); 940 | #918=DIRECTION('',(0.,0.,-1.)); 941 | #919=DIRECTION('',(1.,0.,0.)); 942 | #920=DIRECTION('',(0.,0.,-1.)); 943 | #921=DIRECTION('',(0.,0.,-1.)); 944 | #922=DIRECTION('',(0.,1.,0.)); 945 | #923=DIRECTION('',(0.,0.,1.)); 946 | #924=DIRECTION('',(0.,0.,-1.)); 947 | #925=DIRECTION('',(0.,1.,0.)); 948 | #926=DIRECTION('',(0.,0.,1.)); 949 | #927=DIRECTION('',(0.,0.,-1.)); 950 | #928=DIRECTION('',(1.,0.,0.)); 951 | #929=DIRECTION('',(0.,0.,-1.)); 952 | #930=DIRECTION('',(1.,0.,0.)); 953 | #931=DIRECTION('',(0.,0.,1.)); 954 | #932=DIRECTION('',(1.,0.,0.)); 955 | #933=DIRECTION('',(0.,-1.,0.)); 956 | #934=DIRECTION('',(-1.,0.,0.)); 957 | #935=DIRECTION('',(0.,-1.,0.)); 958 | #936=DIRECTION('',(0.,0.,1.)); 959 | #937=DIRECTION('',(1.,0.,0.)); 960 | #938=DIRECTION('',(0.,0.,1.)); 961 | #939=DIRECTION('',(1.,0.,0.)); 962 | #940=DIRECTION('',(-0.866025403784439,-0.5,0.)); 963 | #941=DIRECTION('',(-0.866025403784441,0.5,0.)); 964 | #942=DIRECTION('',(-1.22637926427523E-15,1.,0.)); 965 | #943=DIRECTION('',(0.866025403784438,0.5,0.)); 966 | #944=DIRECTION('',(0.86602540378444,-0.5,0.)); 967 | #945=DIRECTION('',(2.45275852855047E-15,-1.,0.)); 968 | #946=DIRECTION('',(1.,0.,0.)); 969 | #947=DIRECTION('',(0.,0.,-1.)); 970 | #948=DIRECTION('',(0.,-0.707106781186548,-0.707106781186548)); 971 | #949=DIRECTION('',(0.,-1.,0.)); 972 | #950=DIRECTION('',(0.,0.,-1.)); 973 | #951=DIRECTION('',(0.,-1.,0.)); 974 | #952=DIRECTION('',(0.,0.,-1.)); 975 | #953=DIRECTION('',(0.,-1.,0.)); 976 | #954=DIRECTION('',(3.43630190167812E-16,1.,0.)); 977 | #955=DIRECTION('',(-1.,3.43630190167812E-16,0.)); 978 | #956=DIRECTION('',(3.43630190167812E-16,1.,0.)); 979 | #957=DIRECTION('',(-1.,3.43630190167812E-16,0.)); 980 | #958=DIRECTION('',(3.43630190167812E-16,1.,0.)); 981 | #959=DIRECTION('',(-1.,3.43630190167812E-16,0.)); 982 | #960=DIRECTION('',(0.,0.,-1.)); 983 | #961=DIRECTION('',(3.43630190167812E-16,1.,0.)); 984 | #962=DIRECTION('',(-1.,3.43630190167812E-16,0.)); 985 | #963=DIRECTION('',(0.,0.,-1.)); 986 | #964=DIRECTION('',(0.,0.,-1.)); 987 | #965=DIRECTION('',(1.,-3.43630190167812E-16,0.)); 988 | #966=DIRECTION('',(1.,-3.43630190167812E-16,0.)); 989 | #967=DIRECTION('',(1.,0.,0.)); 990 | #968=DIRECTION('',(0.,0.,-1.)); 991 | #969=DIRECTION('',(0.,-1.,0.)); 992 | #970=DIRECTION('',(0.,0.,-1.)); 993 | #971=DIRECTION('',(0.,0.707106781186548,0.707106781186548)); 994 | #972=DIRECTION('',(0.,-1.,0.)); 995 | #973=DIRECTION('',(0.,0.,1.)); 996 | #974=DIRECTION('',(1.,0.,0.)); 997 | #975=DIRECTION('',(0.,0.,1.)); 998 | #976=DIRECTION('',(1.,0.,0.)); 999 | #977=DIRECTION('',(0.,0.,1.)); 1000 | #978=DIRECTION('',(1.,0.,0.)); 1001 | #979=DIRECTION('',(0.,0.,1.)); 1002 | #980=DIRECTION('',(1.,0.,0.)); 1003 | #981=DIRECTION('',(0.,0.,1.)); 1004 | #982=DIRECTION('',(1.,0.,0.)); 1005 | #983=DIRECTION('',(0.,-1.,0.)); 1006 | #984=DIRECTION('',(0.707106781186547,-0.707106781186548,0.)); 1007 | #985=DIRECTION('',(-0.707106781186547,-0.707106781186548,0.)); 1008 | #986=DIRECTION('',(0.,-1.,0.)); 1009 | #987=DIRECTION('',(0.,0.,1.)); 1010 | #988=DIRECTION('',(1.,0.,0.)); 1011 | #989=DIRECTION('',(0.,0.,1.)); 1012 | #990=DIRECTION('',(1.,0.,0.)); 1013 | #991=DIRECTION('',(0.,0.,1.)); 1014 | #992=DIRECTION('',(1.,0.,0.)); 1015 | #993=DIRECTION('',(1.,0.,0.)); 1016 | #994=DIRECTION('',(0.,0.,-1.)); 1017 | #995=DIRECTION('',(0.,0.,1.)); 1018 | #996=DIRECTION('',(0.,0.,-1.)); 1019 | #997=DIRECTION('',(1.,0.,0.)); 1020 | #998=DIRECTION('',(0.,0.,-1.)); 1021 | #999=DIRECTION('',(0.,-1.,0.)); 1022 | #1000=DIRECTION('',(0.,0.,-1.)); 1023 | #1001=DIRECTION('',(0.,0.,-1.)); 1024 | #1002=DIRECTION('',(0.,0.,1.)); 1025 | #1003=DIRECTION('',(1.,0.,0.)); 1026 | #1004=DIRECTION('',(1.22637926427523E-15,1.,0.)); 1027 | #1005=DIRECTION('',(0.866025403784441,0.5,0.)); 1028 | #1006=DIRECTION('',(0.866025403784438,-0.5,0.)); 1029 | #1007=DIRECTION('',(-2.45275852855047E-15,-1.,0.)); 1030 | #1008=DIRECTION('',(-0.86602540378444,-0.5,0.)); 1031 | #1009=DIRECTION('',(-0.866025403784438,0.5,0.)); 1032 | #1010=DIRECTION('',(-1.,0.,0.)); 1033 | #1011=DIRECTION('',(0.,0.,1.)); 1034 | #1012=DIRECTION('',(1.,0.,0.)); 1035 | #1013=DIRECTION('',(0.,0.,1.)); 1036 | #1014=DIRECTION('',(1.,0.,0.)); 1037 | #1015=DIRECTION('',(1.,-1.22637926427523E-15,0.)); 1038 | #1016=DIRECTION('',(1.22637926427523E-15,1.,0.)); 1039 | #1017=DIRECTION('',(0.,0.,-1.)); 1040 | #1018=DIRECTION('',(-1.22637926427523E-15,-1.,0.)); 1041 | #1019=DIRECTION('',(0.,0.,-1.)); 1042 | #1020=DIRECTION('',(0.5,0.866025403784437,0.)); 1043 | #1021=DIRECTION('',(-0.866025403784438,0.5,0.)); 1044 | #1022=DIRECTION('',(0.,0.,-1.)); 1045 | #1023=DIRECTION('',(0.866025403784438,-0.5,0.)); 1046 | #1024=DIRECTION('',(-0.5,0.86602540378444,0.)); 1047 | #1025=DIRECTION('',(-0.86602540378444,-0.5,0.)); 1048 | #1026=DIRECTION('',(0.,0.,-1.)); 1049 | #1027=DIRECTION('',(0.86602540378444,0.5,0.)); 1050 | #1028=DIRECTION('',(-1.,2.45275852855047E-15,0.)); 1051 | #1029=DIRECTION('',(-2.45275852855047E-15,-1.,0.)); 1052 | #1030=DIRECTION('',(0.,0.,-1.)); 1053 | #1031=DIRECTION('',(2.45275852855047E-15,1.,0.)); 1054 | #1032=DIRECTION('',(-0.5,-0.866025403784438,0.)); 1055 | #1033=DIRECTION('',(0.866025403784438,-0.5,0.)); 1056 | #1034=DIRECTION('',(0.,0.,-1.)); 1057 | #1035=DIRECTION('',(-0.866025403784438,0.5,0.)); 1058 | #1036=DIRECTION('',(0.5,-0.86602540378444,0.)); 1059 | #1037=DIRECTION('',(0.866025403784441,0.5,0.)); 1060 | #1038=DIRECTION('',(-0.86602540378444,-0.5,0.)); 1061 | #1039=DIRECTION('',(0.,0.,1.)); 1062 | #1040=DIRECTION('',(1.,0.,0.)); 1063 | #1041=DIRECTION('',(0.,0.,1.)); 1064 | #1042=DIRECTION('',(1.,0.,0.)); 1065 | #1043=DIRECTION('',(0.5,0.86602540378444,0.)); 1066 | #1044=DIRECTION('',(-0.866025403784441,0.5,0.)); 1067 | #1045=DIRECTION('',(0.,0.,-1.)); 1068 | #1046=DIRECTION('',(0.86602540378444,-0.5,0.)); 1069 | #1047=DIRECTION('',(0.,0.,-1.)); 1070 | #1048=DIRECTION('',(-0.5,0.866025403784439,0.)); 1071 | #1049=DIRECTION('',(-0.866025403784439,-0.5,0.)); 1072 | #1050=DIRECTION('',(0.,0.,-1.)); 1073 | #1051=DIRECTION('',(0.866025403784439,0.5,0.)); 1074 | #1052=DIRECTION('',(-1.,-2.45275852855047E-15,0.)); 1075 | #1053=DIRECTION('',(2.45275852855047E-15,-1.,0.)); 1076 | #1054=DIRECTION('',(0.,0.,-1.)); 1077 | #1055=DIRECTION('',(-2.45275852855047E-15,1.,0.)); 1078 | #1056=DIRECTION('',(-0.5,-0.86602540378444,0.)); 1079 | #1057=DIRECTION('',(0.86602540378444,-0.5,0.)); 1080 | #1058=DIRECTION('',(0.,0.,-1.)); 1081 | #1059=DIRECTION('',(-0.86602540378444,0.5,0.)); 1082 | #1060=DIRECTION('',(0.5,-0.866025403784437,0.)); 1083 | #1061=DIRECTION('',(0.866025403784438,0.5,0.)); 1084 | #1062=DIRECTION('',(0.,0.,-1.)); 1085 | #1063=DIRECTION('',(-0.866025403784438,-0.5,0.)); 1086 | #1064=DIRECTION('',(1.,1.22637926427523E-15,0.)); 1087 | #1065=DIRECTION('',(-1.22637926427523E-15,1.,0.)); 1088 | #1066=DIRECTION('',(1.22637926427523E-15,-1.,0.)); 1089 | #1067=DIRECTION('',(0.,0.,1.)); 1090 | #1068=DIRECTION('',(1.,0.,0.)); 1091 | #1069=DIRECTION('',(0.,0.,1.)); 1092 | #1070=DIRECTION('',(1.,0.,0.)); 1093 | #1071=DIRECTION('',(0.,0.,1.)); 1094 | #1072=DIRECTION('',(1.,0.,0.)); 1095 | #1073=DIRECTION('',(0.,0.,1.)); 1096 | #1074=DIRECTION('',(0.,0.,-1.)); 1097 | #1075=DIRECTION('',(-1.,0.,0.)); 1098 | #1076=DIRECTION('',(0.,0.,-1.)); 1099 | #1077=DIRECTION('',(-1.,0.,0.)); 1100 | #1078=DIRECTION('',(0.,0.,-1.)); 1101 | #1079=DIRECTION('',(0.,0.,1.)); 1102 | #1080=DIRECTION('',(1.,0.,0.)); 1103 | #1081=DIRECTION('',(3.43630190167812E-16,1.,0.)); 1104 | #1082=DIRECTION('',(-1.,3.43630190167812E-16,0.)); 1105 | #1083=DIRECTION('',(3.43630190167812E-16,1.,0.)); 1106 | #1084=DIRECTION('',(3.43630190167812E-16,1.,0.)); 1107 | #1085=DIRECTION('',(1.,-3.43630190167812E-16,0.)); 1108 | #1086=DIRECTION('',(3.43630190167812E-16,1.,0.)); 1109 | #1087=DIRECTION('',(3.43630190167812E-16,1.,0.)); 1110 | #1088=DIRECTION('',(3.43630190167812E-16,1.,0.)); 1111 | #1089=DIRECTION('',(-1.,3.43630190167812E-16,0.)); 1112 | #1090=DIRECTION('',(3.43630190167812E-16,1.,0.)); 1113 | #1091=DIRECTION('',(1.,-3.43630190167812E-16,0.)); 1114 | #1092=DIRECTION('',(3.43630190167812E-16,1.,0.)); 1115 | #1093=DIRECTION('',(3.43630190167812E-16,1.,0.)); 1116 | #1094=DIRECTION('',(-1.,3.43630190167812E-16,0.)); 1117 | #1095=DIRECTION('',(3.43630190167812E-16,1.,0.)); 1118 | #1096=DIRECTION('',(-1.,3.43630190167812E-16,0.)); 1119 | #1097=DIRECTION('',(1.,-3.43630190167812E-16,0.)); 1120 | #1098=DIRECTION('',(3.43630190167812E-16,1.,0.)); 1121 | #1099=DIRECTION('',(3.43630190167812E-16,1.,0.)); 1122 | #1100=DIRECTION('',(0.,0.,-1.)); 1123 | #1101=DIRECTION('',(3.43630190167812E-16,1.,0.)); 1124 | #1102=DIRECTION('',(0.,0.,1.)); 1125 | #1103=DIRECTION('',(1.,0.,0.)); 1126 | #1104=DIRECTION('',(1.,-3.43630190167812E-16,0.)); 1127 | #1105=DIRECTION('',(3.43630190167812E-16,1.,0.)); 1128 | #1106=DIRECTION('',(1.,-3.43630190167812E-16,0.)); 1129 | #1107=DIRECTION('',(3.43630190167812E-16,1.,0.)); 1130 | #1108=DIRECTION('',(0.,0.,-1.)); 1131 | #1109=DIRECTION('',(3.43630190167812E-16,1.,0.)); 1132 | #1110=DIRECTION('',(0.,0.,1.)); 1133 | #1111=DIRECTION('',(1.,0.,0.)); 1134 | #1112=DIRECTION('',(1.,-3.43630190167812E-16,0.)); 1135 | #1113=DIRECTION('',(3.43630190167812E-16,1.,0.)); 1136 | #1114=DIRECTION('',(-1.,3.43630190167812E-16,0.)); 1137 | #1115=DIRECTION('',(0.,0.707106781186548,-0.707106781186548)); 1138 | #1116=DIRECTION('',(1.,0.,0.)); 1139 | #1117=DIRECTION('',(0.577350269189625,0.577350269189626,0.577350269189626)); 1140 | #1118=DIRECTION('',(-0.707106781186548,0.707106781186547,0.)); 1141 | #1119=DIRECTION('',(0.,0.,-1.)); 1142 | #1120=DIRECTION('',(0.,0.707106781186548,-0.707106781186548)); 1143 | #1121=DIRECTION('',(1.,0.,0.)); 1144 | #1122=DIRECTION('',(-0.577350269189625,0.577350269189626,0.577350269189626)); 1145 | #1123=DIRECTION('',(-0.707106781186548,-0.707106781186547,0.)); 1146 | #1124=DIRECTION('',(0.,0.,1.)); 1147 | #1125=DIRECTION('',(0.,0.,1.)); 1148 | #1126=DIRECTION('',(1.,0.,0.)); 1149 | #1127=DIRECTION('',(0.,0.,1.)); 1150 | #1128=DIRECTION('',(1.,0.,0.)); 1151 | #1129=CARTESIAN_POINT('',(0.,0.,0.)); 1152 | #1130=CARTESIAN_POINT('',(0.,0.0935,-0.004398)); 1153 | #1131=CARTESIAN_POINT('',(0.,0.0935,-0.0374)); 1154 | #1132=CARTESIAN_POINT('',(-0.0331147545195112,0.0935,-0.0374)); 1155 | #1133=CARTESIAN_POINT('',(-0.0183147545195113,0.0935,-0.0374)); 1156 | #1134=CARTESIAN_POINT('',(-0.0183147545195113,0.0935,-0.004398)); 1157 | #1135=CARTESIAN_POINT('',(-0.0183147545195113,0.0935,-0.0442)); 1158 | #1136=CARTESIAN_POINT('',(0.,0.0935,-0.0442)); 1159 | #1137=CARTESIAN_POINT('',(0.0183147545195113,0.0935,-0.0442)); 1160 | #1138=CARTESIAN_POINT('',(0.0183147545195113,0.0935,-0.0404)); 1161 | #1139=CARTESIAN_POINT('',(0.0183147545195113,0.0935,-0.0374)); 1162 | #1140=CARTESIAN_POINT('',(0.,0.0935,-0.0374)); 1163 | #1141=CARTESIAN_POINT('',(0.0331147545195113,0.0935,-0.0374)); 1164 | #1142=CARTESIAN_POINT('',(0.0331147545195113,0.0935,-0.004398)); 1165 | #1143=CARTESIAN_POINT('',(0.0331147545195113,0.0935,-0.0046)); 1166 | #1144=CARTESIAN_POINT('',(0.,0.0935,-0.0046)); 1167 | #1145=CARTESIAN_POINT('',(-0.0331147545195112,0.0935,-0.0046)); 1168 | #1146=CARTESIAN_POINT('',(-0.0331147545195112,0.0935,-0.004398)); 1169 | #1147=CARTESIAN_POINT('',(-0.0176,0.0935,-0.004398)); 1170 | #1148=CARTESIAN_POINT('',(-0.0176,0.0935,-0.0214062565240155)); 1171 | #1149=CARTESIAN_POINT('',(-0.0176,0.0935,-0.0273937434759845)); 1172 | #1150=CARTESIAN_POINT('',(-0.012,0.0935,-0.0244)); 1173 | #1151=CARTESIAN_POINT('',(-0.0064,0.0935,-0.0214062565240155)); 1174 | #1152=CARTESIAN_POINT('',(-0.0064,0.0935,-0.004398)); 1175 | #1153=CARTESIAN_POINT('',(-0.0064,0.0935,-0.0273937434759845)); 1176 | #1154=CARTESIAN_POINT('',(-0.012,0.0935,-0.0244)); 1177 | #1155=CARTESIAN_POINT('',(0.0079,0.0935,-0.004398)); 1178 | #1156=CARTESIAN_POINT('',(0.0079,0.0935,-0.0173)); 1179 | #1157=CARTESIAN_POINT('',(0.0079,0.0935,-0.0315)); 1180 | #1158=CARTESIAN_POINT('',(0.,0.0935,-0.0173)); 1181 | #1159=CARTESIAN_POINT('',(0.0161,0.0935,-0.0173)); 1182 | #1160=CARTESIAN_POINT('',(0.0161,0.0935,-0.004398)); 1183 | #1161=CARTESIAN_POINT('',(0.0161,0.0935,-0.0315)); 1184 | #1162=CARTESIAN_POINT('',(0.,0.0935,-0.0315)); 1185 | #1163=CARTESIAN_POINT('',(1.38777878078145E-17,0.,-0.0404)); 1186 | #1164=CARTESIAN_POINT('',(-0.0213147545195113,0.0875,-0.0404)); 1187 | #1165=CARTESIAN_POINT('',(-0.0213147545195113,0.0905,-0.0404)); 1188 | #1166=CARTESIAN_POINT('',(-0.0213147545195113,0.0875,-0.0404)); 1189 | #1167=CARTESIAN_POINT('',(1.38777878078145E-17,0.0905,-0.0404)); 1190 | #1168=CARTESIAN_POINT('',(-0.0331147545195112,0.0905,-0.0404)); 1191 | #1169=CARTESIAN_POINT('',(-0.0331147545195112,0.0955,-0.0404)); 1192 | #1170=CARTESIAN_POINT('',(-0.0331147545195112,0.0875,-0.0404)); 1193 | #1171=CARTESIAN_POINT('',(-0.0271147545195113,0.0875,-0.0404)); 1194 | #1172=CARTESIAN_POINT('',(-0.0272147545195113,0.0815008333912118,-0.0404)); 1195 | #1173=CARTESIAN_POINT('',(-0.0273147545195113,0.0875,-0.0404)); 1196 | #1174=CARTESIAN_POINT('',(-0.043492300045447,0.0753308734167444,-0.0404)); 1197 | #1175=CARTESIAN_POINT('',(-0.0248647545195112,0.0860854918404855,-0.0404)); 1198 | #1176=CARTESIAN_POINT('',(-0.0273147545195113,0.0846709836809708,-0.0404)); 1199 | #1177=CARTESIAN_POINT('',(0.0298349227856913,0.0516756021047121,-0.0404)); 1200 | #1178=CARTESIAN_POINT('',(-0.0297647545195113,0.0860854918404854,-0.0404)); 1201 | #1179=CARTESIAN_POINT('',(-0.0297647545195112,-3.65028777489708E-17,-0.0404)); 1202 | #1180=CARTESIAN_POINT('',(-0.0297647545195113,0.0889145081595146,-0.0404)); 1203 | #1181=CARTESIAN_POINT('',(-0.0459423000454472,0.079574397895288,-0.0404)); 1204 | #1182=CARTESIAN_POINT('',(-0.0273147545195113,0.0903290163190292,-0.0404)); 1205 | #1183=CARTESIAN_POINT('',(0.0322849227856914,0.0559191265832558,-0.0404)); 1206 | #1184=CARTESIAN_POINT('',(-0.0248647545195112,0.0889145081595146,-0.0404)); 1207 | #1185=CARTESIAN_POINT('',(-0.024864754519511,-6.09872387080444E-17,-0.0404)); 1208 | #1186=CARTESIAN_POINT('',(0.0331147545195113,0.0955,-0.004398)); 1209 | #1187=CARTESIAN_POINT('',(0.0331147545195113,0.0935,-0.0374)); 1210 | #1188=CARTESIAN_POINT('',(0.0331147545195113,0.0905,-0.0404)); 1211 | #1189=CARTESIAN_POINT('',(0.0331147545195113,0.0955,-0.0404)); 1212 | #1190=CARTESIAN_POINT('',(0.0331147545195113,0.0875,-0.0404)); 1213 | #1191=CARTESIAN_POINT('',(0.0331147545195113,0.0875,-0.004398)); 1214 | #1192=CARTESIAN_POINT('',(0.0331147545195113,0.0875,-0.0442)); 1215 | #1193=CARTESIAN_POINT('',(0.0331147545195113,0.0955,-0.0442)); 1216 | #1194=CARTESIAN_POINT('',(0.0331147545195113,0.0975,-0.0442)); 1217 | #1195=CARTESIAN_POINT('',(0.0331147545195113,0.0975,-0.004398)); 1218 | #1196=CARTESIAN_POINT('',(0.0331147545195113,0.0975,-0.0046)); 1219 | #1197=CARTESIAN_POINT('',(0.0331147545195113,0.0955,-0.0046)); 1220 | #1198=CARTESIAN_POINT('',(-6.93889390390723E-18,0.0975,-0.004398)); 1221 | #1199=CARTESIAN_POINT('',(0.012,0.0975,-0.0244)); 1222 | #1200=CARTESIAN_POINT('',(0.00835,0.0975,-0.0244)); 1223 | #1201=CARTESIAN_POINT('',(-0.012,0.0975,-0.0244)); 1224 | #1202=CARTESIAN_POINT('',(-0.0176,0.0975,-0.0214062565240155)); 1225 | #1203=CARTESIAN_POINT('',(-0.0064,0.0975,-0.0214062565240155)); 1226 | #1204=CARTESIAN_POINT('',(-0.0176,0.0975,-0.0244)); 1227 | #1205=CARTESIAN_POINT('',(-0.0176,0.0975,-0.0273937434759845)); 1228 | #1206=CARTESIAN_POINT('',(-0.012,0.0975,-0.0244)); 1229 | #1207=CARTESIAN_POINT('',(-0.0064,0.0975,-0.0273937434759845)); 1230 | #1208=CARTESIAN_POINT('',(-0.0064,0.0975,-0.0244)); 1231 | #1209=CARTESIAN_POINT('',(-0.0331147545195112,0.0975,-0.004398)); 1232 | #1210=CARTESIAN_POINT('',(-0.0331147545195112,0.0975,-0.0046)); 1233 | #1211=CARTESIAN_POINT('',(-0.0331147545195112,0.0975,-0.0442)); 1234 | #1212=CARTESIAN_POINT('',(-6.93889390390723E-18,0.0975,-0.0046)); 1235 | #1213=CARTESIAN_POINT('',(-6.93889390390723E-18,0.0975,-0.0442)); 1236 | #1214=CARTESIAN_POINT('',(-0.0331147545195112,0.0955,-0.004398)); 1237 | #1215=CARTESIAN_POINT('',(-0.0331147545195112,0.0955,-0.0442)); 1238 | #1216=CARTESIAN_POINT('',(-0.0331147545195112,0.0875,-0.0442)); 1239 | #1217=CARTESIAN_POINT('',(-0.0331147545195112,0.0875,-0.004398)); 1240 | #1218=CARTESIAN_POINT('',(-0.0331147545195112,0.111001,-0.019899)); 1241 | #1219=CARTESIAN_POINT('',(-0.0331147545195112,0.0955,-0.0046)); 1242 | #1220=CARTESIAN_POINT('',(1.38777878078145E-17,0.,-0.0442)); 1243 | #1221=CARTESIAN_POINT('',(-0.0273147545195113,0.0875,-0.0442)); 1244 | #1222=CARTESIAN_POINT('',(-0.0258647545195113,0.0875,-0.0442)); 1245 | #1223=CARTESIAN_POINT('',(0.0273147545195113,0.0875,-0.0442)); 1246 | #1224=CARTESIAN_POINT('',(0.0287647545195113,0.0875,-0.0442)); 1247 | #1225=CARTESIAN_POINT('',(0.0271147545195113,0.0875,-0.0442)); 1248 | #1226=CARTESIAN_POINT('',(0.0272147545195113,0.0815008333912118,-0.0442)); 1249 | #1227=CARTESIAN_POINT('',(0.0273147545195113,0.0875,-0.0442)); 1250 | #1228=CARTESIAN_POINT('',(0.0213147545195113,0.0875,-0.0442)); 1251 | #1229=CARTESIAN_POINT('',(0.0213147545195113,0.0875,-0.0442)); 1252 | #1230=CARTESIAN_POINT('',(0.0213147545195113,0.0905,-0.0442)); 1253 | #1231=CARTESIAN_POINT('',(0.0559073772597557,0.0559073772597556,-0.0442)); 1254 | #1232=CARTESIAN_POINT('',(-0.0559073772597557,0.0559073772597556,-0.0442)); 1255 | #1233=CARTESIAN_POINT('',(-0.0213147545195113,0.0905,-0.0442)); 1256 | #1234=CARTESIAN_POINT('',(-0.0213147545195113,0.0875,-0.0442)); 1257 | #1235=CARTESIAN_POINT('',(-0.0213147545195113,0.0875,-0.0442)); 1258 | #1236=CARTESIAN_POINT('',(-0.0273147545195113,0.0875,-0.0442)); 1259 | #1237=CARTESIAN_POINT('',(-0.0272147545195113,0.0815008333912118,-0.0442)); 1260 | #1238=CARTESIAN_POINT('',(-0.0271147545195113,0.0875,-0.0442)); 1261 | #1239=CARTESIAN_POINT('',(-1.38777878078145E-17,1.38777878078145E-17,-0.0046)); 1262 | #1240=CARTESIAN_POINT('',(-0.0213147545195113,0.0875,-0.0404)); 1263 | #1241=CARTESIAN_POINT('',(-0.0213147545195113,0.0905,-0.0404)); 1264 | #1242=CARTESIAN_POINT('',(-0.0213147545195113,0.0875,-0.0442)); 1265 | #1243=CARTESIAN_POINT('',(0.0213147545195113,0.0875,-0.0404)); 1266 | #1244=CARTESIAN_POINT('',(0.0213147545195113,0.0875,-0.0404)); 1267 | #1245=CARTESIAN_POINT('',(0.0213147545195113,0.0905,-0.0404)); 1268 | #1246=CARTESIAN_POINT('',(0.0213147545195113,0.0875,-0.0404)); 1269 | #1247=CARTESIAN_POINT('',(0.0213147545195113,0.0905,-0.0442)); 1270 | #1248=CARTESIAN_POINT('',(0.0213147545195113,0.0875,-0.0404)); 1271 | #1249=CARTESIAN_POINT('',(1.38777878078145E-17,0.,-0.0404)); 1272 | #1250=CARTESIAN_POINT('',(0.0297647545195112,-3.65028777489707E-17,-0.0404)); 1273 | #1251=CARTESIAN_POINT('',(0.0297647545195113,0.0860854918404854,-0.0404)); 1274 | #1252=CARTESIAN_POINT('',(0.0297647545195113,0.0889145081595146,-0.0404)); 1275 | #1253=CARTESIAN_POINT('',(-0.0298349227856913,0.0516756021047121,-0.0404)); 1276 | #1254=CARTESIAN_POINT('',(0.0273147545195113,0.0846709836809708,-0.0404)); 1277 | #1255=CARTESIAN_POINT('',(0.0434923000454471,0.0753308734167444,-0.0404)); 1278 | #1256=CARTESIAN_POINT('',(0.0248647545195112,0.0860854918404855,-0.0404)); 1279 | #1257=CARTESIAN_POINT('',(0.024864754519511,-6.09872387080444E-17,-0.0404)); 1280 | #1258=CARTESIAN_POINT('',(0.0248647545195112,0.0889145081595146,-0.0404)); 1281 | #1259=CARTESIAN_POINT('',(-0.0322849227856914,0.0559191265832558,-0.0404)); 1282 | #1260=CARTESIAN_POINT('',(0.0273147545195113,0.0903290163190292,-0.0404)); 1283 | #1261=CARTESIAN_POINT('',(0.0459423000454472,0.079574397895288,-0.0404)); 1284 | #1262=CARTESIAN_POINT('',(1.38777878078145E-17,0.0905,-0.0404)); 1285 | #1263=CARTESIAN_POINT('',(0.0273147545195113,0.0875,-0.0404)); 1286 | #1264=CARTESIAN_POINT('',(0.0272147545195113,0.0815008333912118,-0.0404)); 1287 | #1265=CARTESIAN_POINT('',(0.0271147545195113,0.0875,-0.0404)); 1288 | #1266=CARTESIAN_POINT('',(0.0297647545195113,0.0875,-0.0194)); 1289 | #1267=CARTESIAN_POINT('',(0.0297647545195113,0.0889145081595146,-0.0194)); 1290 | #1268=CARTESIAN_POINT('',(0.0297647545195113,0.0889145081595146,-0.0424)); 1291 | #1269=CARTESIAN_POINT('',(0.0297647545195113,0.0875,-0.0424)); 1292 | #1270=CARTESIAN_POINT('',(0.0297647545195113,0.0860854918404854,-0.0424)); 1293 | #1271=CARTESIAN_POINT('',(0.0297647545195113,0.0860854918404854,-0.0194)); 1294 | #1272=CARTESIAN_POINT('',(0.0285397545195113,0.0896217622392719,-0.0194)); 1295 | #1273=CARTESIAN_POINT('',(0.0273147545195113,0.0903290163190292,-0.0194)); 1296 | #1274=CARTESIAN_POINT('',(0.0273147545195113,0.0903290163190292,-0.0424)); 1297 | #1275=CARTESIAN_POINT('',(0.0285397545195113,0.0896217622392719,-0.0424)); 1298 | #1276=CARTESIAN_POINT('',(0.0260897545195112,0.0896217622392719,-0.0194)); 1299 | #1277=CARTESIAN_POINT('',(0.0248647545195112,0.0889145081595146,-0.0194)); 1300 | #1278=CARTESIAN_POINT('',(0.0248647545195112,0.0889145081595146,-0.0424)); 1301 | #1279=CARTESIAN_POINT('',(0.0260897545195112,0.0896217622392719,-0.0424)); 1302 | #1280=CARTESIAN_POINT('',(0.0248647545195112,0.0875,-0.0194)); 1303 | #1281=CARTESIAN_POINT('',(0.0248647545195112,0.0860854918404855,-0.0194)); 1304 | #1282=CARTESIAN_POINT('',(0.0248647545195112,0.0860854918404855,-0.0424)); 1305 | #1283=CARTESIAN_POINT('',(0.0248647545195112,0.0875,-0.0424)); 1306 | #1284=CARTESIAN_POINT('',(0.0260897545195112,0.0853782377607281,-0.0194)); 1307 | #1285=CARTESIAN_POINT('',(0.0273147545195113,0.0846709836809708,-0.0194)); 1308 | #1286=CARTESIAN_POINT('',(0.0273147545195113,0.0846709836809708,-0.0424)); 1309 | #1287=CARTESIAN_POINT('',(0.0260897545195112,0.0853782377607281,-0.0424)); 1310 | #1288=CARTESIAN_POINT('',(0.0285397545195113,0.0853782377607281,-0.0194)); 1311 | #1289=CARTESIAN_POINT('',(0.0285397545195113,0.0853782377607281,-0.0424)); 1312 | #1290=CARTESIAN_POINT('',(1.38777878078145E-17,0.,-0.0424)); 1313 | #1291=CARTESIAN_POINT('',(0.0273147545195113,0.0875,-0.0424)); 1314 | #1292=CARTESIAN_POINT('',(0.0287647545195113,0.0875,-0.0424)); 1315 | #1293=CARTESIAN_POINT('',(-0.0285397545195113,0.0853782377607281,-0.0194)); 1316 | #1294=CARTESIAN_POINT('',(-0.0273147545195113,0.0846709836809708,-0.0194)); 1317 | #1295=CARTESIAN_POINT('',(-0.0273147545195113,0.0846709836809708,-0.0424)); 1318 | #1296=CARTESIAN_POINT('',(-0.0285397545195113,0.0853782377607281,-0.0424)); 1319 | #1297=CARTESIAN_POINT('',(-0.0297647545195113,0.0860854918404854,-0.0424)); 1320 | #1298=CARTESIAN_POINT('',(-0.0297647545195113,0.0860854918404854,-0.0194)); 1321 | #1299=CARTESIAN_POINT('',(-0.0260897545195112,0.0853782377607281,-0.0194)); 1322 | #1300=CARTESIAN_POINT('',(-0.0248647545195112,0.0860854918404855,-0.0194)); 1323 | #1301=CARTESIAN_POINT('',(-0.0248647545195112,0.0860854918404855,-0.0424)); 1324 | #1302=CARTESIAN_POINT('',(-0.0260897545195112,0.0853782377607281,-0.0424)); 1325 | #1303=CARTESIAN_POINT('',(-0.0248647545195112,0.0875,-0.0194)); 1326 | #1304=CARTESIAN_POINT('',(-0.0248647545195112,0.0889145081595146,-0.0194)); 1327 | #1305=CARTESIAN_POINT('',(-0.0248647545195112,0.0889145081595146,-0.0424)); 1328 | #1306=CARTESIAN_POINT('',(-0.0248647545195112,0.0875,-0.0424)); 1329 | #1307=CARTESIAN_POINT('',(-0.0260897545195112,0.0896217622392719,-0.0194)); 1330 | #1308=CARTESIAN_POINT('',(-0.0273147545195113,0.0903290163190292,-0.0194)); 1331 | #1309=CARTESIAN_POINT('',(-0.0273147545195113,0.0903290163190292,-0.0424)); 1332 | #1310=CARTESIAN_POINT('',(-0.0260897545195112,0.0896217622392719,-0.0424)); 1333 | #1311=CARTESIAN_POINT('',(-0.0285397545195113,0.0896217622392719,-0.0194)); 1334 | #1312=CARTESIAN_POINT('',(-0.0297647545195113,0.0889145081595146,-0.0194)); 1335 | #1313=CARTESIAN_POINT('',(-0.0297647545195113,0.0889145081595146,-0.0424)); 1336 | #1314=CARTESIAN_POINT('',(-0.0285397545195113,0.0896217622392719,-0.0424)); 1337 | #1315=CARTESIAN_POINT('',(-0.0297647545195113,0.0875,-0.0194)); 1338 | #1316=CARTESIAN_POINT('',(-0.0297647545195113,0.0875,-0.0424)); 1339 | #1317=CARTESIAN_POINT('',(1.38777878078145E-17,0.,-0.0424)); 1340 | #1318=CARTESIAN_POINT('',(-0.0273147545195113,0.0875,-0.0424)); 1341 | #1319=CARTESIAN_POINT('',(-0.0258647545195113,0.0875,-0.0424)); 1342 | #1320=CARTESIAN_POINT('',(0.0273147545195113,0.0875,-0.0404)); 1343 | #1321=CARTESIAN_POINT('',(0.0272147545195113,0.0815008333912118,-0.0423)); 1344 | #1322=CARTESIAN_POINT('',(0.0271147545195113,0.0875,-0.004398)); 1345 | #1323=CARTESIAN_POINT('',(-0.0271147545195113,0.0875,-0.0404)); 1346 | #1324=CARTESIAN_POINT('',(-0.0272147545195113,0.0815008333912118,-0.0423)); 1347 | #1325=CARTESIAN_POINT('',(-0.0273147545195113,0.0875,-0.0404)); 1348 | #1326=CARTESIAN_POINT('',(-0.012,0.0725,-0.0244)); 1349 | #1327=CARTESIAN_POINT('',(-0.0176,0.0725,-0.0214062565240155)); 1350 | #1328=CARTESIAN_POINT('',(-0.0064,0.0725,-0.0214062565240155)); 1351 | #1329=CARTESIAN_POINT('',(-0.0064,0.0725,-0.0244)); 1352 | #1330=CARTESIAN_POINT('',(-0.0064,0.0725,-0.0273937434759845)); 1353 | #1331=CARTESIAN_POINT('',(-0.012,0.0725,-0.0244)); 1354 | #1332=CARTESIAN_POINT('',(-0.0176,0.0725,-0.0273937434759845)); 1355 | #1333=CARTESIAN_POINT('',(-0.0176,0.0725,-0.0244)); 1356 | #1334=CARTESIAN_POINT('',(0.012,0.0725,-0.0244)); 1357 | #1335=CARTESIAN_POINT('',(0.012,0.097,-0.0244)); 1358 | #1336=CARTESIAN_POINT('',(0.00835,0.097,-0.0244)); 1359 | #1337=CARTESIAN_POINT('',(0.0079,0.0725,-0.0244)); 1360 | #1338=CARTESIAN_POINT('',(0.0079,0.0725,-0.0315)); 1361 | #1339=CARTESIAN_POINT('',(0.0079,0.097,-0.0315)); 1362 | #1340=CARTESIAN_POINT('',(0.0079,0.097,-0.0244)); 1363 | #1341=CARTESIAN_POINT('',(0.0079,0.097,-0.0173)); 1364 | #1342=CARTESIAN_POINT('',(0.0079,0.0725,-0.0173)); 1365 | #1343=CARTESIAN_POINT('',(0.012,0.0725,-0.0173)); 1366 | #1344=CARTESIAN_POINT('',(0.012,0.097,-0.0173)); 1367 | #1345=CARTESIAN_POINT('',(0.0161,0.097,-0.0173)); 1368 | #1346=CARTESIAN_POINT('',(0.0161,0.0725,-0.0173)); 1369 | #1347=CARTESIAN_POINT('',(0.0161,0.0725,-0.0244)); 1370 | #1348=CARTESIAN_POINT('',(0.0161,0.097,-0.0244)); 1371 | #1349=CARTESIAN_POINT('',(0.0161,0.097,-0.0315)); 1372 | #1350=CARTESIAN_POINT('',(0.0161,0.0725,-0.0315)); 1373 | #1351=CARTESIAN_POINT('',(0.012,0.0725,-0.0315)); 1374 | #1352=CARTESIAN_POINT('',(0.012,0.097,-0.0315)); 1375 | #1353=CARTESIAN_POINT('',(2.63932345423705E-17,0.097,-0.0244)); 1376 | #1354=CARTESIAN_POINT('',(0.,0.0935,-0.0374)); 1377 | #1355=CARTESIAN_POINT('',(-0.0122098363463409,0.0996049181731704,-0.0312950818268296)); 1378 | #1356=CARTESIAN_POINT('',(-0.0183147545195113,0.0935,-0.004398)); 1379 | #1357=CARTESIAN_POINT('',(0.,0.0935,-0.0374)); 1380 | #1358=CARTESIAN_POINT('',(0.0122098363463409,0.0996049181731704,-0.0312950818268296)); 1381 | #1359=CARTESIAN_POINT('',(0.0213147545195113,0.0905,-0.0404)); 1382 | #1360=CARTESIAN_POINT('',(-0.0273147545195113,0.0875,-0.0474)); 1383 | #1361=CARTESIAN_POINT('',(0.0273147545195113,0.0875,-0.0474)); 1384 | #1362=MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#835), 1385 | #1363); 1386 | #1363=( 1387 | GEOMETRIC_REPRESENTATION_CONTEXT(3) 1388 | GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#1364)) 1389 | GLOBAL_UNIT_ASSIGNED_CONTEXT((#1367,#1366,#1365)) 1390 | REPRESENTATION_CONTEXT('RearPanel','TOP_LEVEL_ASSEMBLY_PART') 1391 | ); 1392 | #1364=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(5.E-6),#1367, 1393 | 'DISTANCE_ACCURACY_VALUE','Maximum Tolerance applied to model'); 1394 | #1365=( 1395 | NAMED_UNIT(*) 1396 | SI_UNIT($,.STERADIAN.) 1397 | SOLID_ANGLE_UNIT() 1398 | ); 1399 | #1366=( 1400 | NAMED_UNIT(*) 1401 | PLANE_ANGLE_UNIT() 1402 | SI_UNIT($,.RADIAN.) 1403 | ); 1404 | #1367=( 1405 | LENGTH_UNIT() 1406 | NAMED_UNIT(*) 1407 | SI_UNIT($,.METRE.) 1408 | ); 1409 | #1368=PRODUCT_DEFINITION_SHAPE('','',#1369); 1410 | #1369=PRODUCT_DEFINITION('','',#1371,#1370); 1411 | #1370=PRODUCT_DEFINITION_CONTEXT('',#1377,'design'); 1412 | #1371=PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE('','',#1373, 1413 | .NOT_KNOWN.); 1414 | #1372=PRODUCT_RELATED_PRODUCT_CATEGORY('','',(#1373)); 1415 | #1373=PRODUCT('RearPanel','RearPanel','RearPanel',(#1375)); 1416 | #1374=PRODUCT_CATEGORY('',''); 1417 | #1375=PRODUCT_CONTEXT('',#1377,'mechanical'); 1418 | #1376=APPLICATION_PROTOCOL_DEFINITION('international standard', 1419 | 'ap242_managed_model_based_3d_engineering',2011,#1377); 1420 | #1377=APPLICATION_CONTEXT('managed model based 3d engineering'); 1421 | ENDSEC; 1422 | END-ISO-10303-21; 1423 | -------------------------------------------------------------------------------- /CAD/STEP/RearSupport.step: -------------------------------------------------------------------------------- 1 | ISO-10303-21; 2 | HEADER; 3 | /* Generated by software containing ST-Developer 4 | * from STEP Tools, Inc. (www.steptools.com) 5 | */ 6 | /* OPTION: using custom renumber hook */ 7 | 8 | FILE_DESCRIPTION( 9 | /* description */ ('STEP AP242', 10 | 'CAx-IF Rec.Pracs.---Representation and Presentation of Product Manufa 11 | cturing Information (PMI)---4.0---2014-10-13', 12 | 'CAx-IF Rec.Pracs.---3D Tessellated Geometry---0.4---2014-09-14','2;1'), 13 | 14 | /* implementation_level */ '2;1'); 15 | 16 | FILE_NAME( 17 | /* name */ '6423629006b4aa79901b44d6', 18 | /* time_stamp */ '2023-03-28T21:56:32+00:00', 19 | /* author */ (''), 20 | /* organization */ (''), 21 | /* preprocessor_version */ 'ST-DEVELOPER v18.102', 22 | /* originating_system */ ' ', 23 | /* authorisation */ ' '); 24 | 25 | FILE_SCHEMA (('AP242_MANAGED_MODEL_BASED_3D_ENGINEERING_MIM_LF { 1 0 10303 442 1 1 4 }')); 26 | ENDSEC; 27 | 28 | DATA; 29 | #10=SHAPE_REPRESENTATION_RELATIONSHIP('','',#819,#11); 30 | #11=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#817),#1390); 31 | #12=CONICAL_SURFACE('',#880,0.104659169440383,0.785398163397449); 32 | #13=CONICAL_SURFACE('',#881,0.015,0.785398163397448); 33 | #14=CONICAL_SURFACE('',#882,0.102659169440383,0.785398163397449); 34 | #15=CONICAL_SURFACE('',#883,0.013,0.785398163397448); 35 | #16=CONICAL_SURFACE('',#884,0.118241702050283,0.785398163397449); 36 | #17=CONICAL_SURFACE('',#886,0.116241702050283,0.785398163397449); 37 | #18=ELLIPSE('',#825,0.0212132034355964,0.015); 38 | #19=ELLIPSE('',#826,0.0212132034355964,0.015); 39 | #20=ELLIPSE('',#829,0.0121906360413114,0.0087318254350141); 40 | #21=ELLIPSE('',#831,0.0121906360413114,0.00873182543501412); 41 | #22=ELLIPSE('',#835,0.118540598222377,0.102659169440383); 42 | #23=ELLIPSE('',#836,0.118540598222378,0.102659169440383); 43 | #24=ELLIPSE('',#837,0.118540598222377,0.102659169440383); 44 | #25=ELLIPSE('',#838,0.118540598222378,0.102659169440383); 45 | #26=ELLIPSE('',#867,0.163074759144116,0.115311268031167); 46 | #27=ELLIPSE('',#870,0.163074759144116,0.115311268031167); 47 | #28=ELLIPSE('',#875,0.149300479831657,0.10557138172337); 48 | #29=ELLIPSE('',#876,0.149300479831657,0.10557138172337); 49 | #30=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1164,#1165,#1166,#1167), 50 | .UNSPECIFIED.,.F.,.F.,(4,4),(0.00387131409276971,0.00389623821916556), 51 | .UNSPECIFIED.); 52 | #31=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1173,#1174,#1175,#1176), 53 | .UNSPECIFIED.,.F.,.F.,(4,4),(0.,2.49241263958953E-5),.UNSPECIFIED.); 54 | #32=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1271,#1272,#1273,#1274), 55 | .UNSPECIFIED.,.F.,.F.,(4,4),(0.,0.00395626437950874),.UNSPECIFIED.); 56 | #33=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1275,#1276,#1277,#1278), 57 | .UNSPECIFIED.,.F.,.F.,(4,4),(0.,0.00395626437950874),.UNSPECIFIED.); 58 | #34=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1279,#1280,#1281,#1282), 59 | .UNSPECIFIED.,.F.,.F.,(4,4),(0.,0.00539095186251311),.UNSPECIFIED.); 60 | #35=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1283,#1284,#1285,#1286), 61 | .UNSPECIFIED.,.F.,.F.,(4,4),(0.,0.00539095186251311),.UNSPECIFIED.); 62 | #36=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1347,#1348,#1349,#1350), 63 | .UNSPECIFIED.,.F.,.F.,(4,4),(0.,0.0032620178550962),.UNSPECIFIED.); 64 | #37=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1353,#1354,#1355,#1356), 65 | .UNSPECIFIED.,.F.,.F.,(4,4),(0.,0.0032620178550962),.UNSPECIFIED.); 66 | #38=CIRCLE('',#824,0.015); 67 | #39=CIRCLE('',#833,0.102659169440383); 68 | #40=CIRCLE('',#834,0.102659169440383); 69 | #41=CIRCLE('',#840,0.015); 70 | #42=CIRCLE('',#841,0.015); 71 | #43=CIRCLE('',#843,0.013); 72 | #44=CIRCLE('',#844,0.116241702050283); 73 | #45=CIRCLE('',#845,0.104659169440383); 74 | #46=CIRCLE('',#847,0.013); 75 | #47=CIRCLE('',#848,0.104659169440383); 76 | #48=CIRCLE('',#849,0.116241702050283); 77 | #49=CIRCLE('',#852,0.118241702050283); 78 | #50=CIRCLE('',#853,0.118241702050283); 79 | #51=CIRCLE('',#854,0.118241702050281); 80 | #52=CIRCLE('',#855,0.118241702050281); 81 | #53=CIRCLE('',#857,0.00145); 82 | #54=CIRCLE('',#859,0.00095); 83 | #55=CIRCLE('',#863,0.00095); 84 | #56=CIRCLE('',#868,0.115311268031167); 85 | #57=CIRCLE('',#869,0.115311268031167); 86 | #58=CIRCLE('',#874,0.10557138172337); 87 | #59=CIRCLE('',#877,0.10557138172337); 88 | #60=CIRCLE('',#895,0.00145); 89 | #61=CYLINDRICAL_SURFACE('',#823,0.015); 90 | #62=CYLINDRICAL_SURFACE('',#832,0.102659169440383); 91 | #63=CYLINDRICAL_SURFACE('',#839,0.015); 92 | #64=CYLINDRICAL_SURFACE('',#851,0.118241702050283); 93 | #65=CYLINDRICAL_SURFACE('',#866,0.115311268031167); 94 | #66=CYLINDRICAL_SURFACE('',#873,0.10557138172337); 95 | #67=CYLINDRICAL_SURFACE('',#896,0.00145); 96 | #68=CYLINDRICAL_SURFACE('',#897,0.00095); 97 | #69=ORIENTED_EDGE('',*,*,#297,.F.); 98 | #70=ORIENTED_EDGE('',*,*,#298,.T.); 99 | #71=ORIENTED_EDGE('',*,*,#299,.F.); 100 | #72=ORIENTED_EDGE('',*,*,#300,.T.); 101 | #73=ORIENTED_EDGE('',*,*,#301,.F.); 102 | #74=ORIENTED_EDGE('',*,*,#302,.F.); 103 | #75=ORIENTED_EDGE('',*,*,#303,.F.); 104 | #76=ORIENTED_EDGE('',*,*,#304,.F.); 105 | #77=ORIENTED_EDGE('',*,*,#305,.F.); 106 | #78=ORIENTED_EDGE('',*,*,#306,.T.); 107 | #79=ORIENTED_EDGE('',*,*,#307,.F.); 108 | #80=ORIENTED_EDGE('',*,*,#308,.T.); 109 | #81=ORIENTED_EDGE('',*,*,#309,.F.); 110 | #82=ORIENTED_EDGE('',*,*,#310,.T.); 111 | #83=ORIENTED_EDGE('',*,*,#311,.T.); 112 | #84=ORIENTED_EDGE('',*,*,#312,.T.); 113 | #85=ORIENTED_EDGE('',*,*,#313,.T.); 114 | #86=ORIENTED_EDGE('',*,*,#314,.T.); 115 | #87=ORIENTED_EDGE('',*,*,#315,.T.); 116 | #88=ORIENTED_EDGE('',*,*,#316,.T.); 117 | #89=ORIENTED_EDGE('',*,*,#317,.T.); 118 | #90=ORIENTED_EDGE('',*,*,#318,.T.); 119 | #91=ORIENTED_EDGE('',*,*,#319,.F.); 120 | #92=ORIENTED_EDGE('',*,*,#320,.F.); 121 | #93=ORIENTED_EDGE('',*,*,#321,.T.); 122 | #94=ORIENTED_EDGE('',*,*,#315,.F.); 123 | #95=ORIENTED_EDGE('',*,*,#322,.F.); 124 | #96=ORIENTED_EDGE('',*,*,#310,.F.); 125 | #97=ORIENTED_EDGE('',*,*,#323,.T.); 126 | #98=ORIENTED_EDGE('',*,*,#324,.F.); 127 | #99=ORIENTED_EDGE('',*,*,#325,.F.); 128 | #100=ORIENTED_EDGE('',*,*,#326,.T.); 129 | #101=ORIENTED_EDGE('',*,*,#327,.T.); 130 | #102=ORIENTED_EDGE('',*,*,#328,.F.); 131 | #103=ORIENTED_EDGE('',*,*,#329,.T.); 132 | #104=ORIENTED_EDGE('',*,*,#330,.T.); 133 | #105=ORIENTED_EDGE('',*,*,#331,.T.); 134 | #106=ORIENTED_EDGE('',*,*,#332,.T.); 135 | #107=ORIENTED_EDGE('',*,*,#333,.T.); 136 | #108=ORIENTED_EDGE('',*,*,#334,.T.); 137 | #109=ORIENTED_EDGE('',*,*,#335,.T.); 138 | #110=ORIENTED_EDGE('',*,*,#328,.T.); 139 | #111=ORIENTED_EDGE('',*,*,#336,.T.); 140 | #112=ORIENTED_EDGE('',*,*,#313,.F.); 141 | #113=ORIENTED_EDGE('',*,*,#312,.F.); 142 | #114=ORIENTED_EDGE('',*,*,#337,.T.); 143 | #115=ORIENTED_EDGE('',*,*,#338,.T.); 144 | #116=ORIENTED_EDGE('',*,*,#324,.T.); 145 | #117=ORIENTED_EDGE('',*,*,#339,.F.); 146 | #118=ORIENTED_EDGE('',*,*,#340,.T.); 147 | #119=ORIENTED_EDGE('',*,*,#341,.T.); 148 | #120=ORIENTED_EDGE('',*,*,#342,.F.); 149 | #121=ORIENTED_EDGE('',*,*,#343,.T.); 150 | #122=ORIENTED_EDGE('',*,*,#344,.T.); 151 | #123=ORIENTED_EDGE('',*,*,#320,.T.); 152 | #124=ORIENTED_EDGE('',*,*,#345,.T.); 153 | #125=ORIENTED_EDGE('',*,*,#346,.T.); 154 | #126=ORIENTED_EDGE('',*,*,#347,.T.); 155 | #127=ORIENTED_EDGE('',*,*,#348,.T.); 156 | #128=ORIENTED_EDGE('',*,*,#349,.T.); 157 | #129=ORIENTED_EDGE('',*,*,#350,.F.); 158 | #130=ORIENTED_EDGE('',*,*,#351,.T.); 159 | #131=ORIENTED_EDGE('',*,*,#352,.T.); 160 | #132=ORIENTED_EDGE('',*,*,#306,.F.); 161 | #133=ORIENTED_EDGE('',*,*,#353,.F.); 162 | #134=ORIENTED_EDGE('',*,*,#354,.T.); 163 | #135=ORIENTED_EDGE('',*,*,#319,.T.); 164 | #136=ORIENTED_EDGE('',*,*,#355,.T.); 165 | #137=ORIENTED_EDGE('',*,*,#356,.F.); 166 | #138=ORIENTED_EDGE('',*,*,#357,.T.); 167 | #139=ORIENTED_EDGE('',*,*,#358,.T.); 168 | #140=ORIENTED_EDGE('',*,*,#359,.F.); 169 | #141=ORIENTED_EDGE('',*,*,#360,.T.); 170 | #142=ORIENTED_EDGE('',*,*,#342,.T.); 171 | #143=ORIENTED_EDGE('',*,*,#361,.T.); 172 | #144=ORIENTED_EDGE('',*,*,#353,.T.); 173 | #145=ORIENTED_EDGE('',*,*,#362,.T.); 174 | #146=ORIENTED_EDGE('',*,*,#347,.F.); 175 | #147=ORIENTED_EDGE('',*,*,#363,.T.); 176 | #148=ORIENTED_EDGE('',*,*,#326,.F.); 177 | #149=ORIENTED_EDGE('',*,*,#364,.T.); 178 | #150=ORIENTED_EDGE('',*,*,#365,.T.); 179 | #151=ORIENTED_EDGE('',*,*,#366,.F.); 180 | #152=ORIENTED_EDGE('',*,*,#297,.T.); 181 | #153=ORIENTED_EDGE('',*,*,#367,.F.); 182 | #154=ORIENTED_EDGE('',*,*,#303,.T.); 183 | #155=ORIENTED_EDGE('',*,*,#368,.T.); 184 | #156=ORIENTED_EDGE('',*,*,#339,.T.); 185 | #157=ORIENTED_EDGE('',*,*,#323,.F.); 186 | #158=ORIENTED_EDGE('',*,*,#309,.T.); 187 | #159=ORIENTED_EDGE('',*,*,#321,.F.); 188 | #160=ORIENTED_EDGE('',*,*,#344,.F.); 189 | #161=ORIENTED_EDGE('',*,*,#369,.T.); 190 | #162=ORIENTED_EDGE('',*,*,#317,.F.); 191 | #163=ORIENTED_EDGE('',*,*,#370,.T.); 192 | #164=ORIENTED_EDGE('',*,*,#371,.T.); 193 | #165=ORIENTED_EDGE('',*,*,#372,.F.); 194 | #166=ORIENTED_EDGE('',*,*,#300,.F.); 195 | #167=ORIENTED_EDGE('',*,*,#372,.T.); 196 | #168=ORIENTED_EDGE('',*,*,#373,.T.); 197 | #169=ORIENTED_EDGE('',*,*,#350,.T.); 198 | #170=ORIENTED_EDGE('',*,*,#305,.T.); 199 | #171=ORIENTED_EDGE('',*,*,#374,.F.); 200 | #172=ORIENTED_EDGE('',*,*,#301,.T.); 201 | #173=ORIENTED_EDGE('',*,*,#375,.T.); 202 | #174=ORIENTED_EDGE('',*,*,#376,.T.); 203 | #175=ORIENTED_EDGE('',*,*,#307,.T.); 204 | #176=ORIENTED_EDGE('',*,*,#352,.F.); 205 | #177=ORIENTED_EDGE('',*,*,#377,.F.); 206 | #178=ORIENTED_EDGE('',*,*,#370,.F.); 207 | #179=ORIENTED_EDGE('',*,*,#299,.T.); 208 | #180=ORIENTED_EDGE('',*,*,#374,.T.); 209 | #181=ORIENTED_EDGE('',*,*,#304,.T.); 210 | #182=ORIENTED_EDGE('',*,*,#367,.T.); 211 | #183=ORIENTED_EDGE('',*,*,#302,.T.); 212 | #184=ORIENTED_EDGE('',*,*,#366,.T.); 213 | #185=ORIENTED_EDGE('',*,*,#308,.F.); 214 | #186=ORIENTED_EDGE('',*,*,#376,.F.); 215 | #187=ORIENTED_EDGE('',*,*,#298,.F.); 216 | #188=ORIENTED_EDGE('',*,*,#377,.T.); 217 | #189=ORIENTED_EDGE('',*,*,#378,.T.); 218 | #190=ORIENTED_EDGE('',*,*,#379,.T.); 219 | #191=ORIENTED_EDGE('',*,*,#380,.F.); 220 | #192=ORIENTED_EDGE('',*,*,#381,.F.); 221 | #193=ORIENTED_EDGE('',*,*,#382,.T.); 222 | #194=ORIENTED_EDGE('',*,*,#383,.T.); 223 | #195=ORIENTED_EDGE('',*,*,#357,.F.); 224 | #196=ORIENTED_EDGE('',*,*,#384,.F.); 225 | #197=ORIENTED_EDGE('',*,*,#380,.T.); 226 | #198=ORIENTED_EDGE('',*,*,#385,.T.); 227 | #199=ORIENTED_EDGE('',*,*,#386,.F.); 228 | #200=ORIENTED_EDGE('',*,*,#387,.F.); 229 | #201=ORIENTED_EDGE('',*,*,#359,.T.); 230 | #202=ORIENTED_EDGE('',*,*,#388,.F.); 231 | #203=ORIENTED_EDGE('',*,*,#389,.T.); 232 | #204=ORIENTED_EDGE('',*,*,#373,.F.); 233 | #205=ORIENTED_EDGE('',*,*,#390,.T.); 234 | #206=ORIENTED_EDGE('',*,*,#391,.T.); 235 | #207=ORIENTED_EDGE('',*,*,#386,.T.); 236 | #208=ORIENTED_EDGE('',*,*,#391,.F.); 237 | #209=ORIENTED_EDGE('',*,*,#392,.T.); 238 | #210=ORIENTED_EDGE('',*,*,#381,.T.); 239 | #211=ORIENTED_EDGE('',*,*,#384,.T.); 240 | #212=ORIENTED_EDGE('',*,*,#356,.T.); 241 | #213=ORIENTED_EDGE('',*,*,#387,.T.); 242 | #214=ORIENTED_EDGE('',*,*,#379,.F.); 243 | #215=ORIENTED_EDGE('',*,*,#393,.T.); 244 | #216=ORIENTED_EDGE('',*,*,#388,.T.); 245 | #217=ORIENTED_EDGE('',*,*,#385,.F.); 246 | #218=ORIENTED_EDGE('',*,*,#358,.F.); 247 | #219=ORIENTED_EDGE('',*,*,#383,.F.); 248 | #220=ORIENTED_EDGE('',*,*,#363,.F.); 249 | #221=ORIENTED_EDGE('',*,*,#346,.F.); 250 | #222=ORIENTED_EDGE('',*,*,#394,.F.); 251 | #223=ORIENTED_EDGE('',*,*,#327,.F.); 252 | #224=ORIENTED_EDGE('',*,*,#345,.F.); 253 | #225=ORIENTED_EDGE('',*,*,#322,.T.); 254 | #226=ORIENTED_EDGE('',*,*,#314,.F.); 255 | #227=ORIENTED_EDGE('',*,*,#336,.F.); 256 | #228=ORIENTED_EDGE('',*,*,#394,.T.); 257 | #229=ORIENTED_EDGE('',*,*,#364,.F.); 258 | #230=ORIENTED_EDGE('',*,*,#329,.F.); 259 | #231=ORIENTED_EDGE('',*,*,#395,.F.); 260 | #232=ORIENTED_EDGE('',*,*,#343,.F.); 261 | #233=ORIENTED_EDGE('',*,*,#311,.F.); 262 | #234=ORIENTED_EDGE('',*,*,#325,.T.); 263 | #235=ORIENTED_EDGE('',*,*,#338,.F.); 264 | #236=ORIENTED_EDGE('',*,*,#395,.T.); 265 | #237=ORIENTED_EDGE('',*,*,#337,.F.); 266 | #238=ORIENTED_EDGE('',*,*,#362,.F.); 267 | #239=ORIENTED_EDGE('',*,*,#355,.F.); 268 | #240=ORIENTED_EDGE('',*,*,#396,.F.); 269 | #241=ORIENTED_EDGE('',*,*,#348,.F.); 270 | #242=ORIENTED_EDGE('',*,*,#369,.F.); 271 | #243=ORIENTED_EDGE('',*,*,#349,.F.); 272 | #244=ORIENTED_EDGE('',*,*,#396,.T.); 273 | #245=ORIENTED_EDGE('',*,*,#318,.F.); 274 | #246=ORIENTED_EDGE('',*,*,#361,.F.); 275 | #247=ORIENTED_EDGE('',*,*,#341,.F.); 276 | #248=ORIENTED_EDGE('',*,*,#397,.F.); 277 | #249=ORIENTED_EDGE('',*,*,#354,.F.); 278 | #250=ORIENTED_EDGE('',*,*,#368,.F.); 279 | #251=ORIENTED_EDGE('',*,*,#316,.F.); 280 | #252=ORIENTED_EDGE('',*,*,#397,.T.); 281 | #253=ORIENTED_EDGE('',*,*,#340,.F.); 282 | #254=ORIENTED_EDGE('',*,*,#398,.T.); 283 | #255=ORIENTED_EDGE('',*,*,#399,.F.); 284 | #256=ORIENTED_EDGE('',*,*,#400,.F.); 285 | #257=ORIENTED_EDGE('',*,*,#331,.F.); 286 | #258=ORIENTED_EDGE('',*,*,#401,.T.); 287 | #259=ORIENTED_EDGE('',*,*,#402,.F.); 288 | #260=ORIENTED_EDGE('',*,*,#398,.F.); 289 | #261=ORIENTED_EDGE('',*,*,#330,.F.); 290 | #262=ORIENTED_EDGE('',*,*,#403,.T.); 291 | #263=ORIENTED_EDGE('',*,*,#404,.F.); 292 | #264=ORIENTED_EDGE('',*,*,#401,.F.); 293 | #265=ORIENTED_EDGE('',*,*,#335,.F.); 294 | #266=ORIENTED_EDGE('',*,*,#405,.T.); 295 | #267=ORIENTED_EDGE('',*,*,#406,.F.); 296 | #268=ORIENTED_EDGE('',*,*,#403,.F.); 297 | #269=ORIENTED_EDGE('',*,*,#334,.F.); 298 | #270=ORIENTED_EDGE('',*,*,#407,.T.); 299 | #271=ORIENTED_EDGE('',*,*,#408,.F.); 300 | #272=ORIENTED_EDGE('',*,*,#405,.F.); 301 | #273=ORIENTED_EDGE('',*,*,#333,.F.); 302 | #274=ORIENTED_EDGE('',*,*,#400,.T.); 303 | #275=ORIENTED_EDGE('',*,*,#409,.F.); 304 | #276=ORIENTED_EDGE('',*,*,#407,.F.); 305 | #277=ORIENTED_EDGE('',*,*,#332,.F.); 306 | #278=ORIENTED_EDGE('',*,*,#410,.T.); 307 | #279=ORIENTED_EDGE('',*,*,#399,.T.); 308 | #280=ORIENTED_EDGE('',*,*,#402,.T.); 309 | #281=ORIENTED_EDGE('',*,*,#404,.T.); 310 | #282=ORIENTED_EDGE('',*,*,#406,.T.); 311 | #283=ORIENTED_EDGE('',*,*,#408,.T.); 312 | #284=ORIENTED_EDGE('',*,*,#409,.T.); 313 | #285=ORIENTED_EDGE('',*,*,#410,.F.); 314 | #286=ORIENTED_EDGE('',*,*,#360,.F.); 315 | #287=ORIENTED_EDGE('',*,*,#375,.F.); 316 | #288=ORIENTED_EDGE('',*,*,#365,.F.); 317 | #289=ORIENTED_EDGE('',*,*,#382,.F.); 318 | #290=ORIENTED_EDGE('',*,*,#392,.F.); 319 | #291=ORIENTED_EDGE('',*,*,#390,.F.); 320 | #292=ORIENTED_EDGE('',*,*,#371,.F.); 321 | #293=ORIENTED_EDGE('',*,*,#378,.F.); 322 | #294=ORIENTED_EDGE('',*,*,#351,.F.); 323 | #295=ORIENTED_EDGE('',*,*,#389,.F.); 324 | #296=ORIENTED_EDGE('',*,*,#393,.F.); 325 | #297=EDGE_CURVE('',#411,#412,#486,.T.); 326 | #298=EDGE_CURVE('',#411,#413,#487,.T.); 327 | #299=EDGE_CURVE('',#414,#413,#488,.T.); 328 | #300=EDGE_CURVE('',#414,#415,#489,.T.); 329 | #301=EDGE_CURVE('',#416,#415,#490,.T.); 330 | #302=EDGE_CURVE('',#412,#416,#491,.T.); 331 | #303=EDGE_CURVE('',#417,#418,#492,.T.); 332 | #304=EDGE_CURVE('',#419,#417,#493,.T.); 333 | #305=EDGE_CURVE('',#420,#419,#494,.T.); 334 | #306=EDGE_CURVE('',#420,#421,#495,.T.); 335 | #307=EDGE_CURVE('',#422,#421,#496,.T.); 336 | #308=EDGE_CURVE('',#422,#418,#497,.T.); 337 | #309=EDGE_CURVE('',#423,#424,#38,.T.); 338 | #310=EDGE_CURVE('',#423,#425,#498,.T.); 339 | #311=EDGE_CURVE('',#425,#426,#30,.T.); 340 | #312=EDGE_CURVE('',#426,#427,#18,.F.); 341 | #313=EDGE_CURVE('',#427,#428,#19,.T.); 342 | #314=EDGE_CURVE('',#428,#429,#31,.T.); 343 | #315=EDGE_CURVE('',#429,#424,#499,.F.); 344 | #316=EDGE_CURVE('',#430,#431,#500,.T.); 345 | #317=EDGE_CURVE('',#431,#432,#501,.T.); 346 | #318=EDGE_CURVE('',#432,#433,#502,.T.); 347 | #319=EDGE_CURVE('',#430,#433,#503,.T.); 348 | #320=EDGE_CURVE('',#434,#435,#504,.T.); 349 | #321=EDGE_CURVE('',#434,#424,#505,.T.); 350 | #322=EDGE_CURVE('',#435,#429,#20,.F.); 351 | #323=EDGE_CURVE('',#423,#436,#506,.T.); 352 | #324=EDGE_CURVE('',#437,#436,#507,.T.); 353 | #325=EDGE_CURVE('',#425,#437,#21,.F.); 354 | #326=EDGE_CURVE('',#438,#439,#508,.T.); 355 | #327=EDGE_CURVE('',#439,#440,#39,.F.); 356 | #328=EDGE_CURVE('',#441,#440,#509,.T.); 357 | #329=EDGE_CURVE('',#441,#438,#40,.T.); 358 | #330=EDGE_CURVE('',#442,#443,#22,.T.); 359 | #331=EDGE_CURVE('',#443,#444,#510,.T.); 360 | #332=EDGE_CURVE('',#444,#445,#23,.T.); 361 | #333=EDGE_CURVE('',#445,#446,#24,.T.); 362 | #334=EDGE_CURVE('',#446,#447,#511,.F.); 363 | #335=EDGE_CURVE('',#447,#442,#25,.T.); 364 | #336=EDGE_CURVE('',#440,#428,#41,.T.); 365 | #337=EDGE_CURVE('',#426,#441,#42,.F.); 366 | #338=EDGE_CURVE('',#448,#437,#43,.T.); 367 | #339=EDGE_CURVE('',#449,#436,#512,.T.); 368 | #340=EDGE_CURVE('',#449,#450,#513,.T.); 369 | #341=EDGE_CURVE('',#450,#451,#44,.T.); 370 | #342=EDGE_CURVE('',#452,#451,#514,.T.); 371 | #343=EDGE_CURVE('',#452,#448,#45,.F.); 372 | #344=EDGE_CURVE('',#453,#434,#515,.T.); 373 | #345=EDGE_CURVE('',#435,#454,#46,.F.); 374 | #346=EDGE_CURVE('',#454,#455,#47,.T.); 375 | #347=EDGE_CURVE('',#455,#456,#516,.T.); 376 | #348=EDGE_CURVE('',#456,#457,#48,.F.); 377 | #349=EDGE_CURVE('',#457,#453,#517,.T.); 378 | #350=EDGE_CURVE('',#458,#420,#518,.T.); 379 | #351=EDGE_CURVE('',#458,#459,#519,.T.); 380 | #352=EDGE_CURVE('',#459,#421,#520,.T.); 381 | #353=EDGE_CURVE('',#460,#461,#521,.T.); 382 | #354=EDGE_CURVE('',#460,#430,#49,.F.); 383 | #355=EDGE_CURVE('',#433,#461,#50,.T.); 384 | #356=EDGE_CURVE('',#462,#463,#51,.T.); 385 | #357=EDGE_CURVE('',#462,#464,#522,.T.); 386 | #358=EDGE_CURVE('',#464,#465,#52,.T.); 387 | #359=EDGE_CURVE('',#463,#465,#523,.T.); 388 | #360=EDGE_CURVE('',#466,#466,#53,.T.); 389 | #361=EDGE_CURVE('',#451,#460,#32,.T.); 390 | #362=EDGE_CURVE('',#461,#456,#33,.T.); 391 | #363=EDGE_CURVE('',#455,#439,#34,.T.); 392 | #364=EDGE_CURVE('',#438,#452,#35,.T.); 393 | #365=EDGE_CURVE('',#467,#467,#54,.T.); 394 | #366=EDGE_CURVE('',#411,#418,#524,.T.); 395 | #367=EDGE_CURVE('',#417,#412,#525,.T.); 396 | #368=EDGE_CURVE('',#431,#449,#526,.T.); 397 | #369=EDGE_CURVE('',#453,#432,#527,.F.); 398 | #370=EDGE_CURVE('',#414,#468,#528,.T.); 399 | #371=EDGE_CURVE('',#468,#469,#529,.T.); 400 | #372=EDGE_CURVE('',#415,#469,#530,.T.); 401 | #373=EDGE_CURVE('',#469,#458,#531,.T.); 402 | #374=EDGE_CURVE('',#416,#419,#532,.T.); 403 | #375=EDGE_CURVE('',#470,#470,#55,.F.); 404 | #376=EDGE_CURVE('',#413,#422,#533,.T.); 405 | #377=EDGE_CURVE('',#468,#459,#534,.T.); 406 | #378=EDGE_CURVE('',#459,#471,#26,.T.); 407 | #379=EDGE_CURVE('',#471,#472,#56,.T.); 408 | #380=EDGE_CURVE('',#473,#472,#535,.T.); 409 | #381=EDGE_CURVE('',#474,#473,#57,.T.); 410 | #382=EDGE_CURVE('',#474,#468,#27,.F.); 411 | #383=EDGE_CURVE('',#472,#464,#536,.T.); 412 | #384=EDGE_CURVE('',#473,#462,#537,.T.); 413 | #385=EDGE_CURVE('',#465,#475,#538,.T.); 414 | #386=EDGE_CURVE('',#476,#475,#539,.T.); 415 | #387=EDGE_CURVE('',#463,#476,#540,.T.); 416 | #388=EDGE_CURVE('',#477,#475,#58,.T.); 417 | #389=EDGE_CURVE('',#477,#458,#28,.F.); 418 | #390=EDGE_CURVE('',#469,#478,#29,.T.); 419 | #391=EDGE_CURVE('',#478,#476,#59,.T.); 420 | #392=EDGE_CURVE('',#478,#474,#541,.T.); 421 | #393=EDGE_CURVE('',#471,#477,#542,.T.); 422 | #394=EDGE_CURVE('',#440,#454,#543,.T.); 423 | #395=EDGE_CURVE('',#448,#441,#544,.T.); 424 | #396=EDGE_CURVE('',#457,#433,#36,.F.); 425 | #397=EDGE_CURVE('',#430,#450,#37,.F.); 426 | #398=EDGE_CURVE('',#443,#479,#545,.T.); 427 | #399=EDGE_CURVE('',#480,#479,#546,.T.); 428 | #400=EDGE_CURVE('',#444,#480,#547,.T.); 429 | #401=EDGE_CURVE('',#442,#481,#548,.T.); 430 | #402=EDGE_CURVE('',#479,#481,#549,.T.); 431 | #403=EDGE_CURVE('',#447,#482,#550,.T.); 432 | #404=EDGE_CURVE('',#481,#482,#551,.T.); 433 | #405=EDGE_CURVE('',#446,#483,#552,.T.); 434 | #406=EDGE_CURVE('',#482,#483,#553,.T.); 435 | #407=EDGE_CURVE('',#445,#484,#554,.T.); 436 | #408=EDGE_CURVE('',#483,#484,#555,.T.); 437 | #409=EDGE_CURVE('',#484,#480,#556,.T.); 438 | #410=EDGE_CURVE('',#485,#485,#60,.F.); 439 | #411=VERTEX_POINT('',#1134); 440 | #412=VERTEX_POINT('',#1135); 441 | #413=VERTEX_POINT('',#1137); 442 | #414=VERTEX_POINT('',#1139); 443 | #415=VERTEX_POINT('',#1141); 444 | #416=VERTEX_POINT('',#1143); 445 | #417=VERTEX_POINT('',#1147); 446 | #418=VERTEX_POINT('',#1148); 447 | #419=VERTEX_POINT('',#1150); 448 | #420=VERTEX_POINT('',#1152); 449 | #421=VERTEX_POINT('',#1154); 450 | #422=VERTEX_POINT('',#1156); 451 | #423=VERTEX_POINT('',#1160); 452 | #424=VERTEX_POINT('',#1161); 453 | #425=VERTEX_POINT('',#1163); 454 | #426=VERTEX_POINT('',#1168); 455 | #427=VERTEX_POINT('',#1170); 456 | #428=VERTEX_POINT('',#1172); 457 | #429=VERTEX_POINT('',#1177); 458 | #430=VERTEX_POINT('',#1181); 459 | #431=VERTEX_POINT('',#1182); 460 | #432=VERTEX_POINT('',#1184); 461 | #433=VERTEX_POINT('',#1186); 462 | #434=VERTEX_POINT('',#1190); 463 | #435=VERTEX_POINT('',#1191); 464 | #436=VERTEX_POINT('',#1196); 465 | #437=VERTEX_POINT('',#1198); 466 | #438=VERTEX_POINT('',#1202); 467 | #439=VERTEX_POINT('',#1203); 468 | #440=VERTEX_POINT('',#1205); 469 | #441=VERTEX_POINT('',#1207); 470 | #442=VERTEX_POINT('',#1210); 471 | #443=VERTEX_POINT('',#1211); 472 | #444=VERTEX_POINT('',#1213); 473 | #445=VERTEX_POINT('',#1215); 474 | #446=VERTEX_POINT('',#1217); 475 | #447=VERTEX_POINT('',#1219); 476 | #448=VERTEX_POINT('',#1226); 477 | #449=VERTEX_POINT('',#1228); 478 | #450=VERTEX_POINT('',#1230); 479 | #451=VERTEX_POINT('',#1232); 480 | #452=VERTEX_POINT('',#1234); 481 | #453=VERTEX_POINT('',#1238); 482 | #454=VERTEX_POINT('',#1240); 483 | #455=VERTEX_POINT('',#1242); 484 | #456=VERTEX_POINT('',#1244); 485 | #457=VERTEX_POINT('',#1246); 486 | #458=VERTEX_POINT('',#1250); 487 | #459=VERTEX_POINT('',#1252); 488 | #460=VERTEX_POINT('',#1256); 489 | #461=VERTEX_POINT('',#1257); 490 | #462=VERTEX_POINT('',#1261); 491 | #463=VERTEX_POINT('',#1262); 492 | #464=VERTEX_POINT('',#1264); 493 | #465=VERTEX_POINT('',#1266); 494 | #466=VERTEX_POINT('',#1270); 495 | #467=VERTEX_POINT('',#1289); 496 | #468=VERTEX_POINT('',#1296); 497 | #469=VERTEX_POINT('',#1298); 498 | #470=VERTEX_POINT('',#1305); 499 | #471=VERTEX_POINT('',#1312); 500 | #472=VERTEX_POINT('',#1314); 501 | #473=VERTEX_POINT('',#1316); 502 | #474=VERTEX_POINT('',#1318); 503 | #475=VERTEX_POINT('',#1325); 504 | #476=VERTEX_POINT('',#1327); 505 | #477=VERTEX_POINT('',#1331); 506 | #478=VERTEX_POINT('',#1334); 507 | #479=VERTEX_POINT('',#1360); 508 | #480=VERTEX_POINT('',#1362); 509 | #481=VERTEX_POINT('',#1366); 510 | #482=VERTEX_POINT('',#1370); 511 | #483=VERTEX_POINT('',#1374); 512 | #484=VERTEX_POINT('',#1378); 513 | #485=VERTEX_POINT('',#1384); 514 | #486=LINE('',#1133,#557); 515 | #487=LINE('',#1136,#558); 516 | #488=LINE('',#1138,#559); 517 | #489=LINE('',#1140,#560); 518 | #490=LINE('',#1142,#561); 519 | #491=LINE('',#1144,#562); 520 | #492=LINE('',#1146,#563); 521 | #493=LINE('',#1149,#564); 522 | #494=LINE('',#1151,#565); 523 | #495=LINE('',#1153,#566); 524 | #496=LINE('',#1155,#567); 525 | #497=LINE('',#1157,#568); 526 | #498=LINE('',#1162,#569); 527 | #499=LINE('',#1178,#570); 528 | #500=LINE('',#1180,#571); 529 | #501=LINE('',#1183,#572); 530 | #502=LINE('',#1185,#573); 531 | #503=LINE('',#1187,#574); 532 | #504=LINE('',#1189,#575); 533 | #505=LINE('',#1192,#576); 534 | #506=LINE('',#1195,#577); 535 | #507=LINE('',#1197,#578); 536 | #508=LINE('',#1201,#579); 537 | #509=LINE('',#1206,#580); 538 | #510=LINE('',#1212,#581); 539 | #511=LINE('',#1218,#582); 540 | #512=LINE('',#1227,#583); 541 | #513=LINE('',#1229,#584); 542 | #514=LINE('',#1233,#585); 543 | #515=LINE('',#1237,#586); 544 | #516=LINE('',#1243,#587); 545 | #517=LINE('',#1247,#588); 546 | #518=LINE('',#1249,#589); 547 | #519=LINE('',#1251,#590); 548 | #520=LINE('',#1253,#591); 549 | #521=LINE('',#1255,#592); 550 | #522=LINE('',#1263,#593); 551 | #523=LINE('',#1267,#594); 552 | #524=LINE('',#1290,#595); 553 | #525=LINE('',#1291,#596); 554 | #526=LINE('',#1292,#597); 555 | #527=LINE('',#1293,#598); 556 | #528=LINE('',#1295,#599); 557 | #529=LINE('',#1297,#600); 558 | #530=LINE('',#1299,#601); 559 | #531=LINE('',#1301,#602); 560 | #532=LINE('',#1302,#603); 561 | #533=LINE('',#1306,#604); 562 | #534=LINE('',#1307,#605); 563 | #535=LINE('',#1315,#606); 564 | #536=LINE('',#1321,#607); 565 | #537=LINE('',#1322,#608); 566 | #538=LINE('',#1324,#609); 567 | #539=LINE('',#1326,#610); 568 | #540=LINE('',#1328,#611); 569 | #541=LINE('',#1337,#612); 570 | #542=LINE('',#1339,#613); 571 | #543=LINE('',#1341,#614); 572 | #544=LINE('',#1344,#615); 573 | #545=LINE('',#1359,#616); 574 | #546=LINE('',#1361,#617); 575 | #547=LINE('',#1363,#618); 576 | #548=LINE('',#1365,#619); 577 | #549=LINE('',#1367,#620); 578 | #550=LINE('',#1369,#621); 579 | #551=LINE('',#1371,#622); 580 | #552=LINE('',#1373,#623); 581 | #553=LINE('',#1375,#624); 582 | #554=LINE('',#1377,#625); 583 | #555=LINE('',#1379,#626); 584 | #556=LINE('',#1381,#627); 585 | #557=VECTOR('',#904,1.); 586 | #558=VECTOR('',#905,1.); 587 | #559=VECTOR('',#906,1.); 588 | #560=VECTOR('',#907,1.); 589 | #561=VECTOR('',#908,1.); 590 | #562=VECTOR('',#909,1.); 591 | #563=VECTOR('',#912,1.); 592 | #564=VECTOR('',#913,1.); 593 | #565=VECTOR('',#914,1.); 594 | #566=VECTOR('',#915,1.); 595 | #567=VECTOR('',#916,1.); 596 | #568=VECTOR('',#917,1.); 597 | #569=VECTOR('',#922,1.); 598 | #570=VECTOR('',#927,1.); 599 | #571=VECTOR('',#930,1.); 600 | #572=VECTOR('',#931,1.); 601 | #573=VECTOR('',#932,1.); 602 | #574=VECTOR('',#933,1.); 603 | #575=VECTOR('',#936,1.); 604 | #576=VECTOR('',#937,1.); 605 | #577=VECTOR('',#942,1.); 606 | #578=VECTOR('',#943,1.); 607 | #579=VECTOR('',#948,1.); 608 | #580=VECTOR('',#951,1.); 609 | #581=VECTOR('',#956,1.); 610 | #582=VECTOR('',#961,1.); 611 | #583=VECTOR('',#974,1.); 612 | #584=VECTOR('',#975,1.); 613 | #585=VECTOR('',#978,1.); 614 | #586=VECTOR('',#983,1.); 615 | #587=VECTOR('',#988,1.); 616 | #588=VECTOR('',#991,1.); 617 | #589=VECTOR('',#994,1.); 618 | #590=VECTOR('',#995,1.); 619 | #591=VECTOR('',#996,1.); 620 | #592=VECTOR('',#999,1.); 621 | #593=VECTOR('',#1006,1.); 622 | #594=VECTOR('',#1009,1.); 623 | #595=VECTOR('',#1018,1.); 624 | #596=VECTOR('',#1019,1.); 625 | #597=VECTOR('',#1020,1.); 626 | #598=VECTOR('',#1021,1.); 627 | #599=VECTOR('',#1024,1.); 628 | #600=VECTOR('',#1025,1.); 629 | #601=VECTOR('',#1026,1.); 630 | #602=VECTOR('',#1029,1.); 631 | #603=VECTOR('',#1030,1.); 632 | #604=VECTOR('',#1035,1.); 633 | #605=VECTOR('',#1036,1.); 634 | #606=VECTOR('',#1047,1.); 635 | #607=VECTOR('',#1054,1.); 636 | #608=VECTOR('',#1055,1.); 637 | #609=VECTOR('',#1058,1.); 638 | #610=VECTOR('',#1059,1.); 639 | #611=VECTOR('',#1060,1.); 640 | #612=VECTOR('',#1073,1.); 641 | #613=VECTOR('',#1076,1.); 642 | #614=VECTOR('',#1079,1.); 643 | #615=VECTOR('',#1084,1.); 644 | #616=VECTOR('',#1097,1.); 645 | #617=VECTOR('',#1098,1.); 646 | #618=VECTOR('',#1099,1.); 647 | #619=VECTOR('',#1102,1.); 648 | #620=VECTOR('',#1103,1.); 649 | #621=VECTOR('',#1106,1.); 650 | #622=VECTOR('',#1107,1.); 651 | #623=VECTOR('',#1110,1.); 652 | #624=VECTOR('',#1111,1.); 653 | #625=VECTOR('',#1114,1.); 654 | #626=VECTOR('',#1115,1.); 655 | #627=VECTOR('',#1118,1.); 656 | #628=EDGE_LOOP('',(#69,#70,#71,#72,#73,#74)); 657 | #629=EDGE_LOOP('',(#75,#76,#77,#78,#79,#80)); 658 | #630=EDGE_LOOP('',(#81,#82,#83,#84,#85,#86,#87)); 659 | #631=EDGE_LOOP('',(#88,#89,#90,#91)); 660 | #632=EDGE_LOOP('',(#92,#93,#94,#95)); 661 | #633=EDGE_LOOP('',(#96,#97,#98,#99)); 662 | #634=EDGE_LOOP('',(#100,#101,#102,#103)); 663 | #635=EDGE_LOOP('',(#104,#105,#106,#107,#108,#109)); 664 | #636=EDGE_LOOP('',(#110,#111,#112,#113,#114)); 665 | #637=EDGE_LOOP('',(#115,#116,#117,#118,#119,#120,#121)); 666 | #638=EDGE_LOOP('',(#122,#123,#124,#125,#126,#127,#128)); 667 | #639=EDGE_LOOP('',(#129,#130,#131,#132)); 668 | #640=EDGE_LOOP('',(#133,#134,#135,#136)); 669 | #641=EDGE_LOOP('',(#137,#138,#139,#140)); 670 | #642=EDGE_LOOP('',(#141)); 671 | #643=EDGE_LOOP('',(#142,#143,#144,#145,#146,#147,#148,#149)); 672 | #644=EDGE_LOOP('',(#150)); 673 | #645=EDGE_LOOP('',(#151,#152,#153,#154)); 674 | #646=EDGE_LOOP('',(#155,#156,#157,#158,#159,#160,#161,#162)); 675 | #647=EDGE_LOOP('',(#163,#164,#165,#166)); 676 | #648=EDGE_LOOP('',(#167,#168,#169,#170,#171,#172)); 677 | #649=EDGE_LOOP('',(#173)); 678 | #650=EDGE_LOOP('',(#174,#175,#176,#177,#178,#179)); 679 | #651=EDGE_LOOP('',(#180,#181,#182,#183)); 680 | #652=EDGE_LOOP('',(#184,#185,#186,#187)); 681 | #653=EDGE_LOOP('',(#188,#189,#190,#191,#192,#193)); 682 | #654=EDGE_LOOP('',(#194,#195,#196,#197)); 683 | #655=EDGE_LOOP('',(#198,#199,#200,#201)); 684 | #656=EDGE_LOOP('',(#202,#203,#204,#205,#206,#207)); 685 | #657=EDGE_LOOP('',(#208,#209,#210,#211,#212,#213)); 686 | #658=EDGE_LOOP('',(#214,#215,#216,#217,#218,#219)); 687 | #659=EDGE_LOOP('',(#220,#221,#222,#223)); 688 | #660=EDGE_LOOP('',(#224,#225,#226,#227,#228)); 689 | #661=EDGE_LOOP('',(#229,#230,#231,#232)); 690 | #662=EDGE_LOOP('',(#233,#234,#235,#236,#237)); 691 | #663=EDGE_LOOP('',(#238,#239,#240,#241)); 692 | #664=EDGE_LOOP('',(#242,#243,#244,#245)); 693 | #665=EDGE_LOOP('',(#246,#247,#248,#249)); 694 | #666=EDGE_LOOP('',(#250,#251,#252,#253)); 695 | #667=EDGE_LOOP('',(#254,#255,#256,#257)); 696 | #668=EDGE_LOOP('',(#258,#259,#260,#261)); 697 | #669=EDGE_LOOP('',(#262,#263,#264,#265)); 698 | #670=EDGE_LOOP('',(#266,#267,#268,#269)); 699 | #671=EDGE_LOOP('',(#270,#271,#272,#273)); 700 | #672=EDGE_LOOP('',(#274,#275,#276,#277)); 701 | #673=EDGE_LOOP('',(#278)); 702 | #674=EDGE_LOOP('',(#279,#280,#281,#282,#283,#284)); 703 | #675=EDGE_LOOP('',(#285)); 704 | #676=EDGE_LOOP('',(#286)); 705 | #677=EDGE_LOOP('',(#287)); 706 | #678=EDGE_LOOP('',(#288)); 707 | #679=EDGE_LOOP('',(#289,#290,#291,#292)); 708 | #680=EDGE_LOOP('',(#293,#294,#295,#296)); 709 | #681=FACE_BOUND('',#628,.T.); 710 | #682=FACE_BOUND('',#629,.T.); 711 | #683=FACE_BOUND('',#630,.T.); 712 | #684=FACE_BOUND('',#631,.T.); 713 | #685=FACE_BOUND('',#632,.T.); 714 | #686=FACE_BOUND('',#633,.T.); 715 | #687=FACE_BOUND('',#634,.T.); 716 | #688=FACE_BOUND('',#635,.T.); 717 | #689=FACE_BOUND('',#636,.T.); 718 | #690=FACE_BOUND('',#637,.T.); 719 | #691=FACE_BOUND('',#638,.T.); 720 | #692=FACE_BOUND('',#639,.T.); 721 | #693=FACE_BOUND('',#640,.T.); 722 | #694=FACE_BOUND('',#641,.T.); 723 | #695=FACE_BOUND('',#642,.T.); 724 | #696=FACE_BOUND('',#643,.T.); 725 | #697=FACE_BOUND('',#644,.T.); 726 | #698=FACE_BOUND('',#645,.T.); 727 | #699=FACE_BOUND('',#646,.T.); 728 | #700=FACE_BOUND('',#647,.T.); 729 | #701=FACE_BOUND('',#648,.T.); 730 | #702=FACE_BOUND('',#649,.T.); 731 | #703=FACE_BOUND('',#650,.T.); 732 | #704=FACE_BOUND('',#651,.T.); 733 | #705=FACE_BOUND('',#652,.T.); 734 | #706=FACE_BOUND('',#653,.T.); 735 | #707=FACE_BOUND('',#654,.T.); 736 | #708=FACE_BOUND('',#655,.T.); 737 | #709=FACE_BOUND('',#656,.T.); 738 | #710=FACE_BOUND('',#657,.T.); 739 | #711=FACE_BOUND('',#658,.T.); 740 | #712=FACE_BOUND('',#659,.T.); 741 | #713=FACE_BOUND('',#660,.T.); 742 | #714=FACE_BOUND('',#661,.T.); 743 | #715=FACE_BOUND('',#662,.T.); 744 | #716=FACE_BOUND('',#663,.T.); 745 | #717=FACE_BOUND('',#664,.T.); 746 | #718=FACE_BOUND('',#665,.T.); 747 | #719=FACE_BOUND('',#666,.T.); 748 | #720=FACE_BOUND('',#667,.T.); 749 | #721=FACE_BOUND('',#668,.T.); 750 | #722=FACE_BOUND('',#669,.T.); 751 | #723=FACE_BOUND('',#670,.T.); 752 | #724=FACE_BOUND('',#671,.T.); 753 | #725=FACE_BOUND('',#672,.T.); 754 | #726=FACE_BOUND('',#673,.T.); 755 | #727=FACE_BOUND('',#674,.T.); 756 | #728=FACE_BOUND('',#675,.T.); 757 | #729=FACE_BOUND('',#676,.T.); 758 | #730=FACE_BOUND('',#677,.T.); 759 | #731=FACE_BOUND('',#678,.T.); 760 | #732=FACE_BOUND('',#679,.T.); 761 | #733=FACE_BOUND('',#680,.T.); 762 | #734=PLANE('',#821); 763 | #735=PLANE('',#822); 764 | #736=PLANE('',#827); 765 | #737=PLANE('',#828); 766 | #738=PLANE('',#830); 767 | #739=PLANE('',#842); 768 | #740=PLANE('',#846); 769 | #741=PLANE('',#850); 770 | #742=PLANE('',#856); 771 | #743=PLANE('',#858); 772 | #744=PLANE('',#860); 773 | #745=PLANE('',#861); 774 | #746=PLANE('',#862); 775 | #747=PLANE('',#864); 776 | #748=PLANE('',#865); 777 | #749=PLANE('',#871); 778 | #750=PLANE('',#872); 779 | #751=PLANE('',#878); 780 | #752=PLANE('',#879); 781 | #753=PLANE('',#885); 782 | #754=PLANE('',#887); 783 | #755=PLANE('',#888); 784 | #756=PLANE('',#889); 785 | #757=PLANE('',#890); 786 | #758=PLANE('',#891); 787 | #759=PLANE('',#892); 788 | #760=PLANE('',#893); 789 | #761=PLANE('',#894); 790 | #762=PLANE('',#898); 791 | #763=PLANE('',#899); 792 | #764=ADVANCED_FACE('',(#681),#734,.F.); 793 | #765=ADVANCED_FACE('',(#682),#735,.F.); 794 | #766=ADVANCED_FACE('',(#683),#61,.T.); 795 | #767=ADVANCED_FACE('',(#684),#736,.F.); 796 | #768=ADVANCED_FACE('',(#685),#737,.T.); 797 | #769=ADVANCED_FACE('',(#686),#738,.T.); 798 | #770=ADVANCED_FACE('',(#687,#688),#62,.F.); 799 | #771=ADVANCED_FACE('',(#689),#63,.T.); 800 | #772=ADVANCED_FACE('',(#690),#739,.T.); 801 | #773=ADVANCED_FACE('',(#691),#740,.F.); 802 | #774=ADVANCED_FACE('',(#692),#741,.F.); 803 | #775=ADVANCED_FACE('',(#693,#694),#64,.T.); 804 | #776=ADVANCED_FACE('',(#695,#696),#742,.T.); 805 | #777=ADVANCED_FACE('',(#697,#698,#699),#743,.T.); 806 | #778=ADVANCED_FACE('',(#700),#744,.F.); 807 | #779=ADVANCED_FACE('',(#701),#745,.T.); 808 | #780=ADVANCED_FACE('',(#702,#703),#746,.T.); 809 | #781=ADVANCED_FACE('',(#704),#747,.T.); 810 | #782=ADVANCED_FACE('',(#705),#748,.F.); 811 | #783=ADVANCED_FACE('',(#706),#65,.F.); 812 | #784=ADVANCED_FACE('',(#707),#749,.F.); 813 | #785=ADVANCED_FACE('',(#708),#750,.F.); 814 | #786=ADVANCED_FACE('',(#709),#66,.T.); 815 | #787=ADVANCED_FACE('',(#710),#751,.T.); 816 | #788=ADVANCED_FACE('',(#711),#752,.F.); 817 | #789=ADVANCED_FACE('',(#712),#12,.F.); 818 | #790=ADVANCED_FACE('',(#713),#13,.T.); 819 | #791=ADVANCED_FACE('',(#714),#14,.F.); 820 | #792=ADVANCED_FACE('',(#715),#15,.T.); 821 | #793=ADVANCED_FACE('',(#716),#16,.T.); 822 | #794=ADVANCED_FACE('',(#717),#753,.F.); 823 | #795=ADVANCED_FACE('',(#718),#17,.T.); 824 | #796=ADVANCED_FACE('',(#719),#754,.T.); 825 | #797=ADVANCED_FACE('',(#720),#755,.T.); 826 | #798=ADVANCED_FACE('',(#721),#756,.T.); 827 | #799=ADVANCED_FACE('',(#722),#757,.T.); 828 | #800=ADVANCED_FACE('',(#723),#758,.T.); 829 | #801=ADVANCED_FACE('',(#724),#759,.T.); 830 | #802=ADVANCED_FACE('',(#725),#760,.T.); 831 | #803=ADVANCED_FACE('',(#726,#727),#761,.T.); 832 | #804=ADVANCED_FACE('',(#728,#729),#67,.F.); 833 | #805=ADVANCED_FACE('',(#730,#731),#68,.F.); 834 | #806=ADVANCED_FACE('',(#732),#762,.T.); 835 | #807=ADVANCED_FACE('',(#733),#763,.F.); 836 | #808=CLOSED_SHELL('',(#764,#765,#766,#767,#768,#769,#770,#771,#772,#773, 837 | #774,#775,#776,#777,#778,#779,#780,#781,#782,#783,#784,#785,#786,#787,#788, 838 | #789,#790,#791,#792,#793,#794,#795,#796,#797,#798,#799,#800,#801,#802,#803, 839 | #804,#805,#806,#807)); 840 | #809=STYLED_ITEM('',(#810),#817); 841 | #810=PRESENTATION_STYLE_ASSIGNMENT((#811)); 842 | #811=SURFACE_STYLE_USAGE(.BOTH.,#812); 843 | #812=SURFACE_SIDE_STYLE('',(#813)); 844 | #813=SURFACE_STYLE_FILL_AREA(#814); 845 | #814=FILL_AREA_STYLE('',(#815)); 846 | #815=FILL_AREA_STYLE_COLOUR('',#816); 847 | #816=COLOUR_RGB('',0.823529411764706,0.623529411764706,0.0352941176470589); 848 | #817=MANIFOLD_SOLID_BREP('RearSupport',#808); 849 | #818=SHAPE_DEFINITION_REPRESENTATION(#1395,#819); 850 | #819=SHAPE_REPRESENTATION('RearSupport',(#820),#1390); 851 | #820=AXIS2_PLACEMENT_3D('',#1131,#900,#901); 852 | #821=AXIS2_PLACEMENT_3D('',#1132,#902,#903); 853 | #822=AXIS2_PLACEMENT_3D('',#1145,#910,#911); 854 | #823=AXIS2_PLACEMENT_3D('',#1158,#918,#919); 855 | #824=AXIS2_PLACEMENT_3D('',#1159,#920,#921); 856 | #825=AXIS2_PLACEMENT_3D('',#1169,#923,#924); 857 | #826=AXIS2_PLACEMENT_3D('',#1171,#925,#926); 858 | #827=AXIS2_PLACEMENT_3D('',#1179,#928,#929); 859 | #828=AXIS2_PLACEMENT_3D('',#1188,#934,#935); 860 | #829=AXIS2_PLACEMENT_3D('',#1193,#938,#939); 861 | #830=AXIS2_PLACEMENT_3D('',#1194,#940,#941); 862 | #831=AXIS2_PLACEMENT_3D('',#1199,#944,#945); 863 | #832=AXIS2_PLACEMENT_3D('',#1200,#946,#947); 864 | #833=AXIS2_PLACEMENT_3D('',#1204,#949,#950); 865 | #834=AXIS2_PLACEMENT_3D('',#1208,#952,#953); 866 | #835=AXIS2_PLACEMENT_3D('',#1209,#954,#955); 867 | #836=AXIS2_PLACEMENT_3D('',#1214,#957,#958); 868 | #837=AXIS2_PLACEMENT_3D('',#1216,#959,#960); 869 | #838=AXIS2_PLACEMENT_3D('',#1220,#962,#963); 870 | #839=AXIS2_PLACEMENT_3D('',#1221,#964,#965); 871 | #840=AXIS2_PLACEMENT_3D('',#1222,#966,#967); 872 | #841=AXIS2_PLACEMENT_3D('',#1223,#968,#969); 873 | #842=AXIS2_PLACEMENT_3D('',#1224,#970,#971); 874 | #843=AXIS2_PLACEMENT_3D('',#1225,#972,#973); 875 | #844=AXIS2_PLACEMENT_3D('',#1231,#976,#977); 876 | #845=AXIS2_PLACEMENT_3D('',#1235,#979,#980); 877 | #846=AXIS2_PLACEMENT_3D('',#1236,#981,#982); 878 | #847=AXIS2_PLACEMENT_3D('',#1239,#984,#985); 879 | #848=AXIS2_PLACEMENT_3D('',#1241,#986,#987); 880 | #849=AXIS2_PLACEMENT_3D('',#1245,#989,#990); 881 | #850=AXIS2_PLACEMENT_3D('',#1248,#992,#993); 882 | #851=AXIS2_PLACEMENT_3D('',#1254,#997,#998); 883 | #852=AXIS2_PLACEMENT_3D('',#1258,#1000,#1001); 884 | #853=AXIS2_PLACEMENT_3D('',#1259,#1002,#1003); 885 | #854=AXIS2_PLACEMENT_3D('',#1260,#1004,#1005); 886 | #855=AXIS2_PLACEMENT_3D('',#1265,#1007,#1008); 887 | #856=AXIS2_PLACEMENT_3D('',#1268,#1010,#1011); 888 | #857=AXIS2_PLACEMENT_3D('',#1269,#1012,#1013); 889 | #858=AXIS2_PLACEMENT_3D('',#1287,#1014,#1015); 890 | #859=AXIS2_PLACEMENT_3D('',#1288,#1016,#1017); 891 | #860=AXIS2_PLACEMENT_3D('',#1294,#1022,#1023); 892 | #861=AXIS2_PLACEMENT_3D('',#1300,#1027,#1028); 893 | #862=AXIS2_PLACEMENT_3D('',#1303,#1031,#1032); 894 | #863=AXIS2_PLACEMENT_3D('',#1304,#1033,#1034); 895 | #864=AXIS2_PLACEMENT_3D('',#1308,#1037,#1038); 896 | #865=AXIS2_PLACEMENT_3D('',#1309,#1039,#1040); 897 | #866=AXIS2_PLACEMENT_3D('',#1310,#1041,#1042); 898 | #867=AXIS2_PLACEMENT_3D('',#1311,#1043,#1044); 899 | #868=AXIS2_PLACEMENT_3D('',#1313,#1045,#1046); 900 | #869=AXIS2_PLACEMENT_3D('',#1317,#1048,#1049); 901 | #870=AXIS2_PLACEMENT_3D('',#1319,#1050,#1051); 902 | #871=AXIS2_PLACEMENT_3D('',#1320,#1052,#1053); 903 | #872=AXIS2_PLACEMENT_3D('',#1323,#1056,#1057); 904 | #873=AXIS2_PLACEMENT_3D('',#1329,#1061,#1062); 905 | #874=AXIS2_PLACEMENT_3D('',#1330,#1063,#1064); 906 | #875=AXIS2_PLACEMENT_3D('',#1332,#1065,#1066); 907 | #876=AXIS2_PLACEMENT_3D('',#1333,#1067,#1068); 908 | #877=AXIS2_PLACEMENT_3D('',#1335,#1069,#1070); 909 | #878=AXIS2_PLACEMENT_3D('',#1336,#1071,#1072); 910 | #879=AXIS2_PLACEMENT_3D('',#1338,#1074,#1075); 911 | #880=AXIS2_PLACEMENT_3D('',#1340,#1077,#1078); 912 | #881=AXIS2_PLACEMENT_3D('',#1342,#1080,#1081); 913 | #882=AXIS2_PLACEMENT_3D('',#1343,#1082,#1083); 914 | #883=AXIS2_PLACEMENT_3D('',#1345,#1085,#1086); 915 | #884=AXIS2_PLACEMENT_3D('',#1346,#1087,#1088); 916 | #885=AXIS2_PLACEMENT_3D('',#1351,#1089,#1090); 917 | #886=AXIS2_PLACEMENT_3D('',#1352,#1091,#1092); 918 | #887=AXIS2_PLACEMENT_3D('',#1357,#1093,#1094); 919 | #888=AXIS2_PLACEMENT_3D('',#1358,#1095,#1096); 920 | #889=AXIS2_PLACEMENT_3D('',#1364,#1100,#1101); 921 | #890=AXIS2_PLACEMENT_3D('',#1368,#1104,#1105); 922 | #891=AXIS2_PLACEMENT_3D('',#1372,#1108,#1109); 923 | #892=AXIS2_PLACEMENT_3D('',#1376,#1112,#1113); 924 | #893=AXIS2_PLACEMENT_3D('',#1380,#1116,#1117); 925 | #894=AXIS2_PLACEMENT_3D('',#1382,#1119,#1120); 926 | #895=AXIS2_PLACEMENT_3D('',#1383,#1121,#1122); 927 | #896=AXIS2_PLACEMENT_3D('',#1385,#1123,#1124); 928 | #897=AXIS2_PLACEMENT_3D('',#1386,#1125,#1126); 929 | #898=AXIS2_PLACEMENT_3D('',#1387,#1127,#1128); 930 | #899=AXIS2_PLACEMENT_3D('',#1388,#1129,#1130); 931 | #900=DIRECTION('',(0.,0.,1.)); 932 | #901=DIRECTION('',(1.,0.,0.)); 933 | #902=DIRECTION('',(-1.,0.,-1.57702134179709E-16)); 934 | #903=DIRECTION('',(-1.57702134179709E-16,0.,1.)); 935 | #904=DIRECTION('',(-1.57702134179709E-16,0.,1.)); 936 | #905=DIRECTION('',(0.,1.,0.)); 937 | #906=DIRECTION('',(-1.57702134179709E-16,0.,1.)); 938 | #907=DIRECTION('',(0.,1.,0.)); 939 | #908=DIRECTION('',(1.56888554711795E-16,0.101446099028808,-0.994841037046541)); 940 | #909=DIRECTION('',(4.25638827183051E-17,0.962888221680851,-0.269900486380238)); 941 | #910=DIRECTION('',(1.,0.,0.)); 942 | #911=DIRECTION('',(0.,0.,-1.)); 943 | #912=DIRECTION('',(0.,0.,-1.)); 944 | #913=DIRECTION('',(0.,-0.962888221680851,0.269900486380238)); 945 | #914=DIRECTION('',(0.,-0.101446099028808,0.994841037046541)); 946 | #915=DIRECTION('',(0.,-1.,0.)); 947 | #916=DIRECTION('',(0.,0.,-1.)); 948 | #917=DIRECTION('',(0.,-1.,0.)); 949 | #918=DIRECTION('',(0.,1.,0.)); 950 | #919=DIRECTION('',(0.,0.,1.)); 951 | #920=DIRECTION('',(0.,-1.,0.)); 952 | #921=DIRECTION('',(0.,0.,-1.)); 953 | #922=DIRECTION('',(0.,1.,0.)); 954 | #923=DIRECTION('',(-0.707106781186548,0.707106781186548,0.)); 955 | #924=DIRECTION('',(-0.707106781186548,-0.707106781186548,0.)); 956 | #925=DIRECTION('',(-0.707106781186548,-0.707106781186548,0.)); 957 | #926=DIRECTION('',(-0.707106781186548,0.707106781186548,0.)); 958 | #927=DIRECTION('',(0.,1.,0.)); 959 | #928=DIRECTION('',(0.,0.,1.)); 960 | #929=DIRECTION('',(1.,0.,0.)); 961 | #930=DIRECTION('',(0.,-1.,0.)); 962 | #931=DIRECTION('',(-1.,0.,0.)); 963 | #932=DIRECTION('',(0.,1.,0.)); 964 | #933=DIRECTION('',(-1.,0.,0.)); 965 | #934=DIRECTION('',(-0.869783663873915,0.,0.493433255930393)); 966 | #935=DIRECTION('',(0.,1.,0.)); 967 | #936=DIRECTION('',(0.,1.,0.)); 968 | #937=DIRECTION('',(0.493433255930393,0.,0.869783663873915)); 969 | #938=DIRECTION('',(-0.869783663873915,0.,0.493433255930393)); 970 | #939=DIRECTION('',(0.493433255930393,0.,0.869783663873915)); 971 | #940=DIRECTION('',(0.869783663873916,0.,0.493433255930392)); 972 | #941=DIRECTION('',(0.,1.,0.)); 973 | #942=DIRECTION('',(0.493433255930392,0.,-0.869783663873916)); 974 | #943=DIRECTION('',(0.,-1.,0.)); 975 | #944=DIRECTION('',(0.869783663873916,0.,0.493433255930392)); 976 | #945=DIRECTION('',(-0.493433255930392,0.,0.869783663873916)); 977 | #946=DIRECTION('',(-1.,0.,0.)); 978 | #947=DIRECTION('',(0.,0.,1.)); 979 | #948=DIRECTION('',(-1.,0.,0.)); 980 | #949=DIRECTION('',(1.,0.,0.)); 981 | #950=DIRECTION('',(0.,0.,-1.)); 982 | #951=DIRECTION('',(-1.,0.,0.)); 983 | #952=DIRECTION('',(1.,0.,0.)); 984 | #953=DIRECTION('',(0.,0.,-1.)); 985 | #954=DIRECTION('',(-0.866025403784441,0.5,0.)); 986 | #955=DIRECTION('',(-0.5,-0.866025403784441,0.)); 987 | #956=DIRECTION('',(-1.,0.,0.)); 988 | #957=DIRECTION('',(0.866025403784437,0.5,0.)); 989 | #958=DIRECTION('',(-0.5,0.866025403784437,0.)); 990 | #959=DIRECTION('',(0.866025403784441,-0.5,0.)); 991 | #960=DIRECTION('',(-0.5,-0.866025403784441,0.)); 992 | #961=DIRECTION('',(-1.,0.,0.)); 993 | #962=DIRECTION('',(-0.866025403784437,-0.5,0.)); 994 | #963=DIRECTION('',(-0.5,0.866025403784437,0.)); 995 | #964=DIRECTION('',(-1.,0.,0.)); 996 | #965=DIRECTION('',(0.,0.,1.)); 997 | #966=DIRECTION('',(1.,0.,0.)); 998 | #967=DIRECTION('',(0.,0.,-1.)); 999 | #968=DIRECTION('',(1.,0.,0.)); 1000 | #969=DIRECTION('',(0.,0.,-1.)); 1001 | #970=DIRECTION('',(1.,0.,0.)); 1002 | #971=DIRECTION('',(0.,1.,0.)); 1003 | #972=DIRECTION('',(1.,0.,0.)); 1004 | #973=DIRECTION('',(0.,0.,-1.)); 1005 | #974=DIRECTION('',(0.,0.,1.)); 1006 | #975=DIRECTION('',(0.,1.,0.)); 1007 | #976=DIRECTION('',(1.,0.,0.)); 1008 | #977=DIRECTION('',(0.,0.,-1.)); 1009 | #978=DIRECTION('',(0.,-1.,0.)); 1010 | #979=DIRECTION('',(1.,0.,0.)); 1011 | #980=DIRECTION('',(0.,0.,-1.)); 1012 | #981=DIRECTION('',(1.,0.,0.)); 1013 | #982=DIRECTION('',(0.,1.,0.)); 1014 | #983=DIRECTION('',(0.,0.,1.)); 1015 | #984=DIRECTION('',(1.,0.,0.)); 1016 | #985=DIRECTION('',(0.,0.,-1.)); 1017 | #986=DIRECTION('',(1.,0.,0.)); 1018 | #987=DIRECTION('',(0.,0.,-1.)); 1019 | #988=DIRECTION('',(0.,-1.,0.)); 1020 | #989=DIRECTION('',(1.,0.,0.)); 1021 | #990=DIRECTION('',(0.,0.,-1.)); 1022 | #991=DIRECTION('',(0.,-1.,0.)); 1023 | #992=DIRECTION('',(0.,0.,-1.)); 1024 | #993=DIRECTION('',(-1.,0.,0.)); 1025 | #994=DIRECTION('',(1.,0.,0.)); 1026 | #995=DIRECTION('',(0.,-1.,0.)); 1027 | #996=DIRECTION('',(1.,0.,0.)); 1028 | #997=DIRECTION('',(-1.,0.,0.)); 1029 | #998=DIRECTION('',(0.,0.,1.)); 1030 | #999=DIRECTION('',(-1.,0.,0.)); 1031 | #1000=DIRECTION('',(1.,0.,0.)); 1032 | #1001=DIRECTION('',(0.,0.,-1.)); 1033 | #1002=DIRECTION('',(1.,0.,0.)); 1034 | #1003=DIRECTION('',(0.,0.,-1.)); 1035 | #1004=DIRECTION('',(1.,0.,0.)); 1036 | #1005=DIRECTION('',(0.,0.,-1.)); 1037 | #1006=DIRECTION('',(1.,0.,0.)); 1038 | #1007=DIRECTION('',(1.,0.,0.)); 1039 | #1008=DIRECTION('',(0.,0.,-1.)); 1040 | #1009=DIRECTION('',(1.,0.,0.)); 1041 | #1010=DIRECTION('',(0.,0.,-1.)); 1042 | #1011=DIRECTION('',(-1.,0.,0.)); 1043 | #1012=DIRECTION('',(0.,0.,1.)); 1044 | #1013=DIRECTION('',(1.,0.,0.)); 1045 | #1014=DIRECTION('',(0.,-1.,0.)); 1046 | #1015=DIRECTION('',(0.,0.,-1.)); 1047 | #1016=DIRECTION('',(0.,1.,0.)); 1048 | #1017=DIRECTION('',(0.,0.,1.)); 1049 | #1018=DIRECTION('',(1.,0.,0.)); 1050 | #1019=DIRECTION('',(-1.,0.,0.)); 1051 | #1020=DIRECTION('',(0.707106781186547,0.,0.707106781186548)); 1052 | #1021=DIRECTION('',(-0.707106781186547,0.,0.707106781186548)); 1053 | #1022=DIRECTION('',(0.,0.,-1.)); 1054 | #1023=DIRECTION('',(-1.,0.,0.)); 1055 | #1024=DIRECTION('',(1.,0.,0.)); 1056 | #1025=DIRECTION('',(0.,1.,0.)); 1057 | #1026=DIRECTION('',(1.,0.,0.)); 1058 | #1027=DIRECTION('',(0.,-0.994841037046541,-0.101446099028808)); 1059 | #1028=DIRECTION('',(0.,0.101446099028808,-0.994841037046541)); 1060 | #1029=DIRECTION('',(1.,0.,0.)); 1061 | #1030=DIRECTION('',(1.,0.,0.)); 1062 | #1031=DIRECTION('',(0.,1.,0.)); 1063 | #1032=DIRECTION('',(0.,0.,1.)); 1064 | #1033=DIRECTION('',(0.,1.,0.)); 1065 | #1034=DIRECTION('',(0.,0.,1.)); 1066 | #1035=DIRECTION('',(1.,0.,0.)); 1067 | #1036=DIRECTION('',(1.,0.,0.)); 1068 | #1037=DIRECTION('',(0.,-0.269900486380238,-0.962888221680851)); 1069 | #1038=DIRECTION('',(0.,0.962888221680851,-0.269900486380238)); 1070 | #1039=DIRECTION('',(0.,0.,-1.)); 1071 | #1040=DIRECTION('',(-1.,0.,0.)); 1072 | #1041=DIRECTION('',(1.,0.,0.)); 1073 | #1042=DIRECTION('',(0.,0.,-1.)); 1074 | #1043=DIRECTION('',(0.707106781186547,0.,-0.707106781186548)); 1075 | #1044=DIRECTION('',(0.707106781186548,0.,0.707106781186547)); 1076 | #1045=DIRECTION('',(1.,0.,0.)); 1077 | #1046=DIRECTION('',(0.,0.,-1.)); 1078 | #1047=DIRECTION('',(1.,0.,0.)); 1079 | #1048=DIRECTION('',(1.,0.,0.)); 1080 | #1049=DIRECTION('',(0.,0.,-1.)); 1081 | #1050=DIRECTION('',(0.707106781186547,0.,0.707106781186548)); 1082 | #1051=DIRECTION('',(0.707106781186548,0.,-0.707106781186547)); 1083 | #1052=DIRECTION('',(0.,-0.980773334503022,-0.195150368505479)); 1084 | #1053=DIRECTION('',(0.,0.195150368505479,-0.980773334503022)); 1085 | #1054=DIRECTION('',(0.,0.195150368505479,-0.980773334503021)); 1086 | #1055=DIRECTION('',(0.,0.195150368505479,-0.980773334503021)); 1087 | #1056=DIRECTION('',(0.,1.,0.)); 1088 | #1057=DIRECTION('',(0.,0.,1.)); 1089 | #1058=DIRECTION('',(0.,0.,1.)); 1090 | #1059=DIRECTION('',(1.,0.,0.)); 1091 | #1060=DIRECTION('',(0.,0.,1.)); 1092 | #1061=DIRECTION('',(1.,0.,0.)); 1093 | #1062=DIRECTION('',(0.,0.,-1.)); 1094 | #1063=DIRECTION('',(1.,0.,0.)); 1095 | #1064=DIRECTION('',(0.,0.,-1.)); 1096 | #1065=DIRECTION('',(0.707106781186547,0.,-0.707106781186548)); 1097 | #1066=DIRECTION('',(0.707106781186548,0.,0.707106781186547)); 1098 | #1067=DIRECTION('',(0.707106781186547,0.,0.707106781186548)); 1099 | #1068=DIRECTION('',(0.707106781186548,0.,-0.707106781186547)); 1100 | #1069=DIRECTION('',(1.,0.,0.)); 1101 | #1070=DIRECTION('',(0.,0.,-1.)); 1102 | #1071=DIRECTION('',(1.,0.,0.)); 1103 | #1072=DIRECTION('',(0.,1.,0.)); 1104 | #1073=DIRECTION('',(0.,-1.,0.)); 1105 | #1074=DIRECTION('',(1.,0.,0.)); 1106 | #1075=DIRECTION('',(0.,1.,0.)); 1107 | #1076=DIRECTION('',(0.,1.,0.)); 1108 | #1077=DIRECTION('',(-1.,0.,0.)); 1109 | #1078=DIRECTION('',(0.,0.,1.)); 1110 | #1079=DIRECTION('',(-0.707106781186548,-0.707106781186547,0.)); 1111 | #1080=DIRECTION('',(1.,0.,0.)); 1112 | #1081=DIRECTION('',(0.,0.,-1.)); 1113 | #1082=DIRECTION('',(1.,0.,0.)); 1114 | #1083=DIRECTION('',(0.,0.,-1.)); 1115 | #1084=DIRECTION('',(-0.707106781186547,0.707106781186548,0.)); 1116 | #1085=DIRECTION('',(-1.,0.,0.)); 1117 | #1086=DIRECTION('',(0.,0.,1.)); 1118 | #1087=DIRECTION('',(1.,0.,0.)); 1119 | #1088=DIRECTION('',(0.,0.,-1.)); 1120 | #1089=DIRECTION('',(0.707106781186548,0.,0.707106781186547)); 1121 | #1090=DIRECTION('',(0.,1.,0.)); 1122 | #1091=DIRECTION('',(-1.,0.,0.)); 1123 | #1092=DIRECTION('',(0.,0.,1.)); 1124 | #1093=DIRECTION('',(0.707106781186548,0.,-0.707106781186547)); 1125 | #1094=DIRECTION('',(0.,-1.,0.)); 1126 | #1095=DIRECTION('',(-4.9055170571009E-15,1.,0.)); 1127 | #1096=DIRECTION('',(-1.,-4.9055170571009E-15,0.)); 1128 | #1097=DIRECTION('',(0.,0.,-1.)); 1129 | #1098=DIRECTION('',(1.,4.9055170571009E-15,0.)); 1130 | #1099=DIRECTION('',(0.,0.,-1.)); 1131 | #1100=DIRECTION('',(-0.866025403784441,0.5,0.)); 1132 | #1101=DIRECTION('',(-0.5,-0.866025403784441,0.)); 1133 | #1102=DIRECTION('',(0.,0.,-1.)); 1134 | #1103=DIRECTION('',(0.5,0.866025403784441,0.)); 1135 | #1104=DIRECTION('',(-0.866025403784437,-0.5,0.)); 1136 | #1105=DIRECTION('',(0.5,-0.866025403784437,0.)); 1137 | #1106=DIRECTION('',(0.,0.,-1.)); 1138 | #1107=DIRECTION('',(-0.5,0.866025403784437,0.)); 1139 | #1108=DIRECTION('',(0.,-1.,0.)); 1140 | #1109=DIRECTION('',(0.,0.,-1.)); 1141 | #1110=DIRECTION('',(0.,0.,-1.)); 1142 | #1111=DIRECTION('',(-1.,0.,0.)); 1143 | #1112=DIRECTION('',(0.866025403784441,-0.5,0.)); 1144 | #1113=DIRECTION('',(0.5,0.866025403784441,0.)); 1145 | #1114=DIRECTION('',(0.,0.,-1.)); 1146 | #1115=DIRECTION('',(-0.5,-0.866025403784441,0.)); 1147 | #1116=DIRECTION('',(0.866025403784437,0.5,0.)); 1148 | #1117=DIRECTION('',(-0.5,0.866025403784437,0.)); 1149 | #1118=DIRECTION('',(0.5,-0.866025403784437,0.)); 1150 | #1119=DIRECTION('',(0.,0.,1.)); 1151 | #1120=DIRECTION('',(1.,0.,0.)); 1152 | #1121=DIRECTION('',(0.,0.,1.)); 1153 | #1122=DIRECTION('',(1.,0.,0.)); 1154 | #1123=DIRECTION('',(0.,0.,1.)); 1155 | #1124=DIRECTION('',(1.,0.,0.)); 1156 | #1125=DIRECTION('',(0.,1.,0.)); 1157 | #1126=DIRECTION('',(0.,0.,1.)); 1158 | #1127=DIRECTION('',(0.707106781186547,0.,0.707106781186548)); 1159 | #1128=DIRECTION('',(0.,-1.,0.)); 1160 | #1129=DIRECTION('',(0.707106781186547,0.,-0.707106781186548)); 1161 | #1130=DIRECTION('',(0.,1.,0.)); 1162 | #1131=CARTESIAN_POINT('',(0.,0.,0.)); 1163 | #1132=CARTESIAN_POINT('',(-0.00645,0.025,0.107)); 1164 | #1133=CARTESIAN_POINT('',(-0.00645,0.008,0.107)); 1165 | #1134=CARTESIAN_POINT('',(-0.00645,0.008,0.08125)); 1166 | #1135=CARTESIAN_POINT('',(-0.00645,0.008,0.10995)); 1167 | #1136=CARTESIAN_POINT('',(-0.00645,0.0112952873208376,0.08125)); 1168 | #1137=CARTESIAN_POINT('',(-0.00645,0.0145905746416752,0.08125)); 1169 | #1138=CARTESIAN_POINT('',(-0.00645,0.0145905746416752,0.074275)); 1170 | #1139=CARTESIAN_POINT('',(-0.00645,0.0145905746416752,0.073)); 1171 | #1140=CARTESIAN_POINT('',(-0.00645,0.0195905746416752,0.073)); 1172 | #1141=CARTESIAN_POINT('',(-0.00645,0.0245905746416752,0.073)); 1173 | #1142=CARTESIAN_POINT('',(-0.00645,0.0228952873208376,0.089625)); 1174 | #1143=CARTESIAN_POINT('',(-0.00645,0.0212,0.10625)); 1175 | #1144=CARTESIAN_POINT('',(-0.00645,0.0146,0.1081)); 1176 | #1145=CARTESIAN_POINT('',(0.00645,0.025,0.107)); 1177 | #1146=CARTESIAN_POINT('',(0.00645,0.008,0.107)); 1178 | #1147=CARTESIAN_POINT('',(0.00645,0.008,0.10995)); 1179 | #1148=CARTESIAN_POINT('',(0.00645,0.008,0.08125)); 1180 | #1149=CARTESIAN_POINT('',(0.00645,0.0146,0.1081)); 1181 | #1150=CARTESIAN_POINT('',(0.00645,0.0212,0.10625)); 1182 | #1151=CARTESIAN_POINT('',(0.00645,0.0228952873208376,0.089625)); 1183 | #1152=CARTESIAN_POINT('',(0.00645,0.0245905746416752,0.073)); 1184 | #1153=CARTESIAN_POINT('',(0.00645,0.0195905746416752,0.073)); 1185 | #1154=CARTESIAN_POINT('',(0.00645,0.0145905746416752,0.073)); 1186 | #1155=CARTESIAN_POINT('',(0.00645,0.0145905746416752,0.074275)); 1187 | #1156=CARTESIAN_POINT('',(0.00645,0.0145905746416752,0.08125)); 1188 | #1157=CARTESIAN_POINT('',(0.00645,0.0112952873208376,0.08125)); 1189 | #1158=CARTESIAN_POINT('',(-6.93889390390723E-18,-0.008,0.098)); 1190 | #1159=CARTESIAN_POINT('',(-6.93889390390723E-18,0.008,0.098)); 1191 | #1160=CARTESIAN_POINT('',(0.0060134481011927,0.008,0.111741850018621)); 1192 | #1161=CARTESIAN_POINT('',(-0.0060134481011927,0.008,0.111741850018621)); 1193 | #1162=CARTESIAN_POINT('',(0.0060134481011927,-0.008,0.111741850018621)); 1194 | #1163=CARTESIAN_POINT('',(0.00601344810119269,0.0154798240677618,0.111741850018621)); 1195 | #1164=CARTESIAN_POINT('',(0.00601344810119268,0.0154798240677618,0.111741850018621)); 1196 | #1165=CARTESIAN_POINT('',(0.00600896633909778,0.0154865492349269,0.111743811242453)); 1197 | #1166=CARTESIAN_POINT('',(0.00600448363706113,0.0154932745444083,0.111745770265227)); 1198 | #1167=CARTESIAN_POINT('',(0.006,0.0155,0.111747727084867)); 1199 | #1168=CARTESIAN_POINT('',(0.006,0.0155,0.111747727084867)); 1200 | #1169=CARTESIAN_POINT('',(-6.93889390390723E-18,0.0095,0.098)); 1201 | #1170=CARTESIAN_POINT('',(-6.93889390390723E-18,0.0095,0.113)); 1202 | #1171=CARTESIAN_POINT('',(-6.93889390390723E-18,0.0095,0.098)); 1203 | #1172=CARTESIAN_POINT('',(-0.006,0.0155,0.111747727084867)); 1204 | #1173=CARTESIAN_POINT('',(-0.006,0.0155,0.111747727084867)); 1205 | #1174=CARTESIAN_POINT('',(-0.00600448363706114,0.0154932745444083,0.111745770265227)); 1206 | #1175=CARTESIAN_POINT('',(-0.00600896633909779,0.0154865492349269,0.111743811242453)); 1207 | #1176=CARTESIAN_POINT('',(-0.00601344810119269,0.0154798240677618,0.111741850018621)); 1208 | #1177=CARTESIAN_POINT('',(-0.0060134481011927,0.0154798240677617,0.111741850018621)); 1209 | #1178=CARTESIAN_POINT('',(-0.0060134481011927,-0.008,0.111741850018621)); 1210 | #1179=CARTESIAN_POINT('',(-6.93889390390723E-18,-0.008,0.073)); 1211 | #1180=CARTESIAN_POINT('',(0.006,0.008,0.073)); 1212 | #1181=CARTESIAN_POINT('',(0.006,0.0115905746416752,0.073)); 1213 | #1182=CARTESIAN_POINT('',(0.006,0.008,0.073)); 1214 | #1183=CARTESIAN_POINT('',(0.008,0.008,0.073)); 1215 | #1184=CARTESIAN_POINT('',(-0.006,0.008,0.073)); 1216 | #1185=CARTESIAN_POINT('',(-0.006,-0.008,0.073)); 1217 | #1186=CARTESIAN_POINT('',(-0.006,0.0115905746416752,0.073)); 1218 | #1187=CARTESIAN_POINT('',(0.008,0.0115905746416752,0.073)); 1219 | #1188=CARTESIAN_POINT('',(-0.0060134481011927,-0.008,0.111741850018621)); 1220 | #1189=CARTESIAN_POINT('',(-0.008,0.0462251182009748,0.108240119301743)); 1221 | #1190=CARTESIAN_POINT('',(-0.008,0.008,0.108240119301743)); 1222 | #1191=CARTESIAN_POINT('',(-0.008,0.0175087425159052,0.108240119301743)); 1223 | #1192=CARTESIAN_POINT('',(-0.0060134481011927,0.008,0.111741850018621)); 1224 | #1193=CARTESIAN_POINT('',(-0.0103967839190347,0.0095,0.104015265233727)); 1225 | #1194=CARTESIAN_POINT('',(0.008,-0.008,0.108240119301743)); 1226 | #1195=CARTESIAN_POINT('',(0.008,0.008,0.108240119301743)); 1227 | #1196=CARTESIAN_POINT('',(0.008,0.008,0.108240119301743)); 1228 | #1197=CARTESIAN_POINT('',(0.008,0.006,0.108240119301743)); 1229 | #1198=CARTESIAN_POINT('',(0.008,0.0175087425159052,0.108240119301743)); 1230 | #1199=CARTESIAN_POINT('',(0.0103967839190347,0.0095,0.104015265233727)); 1231 | #1200=CARTESIAN_POINT('',(0.008,0.127159169440383,0.098)); 1232 | #1201=CARTESIAN_POINT('',(0.008,0.0882502364019497,0.003)); 1233 | #1202=CARTESIAN_POINT('',(0.006,0.0882502364019497,0.003)); 1234 | #1203=CARTESIAN_POINT('',(-0.006,0.0882502364019497,0.003)); 1235 | #1204=CARTESIAN_POINT('',(-0.006,0.127159169440383,0.098)); 1236 | #1205=CARTESIAN_POINT('',(-0.006,0.0245,0.098)); 1237 | #1206=CARTESIAN_POINT('',(0.008,0.0245,0.098)); 1238 | #1207=CARTESIAN_POINT('',(0.006,0.0245,0.098)); 1239 | #1208=CARTESIAN_POINT('',(0.006,0.127159169440383,0.098)); 1240 | #1209=CARTESIAN_POINT('',(0.0329431268361415,0.127159169440383,0.098)); 1241 | #1210=CARTESIAN_POINT('',(0.00282901631902919,0.075,0.00957870101904918)); 1242 | #1211=CARTESIAN_POINT('',(0.00141450815951459,0.07255,0.0110704671402128)); 1243 | #1212=CARTESIAN_POINT('',(0.00800000000000027,0.07255,0.0110704671402128)); 1244 | #1213=CARTESIAN_POINT('',(-0.00141450815951459,0.07255,0.0110704671402128)); 1245 | #1214=CARTESIAN_POINT('',(-0.032943126836142,0.127159169440383,0.098)); 1246 | #1215=CARTESIAN_POINT('',(-0.00282901631902919,0.075,0.00957870101904917)); 1247 | #1216=CARTESIAN_POINT('',(0.0272850941980831,0.127159169440383,0.098)); 1248 | #1217=CARTESIAN_POINT('',(-0.0014145081595146,0.07745,0.0081784906398441)); 1249 | #1218=CARTESIAN_POINT('',(0.008,0.07745,0.00817849063984409)); 1250 | #1219=CARTESIAN_POINT('',(0.00141450815951459,0.07745,0.00817849063984409)); 1251 | #1220=CARTESIAN_POINT('',(-0.0272850941980836,0.127159169440383,0.098)); 1252 | #1221=CARTESIAN_POINT('',(0.008,0.0095,0.098)); 1253 | #1222=CARTESIAN_POINT('',(-0.006,0.0095,0.098)); 1254 | #1223=CARTESIAN_POINT('',(0.006,0.0095,0.098)); 1255 | #1224=CARTESIAN_POINT('',(0.008,0.0462251182009748,0.058)); 1256 | #1225=CARTESIAN_POINT('',(0.008,0.0095,0.098)); 1257 | #1226=CARTESIAN_POINT('',(0.008,0.0225,0.098)); 1258 | #1227=CARTESIAN_POINT('',(0.008,0.008,0.107493145888789)); 1259 | #1228=CARTESIAN_POINT('',(0.008,0.008,0.075)); 1260 | #1229=CARTESIAN_POINT('',(0.008,0.0115905746416752,0.075)); 1261 | #1230=CARTESIAN_POINT('',(0.008,0.0132156163294378,0.075)); 1262 | #1231=CARTESIAN_POINT('',(0.008,0.127159169440383,0.098)); 1263 | #1232=CARTESIAN_POINT('',(0.008,0.0601731015191593,0.003)); 1264 | #1233=CARTESIAN_POINT('',(0.008,0.0846812548791075,0.003)); 1265 | #1234=CARTESIAN_POINT('',(0.008,0.0832440040877304,0.003)); 1266 | #1235=CARTESIAN_POINT('',(0.008,0.127159169440383,0.098)); 1267 | #1236=CARTESIAN_POINT('',(-0.008,0.0462251182009748,0.058)); 1268 | #1237=CARTESIAN_POINT('',(-0.008,0.008,0.107493145888789)); 1269 | #1238=CARTESIAN_POINT('',(-0.008,0.008,0.075)); 1270 | #1239=CARTESIAN_POINT('',(-0.008,0.0095,0.098)); 1271 | #1240=CARTESIAN_POINT('',(-0.008,0.0225,0.098)); 1272 | #1241=CARTESIAN_POINT('',(-0.008,0.127159169440383,0.098)); 1273 | #1242=CARTESIAN_POINT('',(-0.008,0.0832440040877304,0.003)); 1274 | #1243=CARTESIAN_POINT('',(-0.008,0.0846812548791075,0.003)); 1275 | #1244=CARTESIAN_POINT('',(-0.008,0.0601731015191593,0.003)); 1276 | #1245=CARTESIAN_POINT('',(-0.008,0.127159169440383,0.098)); 1277 | #1246=CARTESIAN_POINT('',(-0.008,0.0132156163294378,0.075)); 1278 | #1247=CARTESIAN_POINT('',(-0.008,0.0462251182009748,0.075)); 1279 | #1248=CARTESIAN_POINT('',(-0.006452,0.0195905746416752,0.073)); 1280 | #1249=CARTESIAN_POINT('',(-0.006452,0.0245905746416752,0.073)); 1281 | #1250=CARTESIAN_POINT('',(0.0064,0.0245905746416752,0.073)); 1282 | #1251=CARTESIAN_POINT('',(0.0064,0.0195905746416752,0.073)); 1283 | #1252=CARTESIAN_POINT('',(0.0064,0.0145905746416752,0.073)); 1284 | #1253=CARTESIAN_POINT('',(-0.006452,0.0145905746416752,0.073)); 1285 | #1254=CARTESIAN_POINT('',(0.008,0.127159169440383,0.098)); 1286 | #1255=CARTESIAN_POINT('',(0.008,0.0567595948411858,0.003)); 1287 | #1256=CARTESIAN_POINT('',(0.006,0.0567595948411858,0.003)); 1288 | #1257=CARTESIAN_POINT('',(-0.006,0.0567595948411858,0.003)); 1289 | #1258=CARTESIAN_POINT('',(0.006,0.127159169440383,0.098)); 1290 | #1259=CARTESIAN_POINT('',(-0.006,0.127159169440383,0.098)); 1291 | #1260=CARTESIAN_POINT('',(-0.005,0.127159169440382,0.0979999999999981)); 1292 | #1261=CARTESIAN_POINT('',(-0.005,0.0467595948411858,0.0112993165654615)); 1293 | #1262=CARTESIAN_POINT('',(-0.005,0.0557595948411858,0.00374926604635058)); 1294 | #1263=CARTESIAN_POINT('',(-0.005,0.0467595948411858,0.0112993165654615)); 1295 | #1264=CARTESIAN_POINT('',(0.005,0.0467595948411858,0.0112993165654615)); 1296 | #1265=CARTESIAN_POINT('',(0.005,0.127159169440382,0.0979999999999981)); 1297 | #1266=CARTESIAN_POINT('',(0.005,0.0557595948411858,0.00374926604635058)); 1298 | #1267=CARTESIAN_POINT('',(-0.005,0.0557595948411858,0.00374926604635058)); 1299 | #1268=CARTESIAN_POINT('',(0.008,0.0846812548791075,0.003)); 1300 | #1269=CARTESIAN_POINT('',(0.,0.075,0.003)); 1301 | #1270=CARTESIAN_POINT('',(0.00145,0.075,0.003)); 1302 | #1271=CARTESIAN_POINT('',(0.008,0.0601731015191593,0.003)); 1303 | #1272=CARTESIAN_POINT('',(0.00734153542503555,0.0590304602907818,0.003)); 1304 | #1273=CARTESIAN_POINT('',(0.00667466304955415,0.0578927452578451,0.003)); 1305 | #1274=CARTESIAN_POINT('',(0.006,0.0567595948411858,0.003)); 1306 | #1275=CARTESIAN_POINT('',(-0.006,0.0567595948411858,0.003)); 1307 | #1276=CARTESIAN_POINT('',(-0.00667466304955415,0.0578927452578451,0.003)); 1308 | #1277=CARTESIAN_POINT('',(-0.00734153542503555,0.0590304602907818,0.003)); 1309 | #1278=CARTESIAN_POINT('',(-0.008,0.0601731015191593,0.003)); 1310 | #1279=CARTESIAN_POINT('',(-0.008,0.0832440040877304,0.003)); 1311 | #1280=CARTESIAN_POINT('',(-0.00730460749918533,0.084901272163255,0.003)); 1312 | #1281=CARTESIAN_POINT('',(-0.0066369687507656,0.0865696279193557,0.003)); 1313 | #1282=CARTESIAN_POINT('',(-0.006,0.0882502364019497,0.003)); 1314 | #1283=CARTESIAN_POINT('',(0.006,0.0882502364019497,0.003)); 1315 | #1284=CARTESIAN_POINT('',(0.0066369687507656,0.0865696279193557,0.003)); 1316 | #1285=CARTESIAN_POINT('',(0.00730460749918533,0.084901272163255,0.003)); 1317 | #1286=CARTESIAN_POINT('',(0.008,0.0832440040877304,0.003)); 1318 | #1287=CARTESIAN_POINT('',(0.008,0.008,0.107493145888789)); 1319 | #1288=CARTESIAN_POINT('',(0.,0.008,0.0786)); 1320 | #1289=CARTESIAN_POINT('',(0.,0.008,0.07955)); 1321 | #1290=CARTESIAN_POINT('',(-0.006452,0.008,0.08125)); 1322 | #1291=CARTESIAN_POINT('',(0.,0.008,0.10995)); 1323 | #1292=CARTESIAN_POINT('',(-0.0045,0.008,0.0625)); 1324 | #1293=CARTESIAN_POINT('',(0.0045,0.008,0.0625)); 1325 | #1294=CARTESIAN_POINT('',(-0.006452,0.0195905746416752,0.073)); 1326 | #1295=CARTESIAN_POINT('',(-0.006452,0.0145905746416752,0.073)); 1327 | #1296=CARTESIAN_POINT('',(-0.0064,0.0145905746416752,0.073)); 1328 | #1297=CARTESIAN_POINT('',(-0.0064,0.0245905746416752,0.073)); 1329 | #1298=CARTESIAN_POINT('',(-0.0064,0.0245905746416752,0.073)); 1330 | #1299=CARTESIAN_POINT('',(-0.006452,0.0245905746416752,0.073)); 1331 | #1300=CARTESIAN_POINT('',(-0.006452,0.0228952873208376,0.089625)); 1332 | #1301=CARTESIAN_POINT('',(-0.005,0.0245905746416752,0.073)); 1333 | #1302=CARTESIAN_POINT('',(-0.006452,0.0212,0.10625)); 1334 | #1303=CARTESIAN_POINT('',(-0.006452,0.0145905746416752,0.074275)); 1335 | #1304=CARTESIAN_POINT('',(0.,0.0145905746416752,0.0786)); 1336 | #1305=CARTESIAN_POINT('',(0.,0.0145905746416752,0.07955)); 1337 | #1306=CARTESIAN_POINT('',(-0.006452,0.0145905746416752,0.08125)); 1338 | #1307=CARTESIAN_POINT('',(-0.005,0.0145905746416752,0.073)); 1339 | #1308=CARTESIAN_POINT('',(-0.006452,0.0146,0.1081)); 1340 | #1309=CARTESIAN_POINT('',(-0.006452,0.0112952873208376,0.08125)); 1341 | #1310=CARTESIAN_POINT('',(-0.005,0.127159169440383,0.098)); 1342 | #1311=CARTESIAN_POINT('',(0.0314,0.127159169440383,0.098)); 1343 | #1312=CARTESIAN_POINT('',(0.005,0.0149106570450926,0.0716)); 1344 | #1313=CARTESIAN_POINT('',(0.005,0.127159169440383,0.098)); 1345 | #1314=CARTESIAN_POINT('',(0.005,0.0457595948411858,0.0163250479643519)); 1346 | #1315=CARTESIAN_POINT('',(-0.005,0.0457595948411858,0.0163250479643519)); 1347 | #1316=CARTESIAN_POINT('',(-0.005,0.0457595948411858,0.0163250479643519)); 1348 | #1317=CARTESIAN_POINT('',(-0.005,0.127159169440383,0.098)); 1349 | #1318=CARTESIAN_POINT('',(-0.005,0.0149106570450926,0.0716)); 1350 | #1319=CARTESIAN_POINT('',(-0.0314,0.127159169440383,0.098)); 1351 | #1320=CARTESIAN_POINT('',(-0.005,0.0462595948411858,0.0138121822649067)); 1352 | #1321=CARTESIAN_POINT('',(0.005,0.0462595948411858,0.0138121822649067)); 1353 | #1322=CARTESIAN_POINT('',(-0.005,0.0462595948411858,0.0138121822649067)); 1354 | #1323=CARTESIAN_POINT('',(-0.005,0.0557595948411858,0.0138438457250481)); 1355 | #1324=CARTESIAN_POINT('',(0.005,0.0557595948411858,0.0138438457250481)); 1356 | #1325=CARTESIAN_POINT('',(0.005,0.0557595948411858,0.0202348575129243)); 1357 | #1326=CARTESIAN_POINT('',(-0.005,0.0557595948411858,0.0202348575129243)); 1358 | #1327=CARTESIAN_POINT('',(-0.005,0.0557595948411858,0.0202348575129243)); 1359 | #1328=CARTESIAN_POINT('',(-0.005,0.0557595948411858,0.0138438457250481)); 1360 | #1329=CARTESIAN_POINT('',(-0.005,0.127159169440383,0.098)); 1361 | #1330=CARTESIAN_POINT('',(0.005,0.127159169440383,0.098)); 1362 | #1331=CARTESIAN_POINT('',(0.005,0.0249419661965967,0.0716)); 1363 | #1332=CARTESIAN_POINT('',(0.0314,0.127159169440383,0.098)); 1364 | #1333=CARTESIAN_POINT('',(-0.0314,0.127159169440383,0.098)); 1365 | #1334=CARTESIAN_POINT('',(-0.005,0.0249419661965967,0.0716)); 1366 | #1335=CARTESIAN_POINT('',(-0.005,0.127159169440383,0.098)); 1367 | #1336=CARTESIAN_POINT('',(-0.005,0.0462251182009748,0.058)); 1368 | #1337=CARTESIAN_POINT('',(-0.005,0.0145905746416752,0.0716)); 1369 | #1338=CARTESIAN_POINT('',(0.005,0.0462251182009748,0.058)); 1370 | #1339=CARTESIAN_POINT('',(0.005,0.0462251182009748,0.0716)); 1371 | #1340=CARTESIAN_POINT('',(-0.008,0.127159169440383,0.098)); 1372 | #1341=CARTESIAN_POINT('',(-0.006,0.0245,0.098)); 1373 | #1342=CARTESIAN_POINT('',(-0.006,0.0095,0.098)); 1374 | #1343=CARTESIAN_POINT('',(0.006,0.127159169440383,0.098)); 1375 | #1344=CARTESIAN_POINT('',(0.008,0.0225,0.098)); 1376 | #1345=CARTESIAN_POINT('',(0.008,0.0095,0.098)); 1377 | #1346=CARTESIAN_POINT('',(-0.006,0.127159169440383,0.098)); 1378 | #1347=CARTESIAN_POINT('',(-0.006,0.0115905746416752,0.073)); 1379 | #1348=CARTESIAN_POINT('',(-0.00666783191420128,0.0121293869762206,0.0736678319142013)); 1380 | #1349=CARTESIAN_POINT('',(-0.00733451105304784,0.0126710368388452,0.0743345110530478)); 1381 | #1350=CARTESIAN_POINT('',(-0.008,0.0132156163294378,0.075)); 1382 | #1351=CARTESIAN_POINT('',(-0.006,-0.008,0.073)); 1383 | #1352=CARTESIAN_POINT('',(0.008,0.127159169440383,0.098)); 1384 | #1353=CARTESIAN_POINT('',(0.008,0.0132156163294378,0.075)); 1385 | #1354=CARTESIAN_POINT('',(0.00733451105304784,0.0126710368388452,0.0743345110530478)); 1386 | #1355=CARTESIAN_POINT('',(0.00666783191420128,0.0121293869762206,0.0736678319142013)); 1387 | #1356=CARTESIAN_POINT('',(0.006,0.0115905746416752,0.073)); 1388 | #1357=CARTESIAN_POINT('',(0.008,0.0462251182009748,0.075)); 1389 | #1358=CARTESIAN_POINT('',(0.,0.07255,0.025)); 1390 | #1359=CARTESIAN_POINT('',(0.00141450815951459,0.07255,0.025)); 1391 | #1360=CARTESIAN_POINT('',(0.00141450815951459,0.07255,0.005)); 1392 | #1361=CARTESIAN_POINT('',(0.,0.07255,0.005)); 1393 | #1362=CARTESIAN_POINT('',(-0.00141450815951459,0.07255,0.005)); 1394 | #1363=CARTESIAN_POINT('',(-0.00141450815951459,0.07255,0.025)); 1395 | #1364=CARTESIAN_POINT('',(0.00212176223927188,0.073775,0.025)); 1396 | #1365=CARTESIAN_POINT('',(0.00282901631902919,0.075,0.025)); 1397 | #1366=CARTESIAN_POINT('',(0.00282901631902919,0.075,0.005)); 1398 | #1367=CARTESIAN_POINT('',(0.00212176223927188,0.073775,0.005)); 1399 | #1368=CARTESIAN_POINT('',(0.00212176223927189,0.076225,0.025)); 1400 | #1369=CARTESIAN_POINT('',(0.00141450815951459,0.07745,0.025)); 1401 | #1370=CARTESIAN_POINT('',(0.00141450815951459,0.07745,0.005)); 1402 | #1371=CARTESIAN_POINT('',(0.00212176223927189,0.076225,0.005)); 1403 | #1372=CARTESIAN_POINT('',(2.60208521396521E-18,0.07745,0.025)); 1404 | #1373=CARTESIAN_POINT('',(-0.0014145081595146,0.07745,0.025)); 1405 | #1374=CARTESIAN_POINT('',(-0.0014145081595146,0.07745,0.005)); 1406 | #1375=CARTESIAN_POINT('',(2.60208521396521E-18,0.07745,0.005)); 1407 | #1376=CARTESIAN_POINT('',(-0.00212176223927189,0.076225,0.025)); 1408 | #1377=CARTESIAN_POINT('',(-0.00282901631902919,0.075,0.025)); 1409 | #1378=CARTESIAN_POINT('',(-0.00282901631902919,0.075,0.005)); 1410 | #1379=CARTESIAN_POINT('',(-0.00212176223927189,0.076225,0.005)); 1411 | #1380=CARTESIAN_POINT('',(-0.00212176223927189,0.073775,0.025)); 1412 | #1381=CARTESIAN_POINT('',(-0.00212176223927189,0.073775,0.005)); 1413 | #1382=CARTESIAN_POINT('',(0.,0.0373104918404854,0.005)); 1414 | #1383=CARTESIAN_POINT('',(0.,0.075,0.005)); 1415 | #1384=CARTESIAN_POINT('',(0.00145,0.075,0.005)); 1416 | #1385=CARTESIAN_POINT('',(0.,0.075,0.)); 1417 | #1386=CARTESIAN_POINT('',(0.,0.,0.0786)); 1418 | #1387=CARTESIAN_POINT('',(-0.0064,0.0195905746416752,0.073)); 1419 | #1388=CARTESIAN_POINT('',(0.005,0.0462251182009748,0.0716)); 1420 | #1389=MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#809), 1421 | #1390); 1422 | #1390=( 1423 | GEOMETRIC_REPRESENTATION_CONTEXT(3) 1424 | GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#1391)) 1425 | GLOBAL_UNIT_ASSIGNED_CONTEXT((#1394,#1393,#1392)) 1426 | REPRESENTATION_CONTEXT('RearSupport','TOP_LEVEL_ASSEMBLY_PART') 1427 | ); 1428 | #1391=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(5.E-6),#1394, 1429 | 'DISTANCE_ACCURACY_VALUE','Maximum Tolerance applied to model'); 1430 | #1392=( 1431 | NAMED_UNIT(*) 1432 | SI_UNIT($,.STERADIAN.) 1433 | SOLID_ANGLE_UNIT() 1434 | ); 1435 | #1393=( 1436 | NAMED_UNIT(*) 1437 | PLANE_ANGLE_UNIT() 1438 | SI_UNIT($,.RADIAN.) 1439 | ); 1440 | #1394=( 1441 | LENGTH_UNIT() 1442 | NAMED_UNIT(*) 1443 | SI_UNIT($,.METRE.) 1444 | ); 1445 | #1395=PRODUCT_DEFINITION_SHAPE('','',#1396); 1446 | #1396=PRODUCT_DEFINITION('','',#1398,#1397); 1447 | #1397=PRODUCT_DEFINITION_CONTEXT('',#1404,'design'); 1448 | #1398=PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE('','',#1400, 1449 | .NOT_KNOWN.); 1450 | #1399=PRODUCT_RELATED_PRODUCT_CATEGORY('','',(#1400)); 1451 | #1400=PRODUCT('RearSupport','RearSupport','RearSupport',(#1402)); 1452 | #1401=PRODUCT_CATEGORY('',''); 1453 | #1402=PRODUCT_CONTEXT('',#1404,'mechanical'); 1454 | #1403=APPLICATION_PROTOCOL_DEFINITION('international standard', 1455 | 'ap242_managed_model_based_3d_engineering',2011,#1404); 1456 | #1404=APPLICATION_CONTEXT('managed model based 3d engineering'); 1457 | ENDSEC; 1458 | END-ISO-10303-21; 1459 | -------------------------------------------------------------------------------- /CAD/StandBottom.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dpelgrift/ISS-Tracker/ed156a5c9b999c7eab7671b51ed43e5d86ebc045/CAD/StandBottom.stl -------------------------------------------------------------------------------- /CAD/StandTop.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dpelgrift/ISS-Tracker/ed156a5c9b999c7eab7671b51ed43e5d86ebc045/CAD/StandTop.stl -------------------------------------------------------------------------------- /CAD/Upright.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dpelgrift/ISS-Tracker/ed156a5c9b999c7eab7671b51ed43e5d86ebc045/CAD/Upright.stl -------------------------------------------------------------------------------- /CAD/WireCover.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dpelgrift/ISS-Tracker/ed156a5c9b999c7eab7671b51ed43e5d86ebc045/CAD/WireCover.stl -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ISS-Tracker 2 | Assembly instructions available here: https://www.printables.com/model/383268-iss-tracker 3 | 4 | The electronics here are based around an Adafruit Feather m0 Express with a Featherwing ESP32 Wifi coprocessor. In order to build with the arduino IDE, you'll need to install Adafruit boards and SAMD support. Follow the guide here: https://learn.adafruit.com/adafruit-feather-m0-express-designed-for-circuit-python-circuitpython/arduino-ide-setup 5 | 6 | In addition to the other dependencies, which can be installed with the standard Arduino IDE library manager, the Airlift Featherwing uses an Adafruit fork of the WiFiNINA library. See here for additional details: https://learn.adafruit.com/adafruit-airlift-featherwing-esp32-wifi-co-processor-featherwing/arduino 7 | 8 | ## Configuration 9 | You'll need to make some minor modifications before getting up and running. The biggest ones are found in arduino_secrets.h, where you'll need to fill in your wifi SSID and password so that it can actually connect to the internet, and your precise latitude & longitude so that it can perform proper pointing. If you end up forking this code, make absolutely sure not to push any commits with these fields filled in. 10 | 11 | Aside from that, all other configuration parameters can be found in defs.h. They should all hopefully be pretty self-explanatory. If you are omitting the compass, make sure you set DO_BYPASS_COMPASS to true. Also be sure to set your timeZone properly so that the displayed time is correct. Finally, you may need to adjust the SERVO_MIN_PWM and SERVO_MAX_PWM parameters so that the pointer properly points with the correct elevation. On startup, the servo will run through a test cycle, attempting to point at 0 degrees, then -90, then +90, then back to 0. This should give you a chance to make sure that the PWM range specified by these parameters is correct. If it isn't, double-check the spec sheet for your micro-servo of choice. 12 | 13 | ## Notes on electical connections 14 | A simple schematic is included under Schematic.png. Note that the compass and OLED Featherwing are both connected using 4-wire stemma QT cables. Note also that the Wifi featherwing is not included in the schematic as it just stacks directly on top of the Feather M0 using stacking headers. In my build I used a perma-proto board to handle both distribution of power and breaking out the I2C clock and data signals to both the compass and display. 15 | 16 | ## Dependencies: 17 | Adafruit GFX Library 18 | 19 | Adafruit SH110X 20 | 21 | Adafruit MMC56x3 22 | 23 | AccelStepper 24 | 25 | TimeLib 26 | 27 | WiFiNINA (Adafruit fork, see above) 28 | -------------------------------------------------------------------------------- /Schematic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dpelgrift/ISS-Tracker/ed156a5c9b999c7eab7671b51ed43e5d86ebc045/Schematic.png -------------------------------------------------------------------------------- /iss-tracker/arduino_secrets.h: -------------------------------------------------------------------------------- 1 | /* 2 | arduino_secrets.h - Place to insert sensitive data 3 | If you fork this code be absolutely sure to not push this file with filled-in fields to keep from doxxing yourself :) 4 | */ 5 | 6 | // Wifi SSID and Password 7 | // Place your Wifi SSID and password below 8 | #define SECRET_SSID "" 9 | #define SECRET_PASS "" 10 | 11 | // Pedestal Lat/Lon 12 | // Insert your pedestal latitude and longitude below (in decimal degrees) 13 | #define SECRET_LAT 0.0f 14 | #define SECRET_LON 0.0f 15 | -------------------------------------------------------------------------------- /iss-tracker/coord.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | coord.cpp - Coordinate frame conversion functions 3 | Originally taken from the navduino library: https://github.com/PowerBroker2/navduino 4 | Reimplemented to use custom Vec3 and Dcm implementations due to Arduino Eigen not compiling for SAMD architecture 5 | 6 | Unless otherwise noted all latitude & longitude inputs & outputs are assumed to be in decimal degrees. 7 | Altitudes, Earth-Centered-Earth-Fixed (ECEF) Positions, and North-East-Down (NED) Positions are assumed to be 8 | in meters. 9 | */ 10 | #include "coord.h" 11 | 12 | void earthRad(const float& _lat, const bool& angle_unit, double& R_N, double& R_M) 13 | { 14 | float lat = _lat; 15 | 16 | if (angle_unit == DEGREES) 17 | lat *= DEG_TO_RAD; 18 | 19 | R_N = a / sqrt(1 - (ecc_sqrd * pow(sin(lat), 2))); 20 | R_M = (a * (1 - ecc_sqrd)) / pow(1 - (ecc_sqrd * pow(sin(lat), 2)), 1.5); 21 | } 22 | 23 | // Convert Lat-Lon-Alt (LLA) position to ECEF position 24 | Vec3 lla2ecef(const Vec3& lla, const bool& angle_unit) 25 | { 26 | double lat = lla.x; 27 | double lon = lla.y; 28 | double alt = lla.z; 29 | 30 | double R_N, R_M; 31 | 32 | earthRad(lat, angle_unit,R_N,R_M); 33 | 34 | if (angle_unit == DEGREES) 35 | { 36 | lat *= DEG_TO_RAD; 37 | lon *= DEG_TO_RAD; 38 | } 39 | 40 | return Vec3{(R_N + alt) * cos(lat) * cos(lon), 41 | (R_N + alt)* cos(lat)* sin(lon), 42 | ((1 - ecc_sqrd) * R_N + alt)* sin(lat)}; 43 | } 44 | 45 | // Convert ECEF position to LLA position 46 | Vec3 ecef2lla(const Vec3& ecef, const bool& angle_unit) 47 | { 48 | float x = ecef.x; 49 | float y = ecef.y; 50 | float z = ecef.z; 51 | 52 | float x_sqrd = pow(x, 2); 53 | float y_sqrd = pow(y, 2); 54 | 55 | float lon = atan2(y, x); 56 | float lat = 400; 57 | 58 | float s = sqrt(x_sqrd + y_sqrd); 59 | float beta = atan2(z, (1 - f) * s); 60 | float mu_bar = atan2(z + (((ecc_sqrd * (1 - f)) / (1 - ecc_sqrd)) * a * pow(sin(beta), 3)), 61 | s - (ecc_sqrd * a * pow(cos(beta), 3))); 62 | 63 | size_t iter = 0; 64 | while (abs(lat - mu_bar) > 1e-10) 65 | { 66 | lat = mu_bar; 67 | beta = atan2((1 - f) * sin(lat), 68 | cos(lat)); 69 | mu_bar = atan2(z + (((ecc_sqrd * (1 - f)) / (1 - ecc_sqrd)) * a * pow(sin(beta), 3)), 70 | s - (ecc_sqrd * a * pow(cos(beta), 3))); 71 | iter++; 72 | if (iter > 1e3) break; 73 | } 74 | 75 | lat = mu_bar; 76 | 77 | float N = a / sqrt(1 - (ecc_sqrd * pow(sin(lat), 2))); 78 | float h = (s * cos(lat)) + ((z + (ecc_sqrd * N * sin(lat))) * sin(lat)) - N; 79 | 80 | if (angle_unit == DEGREES) 81 | { 82 | lat *= RAD_TO_DEG; 83 | lon *= RAD_TO_DEG; 84 | } 85 | 86 | return Vec3{lat,lon,h}; 87 | } 88 | 89 | // Calculate DCM to rotate between ECEF and local NED coordinates for a given LLA position 90 | Dcm ecef2ned_dcm(const Vec3& lla, const bool& angle_unit) 91 | { 92 | float lat = lla.x; 93 | float lon = lla.y; 94 | 95 | if (angle_unit == DEGREES) 96 | { 97 | lat *= DEG_TO_RAD; 98 | lon *= DEG_TO_RAD; 99 | } 100 | 101 | Dcm C = {}; 102 | 103 | C.x00 = -sin(lat) * cos(lon); 104 | C.x01 = -sin(lat) * sin(lon); 105 | C.x02 = cos(lat); 106 | 107 | C.x10 = -sin(lon); 108 | C.x11 = cos(lon); 109 | C.x12 = 0; 110 | 111 | C.x20 = -cos(lat) * cos(lon); 112 | C.x21 = -cos(lat) * sin(lon); 113 | C.x22 = -sin(lat); 114 | 115 | return C; 116 | } 117 | 118 | // Convert position from ECEF frame to local NED frame at a given LLA reference position 119 | Vec3 ecef2ned(const Vec3& ecef, 120 | const Vec3& lla_ref, 121 | const bool& angle_unit) 122 | { 123 | Vec3 ecef_ref = lla2ecef(lla_ref, angle_unit); 124 | Dcm C = ecef2ned_dcm(lla_ref, angle_unit); 125 | 126 | return C * (ecef - ecef_ref); 127 | } 128 | 129 | // Convert position in NED to equivalent Azimuth, Elevation, & Range 130 | // Azimuth is defined as 0 degrees northward and increases clockwise 131 | // Azimuth & Elevation are returned in units of degrees 132 | Vec3 ned2AzElRng(const Vec3& ned) { 133 | double horiz = sqrt(ned.x*ned.x + ned.y*ned.y); 134 | 135 | double az = fmod((atan2(ned.y, ned.x) * RAD_TO_DEG) + 360, 360); 136 | double el = atan2(-ned.z,horiz) * RAD_TO_DEG; 137 | double rng = norm(ned); 138 | 139 | return Vec3{az,el,rng}; 140 | } 141 | 142 | // Convert Earth-Centered-Inertial (ECI) position to an ECEF position for a given Earth-Rotation-Angle 143 | Vec3 eci2ecef(Vec3 eci, double angle) { 144 | Dcm eci2ecef = { 145 | cos(angle), 146 | sin(angle), 147 | 0, 148 | -sin(angle), 149 | cos(angle), 150 | 0, 151 | 0,0,1 152 | }; 153 | return eci2ecef * eci; 154 | } 155 | 156 | // Compute spherical bearing between two Lat/Lon positions 157 | double calcBearing(double lat1, double lon1, double lat2, double lon2) { 158 | // Convert latitude and longitude to 159 | // spherical coordinates in radians. 160 | lat1 *= DEG_TO_RAD; 161 | lat2 *= DEG_TO_RAD; 162 | lon1 *= DEG_TO_RAD; 163 | lon2 *= DEG_TO_RAD; 164 | 165 | double cosLat2 = cos(lat2); 166 | 167 | // Compute the bearing angle. 168 | double bearing = atan2( 169 | sin(lon2 - lon1) * cosLat2, 170 | cos(lat1) * sin(lat2) - 171 | sin(lat1) * cosLat2 * 172 | cos(lon2 - lon1) 173 | ); 174 | 175 | // Convert the bearing angle from radians to degrees. 176 | bearing *= RAD_TO_DEG; 177 | 178 | // Make sure the bearing angle is between 0 and 360 degrees. 179 | bearing = fmod(bearing + 360, 360); 180 | 181 | return bearing; 182 | } 183 | -------------------------------------------------------------------------------- /iss-tracker/coord.h: -------------------------------------------------------------------------------- 1 | /* 2 | coord.h - coordinate frame conversion function declarations 3 | */ 4 | #pragma once 5 | #include 6 | #include "math_utils.h" 7 | #include "wgs84.h" 8 | 9 | const bool RADIANS = true; 10 | const bool DEGREES = false; 11 | 12 | 13 | void earthRad(const float& _lat, const bool& angle_unit, double& R_N, double& R_M); 14 | 15 | Vec3 lla2ecef(const Vec3& lla, const bool& angle_unit); 16 | 17 | Vec3 ecef2lla(const Vec3& ecef, const bool& angle_unit); 18 | 19 | Dcm ecef2ned_dcm(const Vec3& lla, const bool& angle_unit); 20 | 21 | Vec3 ecef2ned(const Vec3& ecef, 22 | const Vec3& lla_ref, 23 | const bool& angle_unit); 24 | 25 | Vec3 ned2AzElRng(const Vec3& ned); 26 | 27 | Vec3 eci2ecef(Vec3 eci, double angle); 28 | 29 | double calcBearing(double lat1, double lon1, double lat2, double lon2); 30 | -------------------------------------------------------------------------------- /iss-tracker/defs.h: -------------------------------------------------------------------------------- 1 | /* 2 | defs.h - General parameter definitions 3 | */ 4 | #pragma once 5 | 6 | // Pins 7 | #define SPIWIFI SPI // The SPI port 8 | #define SPIWIFI_SS 13 // Chip select pin 9 | #define ESP32_RESETN 12 // Reset pin 10 | #define SPIWIFI_ACK 11 // a.k.a BUSY or READY pin 11 | #define ESP32_GPIO0 -1 12 | 13 | #define SERVO_PIN 10 14 | 15 | // Stepper pins 16 | #define STEP1 A3 17 | #define STEP2 A1 18 | #define STEP3 A2 19 | #define STEP4 A0 20 | 21 | // TLE Server & Query Info 22 | #define HEADER_STR "ISS (ZARYA)" 23 | #define TLE_LEN 69 24 | #define MAX_BUFFER 1024 25 | #define SERVER "celestrak.org" 26 | #define QUERY "/NORAD/elements/gp.php?CATNR=25544&FORMAT=TLE" 27 | 28 | // Misc. Flags 29 | #define CHECK_DISPLAY_CONNECTION false 30 | #define CHECK_COMPASS_CONNECTION false 31 | #define WAIT_FOR_SERIAL false 32 | #define DO_PRINT_DEBUG false 33 | 34 | // If set true, will not attempt to automatically point north at startup 35 | // Assumes that pedestal is manually pointed north before startup 36 | #define DO_BYPASS_COMPASS false 37 | 38 | #define MAG_NORTH_LAT 86.494 39 | #define MAG_NORTH_LON 162.867 40 | #define TRUE_NORTH_OFFSET_DEG -3.73 41 | 42 | // Refresh durations 43 | #define TIME_REFRESH_DELAY_MIN 10 44 | #define TLE_REFRESH_DELAY_MIN 60 45 | #define ORBIT_REFRESH_DELAY_MS 500 46 | 47 | // Stepper Motor Specs 48 | #define STEPS_PER_REV (2038*4) 49 | #define STEPPER_SPEED 500 50 | #define STEPPER_ACCEL 300 51 | 52 | // Servo PWM Range 53 | #define SERVO_MIN_PWM 500 54 | #define SERVO_MAX_PWM 2500 55 | 56 | // Timezone used for time display 57 | // const int timeZone = 1; // Central European Time 58 | const int timeZone = -5; // Eastern Standard Time (USA) 59 | // const int timeZone = -4; // Eastern Daylight Time (USA) 60 | // const int timeZone = -8; // Pacific Standard Time (USA) 61 | // const int timeZone = -7; // Pacific Daylight Time (USA) 62 | -------------------------------------------------------------------------------- /iss-tracker/display_utils.h: -------------------------------------------------------------------------------- 1 | /* 2 | display_utils.h - Utility functions for handling Adafruit 128x64 OLED Featherwing: https://www.adafruit.com/product/4650 3 | */ 4 | #pragma once 5 | 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include "TimeLib.h" 11 | 12 | #define WIDTH 128 13 | #define HEIGHT 64 14 | 15 | // Create display object 16 | Adafruit_SH1107 display = Adafruit_SH1107(HEIGHT, WIDTH, &Wire); 17 | 18 | // Clear display contents, set text size, and set cursor location 19 | void resetDisplay(int16_t x, int16_t y, uint8_t textSize=1, bool doRefresh=false) { 20 | display.clearDisplay(); 21 | display.setTextSize(textSize); 22 | display.setTextColor(SH110X_WHITE); 23 | display.setCursor(x,y); 24 | 25 | if (doRefresh) display.display(); 26 | } 27 | 28 | // Clear display contents and refresh 29 | void clearDisplay() { 30 | display.clearDisplay(); 31 | display.display(); 32 | } 33 | 34 | // Start I2C connection to display 35 | int beginDisplay() { 36 | return display.begin(0x3C, true); // Address 0x3C default 37 | } 38 | 39 | // Display current time and ISS Azimuth & Elevation 40 | void displayCurrTime(double az, double el) { 41 | display.clearDisplay(); 42 | 43 | // Display Time in "hh:mm" format 44 | display.setCursor(1,2); 45 | display.setTextSize(3); 46 | display.printf("%02i:%02i",hour(),minute()); 47 | 48 | // Dividing Line 49 | display.writeFastHLine(0,28,WIDTH,SH110X_WHITE); 50 | 51 | // Display Date in "Www MM/dd" format 52 | display.setTextSize(1); 53 | display.setCursor(98,2); 54 | display.print(dayShortStr(weekday())); 55 | display.setCursor(98,16); 56 | display.printf("%02i/%02i",month(),day()); 57 | 58 | // Display ISS Az/El 59 | display.setCursor(0,32); 60 | display.setTextSize(2); 61 | display.printf("Az:%03.1f\nEl:%03.1f",az,el); 62 | 63 | display.display(); 64 | } 65 | -------------------------------------------------------------------------------- /iss-tracker/iss-tracker.ino: -------------------------------------------------------------------------------- 1 | /* 2 | iss-tracker.ino - Main methods 3 | */ 4 | 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include "arduino_secrets.h" 10 | #include "coord.h" 11 | #include "orbit_utils.h" 12 | #include "wifi_utils.h" 13 | #include "display_utils.h" 14 | #include "pedestal.h" 15 | 16 | #include "defs.h" 17 | 18 | // Make sure to enter the appropriate info in arduino_secrets.h 19 | char ssid[] = SECRET_SSID; // network SSID 20 | char pass[] = SECRET_PASS; // network password (use for WPA, or use as key for WEP) 21 | Vec3 llaRef = {SECRET_LAT,SECRET_LON,0}; // Pedestal Lat/Lon 22 | 23 | 24 | // Wrapper Structs 25 | NtpQueryHandler ntp{}; 26 | TleQueryHandler tle{}; 27 | Pedestal ped{}; 28 | Orbit orb{}; 29 | 30 | // Misc. variable declaration 31 | Vec3 posECI, velECI, posECEF, posLLA, posNED, posAER; 32 | double era; 33 | int wifiStatus = WL_IDLE_STATUS; 34 | uint32_t lastTleUpdateMillis, lastOrbitUpdateMillis, lastNtpUpdateMillis; 35 | 36 | bool ntpPacketSent = false; 37 | bool tleQuerySent = false; 38 | 39 | void setup() { 40 | // Initialize serial and wait for port to open 41 | Serial.begin(9600); 42 | delay(250); 43 | while (!Serial && WAIT_FOR_SERIAL) {} 44 | 45 | /* Initialise the display */ 46 | delay(250); // wait for the OLED to power up 47 | if (!display.begin(0x3C, true)) { // Address 0x3C default 48 | Serial.println("No display detected"); 49 | while (CHECK_DISPLAY_CONNECTION) delay(10); 50 | } 51 | 52 | // Show image buffer on the display hardware. 53 | // Since the buffer is intialized with an Adafruit splashscreen 54 | // internally, this will display the splashscreen. 55 | display.display(); 56 | delay(1000); 57 | display.setRotation(1); 58 | resetDisplay(0,0,1); 59 | 60 | // Initialize pedestal wrapper 61 | ped.begin(); 62 | 63 | // Test pointer elevation range 64 | // Should point at 0 degrees, then -90, then +90, then back to 0 65 | // If any are significantly misaligned from expectation, 66 | // then you'll need to adjust the SERVO_MIN_PWM & SERVO_MAX_PWM 67 | // params in defs.h. Check the spec sheet for your micro-servo of choice 68 | ped.setElevation(90); 69 | delay(1000); 70 | ped.servo.writeMicroseconds(SERVO_MIN_PWM); 71 | delay(1000); 72 | ped.servo.writeMicroseconds(SERVO_MAX_PWM); 73 | delay(1000); 74 | ped.setElevation(90); 75 | 76 | // If using the compass to align northward, perform a few attempts at automatically pointing northward 77 | if (!DO_BYPASS_COMPASS) { 78 | for (int i = 0; i < 3; ++i){ 79 | resetDisplay(0,0,2); 80 | display.printf("Az: %0.1f\n",ped.getAverageHeading()); 81 | display.display(); 82 | ped.pointNorth(); 83 | } 84 | resetDisplay(0,0,2); 85 | display.printf("Az: %0.1f\n",ped.getAverageHeading()); 86 | display.display(); 87 | delay(100); 88 | } 89 | 90 | 91 | // Reset stepper step count to zero to establish current step count as zero azimuth 92 | ped.stepper.setCurrentPosition(0); 93 | 94 | // check for the WiFi module: 95 | WiFi.setPins(SPIWIFI_SS, SPIWIFI_ACK, ESP32_RESETN, ESP32_GPIO0, &SPIWIFI); 96 | while (WiFi.status() == WL_NO_MODULE) { 97 | Serial.println("Communication with WiFi module failed!"); 98 | resetDisplay(0,0,1); 99 | display.println("Communication with WiFi module failed!"); 100 | display.display(); 101 | // don't continue 102 | while (true) {} 103 | } 104 | 105 | // Check Wifi Co-processor Firmware 106 | String fv = WiFi.firmwareVersion(); 107 | Serial.print("Found firmware "); Serial.println(fv); 108 | 109 | // List visible Wifi Networks 110 | Serial.println("Scanning available networks..."); 111 | listNetworks(); 112 | 113 | // Attempt to connect to Wifi network: 114 | resetDisplay(0,10,1); 115 | Serial.print("Attempting to connect to SSID: "); 116 | Serial.println(ssid); 117 | display.print("Attempting to connect to SSID:\n"); 118 | display.println(ssid); 119 | display.display(); 120 | 121 | // Connect to WPA/WPA2 network 122 | do { 123 | wifiStatus = WiFi.begin(ssid, pass); 124 | delay(10000); // wait until connection is ready! 125 | } while (wifiStatus != WL_CONNECTED); 126 | 127 | Serial.println("Connected to wifi"); 128 | display.println("Connected to wifi"); 129 | display.display(); 130 | delay(1000); 131 | 132 | // Start NTP connection 133 | ntp.begin(); 134 | Serial.println("\nStarting connection to NTP server..."); 135 | display.println("\nStarting connection to NTP server..."); 136 | display.display(); 137 | delay(100); 138 | 139 | // Get unix time 140 | ntp.sendNTPpacket(); // send an NTP packet to the time server 141 | // wait to see if a reply is available 142 | while (!ntp.parsePacket()) {}; 143 | displayCurrTime(0.0,0.0); 144 | 145 | // Send initial TLE query 146 | tle.sendQuery(); 147 | 148 | // Wait for response 149 | while (!tle.rcvData()){} 150 | tle.readTLE(); 151 | 152 | Serial.println(tle.line1); 153 | Serial.println(tle.line2); 154 | 155 | // Parse received TLE 156 | tle.getOrbit(orb); 157 | 158 | if (DO_PRINT_DEBUG) { 159 | Serial.println(); 160 | Serial.print("epoch: "); Serial.println(orb.epoch_J); 161 | Serial.print("utc: "); Serial.println(orb.epochUTC); 162 | Serial.print("incl: "); Serial.println(orb.incl,8); 163 | Serial.print("a: "); Serial.println(orb.a); 164 | Serial.print("ecc: "); Serial.println(orb.ecc,8); 165 | Serial.print("Omega: "); Serial.println(orb.Omega,8); 166 | Serial.print("omega: "); Serial.println(orb.omega,8); 167 | Serial.print("M0: "); Serial.println(orb.M0,8); 168 | Serial.print("n: "); Serial.println(orb.n,8); 169 | Serial.print("n_dot: "); Serial.println(orb.n_dot,16); 170 | } 171 | 172 | // Initialize timers 173 | lastNtpUpdateMillis = millis(); 174 | lastTleUpdateMillis = lastNtpUpdateMillis; 175 | lastOrbitUpdateMillis = lastNtpUpdateMillis; 176 | delay(100); 177 | 178 | if (DO_PRINT_DEBUG) { 179 | Serial.print("In setup(): lastNtpUpdateMillis: "); 180 | Serial.println(int32_t(lastTleUpdateMillis)); 181 | Serial.print("In setup(): lastTleUpdateMillis: "); 182 | Serial.println(int32_t(lastTleUpdateMillis)); 183 | } 184 | } 185 | 186 | uint32_t currMillis, timeSinceNtpUpdate_ms, timeSinceTleUpdate_ms, timeSinceOrbitUpdate_ms; 187 | 188 | void loop() { 189 | // Get current time 190 | currMillis = millis(); 191 | 192 | // Try to catch overflow of millis() count and handle gracefully 193 | if (currMillis < lastNtpUpdateMillis) { 194 | lastNtpUpdateMillis = currMillis; 195 | lastTleUpdateMillis = currMillis; 196 | lastOrbitUpdateMillis = currMillis; 197 | 198 | Serial.println("Time counter overflow hit"); 199 | } 200 | 201 | timeSinceNtpUpdate_ms = (currMillis - lastNtpUpdateMillis); 202 | timeSinceTleUpdate_ms = (currMillis - lastTleUpdateMillis); 203 | timeSinceOrbitUpdate_ms = (currMillis - lastOrbitUpdateMillis); 204 | 205 | // Advance stepper if necessary 206 | ped.runStepper(); 207 | 208 | // Recheck wifi connection status, and try to reconnect if disconnected 209 | if (WiFi.status() != WL_CONNECTED) { 210 | resetDisplay(0,0,1); 211 | display.println("Wifi disconnected, attempting to reconnect..."); 212 | display.display(); 213 | do { 214 | wifiStatus = WiFi.begin(ssid, pass); 215 | delay(10000); // wait until connection is ready! 216 | } while (wifiStatus != WL_CONNECTED); 217 | } 218 | 219 | // Resend NTP packet regularly to keep time synchronized 220 | if (!ntpPacketSent && (timeSinceNtpUpdate_ms > (TIME_REFRESH_DELAY_MIN*60*1000))) { 221 | ntp.sendNTPpacket(); 222 | ntpPacketSent = true; 223 | Serial.println("NTP Packet Sent"); 224 | } else { 225 | if (ntp.parsePacket()) { 226 | Serial.println("Parsed NTP Packet"); 227 | lastNtpUpdateMillis = millis(); 228 | ntpPacketSent = false; 229 | } 230 | } 231 | 232 | // Resend TLE Query regularly to get updated ephemeris 233 | if (!tleQuerySent && (timeSinceTleUpdate_ms > (TLE_REFRESH_DELAY_MIN * 60*1000))) { 234 | tle.sendQuery(); 235 | tleQuerySent = true; 236 | Serial.println("TLE Query Sent"); 237 | } else if (tleQuerySent) { 238 | if (tle.rcvData()) { 239 | Serial.println("Updating Ephemeris"); 240 | tle.readTLE(); // Read received TLE data into separate lines 241 | tle.getOrbit(orb); // Update orbit from received TLE data 242 | lastTleUpdateMillis = millis(); 243 | tleQuerySent = false; 244 | } 245 | } 246 | 247 | uint64_t currUTC_ms = uint64_t(ntp.unixEpoch)*1000 + uint64_t(timeSinceNtpUpdate_ms); 248 | 249 | // Update Az/El at regular rate 250 | if (timeSinceOrbitUpdate_ms >= ORBIT_REFRESH_DELAY_MS) { 251 | 252 | // Calc Earth-Rotation-Angle for current UTC 253 | era = getEraFromJulian(getJulianFromUnix(currUTC_ms/1000)); 254 | 255 | // Calc ECI Pos/Vel for current UTC 256 | orb.calcPosVelECI_UTC(currUTC_ms,posECI,velECI); 257 | lastOrbitUpdateMillis = millis(); 258 | posECEF = eci2ecef(posECI,-era); 259 | posLLA = ecef2lla(posECEF,DEGREES); 260 | posNED = ecef2ned(posECEF,llaRef,DEGREES); 261 | posAER = ned2AzElRng(posNED); 262 | 263 | if (DO_PRINT_DEBUG) { 264 | Serial.printf("System Time: %04i-%02i-%02i %02i:%02i:%02i\n", 265 | year(),month(),day(),hour(),minute(),second()); 266 | 267 | Serial.printf("timeSinceNtpUpdate_ms: %lu, timeSinceTleUpdate_ms: %lu\n", 268 | timeSinceNtpUpdate_ms, timeSinceTleUpdate_ms); 269 | Serial.print("era: "); Serial.println(era*RAD_TO_DEG,3); 270 | Serial.printf("posECI: [%0.3f,%0.3f,%0.3f]\n",posECI.x,posECI.y,posECI.z); 271 | Serial.printf("posECEF: [%0.3f,%0.3f,%0.3f]\n",posECEF.x,posECEF.y,posECEF.z); 272 | Serial.printf("posLLA: [%0.3f,%0.3f,%0.3f]\n",posLLA.x,posLLA.y,posLLA.z/1e3); 273 | Serial.printf("posNED: [%0.3f,%0.3f,%0.3f]\n",posNED.x,posNED.y,posNED.z); 274 | Serial.printf("posAER: [%0.3f,%0.3f,%0.3f]\n",posAER.x,posAER.y,posAER.z); 275 | } 276 | 277 | // Update target azimuth only if reached current step target (to avoid interrupting smooth movement) 278 | if (ped.stepper.distanceToGo() == 0) 279 | ped.setTargetAz(posAER[0]); 280 | ped.setElevation(90+posAER[1]); 281 | 282 | // Display current date/time on screen 283 | displayCurrTime(posAER[0],posAER[1]); 284 | } 285 | } 286 | -------------------------------------------------------------------------------- /iss-tracker/math_utils.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | math_utils.cpp - Utilities to handle vector math 3 | */ 4 | #include "math_utils.h" 5 | 6 | // DCM transposition 7 | Dcm Dcm::transpose(Dcm d) { 8 | return Dcm{x00,x01,x02,x10,x11,x12,x20,x21,x22}; 9 | } 10 | 11 | // DCM multiplication 12 | Dcm Dcm::operator*(Dcm D) { 13 | return Dcm { 14 | x00*D.x00 + x01*D.x10 + x02*D.x20, 15 | x10*D.x00 + x11*D.x10 + x12*D.x20, 16 | x20*D.x00 + x21*D.x10 + x22*D.x20, 17 | x00*D.x01 + x01*D.x11 + x02*D.x21, 18 | x10*D.x01 + x11*D.x11 + x12*D.x21, 19 | x20*D.x01 + x21*D.x11 + x22*D.x21, 20 | x00*D.x02 + x01*D.x12 + x02*D.x22, 21 | x10*D.x02 + x11*D.x12 + x12*D.x22, 22 | x20*D.x02 + x21*D.x12 + x22*D.x22, 23 | }; 24 | } 25 | 26 | // Vector3 constructors 27 | Vec3::Vec3() {x = 0;y = 0;z = 0;} 28 | Vec3::Vec3(double nx, double ny, double nz) {x = nx; y = ny; z = nz;} 29 | 30 | // Vector3 getter operator 31 | double Vec3::operator[](uint8_t i) { 32 | if (i == 0) return x; 33 | if (i == 1) return y; 34 | else return z; 35 | } 36 | 37 | // Vector3 math operators 38 | Vec3 operator*(Vec3 a, Vec3 b) { return Vec3{a.x*b.x,a.y*b.y,a.z*b.z};} 39 | Vec3 operator/(Vec3 a, Vec3 b) { return Vec3{a.x/b.x,a.y/b.y,a.z/b.z};} 40 | Vec3 operator+(Vec3 a, Vec3 b) { return Vec3{a.x+b.x,a.y+b.y,a.z+b.z};} 41 | Vec3 operator-(Vec3 a, Vec3 b) { return Vec3{a.x-b.x,a.y-b.y,a.z-b.z};} 42 | 43 | Vec3 operator*(Vec3 a, double b) { return Vec3{a.x*b,a.y*b,a.z*b};} 44 | Vec3 operator/(Vec3 a, double b) { return Vec3{a.x/b,a.y/b,a.z/b};} 45 | Vec3 operator+(Vec3 a, double b) { return Vec3{a.x+b,a.y+b,a.z+b};} 46 | Vec3 operator-(Vec3 a, double b) { return Vec3{a.x-b,a.y-b,a.z-b};} 47 | 48 | // Vector3 dot product 49 | double dot(Vec3 a, Vec3 b) {return a.x*b.x + a.y*b.y + a.z*b.z;} 50 | // Vector3 normalization 51 | double norm(Vec3 v) { return sqrt(v.x*v.x + v.y*v.y + v.z*v.z);} 52 | 53 | // DCM & Vector3 multiplication 54 | Vec3 operator*(Dcm d,Vec3 v) { 55 | return Vec3 { 56 | v.x*d.x00 + v.y*d.x01 + v.z*d.x02, 57 | v.x*d.x10 + v.y*d.x11 + v.z*d.x12, 58 | v.x*d.x20 + v.y*d.x21 + v.z*d.x22, 59 | }; 60 | } 61 | -------------------------------------------------------------------------------- /iss-tracker/math_utils.h: -------------------------------------------------------------------------------- 1 | /* 2 | math_utils.h - Direction-Cosine-Matrix (DCM) and 3-Element Vector (Vec3) struct definitions 3 | */ 4 | #pragma once 5 | #include 6 | 7 | // Direction-Cosine-Matrix Definition 8 | struct Dcm { 9 | 10 | double x00; 11 | double x10; 12 | double x20; 13 | double x01; 14 | double x11; 15 | double x21; 16 | double x02; 17 | double x12; 18 | double x22; 19 | 20 | Dcm transpose(Dcm d); 21 | Dcm operator*(Dcm D); 22 | }; 23 | 24 | // 3-Element Vector Definition 25 | struct Vec3 { 26 | 27 | double x; 28 | double y; 29 | double z; 30 | 31 | Vec3(); 32 | Vec3(double nx, double ny, double nz); 33 | 34 | double operator[](uint8_t i); 35 | double getMagnitude(); 36 | void normalize(); 37 | Vec3 getNormalized(); 38 | }; 39 | 40 | 41 | Vec3 operator*(Vec3 a, Vec3 b); 42 | Vec3 operator/(Vec3 a, Vec3 b); 43 | Vec3 operator+(Vec3 a, Vec3 b); 44 | Vec3 operator-(Vec3 a, Vec3 b); 45 | 46 | Vec3 operator*(Vec3 a, double b); 47 | Vec3 operator/(Vec3 a, double b); 48 | Vec3 operator+(Vec3 a, double b); 49 | Vec3 operator-(Vec3 a, double b); 50 | 51 | 52 | double dot(Vec3 a, Vec3 b); 53 | double norm(Vec3 v); 54 | 55 | Vec3 operator*(Dcm d,Vec3 v); 56 | -------------------------------------------------------------------------------- /iss-tracker/orbit_utils.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | orbit_utils.cpp - Utilities to handle orbit initialization and propagation, and timestamp conversion 3 | */ 4 | #include "orbit_utils.h" 5 | 6 | // Convert Unix Seconds to Julian date 7 | double getJulianFromUnix( long unixSecs ) { 8 | return ( unixSecs / SECONDS_PER_DAY ) + J2U; 9 | } 10 | 11 | // Convert Julian date to Unix Seconds 12 | long getUnixSecFromJulian(double julian) { 13 | return long((julian - J2U) * SECONDS_PER_DAY); 14 | } 15 | 16 | // Find Earth-Rotation-Angle (ERA) from julian date 17 | // Source: https://en.wikipedia.org/wiki/Sidereal_time#ERA 18 | double getEraFromJulian(double julian) { 19 | double Tu = julian - 2451545.0; 20 | return fmod(TWO_PI * (0.7790572732640 + 1.00273781191135448 * Tu),TWO_PI); 21 | } 22 | 23 | // Calculate Eccentric Anomaly from Mean Anomaly 24 | double eccAnomalyFromMean(double M0, double ecc) { 25 | double E = M0, dE = 1.; 26 | // Iterative Newton-Raphson solution for eccentic anomaly 27 | while (dE > 1e-8) { 28 | dE = (E - ecc*sin(E) - M0)/(1. - ecc*cos(E)); 29 | E = E - dE; 30 | } 31 | return E; 32 | } 33 | 34 | // Calculate True Anomaly from Eccentric Anomaly 35 | double trueAnomalyFromEcc(double E, double ecc) { 36 | return 2*atan2(sqrt(1.+ecc)*sin(E/2.),sqrt(1.-ecc)*cos(E/2.)); 37 | } 38 | 39 | // Calculate True Anomaly from Mean Anomaly 40 | double trueAnomalyFromMean(double M0, double ecc) { 41 | double E = eccAnomalyFromMean(M0,ecc); 42 | return trueAnomalyFromEcc(E,ecc); 43 | } 44 | 45 | // Convert TLE character string subset to angle 46 | static int get_angle( const char *buff) { 47 | int rval = 0; 48 | 49 | while( *buff == ' ') 50 | buff++; 51 | while( *buff != ' ') 52 | { 53 | if( *buff != '.') 54 | rval = rval * 10 + (int)( *buff - '0'); 55 | buff++; 56 | } 57 | return rval; 58 | } 59 | 60 | // Parse TLE mean-motion 61 | static double get_eight_places( const char *ptr) { 62 | return (double)atoi( ptr) + (double)atoi(ptr + 4) * 1e-8; 63 | } 64 | 65 | // Initialize orbital elements from Two-Line-Element (TLE) 66 | // TLE Format: http://celestrak.org/columns/v04n03/#FAQ01 67 | // Derived from: https://github.com/Bill-Gray/sat_code 68 | void Orbit::initFromTLE(char* line1, char* line2) { 69 | char tbuff[13]; 70 | 71 | int year = line1[19] - '0'; 72 | if( line1[18] >= '0') 73 | year += (line1[18] - '0') * 10; 74 | if( year < 57) /* cycle around Y2K */ 75 | year += 100; 76 | epoch_J = get_eight_places( line1 + 20) + J1900 77 | + (double)( year * 365 + (year - 1) / 4); 78 | 79 | epochUTC = getUnixSecFromJulian(epoch_J); 80 | 81 | incl = (double)get_angle( line2 + 8) * (PI / 180e+4); 82 | Omega = (double)get_angle( line2 + 17) * (PI / 180e+4); 83 | ecc = atoi( line2 + 26) * 1.e-7; 84 | omega = (double)get_angle( line2 + 34) * (PI / 180e+4); 85 | M0 = (double)get_angle( line2 + 43) * (PI / 180e+4); 86 | 87 | /* Make sure mean motion is null-terminated, since rev. no. 88 | may immediately follow. */ 89 | memcpy( tbuff, line2 + 51, 12); 90 | tbuff[12] = '\0'; 91 | /* Input mean motion, and derivative of mean motion */ 92 | /* are in revolutions and days. */ 93 | /* Convert them here to radians and seconds: */ 94 | n = get_eight_places( tbuff) * TWO_PI / SECONDS_PER_DAY; 95 | n_dot = (double)atoi( line1 + 35) 96 | * 1.0e-8 * TWO_PI / (SECONDS_PER_DAY_SQ); 97 | if( line1[33] == '-') 98 | n_dot *= -1.; 99 | 100 | a = pow(MU_EARTH/(n*n),1./3.); 101 | } 102 | 103 | // Calculate Earth-Centered-Inertial (ECI) position & velocity at some delta-T seconds in the future from the orbital epoch 104 | void Orbit::calcPosVelECI(double dt_sec, Vec3& posECI, Vec3& velECI) { 105 | double n_t = n + n_dot*dt_sec; 106 | 107 | double M_t = M0 + n_t*dt_sec; 108 | 109 | double E_t = eccAnomalyFromMean(M_t,ecc); 110 | // Get true anomaly 111 | double v_t = trueAnomalyFromEcc(E_t,ecc); 112 | // Get distance from center 113 | double r_c = a*(1-ecc*cos(E_t)); 114 | 115 | 116 | double cos_w = cos(omega); 117 | double cos_O = cos(Omega); 118 | double cos_i = cos(incl); 119 | 120 | double sin_w = sin(omega); 121 | double sin_O = sin(Omega); 122 | double sin_i = sin(incl); 123 | 124 | Dcm dcm_plane2ECI = {cos_w*cos_O - sin_w*cos_i*sin_O, 125 | cos_w*sin_O + sin_w*cos_i*sin_O, 126 | sin_w*sin_i, 127 | -(sin_w*cos_O + cos_w*cos_i*sin_O), 128 | (cos_w*cos_i*cos_O - sin_w*sin_O), 129 | cos_w*sin_i, 130 | 0, 0, 0}; 131 | 132 | double o_x = r_c*cos(v_t); 133 | double o_y = r_c*sin(v_t); 134 | 135 | double v = sqrt(MU_EARTH * a)/r_c; 136 | double v_x = v * -1.0*sin(E_t); 137 | double v_y = v * (sqrt(1.0 - (ecc*ecc)) * cos(E_t)); 138 | 139 | Vec3 posPlane = {o_x,o_y,0}; 140 | Vec3 velPlane = {v_x,v_y,0}; 141 | 142 | posECI = dcm_plane2ECI * posPlane; 143 | velECI = dcm_plane2ECI * velPlane; 144 | } 145 | 146 | // Calculate Earth-Centered-Inertial (ECI) position & velocity at a specific UTC time 147 | void Orbit::calcPosVelECI_UTC(uint64_t UTC_ms, Vec3& posECI, Vec3& velECI) { 148 | double dt = double(UTC_ms - uint64_t(epochUTC)*1000)/1e3; 149 | calcPosVelECI(dt,posECI,velECI); 150 | } 151 | -------------------------------------------------------------------------------- /iss-tracker/orbit_utils.h: -------------------------------------------------------------------------------- 1 | /* 2 | orbit_utils.h - Utilities to handle orbit initialization and propagation, and time conversions 3 | */ 4 | #pragma once 5 | #include 6 | #include 7 | #include "coord.h" 8 | 9 | #define EARTH_ROT_RATE 7.2921159e-5 10 | #define MU_EARTH 3.986004418e14 11 | #define J2000 2451545.5 12 | #define J1900 (J2000 - 36525. - 1.) 13 | #define SECONDS_PER_DAY 86400. 14 | #define SECONDS_PER_DAY_SQ (SECONDS_PER_DAY*SECONDS_PER_DAY) 15 | #define J2U 2440587.5 16 | 17 | double getJulianFromUnix( long unixSecs ); 18 | long getUnixSecFromJulian(double julian); 19 | double getEraFromJulian(double julian); 20 | double eccAnomalyFromMean(double M0, double ecc); 21 | double trueAnomalyFromEcc(double E, double ecc); 22 | double trueAnomalyFromMean(double M0, double ecc); 23 | 24 | // Struct holding orbital elements 25 | struct Orbit { 26 | double epoch_J; 27 | uint32_t epochUTC; 28 | double incl; 29 | double a; 30 | double ecc; 31 | double Omega; 32 | double omega; 33 | double M0; 34 | double n; 35 | 36 | double n_dot; 37 | 38 | void initFromTLE(char* line1, char* line2); 39 | void calcPosECI(double dt_sec, Vec3& posECI); 40 | void calcPosECI_UTC(uint64_t UTC_ms, Vec3& posECI); 41 | void calcPosVelECI(double dt_sec, Vec3& posECI, Vec3& velECI); 42 | void calcPosVelECI_UTC(uint64_t UTC_ms, Vec3& posECI, Vec3& velECI); 43 | }; 44 | -------------------------------------------------------------------------------- /iss-tracker/pedestal.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | pedestal.cpp - Functions to control pedestal orientation and pointer elevation 3 | */ 4 | #include "pedestal.h" 5 | 6 | // Convert # of steps in stepper motor to equivalent relative pedestal angle in degrees 7 | double steps2deg(long steps) { 8 | return double(-steps) * 360.0 / STEPS_PER_REV; 9 | } 10 | 11 | // Convert pedestal angle in degrees to equivalent # of steps in stepper motor 12 | long deg2steps(double azDeg) { 13 | return floor(-azDeg * STEPS_PER_REV / 360.0); 14 | } 15 | 16 | // Initialize Servo, Stepper, and Compass (if Active) 17 | void Pedestal::begin() { 18 | // Initialize Servo 19 | servo.attach(SERVO_PIN); 20 | servo.write(90); 21 | 22 | // Initialize stepper 23 | stepper = AccelStepper(AccelStepper::FULL4WIRE, STEP1, STEP2, STEP3, STEP4); 24 | stepper.setMaxSpeed(STEPPER_SPEED); 25 | stepper.setAcceleration(STEPPER_ACCEL); 26 | 27 | // Initialise the compass 28 | compass = Adafruit_MMC5603(12345); 29 | if (!DO_BYPASS_COMPASS and !compass.begin(MMC56X3_DEFAULT_ADDRESS, &Wire)) { 30 | Serial.println("No compass detected"); 31 | while (CHECK_COMPASS_CONNECTION) delay(10); 32 | } 33 | } 34 | 35 | // Set both pedestal azimuth and pointer elevation to zero 36 | void Pedestal::zero() { 37 | // Reset Az/El Position to zero 38 | servo.write(90); 39 | stepper.runToNewPosition(0); 40 | } 41 | 42 | // Set target pedestal azimuth 43 | void Pedestal::setTargetAz(double targetAzDeg) { 44 | double currAz = steps2deg(stepper.currentPosition()); 45 | 46 | currAz = fmod(currAz + 3600,360.0); 47 | 48 | Serial.printf("currAz: %0.3f\n",currAz); 49 | 50 | // Compute which direction is closer to current az 51 | double relAz = targetAzDeg - currAz; 52 | if (relAz > 180.0) { 53 | relAz -= 360.0; 54 | } else if (relAz < -180.0) { 55 | relAz += 360.0; 56 | } 57 | 58 | Serial.printf("relAz: %0.3f\n",relAz); 59 | 60 | stepper.move(deg2steps(relAz)); 61 | } 62 | 63 | // Set pointer elevation 64 | void Pedestal::setElevation(double el) { 65 | // Convert double elevation to long hundredths of degrees to improve precision 66 | servo.writeMicroseconds(map(long(el*100),0,18000,SERVO_MIN_PWM,SERVO_MAX_PWM)); 67 | } 68 | 69 | // Run stepper if needed 70 | void Pedestal::runStepper() { 71 | stepper.run(); 72 | } 73 | 74 | // Attempt to point pedestal northward based on average of multiple compass measurements 75 | void Pedestal::pointNorth() { 76 | double currAz, relAz; 77 | currAz = getAverageHeading(); 78 | Serial.printf("currAz (deg): %0.3f\n",currAz); 79 | relAz = -currAz; 80 | 81 | if (relAz > 180.0) { 82 | relAz -= 360.0; 83 | } else if (relAz < -180.0) { 84 | relAz += 360.0; 85 | } 86 | 87 | stepper.move(deg2steps(relAz)); 88 | while (stepper.distanceToGo() != 0) {stepper.run();} 89 | currAz = getAverageHeading(); 90 | Serial.printf("currAz (deg): %0.3f\n",currAz); 91 | } 92 | 93 | // Get reported compass heading in degrees from a single measurement 94 | double Pedestal::getHeading() { 95 | // Get compass heading 96 | compass.getEvent(&compassEvent); 97 | return atan2(compassEvent.magnetic.x,-compassEvent.magnetic.y) * RAD_TO_DEG; 98 | } 99 | 100 | 101 | // Get average compass heading over multiple measurements 102 | double Pedestal::getAverageHeading() { 103 | // Compute average heading over a number of samples 104 | const size_t nSamples=100; 105 | double heading = 0; 106 | for (size_t i = 0; i < nSamples; ++i) { 107 | heading += getHeading() / nSamples; 108 | } 109 | heading += TRUE_NORTH_OFFSET_DEG; 110 | heading = fmod(heading + 360,360); 111 | 112 | return heading; 113 | } 114 | -------------------------------------------------------------------------------- /iss-tracker/pedestal.h: -------------------------------------------------------------------------------- 1 | /* 2 | pedestal.h - Pedestal struct definition 3 | */ 4 | #pragma once 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include "coord.h" 11 | #include "defs.h" 12 | 13 | double steps2deg(long steps); 14 | long deg2steps(double azDeg); 15 | 16 | 17 | // Struct that wraps around pedestal control devices (Servo, Stepper, & Compass) 18 | struct Pedestal { 19 | Servo servo; 20 | AccelStepper stepper; 21 | Adafruit_MMC5603 compass; 22 | sensors_event_t compassEvent; 23 | 24 | void begin(); 25 | void zero(); 26 | void setTargetAz(double azDeg); 27 | void setElevation(double el); 28 | void runStepper(); 29 | void pointNorth(); 30 | double getHeading(); 31 | double getAverageHeading(); 32 | }; 33 | -------------------------------------------------------------------------------- /iss-tracker/wgs84.h: -------------------------------------------------------------------------------- 1 | /* 2 | wgs84.h - params defining WGS84 Ellipsoid parameters. Used in coordinate-frame conversions 3 | Derived from the navduino library: https://github.com/PowerBroker2/navduino 4 | */ 5 | #pragma once 6 | #include "Arduino.h" 7 | 8 | /* 9 | * WGS 84 four defining parameters and several commonly used derived parameters. 10 | * All parameters are stored with the exact number of significant digits provided 11 | * by the WGS 84 rublished report. 12 | */ 13 | 14 | 15 | // WGS 84 Defining Parameters 16 | const float a = 6378137.0; // Semi - major Axis[m] 17 | const float a_sqrd = pow(a, 2); // Semi - major Axis[m] squared 18 | const float f = 1.0 / 298.257223563; // Flattening 19 | const float omega_E = 7292115.0e-11; // Angular velocity of the Earth[rad / s] 20 | const float omega_E_GPS = 7292115.1467e-11; // Angular velocity of the Earth[rad / s] 21 | // According to ICD - GPS - 200 22 | 23 | const float GM = 3.986004418e14; // Earth's Gravitational Constant [m^3/s^2] 24 | // (mass of earth's atmosphere included) 25 | 26 | const float GM_GPS = 3.9860050e14; // The WGS 84 GM value recommended for GPS receiver usage 27 | // by the GPS interface control document(ICD - GPS - 200) 28 | // differs from the current refined WGS 84 GM value. 29 | 30 | // WGS 84 Ellipsoid Derived Geometric Constants 31 | const float b = 6356752.3142; // Semi - minor axis[m] 32 | const float b_sqrd = pow(b, 2); // Semi - minor axis[m] squared 33 | const float ecc = 8.1819190842622e-2; // First eccentricity 34 | const float ecc_sqrd = pow(ecc, 2); // First eccentricity squared 35 | const float ecc_prime = 8.2094437949696e-2; // Second eccentricity 36 | const float ecc_prime_sqrd = pow(ecc_prime, 2); // Second eccentricity squared 37 | const float r = (2*a + b) / 3; // Arithmetic mean radius [m] 38 | -------------------------------------------------------------------------------- /iss-tracker/wifi_utils.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | wifi_utils.cpp - Functions for sending and receiving TLE and NTP queries over Wifi 3 | */ 4 | #include "wifi_utils.h" 5 | 6 | // Initialize UDP connection on local port 7 | void NtpQueryHandler::begin() { 8 | Udp.begin(localPort); 9 | } 10 | 11 | // Send an NTP request to the time server at the given address 12 | void NtpQueryHandler::sendNTPpacket() { 13 | // set all bytes in the buffer to 0 14 | memset(packetBuffer, 0, NTP_PACKET_SIZE); 15 | // Initialize values needed to form NTP request 16 | packetBuffer[0] = 0b11100011; // LI, Version, Mode 17 | packetBuffer[1] = 0; // Stratum, or type of clock 18 | packetBuffer[2] = 6; // Polling Interval 19 | packetBuffer[3] = 0xEC; // Peer Clock Precision 20 | // 8 bytes of zero for Root Delay & Root Dispersion 21 | packetBuffer[12] = 49; 22 | packetBuffer[13] = 0x4E; 23 | packetBuffer[14] = 49; 24 | packetBuffer[15] = 52; 25 | 26 | // all NTP fields have been given values, now 27 | // you can send a packet requesting a timestamp: 28 | Udp.beginPacket("time.nist.gov", 123); //NTP requests are to port 123 29 | Udp.write(packetBuffer, NTP_PACKET_SIZE); 30 | Udp.endPacket(); 31 | } 32 | 33 | // Check if UDP Packet received and if so, parse it 34 | bool NtpQueryHandler::parsePacket() { 35 | if (Udp.parsePacket()) { 36 | Serial.println("packet received"); 37 | // We've received a packet, read the data from it 38 | Udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer 39 | 40 | //the timestamp starts at byte 40 of the received packet and is four bytes, 41 | // or two words, long. First, esxtract the two words: 42 | unsigned long highWord = word(packetBuffer[40], packetBuffer[41]); 43 | unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]); 44 | // combine the four bytes (two words) into a long integer 45 | // this is NTP time (seconds since Jan 1 1900): 46 | unsigned long secsSince1900 = highWord << 16 | lowWord; 47 | Serial.print("Seconds since Jan 1 1900 = "); 48 | Serial.println(secsSince1900); 49 | 50 | // Unix time starts on Jan 1 1970. In seconds, that's 2208988800: 51 | 52 | // subtract seventy years: 53 | unixEpoch = secsSince1900 - seventyYears; 54 | 55 | // Set system time based on received packet 56 | setTime(unixEpoch + timeZone * SECS_PER_HOUR); 57 | 58 | // print Unix time: 59 | Serial.println(int32_t(unixEpoch)); 60 | lastQueryTimeMillis = millis(); 61 | 62 | return true; 63 | } 64 | return false; 65 | } 66 | 67 | // Split full 3-Line-Element (3LE) string into Two-Line-Element components 68 | // TLE Format: http://celestrak.org/columns/v04n03/#FAQ01 69 | int read3LE(char* buff, char* line1, char* line2) { 70 | 71 | int idx = 0; 72 | String str = ""; 73 | 74 | // Read lines until header found 75 | while (idx < MAX_BUFFER) { 76 | str += *buff; // Read character from buffer into string 77 | if (*buff == '\n') { 78 | if (str.startsWith(HEADER_STR)) break; 79 | else str = ""; 80 | } 81 | buff++; 82 | idx++; 83 | } 84 | 85 | // If reached end of buffer, header not found 86 | if (idx == MAX_BUFFER) return -1; 87 | buff++; 88 | memcpy(line1, buff, TLE_LEN); 89 | memcpy(line2, buff+71, TLE_LEN); 90 | 91 | return 0; 92 | } 93 | 94 | // Connect to Celestrak and send query for the latest ISS 3LE 95 | void TleQueryHandler::sendQuery() { 96 | if (client.connect(SERVER, 80)) { 97 | Serial.println("connected to server"); 98 | // Make a HTTP request: 99 | client.print("GET "); client.print(QUERY); client.println(" HTTP/1.1"); 100 | 101 | client.println("Host: " SERVER); 102 | client.println("Connection: close"); 103 | client.println(); 104 | } 105 | } 106 | 107 | // Read received characters into a buffer and return true when we have received everything 108 | bool TleQueryHandler::rcvData() { 109 | if (!client.connected()){ 110 | Serial.println(); 111 | Serial.println("disconnecting from server."); 112 | client.stop(); 113 | rcvBytes = 0; 114 | return true; 115 | } 116 | while (client.available()) { 117 | char c = client.read(); 118 | rcvBuffer[rcvBytes]=c; 119 | rcvBytes++; 120 | } 121 | return false; 122 | } 123 | 124 | // Parse characters in received buffer and store TLE lines 125 | int TleQueryHandler::readTLE() { 126 | return read3LE(rcvBuffer,line1,line2); 127 | } 128 | 129 | // Create Orbit struct from parsed TLE strings 130 | void TleQueryHandler::getOrbit(Orbit& orb) { 131 | orb.initFromTLE(line1,line2); 132 | } 133 | 134 | void printEncryptionType(int thisType) { 135 | // read the encryption type and print out the name: 136 | switch (thisType) { 137 | case ENC_TYPE_WEP: 138 | Serial.println("WEP"); 139 | break; 140 | case ENC_TYPE_TKIP: 141 | Serial.println("WPA"); 142 | break; 143 | case ENC_TYPE_CCMP: 144 | Serial.println("WPA2"); 145 | break; 146 | case ENC_TYPE_NONE: 147 | Serial.println("None"); 148 | break; 149 | case ENC_TYPE_AUTO: 150 | Serial.println("Auto"); 151 | break; 152 | case ENC_TYPE_UNKNOWN: 153 | default: 154 | Serial.println("Unknown"); 155 | break; 156 | } 157 | } 158 | 159 | void printMacAddress(byte mac[]) { 160 | for (int i = 5; i >= 0; i--) { 161 | if (mac[i] < 16) { 162 | Serial.print("0"); 163 | } 164 | Serial.print(mac[i], HEX); 165 | if (i > 0) { 166 | Serial.print(":"); 167 | } 168 | } 169 | Serial.println(); 170 | } 171 | 172 | // List all visible Wifi Networks 173 | // Note that the Adafruit WiFi Co-Processor can only connect to 2.4 GHz networks 174 | void listNetworks() { 175 | // scan for nearby networks: 176 | Serial.println("** Scan Networks **"); 177 | int numSsid = WiFi.scanNetworks(); 178 | if (numSsid == -1) { 179 | Serial.println("Couldn't get a wifi connection"); 180 | while (true); 181 | } 182 | 183 | // print the list of networks seen: 184 | Serial.print("number of available networks:"); 185 | Serial.println(numSsid); 186 | 187 | // print the network number and name for each network found: 188 | for (int thisNet = 0; thisNet < numSsid; thisNet++) { 189 | Serial.print(thisNet); 190 | Serial.print(") "); 191 | Serial.print(WiFi.SSID(thisNet)); 192 | Serial.print("\tSignal: "); 193 | Serial.print(WiFi.RSSI(thisNet)); 194 | Serial.print(" dBm"); 195 | Serial.print("\tEncryption: "); 196 | printEncryptionType(WiFi.encryptionType(thisNet)); 197 | } 198 | } 199 | -------------------------------------------------------------------------------- /iss-tracker/wifi_utils.h: -------------------------------------------------------------------------------- 1 | /* 2 | wifi_utils.h - Wrapper structs that handle sending and receiving TLE and NTP queries over Wifi 3 | */ 4 | #pragma once 5 | 6 | #include 7 | #include 8 | #include 9 | #include "defs.h" 10 | #include "orbit_utils.h" 11 | #include "TimeLib.h" 12 | 13 | #define NTP_PACKET_SIZE 48 14 | 15 | const unsigned long seventyYears = 2208988800UL; 16 | const unsigned int localPort = 2390; // local port to listen for UDP packets 17 | 18 | void printEncryptionType(int thisType); 19 | void listNetworks(); 20 | 21 | int read3LE(char* buff, char* line1, char* line2); 22 | 23 | // Struct to handle UDP querying of NTP Time Server 24 | struct NtpQueryHandler { 25 | WiFiUDP Udp; 26 | byte packetBuffer[NTP_PACKET_SIZE]; 27 | 28 | time_t unixEpoch; 29 | time_t lastQueryTimeMillis; 30 | 31 | void begin(); 32 | void sendNTPpacket(); 33 | bool parsePacket(); 34 | }; 35 | 36 | // Struct to handle HTTP connections and queries to Celestrak for ISS TLE data 37 | struct TleQueryHandler { 38 | WiFiClient client; 39 | 40 | char rcvBuffer[MAX_BUFFER]; 41 | uint32_t rcvBytes; 42 | 43 | char line1[TLE_LEN]; 44 | char line2[TLE_LEN]; 45 | 46 | void sendQuery(); 47 | bool rcvData(); 48 | int readTLE(); 49 | void getOrbit(Orbit& orb); 50 | }; 51 | --------------------------------------------------------------------------------