19 Commits

Author SHA1 Message Date
d8e59ee525 Added some more documentation.
All checks were successful
Deploy firmware via FTP (master) / Build and FTP Sync (push) Successful in 2m21s
2026-03-20 16:11:53 +01:00
51241512b9 Dateien nach "CAD" hochladen
All checks were successful
Deploy firmware via FTP (master) / Build and FTP Sync (push) Successful in 2m17s
2026-03-19 23:36:45 +00:00
757cfdac8a Nick war zu doof
All checks were successful
Deploy firmware via FTP (master) / Build and FTP Sync (push) Successful in 2m26s
2026-03-19 23:30:25 +00:00
c6348417ec alternative EiAndocker für 16x2 O-Ringe und voll aus TPU gedruckt ohne O-Ring
Some checks failed
Deploy firmware via FTP (master) / Build and FTP Sync (push) Has been cancelled
- erfolgreich getestet mit 95A TPU
2026-03-19 23:29:21 +00:00
Holger Weber
c6fd370e02 Added documentation for inkscape plugin.
All checks were successful
Deploy firmware via FTP (master) / Build and FTP Sync (push) Successful in 2m30s
2026-03-20 00:18:23 +01:00
Holger Weber
6931ee4dfd Added working AxiDraw windows version 2026-03-20 00:12:26 +01:00
Holger Weber
6aa6a6637f Added search for windows COM ports 2026-03-20 00:10:49 +01:00
Holger Weber
a0f8a06daf Fixed initial Pin Setting 2026-03-20 00:09:55 +01:00
dca1ab0b53 Added test svg - chicken.
All checks were successful
Deploy firmware via FTP (master) / Build and FTP Sync (push) Successful in 2m20s
2026-03-17 22:45:30 +01:00
fbd14c9b5d Merge pull request 'Added wifi state output as version.' (#6) from feature/wifi-state-in-version into master
All checks were successful
Deploy firmware via FTP (master) / Build and FTP Sync (push) Successful in 2m26s
Reviewed-on: #6
2026-03-14 08:06:12 +00:00
303423a5a5 Added wifi state output as version. 2026-03-13 15:52:36 +01:00
f55dab7546 Added script to kill python process of inkscape.
All checks were successful
Deploy firmware via FTP (master) / Build and FTP Sync (push) Successful in 2m24s
2026-03-13 14:11:32 +01:00
b7a0aa47c8 Fixed target in action.
All checks were successful
Deploy firmware via FTP (master) / Build and FTP Sync (push) Successful in 2m26s
2026-03-13 14:03:38 +01:00
eed8f1365d Merge commit '2eebf732089c57b6d9132218408e68be360a5b43'
Some checks failed
Deploy firmware via FTP (master) / Build and FTP Sync (push) Failing after 13s
2026-03-13 14:02:06 +01:00
2eebf73208 Select build system by your own platformio_override.ini file. Check example file. 2026-03-13 13:50:03 +01:00
dda7ee60c0 Merge pull request 'Update deploy workflow to use 'master' branch and add unit tests for deployment triggers' (#4) from firmware_deploy into master
All checks were successful
Deploy firmware via FTP (master) / Build and FTP Sync (push) Successful in 3m31s
Reviewed-on: #4
2026-03-13 10:16:07 +00:00
33ce61cc8a Update deploy workflow to use 'master' branch and add unit tests for deployment triggers 2026-03-13 11:15:01 +01:00
ad39e86a9d Merge pull request 'firmware_deploy' (#3) from firmware_deploy into master
Reviewed-on: #3
2026-03-13 10:05:59 +00:00
5a389975b2 Auto stash before merge of "SlEggBotEL32Cfg" and "origin/SlEggBotEL32Cfg" 2026-03-13 11:01:29 +01:00
29 changed files with 242476 additions and 45 deletions

View File

@@ -0,0 +1,72 @@
name: Deploy firmware via FTP (master)
on:
push:
branches:
- master
concurrency:
group: deploy-master
cancel-in-progress: true
jobs:
deploy:
name: Build and FTP Sync
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.x'
- name: Install PlatformIO
run: |
python -m pip install --upgrade pip
python -m pip install platformio
- name: Build firmware bundle
run: pio run -e uno_linux
- name: Install lftp client
run: |
if command -v lftp >/dev/null 2>&1; then
echo 'lftp is already available on this runner image'
exit 0
fi
if command -v sudo >/dev/null 2>&1; then
sudo apt-get update
sudo apt-get install -y lftp
exit 0
fi
apt-get update
apt-get install -y lftp
- name: Upload firmware bundle via lftp
env:
FTP_SERVER: ${{ secrets.FTP_SERVER }}
FTP_USERNAME: ${{ secrets.FTP_USERNAME }}
FTP_PASSWORD: ${{ secrets.FTP_PASSWORD }}
FTP_SERVER_DIR: ${{ secrets.FTP_SERVER_DIR }}
run: |
lftp <<EOF
set cmd:fail-exit true
set net:timeout 120
set net:max-retries 2
set net:reconnect-interval-base 5
set ftp:passive-mode true
set ftp:prefer-epsv false
set ftp:ssl-force true
set ftp:ssl-protect-data true
set ftp:ssl-auth TLS
set ssl:verify-certificate no
open -u "$FTP_USERNAME","$FTP_PASSWORD" -p 21 "$FTP_SERVER"
mirror -R --verbose --delete \
--exclude-glob .DS_Store \
firmware/ "$FTP_SERVER_DIR"
quit
EOF

1
.gitignore vendored
View File

@@ -216,3 +216,4 @@ pip-log.txt
#Mr Developer
.mr.developer.cfg
src/credentials.h
platformio_override.ini

View File

@@ -0,0 +1,848 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('FreeCAD Model'),'2;1');
FILE_NAME('Open CASCADE Shape Model','2026-03-16T19:11:20',(''),(''),
'Open CASCADE STEP processor 7.8','FreeCAD','Unknown');
FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }'));
ENDSEC;
DATA;
#1 = APPLICATION_PROTOCOL_DEFINITION('international standard',
'automotive_design',2000,#2);
#2 = APPLICATION_CONTEXT(
'core data for automotive mechanical design processes');
#3 = SHAPE_DEFINITION_REPRESENTATION(#4,#10);
#4 = PRODUCT_DEFINITION_SHAPE('','',#5);
#5 = PRODUCT_DEFINITION('design','',#6,#9);
#6 = PRODUCT_DEFINITION_FORMATION('','',#7);
#7 = PRODUCT('EiAndockerLinksORing16x2','EiAndockerLinksORing16x2','',(
#8));
#8 = PRODUCT_CONTEXT('',#2,'mechanical');
#9 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design');
#10 = ADVANCED_BREP_SHAPE_REPRESENTATION('',(#11,#15),#629);
#11 = AXIS2_PLACEMENT_3D('',#12,#13,#14);
#12 = CARTESIAN_POINT('',(0.,0.,0.));
#13 = DIRECTION('',(0.,0.,1.));
#14 = DIRECTION('',(1.,0.,-0.));
#15 = MANIFOLD_SOLID_BREP('',#16);
#16 = CLOSED_SHELL('',(#17,#241,#269,#295,#322,#354,#404,#424,#444,#491,
#502,#519,#529,#539,#565,#595,#620));
#17 = ADVANCED_FACE('',(#18,#45),#236,.T.);
#18 = FACE_BOUND('',#19,.F.);
#19 = EDGE_LOOP('',(#20,#30,#37,#38));
#20 = ORIENTED_EDGE('',*,*,#21,.T.);
#21 = EDGE_CURVE('',#22,#24,#26,.T.);
#22 = VERTEX_POINT('',#23);
#23 = CARTESIAN_POINT('',(11.,0.,0.));
#24 = VERTEX_POINT('',#25);
#25 = CARTESIAN_POINT('',(11.,0.,39.));
#26 = LINE('',#27,#28);
#27 = CARTESIAN_POINT('',(11.,0.,0.));
#28 = VECTOR('',#29,1.);
#29 = DIRECTION('',(0.,0.,1.));
#30 = ORIENTED_EDGE('',*,*,#31,.T.);
#31 = EDGE_CURVE('',#24,#24,#32,.T.);
#32 = CIRCLE('',#33,11.);
#33 = AXIS2_PLACEMENT_3D('',#34,#35,#36);
#34 = CARTESIAN_POINT('',(0.,0.,39.));
#35 = DIRECTION('',(0.,0.,1.));
#36 = DIRECTION('',(1.,0.,0.));
#37 = ORIENTED_EDGE('',*,*,#21,.F.);
#38 = ORIENTED_EDGE('',*,*,#39,.F.);
#39 = EDGE_CURVE('',#22,#22,#40,.T.);
#40 = CIRCLE('',#41,11.);
#41 = AXIS2_PLACEMENT_3D('',#42,#43,#44);
#42 = CARTESIAN_POINT('',(0.,0.,0.));
#43 = DIRECTION('',(0.,0.,1.));
#44 = DIRECTION('',(1.,0.,0.));
#45 = FACE_BOUND('',#46,.F.);
#46 = EDGE_LOOP('',(#47,#112,#175));
#47 = ORIENTED_EDGE('',*,*,#48,.F.);
#48 = EDGE_CURVE('',#49,#51,#53,.T.);
#49 = VERTEX_POINT('',#50);
#50 = CARTESIAN_POINT('',(-2.927613660003E-07,-11.,12.));
#51 = VERTEX_POINT('',#52);
#52 = CARTESIAN_POINT('',(2.374854292069E-07,-11.,6.));
#53 = B_SPLINE_CURVE_WITH_KNOTS('',8,(#54,#55,#56,#57,#58,#59,#60,#61,
#62,#63,#64,#65,#66,#67,#68,#69,#70,#71,#72,#73,#74,#75,#76,#77,#78,
#79,#80,#81,#82,#83,#84,#85,#86,#87,#88,#89,#90,#91,#92,#93,#94,#95,
#96,#97,#98,#99,#100,#101,#102,#103,#104,#105,#106,#107,#108,#109,
#110,#111),.UNSPECIFIED.,.T.,.F.,(9,7,7,7,7,7,7,7,9),(0.,
0.12028008765,0.221803874722,0.313717691764,0.424279510118,
0.557035521011,0.678561824844,0.82156830206,1.),.UNSPECIFIED.);
#54 = CARTESIAN_POINT('',(-3.,-10.58300524425,9.));
#55 = CARTESIAN_POINT('',(-3.,-10.58300524425,9.247784463312));
#56 = CARTESIAN_POINT('',(-2.97661099072,-10.58963540912,9.495313801967)
);
#57 = CARTESIAN_POINT('',(-2.929914976415,-10.60287246882,9.741235870322
));
#58 = CARTESIAN_POINT('',(-2.859695742185,-10.62246505723,9.984131705533
));
#59 = CARTESIAN_POINT('',(-2.765485670196,-10.64792558084,
10.222409636621));
#60 = CARTESIAN_POINT('',(-2.646608254922,-10.67848833322,
10.454173492424));
#61 = CARTESIAN_POINT('',(-2.502230313136,-10.71304744389,
10.677050088509));
#62 = CARTESIAN_POINT('',(-2.187278576625,-10.78135296782,
11.065983092374));
#63 = CARTESIAN_POINT('',(-2.023097625341,-10.8146465199,11.236965633107
));
#64 = CARTESIAN_POINT('',(-1.838511950113,-10.84895509728,
11.397919728876));
#65 = CARTESIAN_POINT('',(-1.63351040545,-10.88295677609,11.545684384537
));
#66 = CARTESIAN_POINT('',(-1.408464110369,-10.9150703833,11.676917729215
));
#67 = CARTESIAN_POINT('',(-1.164167045979,-10.9435285676,11.788067939419
));
#68 = CARTESIAN_POINT('',(-0.901928016914,-10.96650203127,
11.875311066446));
#69 = CARTESIAN_POINT('',(-0.371875127732,-10.99660615524,
11.987977286074));
#70 = CARTESIAN_POINT('',(-0.110970775212,-11.00480136742,
12.017613390432));
#71 = CARTESIAN_POINT('',(0.154044903682,-11.00581158676,12.020939532078
));
#72 = CARTESIAN_POINT('',(0.417899218976,-10.99920605305,11.997223641124
));
#73 = CARTESIAN_POINT('',(0.675301956574,-10.98540660424,11.947326541564
));
#74 = CARTESIAN_POINT('',(0.921256391971,-10.96563060757,11.873683621587
));
#75 = CARTESIAN_POINT('',(1.151344483982,-10.9416388314,11.780339397179)
);
#76 = CARTESIAN_POINT('',(1.615331728924,-10.88374449378,11.543926087641
));
#77 = CARTESIAN_POINT('',(1.844790555774,-10.84828787337,11.392441050153
));
#78 = CARTESIAN_POINT('',(2.050308680927,-10.81116823604,11.22331735385)
);
#79 = CARTESIAN_POINT('',(2.232359248194,-10.77424422358,11.040306652498
));
#80 = CARTESIAN_POINT('',(2.391662754536,-10.73898686411,10.846382998433
));
#81 = CARTESIAN_POINT('',(2.529009637688,-10.70651764133,10.643900023181
));
#82 = CARTESIAN_POINT('',(2.645138305672,-10.67768546127,10.434702100122
));
#83 = CARTESIAN_POINT('',(2.85530473354,-10.62361774287,9.962660574488)
);
#84 = CARTESIAN_POINT('',(2.940294167414,-10.60024937474,9.697330811818)
);
#85 = CARTESIAN_POINT('',(2.996436520884,-10.58414357274,9.426929463329)
);
#86 = CARTESIAN_POINT('',(3.024268131702,-10.575989631,9.153706681797));
#87 = CARTESIAN_POINT('',(3.024041649892,-10.57609184962,8.87967057245)
);
#88 = CARTESIAN_POINT('',(2.995725631373,-10.58439583235,8.606771307622)
);
#89 = CARTESIAN_POINT('',(2.938989259398,-10.60048293223,8.337074927084)
);
#90 = CARTESIAN_POINT('',(2.77460924759,-10.64463059066,7.831165270903)
);
#91 = CARTESIAN_POINT('',(2.67175104555,-10.67154326208,7.59427485792));
#92 = CARTESIAN_POINT('',(2.544056330611,-10.70365056993,7.363762211941)
);
#93 = CARTESIAN_POINT('',(2.390660235376,-10.74006998818,7.141595617126)
);
#94 = CARTESIAN_POINT('',(2.210506350817,-10.7795878533,6.930367243669)
);
#95 = CARTESIAN_POINT('',(2.002505624649,-10.82052918413,6.733473412639)
);
#96 = CARTESIAN_POINT('',(1.76577358126,-10.86066377413,6.555368237331)
);
#97 = CARTESIAN_POINT('',(1.187250065257,-10.94029721233,6.221357529634)
);
#98 = CARTESIAN_POINT('',(0.823824071924,-10.97986998106,6.068899191573)
);
#99 = CARTESIAN_POINT('',(0.422202059946,-11.00848612598,5.968367559822)
);
#100 = CARTESIAN_POINT('',(2.076561145259E-12,-11.01910836895,
5.933413112681));
#101 = CARTESIAN_POINT('',(-0.42220205995,-11.00848612598,5.968367559823
));
#102 = CARTESIAN_POINT('',(-0.823824071923,-10.97986998106,
6.068899191572));
#103 = CARTESIAN_POINT('',(-1.187250065258,-10.94029721233,
6.221357529634));
#104 = CARTESIAN_POINT('',(-1.890223596673,-10.84353329916,6.62721948723
));
#105 = CARTESIAN_POINT('',(-2.218095833563,-10.78212870183,
6.905826251681));
#106 = CARTESIAN_POINT('',(-2.484538511301,-10.72169165657,
7.219322097354));
#107 = CARTESIAN_POINT('',(-2.692957757048,-10.66854367312,
7.555805901262));
#108 = CARTESIAN_POINT('',(-2.846758847749,-10.62644198358,7.90703918817
));
#109 = CARTESIAN_POINT('',(-2.94864197823,-10.59756449647,8.267356983371
));
#110 = CARTESIAN_POINT('',(-3.,-10.58300524425,8.632829859132));
#111 = CARTESIAN_POINT('',(-3.,-10.58300524425,9.));
#112 = ORIENTED_EDGE('',*,*,#113,.F.);
#113 = EDGE_CURVE('',#114,#49,#116,.T.);
#114 = VERTEX_POINT('',#115);
#115 = CARTESIAN_POINT('',(-3.,-10.58300524425,9.));
#116 = B_SPLINE_CURVE_WITH_KNOTS('',8,(#117,#118,#119,#120,#121,#122,
#123,#124,#125,#126,#127,#128,#129,#130,#131,#132,#133,#134,#135,
#136,#137,#138,#139,#140,#141,#142,#143,#144,#145,#146,#147,#148,
#149,#150,#151,#152,#153,#154,#155,#156,#157,#158,#159,#160,#161,
#162,#163,#164,#165,#166,#167,#168,#169,#170,#171,#172,#173,#174),
.UNSPECIFIED.,.T.,.F.,(9,7,7,7,7,7,7,7,9),(0.,0.12028008765,
0.221803874722,0.313717691764,0.424279510118,0.557035521011,
0.678561824844,0.82156830206,1.),.UNSPECIFIED.);
#117 = CARTESIAN_POINT('',(-3.,-10.58300524425,9.));
#118 = CARTESIAN_POINT('',(-3.,-10.58300524425,9.247784463312));
#119 = CARTESIAN_POINT('',(-2.97661099072,-10.58963540912,9.495313801967
));
#120 = CARTESIAN_POINT('',(-2.929914976415,-10.60287246882,
9.741235870322));
#121 = CARTESIAN_POINT('',(-2.859695742185,-10.62246505723,
9.984131705533));
#122 = CARTESIAN_POINT('',(-2.765485670196,-10.64792558084,
10.222409636621));
#123 = CARTESIAN_POINT('',(-2.646608254922,-10.67848833322,
10.454173492424));
#124 = CARTESIAN_POINT('',(-2.502230313136,-10.71304744389,
10.677050088509));
#125 = CARTESIAN_POINT('',(-2.187278576625,-10.78135296782,
11.065983092374));
#126 = CARTESIAN_POINT('',(-2.023097625341,-10.8146465199,
11.236965633107));
#127 = CARTESIAN_POINT('',(-1.838511950113,-10.84895509728,
11.397919728876));
#128 = CARTESIAN_POINT('',(-1.63351040545,-10.88295677609,
11.545684384537));
#129 = CARTESIAN_POINT('',(-1.408464110369,-10.9150703833,
11.676917729215));
#130 = CARTESIAN_POINT('',(-1.164167045979,-10.9435285676,
11.788067939419));
#131 = CARTESIAN_POINT('',(-0.901928016914,-10.96650203127,
11.875311066446));
#132 = CARTESIAN_POINT('',(-0.371875127732,-10.99660615524,
11.987977286074));
#133 = CARTESIAN_POINT('',(-0.110970775212,-11.00480136742,
12.017613390432));
#134 = CARTESIAN_POINT('',(0.154044903682,-11.00581158676,
12.020939532078));
#135 = CARTESIAN_POINT('',(0.417899218976,-10.99920605305,
11.997223641124));
#136 = CARTESIAN_POINT('',(0.675301956574,-10.98540660424,
11.947326541564));
#137 = CARTESIAN_POINT('',(0.921256391971,-10.96563060757,
11.873683621587));
#138 = CARTESIAN_POINT('',(1.151344483982,-10.9416388314,11.780339397179
));
#139 = CARTESIAN_POINT('',(1.615331728924,-10.88374449378,
11.543926087641));
#140 = CARTESIAN_POINT('',(1.844790555774,-10.84828787337,
11.392441050153));
#141 = CARTESIAN_POINT('',(2.050308680927,-10.81116823604,11.22331735385
));
#142 = CARTESIAN_POINT('',(2.232359248194,-10.77424422358,
11.040306652498));
#143 = CARTESIAN_POINT('',(2.391662754536,-10.73898686411,
10.846382998433));
#144 = CARTESIAN_POINT('',(2.529009637688,-10.70651764133,
10.643900023181));
#145 = CARTESIAN_POINT('',(2.645138305672,-10.67768546127,
10.434702100122));
#146 = CARTESIAN_POINT('',(2.85530473354,-10.62361774287,9.962660574488)
);
#147 = CARTESIAN_POINT('',(2.940294167414,-10.60024937474,9.697330811818
));
#148 = CARTESIAN_POINT('',(2.996436520884,-10.58414357274,9.426929463329
));
#149 = CARTESIAN_POINT('',(3.024268131702,-10.575989631,9.153706681797)
);
#150 = CARTESIAN_POINT('',(3.024041649892,-10.57609184962,8.87967057245)
);
#151 = CARTESIAN_POINT('',(2.995725631373,-10.58439583235,8.606771307622
));
#152 = CARTESIAN_POINT('',(2.938989259398,-10.60048293223,8.337074927084
));
#153 = CARTESIAN_POINT('',(2.77460924759,-10.64463059066,7.831165270903)
);
#154 = CARTESIAN_POINT('',(2.67175104555,-10.67154326208,7.59427485792)
);
#155 = CARTESIAN_POINT('',(2.544056330611,-10.70365056993,7.363762211941
));
#156 = CARTESIAN_POINT('',(2.390660235376,-10.74006998818,7.141595617126
));
#157 = CARTESIAN_POINT('',(2.210506350817,-10.7795878533,6.930367243669)
);
#158 = CARTESIAN_POINT('',(2.002505624649,-10.82052918413,6.733473412639
));
#159 = CARTESIAN_POINT('',(1.76577358126,-10.86066377413,6.555368237331)
);
#160 = CARTESIAN_POINT('',(1.187250065257,-10.94029721233,6.221357529634
));
#161 = CARTESIAN_POINT('',(0.823824071924,-10.97986998106,6.068899191573
));
#162 = CARTESIAN_POINT('',(0.422202059946,-11.00848612598,5.968367559822
));
#163 = CARTESIAN_POINT('',(2.076561145259E-12,-11.01910836895,
5.933413112681));
#164 = CARTESIAN_POINT('',(-0.42220205995,-11.00848612598,5.968367559823
));
#165 = CARTESIAN_POINT('',(-0.823824071923,-10.97986998106,
6.068899191572));
#166 = CARTESIAN_POINT('',(-1.187250065258,-10.94029721233,
6.221357529634));
#167 = CARTESIAN_POINT('',(-1.890223596673,-10.84353329916,6.62721948723
));
#168 = CARTESIAN_POINT('',(-2.218095833563,-10.78212870183,
6.905826251681));
#169 = CARTESIAN_POINT('',(-2.484538511301,-10.72169165657,
7.219322097354));
#170 = CARTESIAN_POINT('',(-2.692957757048,-10.66854367312,
7.555805901262));
#171 = CARTESIAN_POINT('',(-2.846758847749,-10.62644198358,7.90703918817
));
#172 = CARTESIAN_POINT('',(-2.94864197823,-10.59756449647,8.267356983371
));
#173 = CARTESIAN_POINT('',(-3.,-10.58300524425,8.632829859132));
#174 = CARTESIAN_POINT('',(-3.,-10.58300524425,9.));
#175 = ORIENTED_EDGE('',*,*,#176,.F.);
#176 = EDGE_CURVE('',#51,#114,#177,.T.);
#177 = B_SPLINE_CURVE_WITH_KNOTS('',8,(#178,#179,#180,#181,#182,#183,
#184,#185,#186,#187,#188,#189,#190,#191,#192,#193,#194,#195,#196,
#197,#198,#199,#200,#201,#202,#203,#204,#205,#206,#207,#208,#209,
#210,#211,#212,#213,#214,#215,#216,#217,#218,#219,#220,#221,#222,
#223,#224,#225,#226,#227,#228,#229,#230,#231,#232,#233,#234,#235),
.UNSPECIFIED.,.T.,.F.,(9,7,7,7,7,7,7,7,9),(0.,0.12028008765,
0.221803874722,0.313717691764,0.424279510118,0.557035521011,
0.678561824844,0.82156830206,1.),.UNSPECIFIED.);
#178 = CARTESIAN_POINT('',(-3.,-10.58300524425,9.));
#179 = CARTESIAN_POINT('',(-3.,-10.58300524425,9.247784463312));
#180 = CARTESIAN_POINT('',(-2.97661099072,-10.58963540912,9.495313801967
));
#181 = CARTESIAN_POINT('',(-2.929914976415,-10.60287246882,
9.741235870322));
#182 = CARTESIAN_POINT('',(-2.859695742185,-10.62246505723,
9.984131705533));
#183 = CARTESIAN_POINT('',(-2.765485670196,-10.64792558084,
10.222409636621));
#184 = CARTESIAN_POINT('',(-2.646608254922,-10.67848833322,
10.454173492424));
#185 = CARTESIAN_POINT('',(-2.502230313136,-10.71304744389,
10.677050088509));
#186 = CARTESIAN_POINT('',(-2.187278576625,-10.78135296782,
11.065983092374));
#187 = CARTESIAN_POINT('',(-2.023097625341,-10.8146465199,
11.236965633107));
#188 = CARTESIAN_POINT('',(-1.838511950113,-10.84895509728,
11.397919728876));
#189 = CARTESIAN_POINT('',(-1.63351040545,-10.88295677609,
11.545684384537));
#190 = CARTESIAN_POINT('',(-1.408464110369,-10.9150703833,
11.676917729215));
#191 = CARTESIAN_POINT('',(-1.164167045979,-10.9435285676,
11.788067939419));
#192 = CARTESIAN_POINT('',(-0.901928016914,-10.96650203127,
11.875311066446));
#193 = CARTESIAN_POINT('',(-0.371875127732,-10.99660615524,
11.987977286074));
#194 = CARTESIAN_POINT('',(-0.110970775212,-11.00480136742,
12.017613390432));
#195 = CARTESIAN_POINT('',(0.154044903682,-11.00581158676,
12.020939532078));
#196 = CARTESIAN_POINT('',(0.417899218976,-10.99920605305,
11.997223641124));
#197 = CARTESIAN_POINT('',(0.675301956574,-10.98540660424,
11.947326541564));
#198 = CARTESIAN_POINT('',(0.921256391971,-10.96563060757,
11.873683621587));
#199 = CARTESIAN_POINT('',(1.151344483982,-10.9416388314,11.780339397179
));
#200 = CARTESIAN_POINT('',(1.615331728924,-10.88374449378,
11.543926087641));
#201 = CARTESIAN_POINT('',(1.844790555774,-10.84828787337,
11.392441050153));
#202 = CARTESIAN_POINT('',(2.050308680927,-10.81116823604,11.22331735385
));
#203 = CARTESIAN_POINT('',(2.232359248194,-10.77424422358,
11.040306652498));
#204 = CARTESIAN_POINT('',(2.391662754536,-10.73898686411,
10.846382998433));
#205 = CARTESIAN_POINT('',(2.529009637688,-10.70651764133,
10.643900023181));
#206 = CARTESIAN_POINT('',(2.645138305672,-10.67768546127,
10.434702100122));
#207 = CARTESIAN_POINT('',(2.85530473354,-10.62361774287,9.962660574488)
);
#208 = CARTESIAN_POINT('',(2.940294167414,-10.60024937474,9.697330811818
));
#209 = CARTESIAN_POINT('',(2.996436520884,-10.58414357274,9.426929463329
));
#210 = CARTESIAN_POINT('',(3.024268131702,-10.575989631,9.153706681797)
);
#211 = CARTESIAN_POINT('',(3.024041649892,-10.57609184962,8.87967057245)
);
#212 = CARTESIAN_POINT('',(2.995725631373,-10.58439583235,8.606771307622
));
#213 = CARTESIAN_POINT('',(2.938989259398,-10.60048293223,8.337074927084
));
#214 = CARTESIAN_POINT('',(2.77460924759,-10.64463059066,7.831165270903)
);
#215 = CARTESIAN_POINT('',(2.67175104555,-10.67154326208,7.59427485792)
);
#216 = CARTESIAN_POINT('',(2.544056330611,-10.70365056993,7.363762211941
));
#217 = CARTESIAN_POINT('',(2.390660235376,-10.74006998818,7.141595617126
));
#218 = CARTESIAN_POINT('',(2.210506350817,-10.7795878533,6.930367243669)
);
#219 = CARTESIAN_POINT('',(2.002505624649,-10.82052918413,6.733473412639
));
#220 = CARTESIAN_POINT('',(1.76577358126,-10.86066377413,6.555368237331)
);
#221 = CARTESIAN_POINT('',(1.187250065257,-10.94029721233,6.221357529634
));
#222 = CARTESIAN_POINT('',(0.823824071924,-10.97986998106,6.068899191573
));
#223 = CARTESIAN_POINT('',(0.422202059946,-11.00848612598,5.968367559822
));
#224 = CARTESIAN_POINT('',(2.076561145259E-12,-11.01910836895,
5.933413112681));
#225 = CARTESIAN_POINT('',(-0.42220205995,-11.00848612598,5.968367559823
));
#226 = CARTESIAN_POINT('',(-0.823824071923,-10.97986998106,
6.068899191572));
#227 = CARTESIAN_POINT('',(-1.187250065258,-10.94029721233,
6.221357529634));
#228 = CARTESIAN_POINT('',(-1.890223596673,-10.84353329916,6.62721948723
));
#229 = CARTESIAN_POINT('',(-2.218095833563,-10.78212870183,
6.905826251681));
#230 = CARTESIAN_POINT('',(-2.484538511301,-10.72169165657,
7.219322097354));
#231 = CARTESIAN_POINT('',(-2.692957757048,-10.66854367312,
7.555805901262));
#232 = CARTESIAN_POINT('',(-2.846758847749,-10.62644198358,7.90703918817
));
#233 = CARTESIAN_POINT('',(-2.94864197823,-10.59756449647,8.267356983371
));
#234 = CARTESIAN_POINT('',(-3.,-10.58300524425,8.632829859132));
#235 = CARTESIAN_POINT('',(-3.,-10.58300524425,9.));
#236 = CYLINDRICAL_SURFACE('',#237,11.);
#237 = AXIS2_PLACEMENT_3D('',#238,#239,#240);
#238 = CARTESIAN_POINT('',(0.,0.,0.));
#239 = DIRECTION('',(-0.,-0.,-1.));
#240 = DIRECTION('',(1.,0.,0.));
#241 = ADVANCED_FACE('',(#242,#245),#264,.F.);
#242 = FACE_BOUND('',#243,.F.);
#243 = EDGE_LOOP('',(#244));
#244 = ORIENTED_EDGE('',*,*,#39,.T.);
#245 = FACE_BOUND('',#246,.F.);
#246 = EDGE_LOOP('',(#247,#257));
#247 = ORIENTED_EDGE('',*,*,#248,.F.);
#248 = EDGE_CURVE('',#249,#251,#253,.T.);
#249 = VERTEX_POINT('',#250);
#250 = CARTESIAN_POINT('',(-1.581929201956,-2.,0.));
#251 = VERTEX_POINT('',#252);
#252 = CARTESIAN_POINT('',(1.581929201956,-2.,0.));
#253 = LINE('',#254,#255);
#254 = CARTESIAN_POINT('',(-1.581929201956,-2.,0.));
#255 = VECTOR('',#256,1.);
#256 = DIRECTION('',(1.,0.,0.));
#257 = ORIENTED_EDGE('',*,*,#258,.T.);
#258 = EDGE_CURVE('',#249,#251,#259,.T.);
#259 = CIRCLE('',#260,2.55);
#260 = AXIS2_PLACEMENT_3D('',#261,#262,#263);
#261 = CARTESIAN_POINT('',(0.,0.,0.));
#262 = DIRECTION('',(0.,0.,-1.));
#263 = DIRECTION('',(1.,0.,0.));
#264 = PLANE('',#265);
#265 = AXIS2_PLACEMENT_3D('',#266,#267,#268);
#266 = CARTESIAN_POINT('',(-7.458764359306E-16,-4.490371596874E-16,0.));
#267 = DIRECTION('',(0.,0.,1.));
#268 = DIRECTION('',(1.,0.,0.));
#269 = ADVANCED_FACE('',(#270),#290,.T.);
#270 = FACE_BOUND('',#271,.T.);
#271 = EDGE_LOOP('',(#272,#281,#282,#283));
#272 = ORIENTED_EDGE('',*,*,#273,.F.);
#273 = EDGE_CURVE('',#24,#274,#276,.T.);
#274 = VERTEX_POINT('',#275);
#275 = CARTESIAN_POINT('',(10.,0.,40.));
#276 = CIRCLE('',#277,1.);
#277 = AXIS2_PLACEMENT_3D('',#278,#279,#280);
#278 = CARTESIAN_POINT('',(10.,0.,39.));
#279 = DIRECTION('',(0.,-1.,0.));
#280 = DIRECTION('',(1.,0.,0.));
#281 = ORIENTED_EDGE('',*,*,#31,.T.);
#282 = ORIENTED_EDGE('',*,*,#273,.T.);
#283 = ORIENTED_EDGE('',*,*,#284,.F.);
#284 = EDGE_CURVE('',#274,#274,#285,.T.);
#285 = CIRCLE('',#286,10.);
#286 = AXIS2_PLACEMENT_3D('',#287,#288,#289);
#287 = CARTESIAN_POINT('',(0.,0.,40.));
#288 = DIRECTION('',(0.,0.,1.));
#289 = DIRECTION('',(1.,0.,0.));
#290 = TOROIDAL_SURFACE('',#291,10.,1.);
#291 = AXIS2_PLACEMENT_3D('',#292,#293,#294);
#292 = CARTESIAN_POINT('',(0.,0.,39.));
#293 = DIRECTION('',(0.,0.,1.));
#294 = DIRECTION('',(1.,0.,0.));
#295 = ADVANCED_FACE('',(#296),#317,.F.);
#296 = FACE_BOUND('',#297,.T.);
#297 = EDGE_LOOP('',(#298,#299,#307,#314,#315,#316));
#298 = ORIENTED_EDGE('',*,*,#113,.F.);
#299 = ORIENTED_EDGE('',*,*,#300,.T.);
#300 = EDGE_CURVE('',#114,#301,#303,.T.);
#301 = VERTEX_POINT('',#302);
#302 = CARTESIAN_POINT('',(-3.,-9.,9.));
#303 = LINE('',#304,#305);
#304 = CARTESIAN_POINT('',(-3.,-11.,9.));
#305 = VECTOR('',#306,1.);
#306 = DIRECTION('',(0.,1.,-2.22044604925E-16));
#307 = ORIENTED_EDGE('',*,*,#308,.T.);
#308 = EDGE_CURVE('',#301,#301,#309,.T.);
#309 = CIRCLE('',#310,3.);
#310 = AXIS2_PLACEMENT_3D('',#311,#312,#313);
#311 = CARTESIAN_POINT('',(0.,-9.,9.));
#312 = DIRECTION('',(0.,1.,-2.22044604925E-16));
#313 = DIRECTION('',(-1.,0.,0.));
#314 = ORIENTED_EDGE('',*,*,#300,.F.);
#315 = ORIENTED_EDGE('',*,*,#176,.F.);
#316 = ORIENTED_EDGE('',*,*,#48,.F.);
#317 = CYLINDRICAL_SURFACE('',#318,3.);
#318 = AXIS2_PLACEMENT_3D('',#319,#320,#321);
#319 = CARTESIAN_POINT('',(0.,-11.,9.));
#320 = DIRECTION('',(0.,-1.,2.22044604925E-16));
#321 = DIRECTION('',(-1.,0.,0.));
#322 = ADVANCED_FACE('',(#323),#349,.T.);
#323 = FACE_BOUND('',#324,.T.);
#324 = EDGE_LOOP('',(#325,#326,#334,#343));
#325 = ORIENTED_EDGE('',*,*,#248,.F.);
#326 = ORIENTED_EDGE('',*,*,#327,.T.);
#327 = EDGE_CURVE('',#249,#328,#330,.T.);
#328 = VERTEX_POINT('',#329);
#329 = CARTESIAN_POINT('',(-1.581929201956,-2.,7.776276174948));
#330 = LINE('',#331,#332);
#331 = CARTESIAN_POINT('',(-1.581929201956,-2.,0.));
#332 = VECTOR('',#333,1.);
#333 = DIRECTION('',(0.,0.,1.));
#334 = ORIENTED_EDGE('',*,*,#335,.F.);
#335 = EDGE_CURVE('',#336,#328,#338,.T.);
#336 = VERTEX_POINT('',#337);
#337 = CARTESIAN_POINT('',(1.581929201956,-2.,7.776276174948));
#338 = CIRCLE('',#339,2.);
#339 = AXIS2_PLACEMENT_3D('',#340,#341,#342);
#340 = CARTESIAN_POINT('',(0.,-2.,9.));
#341 = DIRECTION('',(0.,1.,-2.22044604925E-16));
#342 = DIRECTION('',(-1.,0.,0.));
#343 = ORIENTED_EDGE('',*,*,#344,.F.);
#344 = EDGE_CURVE('',#251,#336,#345,.T.);
#345 = LINE('',#346,#347);
#346 = CARTESIAN_POINT('',(1.581929201956,-2.,0.));
#347 = VECTOR('',#348,1.);
#348 = DIRECTION('',(0.,0.,1.));
#349 = PLANE('',#350);
#350 = AXIS2_PLACEMENT_3D('',#351,#352,#353);
#351 = CARTESIAN_POINT('',(-1.581929201956,-2.,0.));
#352 = DIRECTION('',(0.,1.,0.));
#353 = DIRECTION('',(1.,0.,0.));
#354 = ADVANCED_FACE('',(#355),#399,.F.);
#355 = FACE_BOUND('',#356,.F.);
#356 = EDGE_LOOP('',(#357,#358,#366,#374,#383,#391,#397,#398));
#357 = ORIENTED_EDGE('',*,*,#327,.T.);
#358 = ORIENTED_EDGE('',*,*,#359,.T.);
#359 = EDGE_CURVE('',#328,#360,#362,.T.);
#360 = VERTEX_POINT('',#361);
#361 = CARTESIAN_POINT('',(-1.581929201956,-2.,10.223723825052));
#362 = LINE('',#363,#364);
#363 = CARTESIAN_POINT('',(-1.581929201956,-2.,0.));
#364 = VECTOR('',#365,1.);
#365 = DIRECTION('',(0.,0.,1.));
#366 = ORIENTED_EDGE('',*,*,#367,.T.);
#367 = EDGE_CURVE('',#360,#368,#370,.T.);
#368 = VERTEX_POINT('',#369);
#369 = CARTESIAN_POINT('',(-1.581929201956,-2.,18.));
#370 = LINE('',#371,#372);
#371 = CARTESIAN_POINT('',(-1.581929201956,-2.,0.));
#372 = VECTOR('',#373,1.);
#373 = DIRECTION('',(0.,0.,1.));
#374 = ORIENTED_EDGE('',*,*,#375,.T.);
#375 = EDGE_CURVE('',#368,#376,#378,.T.);
#376 = VERTEX_POINT('',#377);
#377 = CARTESIAN_POINT('',(1.581929201956,-2.,18.));
#378 = CIRCLE('',#379,2.55);
#379 = AXIS2_PLACEMENT_3D('',#380,#381,#382);
#380 = CARTESIAN_POINT('',(0.,0.,18.));
#381 = DIRECTION('',(0.,0.,-1.));
#382 = DIRECTION('',(1.,0.,0.));
#383 = ORIENTED_EDGE('',*,*,#384,.F.);
#384 = EDGE_CURVE('',#385,#376,#387,.T.);
#385 = VERTEX_POINT('',#386);
#386 = CARTESIAN_POINT('',(1.581929201956,-2.,10.223723825052));
#387 = LINE('',#388,#389);
#388 = CARTESIAN_POINT('',(1.581929201956,-2.,0.));
#389 = VECTOR('',#390,1.);
#390 = DIRECTION('',(0.,0.,1.));
#391 = ORIENTED_EDGE('',*,*,#392,.F.);
#392 = EDGE_CURVE('',#336,#385,#393,.T.);
#393 = LINE('',#394,#395);
#394 = CARTESIAN_POINT('',(1.581929201956,-2.,0.));
#395 = VECTOR('',#396,1.);
#396 = DIRECTION('',(0.,0.,1.));
#397 = ORIENTED_EDGE('',*,*,#344,.F.);
#398 = ORIENTED_EDGE('',*,*,#258,.F.);
#399 = CYLINDRICAL_SURFACE('',#400,2.55);
#400 = AXIS2_PLACEMENT_3D('',#401,#402,#403);
#401 = CARTESIAN_POINT('',(0.,0.,0.));
#402 = DIRECTION('',(0.,0.,-1.));
#403 = DIRECTION('',(1.,0.,0.));
#404 = ADVANCED_FACE('',(#405,#408),#419,.T.);
#405 = FACE_BOUND('',#406,.T.);
#406 = EDGE_LOOP('',(#407));
#407 = ORIENTED_EDGE('',*,*,#284,.T.);
#408 = FACE_BOUND('',#409,.T.);
#409 = EDGE_LOOP('',(#410));
#410 = ORIENTED_EDGE('',*,*,#411,.T.);
#411 = EDGE_CURVE('',#412,#412,#414,.T.);
#412 = VERTEX_POINT('',#413);
#413 = CARTESIAN_POINT('',(0.,-9.916515138991,40.));
#414 = CIRCLE('',#415,9.916515138991);
#415 = AXIS2_PLACEMENT_3D('',#416,#417,#418);
#416 = CARTESIAN_POINT('',(0.,0.,40.));
#417 = DIRECTION('',(-0.,-0.,-1.));
#418 = DIRECTION('',(0.,-1.,0.));
#419 = PLANE('',#420);
#420 = AXIS2_PLACEMENT_3D('',#421,#422,#423);
#421 = CARTESIAN_POINT('',(-7.458764359306E-16,-4.490371596874E-16,40.)
);
#422 = DIRECTION('',(0.,0.,1.));
#423 = DIRECTION('',(1.,0.,0.));
#424 = ADVANCED_FACE('',(#425,#428),#439,.F.);
#425 = FACE_BOUND('',#426,.F.);
#426 = EDGE_LOOP('',(#427));
#427 = ORIENTED_EDGE('',*,*,#308,.T.);
#428 = FACE_BOUND('',#429,.F.);
#429 = EDGE_LOOP('',(#430));
#430 = ORIENTED_EDGE('',*,*,#431,.F.);
#431 = EDGE_CURVE('',#432,#432,#434,.T.);
#432 = VERTEX_POINT('',#433);
#433 = CARTESIAN_POINT('',(-2.,-9.,9.));
#434 = CIRCLE('',#435,2.);
#435 = AXIS2_PLACEMENT_3D('',#436,#437,#438);
#436 = CARTESIAN_POINT('',(0.,-9.,9.));
#437 = DIRECTION('',(0.,1.,-2.22044604925E-16));
#438 = DIRECTION('',(-1.,0.,0.));
#439 = PLANE('',#440);
#440 = AXIS2_PLACEMENT_3D('',#441,#442,#443);
#441 = CARTESIAN_POINT('',(2.279066887566E-16,-9.,9.));
#442 = DIRECTION('',(0.,1.,0.));
#443 = DIRECTION('',(0.,0.,1.));
#444 = ADVANCED_FACE('',(#445),#486,.F.);
#445 = FACE_BOUND('',#446,.F.);
#446 = EDGE_LOOP('',(#447,#455,#462,#463,#470,#477,#484,#485));
#447 = ORIENTED_EDGE('',*,*,#448,.F.);
#448 = EDGE_CURVE('',#449,#432,#451,.T.);
#449 = VERTEX_POINT('',#450);
#450 = CARTESIAN_POINT('',(-2.,-2.,9.));
#451 = LINE('',#452,#453);
#452 = CARTESIAN_POINT('',(-2.,-2.,9.));
#453 = VECTOR('',#454,1.);
#454 = DIRECTION('',(0.,-1.,2.22044604925E-16));
#455 = ORIENTED_EDGE('',*,*,#456,.F.);
#456 = EDGE_CURVE('',#328,#449,#457,.T.);
#457 = CIRCLE('',#458,2.);
#458 = AXIS2_PLACEMENT_3D('',#459,#460,#461);
#459 = CARTESIAN_POINT('',(0.,-2.,9.));
#460 = DIRECTION('',(0.,1.,-2.22044604925E-16));
#461 = DIRECTION('',(-1.,0.,0.));
#462 = ORIENTED_EDGE('',*,*,#335,.F.);
#463 = ORIENTED_EDGE('',*,*,#464,.F.);
#464 = EDGE_CURVE('',#385,#336,#465,.T.);
#465 = CIRCLE('',#466,2.);
#466 = AXIS2_PLACEMENT_3D('',#467,#468,#469);
#467 = CARTESIAN_POINT('',(0.,-2.,9.));
#468 = DIRECTION('',(0.,1.,-2.22044604925E-16));
#469 = DIRECTION('',(-1.,0.,0.));
#470 = ORIENTED_EDGE('',*,*,#471,.F.);
#471 = EDGE_CURVE('',#360,#385,#472,.T.);
#472 = CIRCLE('',#473,2.);
#473 = AXIS2_PLACEMENT_3D('',#474,#475,#476);
#474 = CARTESIAN_POINT('',(0.,-2.,9.));
#475 = DIRECTION('',(0.,1.,-2.22044604925E-16));
#476 = DIRECTION('',(-1.,0.,0.));
#477 = ORIENTED_EDGE('',*,*,#478,.F.);
#478 = EDGE_CURVE('',#449,#360,#479,.T.);
#479 = CIRCLE('',#480,2.);
#480 = AXIS2_PLACEMENT_3D('',#481,#482,#483);
#481 = CARTESIAN_POINT('',(0.,-2.,9.));
#482 = DIRECTION('',(0.,1.,-2.22044604925E-16));
#483 = DIRECTION('',(-1.,0.,0.));
#484 = ORIENTED_EDGE('',*,*,#448,.T.);
#485 = ORIENTED_EDGE('',*,*,#431,.T.);
#486 = CYLINDRICAL_SURFACE('',#487,2.);
#487 = AXIS2_PLACEMENT_3D('',#488,#489,#490);
#488 = CARTESIAN_POINT('',(0.,-2.,9.));
#489 = DIRECTION('',(0.,1.,-2.22044604925E-16));
#490 = DIRECTION('',(-1.,0.,0.));
#491 = ADVANCED_FACE('',(#492),#497,.F.);
#492 = FACE_BOUND('',#493,.F.);
#493 = EDGE_LOOP('',(#494,#495,#496));
#494 = ORIENTED_EDGE('',*,*,#456,.T.);
#495 = ORIENTED_EDGE('',*,*,#478,.T.);
#496 = ORIENTED_EDGE('',*,*,#359,.F.);
#497 = PLANE('',#498);
#498 = AXIS2_PLACEMENT_3D('',#499,#500,#501);
#499 = CARTESIAN_POINT('',(4.273250414186E-17,-2.,9.));
#500 = DIRECTION('',(0.,1.,-2.563950248511E-16));
#501 = DIRECTION('',(0.,2.563950248511E-16,1.));
#502 = ADVANCED_FACE('',(#503),#514,.T.);
#503 = FACE_BOUND('',#504,.T.);
#504 = EDGE_LOOP('',(#505,#506,#507,#513));
#505 = ORIENTED_EDGE('',*,*,#471,.F.);
#506 = ORIENTED_EDGE('',*,*,#367,.T.);
#507 = ORIENTED_EDGE('',*,*,#508,.T.);
#508 = EDGE_CURVE('',#368,#376,#509,.T.);
#509 = LINE('',#510,#511);
#510 = CARTESIAN_POINT('',(-1.581929201956,-2.,18.));
#511 = VECTOR('',#512,1.);
#512 = DIRECTION('',(1.,0.,0.));
#513 = ORIENTED_EDGE('',*,*,#384,.F.);
#514 = PLANE('',#515);
#515 = AXIS2_PLACEMENT_3D('',#516,#517,#518);
#516 = CARTESIAN_POINT('',(-1.581929201956,-2.,0.));
#517 = DIRECTION('',(0.,1.,0.));
#518 = DIRECTION('',(1.,0.,0.));
#519 = ADVANCED_FACE('',(#520),#524,.F.);
#520 = FACE_BOUND('',#521,.F.);
#521 = EDGE_LOOP('',(#522,#523));
#522 = ORIENTED_EDGE('',*,*,#392,.T.);
#523 = ORIENTED_EDGE('',*,*,#464,.T.);
#524 = PLANE('',#525);
#525 = AXIS2_PLACEMENT_3D('',#526,#527,#528);
#526 = CARTESIAN_POINT('',(4.273250414186E-17,-2.,9.));
#527 = DIRECTION('',(0.,1.,-2.563950248511E-16));
#528 = DIRECTION('',(0.,2.563950248511E-16,1.));
#529 = ADVANCED_FACE('',(#530),#534,.F.);
#530 = FACE_BOUND('',#531,.T.);
#531 = EDGE_LOOP('',(#532,#533));
#532 = ORIENTED_EDGE('',*,*,#375,.T.);
#533 = ORIENTED_EDGE('',*,*,#508,.F.);
#534 = PLANE('',#535);
#535 = AXIS2_PLACEMENT_3D('',#536,#537,#538);
#536 = CARTESIAN_POINT('',(2.776832757453E-16,-5.892051345584E-02,18.));
#537 = DIRECTION('',(0.,0.,1.));
#538 = DIRECTION('',(1.,0.,0.));
#539 = ADVANCED_FACE('',(#540),#560,.F.);
#540 = FACE_BOUND('',#541,.F.);
#541 = EDGE_LOOP('',(#542,#551,#558,#559));
#542 = ORIENTED_EDGE('',*,*,#543,.T.);
#543 = EDGE_CURVE('',#412,#544,#546,.T.);
#544 = VERTEX_POINT('',#545);
#545 = CARTESIAN_POINT('',(0.,-8.,39.6));
#546 = CIRCLE('',#547,1.);
#547 = AXIS2_PLACEMENT_3D('',#548,#549,#550);
#548 = CARTESIAN_POINT('',(0.,-9.,39.6));
#549 = DIRECTION('',(1.,0.,0.));
#550 = DIRECTION('',(0.,1.,0.));
#551 = ORIENTED_EDGE('',*,*,#552,.F.);
#552 = EDGE_CURVE('',#544,#544,#553,.T.);
#553 = CIRCLE('',#554,8.);
#554 = AXIS2_PLACEMENT_3D('',#555,#556,#557);
#555 = CARTESIAN_POINT('',(0.,0.,39.6));
#556 = DIRECTION('',(-0.,-0.,-1.));
#557 = DIRECTION('',(0.,-1.,0.));
#558 = ORIENTED_EDGE('',*,*,#543,.F.);
#559 = ORIENTED_EDGE('',*,*,#411,.T.);
#560 = TOROIDAL_SURFACE('',#561,9.,1.);
#561 = AXIS2_PLACEMENT_3D('',#562,#563,#564);
#562 = CARTESIAN_POINT('',(0.,0.,39.6));
#563 = DIRECTION('',(-0.,-0.,-1.));
#564 = DIRECTION('',(0.,-1.,0.));
#565 = ADVANCED_FACE('',(#566),#586,.F.);
#566 = FACE_BOUND('',#567,.F.);
#567 = EDGE_LOOP('',(#568,#577,#578,#579));
#568 = ORIENTED_EDGE('',*,*,#569,.F.);
#569 = EDGE_CURVE('',#544,#570,#572,.T.);
#570 = VERTEX_POINT('',#571);
#571 = CARTESIAN_POINT('',(0.,-1.502502139544E-03,33.6));
#572 = ELLIPSE('',#573,8.,6.000000105821);
#573 = AXIS2_PLACEMENT_3D('',#574,#575,#576);
#574 = CARTESIAN_POINT('',(0.,4.561730651331E-33,39.6));
#575 = DIRECTION('',(1.,0.,0.));
#576 = DIRECTION('',(0.,-1.,0.));
#577 = ORIENTED_EDGE('',*,*,#552,.T.);
#578 = ORIENTED_EDGE('',*,*,#569,.T.);
#579 = ORIENTED_EDGE('',*,*,#580,.F.);
#580 = EDGE_CURVE('',#570,#570,#581,.T.);
#581 = CIRCLE('',#582,1.502502139544E-03);
#582 = AXIS2_PLACEMENT_3D('',#583,#584,#585);
#583 = CARTESIAN_POINT('',(0.,0.,33.6));
#584 = DIRECTION('',(-0.,-0.,-1.));
#585 = DIRECTION('',(0.,-1.,0.));
#586 = SURFACE_OF_REVOLUTION('',#587,#592);
#587 = ELLIPSE('',#588,8.,6.000000105821);
#588 = AXIS2_PLACEMENT_3D('',#589,#590,#591);
#589 = CARTESIAN_POINT('',(0.,4.561730651331E-33,39.6));
#590 = DIRECTION('',(1.,0.,0.));
#591 = DIRECTION('',(0.,-1.,0.));
#592 = AXIS1_PLACEMENT('',#593,#594);
#593 = CARTESIAN_POINT('',(0.,0.,0.));
#594 = DIRECTION('',(-0.,-0.,-1.));
#595 = ADVANCED_FACE('',(#596),#615,.T.);
#596 = FACE_BOUND('',#597,.T.);
#597 = EDGE_LOOP('',(#598,#607,#613,#614));
#598 = ORIENTED_EDGE('',*,*,#599,.T.);
#599 = EDGE_CURVE('',#600,#600,#602,.T.);
#600 = VERTEX_POINT('',#601);
#601 = CARTESIAN_POINT('',(0.,-1.502502139542E-03,40.));
#602 = CIRCLE('',#603,1.502502139542E-03);
#603 = AXIS2_PLACEMENT_3D('',#604,#605,#606);
#604 = CARTESIAN_POINT('',(0.,0.,40.));
#605 = DIRECTION('',(-0.,-0.,-1.));
#606 = DIRECTION('',(0.,-1.,0.));
#607 = ORIENTED_EDGE('',*,*,#608,.T.);
#608 = EDGE_CURVE('',#600,#570,#609,.T.);
#609 = LINE('',#610,#611);
#610 = CARTESIAN_POINT('',(0.,-1.502502139542E-03,45.6));
#611 = VECTOR('',#612,1.);
#612 = DIRECTION('',(0.,0.,-1.));
#613 = ORIENTED_EDGE('',*,*,#580,.F.);
#614 = ORIENTED_EDGE('',*,*,#608,.F.);
#615 = CYLINDRICAL_SURFACE('',#616,1.502502139542E-03);
#616 = AXIS2_PLACEMENT_3D('',#617,#618,#619);
#617 = CARTESIAN_POINT('',(0.,0.,45.6));
#618 = DIRECTION('',(-0.,-0.,-1.));
#619 = DIRECTION('',(0.,-1.,0.));
#620 = ADVANCED_FACE('',(#621),#624,.T.);
#621 = FACE_BOUND('',#622,.T.);
#622 = EDGE_LOOP('',(#623));
#623 = ORIENTED_EDGE('',*,*,#599,.F.);
#624 = PLANE('',#625);
#625 = AXIS2_PLACEMENT_3D('',#626,#627,#628);
#626 = CARTESIAN_POINT('',(-7.458764359306E-16,-4.490371596874E-16,40.)
);
#627 = DIRECTION('',(0.,0.,1.));
#628 = DIRECTION('',(1.,0.,0.));
#629 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3)
GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#633)) GLOBAL_UNIT_ASSIGNED_CONTEXT
((#630,#631,#632)) REPRESENTATION_CONTEXT('Context #1',
'3D Context with UNIT and UNCERTAINTY') );
#630 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) );
#631 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) );
#632 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() );
#633 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#630,
'distance_accuracy_value','confusion accuracy');
#634 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#7));
#635 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#636)
,#629);
#636 = STYLED_ITEM('color',(#637),#15);
#637 = PRESENTATION_STYLE_ASSIGNMENT((#638,#644));
#638 = SURFACE_STYLE_USAGE(.BOTH.,#639);
#639 = SURFACE_SIDE_STYLE('',(#640));
#640 = SURFACE_STYLE_FILL_AREA(#641);
#641 = FILL_AREA_STYLE('',(#642));
#642 = FILL_AREA_STYLE_COLOUR('',#643);
#643 = COLOUR_RGB('',0.668813114255,0.490523995954,0.661122442898);
#644 = CURVE_STYLE('',#645,POSITIVE_LENGTH_MEASURE(0.1),#646);
#645 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');
#646 = COLOUR_RGB('',9.803921802644E-02,9.803921802644E-02,
9.803921802644E-02);
ENDSEC;
END-ISO-10303-21;

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,608 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('FreeCAD Model'),'2;1');
FILE_NAME('Open CASCADE Shape Model','2026-03-20T00:36:18',('Author'),(
''),'Open CASCADE STEP processor 7.8','FreeCAD','Unknown');
FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }'));
ENDSEC;
DATA;
#1 = APPLICATION_PROTOCOL_DEFINITION('international standard',
'automotive_design',2000,#2);
#2 = APPLICATION_CONTEXT(
'core data for automotive mechanical design processes');
#3 = SHAPE_DEFINITION_REPRESENTATION(#4,#10);
#4 = PRODUCT_DEFINITION_SHAPE('','',#5);
#5 = PRODUCT_DEFINITION('design','',#6,#9);
#6 = PRODUCT_DEFINITION_FORMATION('','',#7);
#7 = PRODUCT('EiAndockerRechtsORing16x2','EiAndockerRechtsORing16x2','',
(#8));
#8 = PRODUCT_CONTEXT('',#2,'mechanical');
#9 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design');
#10 = ADVANCED_BREP_SHAPE_REPRESENTATION('',(#11,#15),#548);
#11 = AXIS2_PLACEMENT_3D('',#12,#13,#14);
#12 = CARTESIAN_POINT('',(0.,0.,0.));
#13 = DIRECTION('',(0.,0.,1.));
#14 = DIRECTION('',(1.,0.,-0.));
#15 = MANIFOLD_SOLID_BREP('',#16);
#16 = CLOSED_SHELL('',(#17,#50,#76,#102,#122,#142,#168,#193,#229,#254,
#437,#457,#488,#513,#539));
#17 = ADVANCED_FACE('',(#18),#45,.T.);
#18 = FACE_BOUND('',#19,.F.);
#19 = EDGE_LOOP('',(#20,#30,#37,#38));
#20 = ORIENTED_EDGE('',*,*,#21,.T.);
#21 = EDGE_CURVE('',#22,#24,#26,.T.);
#22 = VERTEX_POINT('',#23);
#23 = CARTESIAN_POINT('',(12.,0.,1.9));
#24 = VERTEX_POINT('',#25);
#25 = CARTESIAN_POINT('',(12.,0.,7.));
#26 = LINE('',#27,#28);
#27 = CARTESIAN_POINT('',(12.,0.,0.));
#28 = VECTOR('',#29,1.);
#29 = DIRECTION('',(0.,0.,1.));
#30 = ORIENTED_EDGE('',*,*,#31,.T.);
#31 = EDGE_CURVE('',#24,#24,#32,.T.);
#32 = CIRCLE('',#33,12.);
#33 = AXIS2_PLACEMENT_3D('',#34,#35,#36);
#34 = CARTESIAN_POINT('',(0.,0.,7.));
#35 = DIRECTION('',(0.,0.,1.));
#36 = DIRECTION('',(1.,0.,0.));
#37 = ORIENTED_EDGE('',*,*,#21,.F.);
#38 = ORIENTED_EDGE('',*,*,#39,.F.);
#39 = EDGE_CURVE('',#22,#22,#40,.T.);
#40 = CIRCLE('',#41,12.);
#41 = AXIS2_PLACEMENT_3D('',#42,#43,#44);
#42 = CARTESIAN_POINT('',(0.,0.,1.9));
#43 = DIRECTION('',(0.,0.,1.));
#44 = DIRECTION('',(1.,0.,-0.));
#45 = CYLINDRICAL_SURFACE('',#46,12.);
#46 = AXIS2_PLACEMENT_3D('',#47,#48,#49);
#47 = CARTESIAN_POINT('',(0.,0.,0.));
#48 = DIRECTION('',(-0.,-0.,-1.));
#49 = DIRECTION('',(1.,0.,0.));
#50 = ADVANCED_FACE('',(#51),#71,.T.);
#51 = FACE_BOUND('',#52,.F.);
#52 = EDGE_LOOP('',(#53,#62,#63,#64));
#53 = ORIENTED_EDGE('',*,*,#54,.F.);
#54 = EDGE_CURVE('',#22,#55,#57,.T.);
#55 = VERTEX_POINT('',#56);
#56 = CARTESIAN_POINT('',(10.1,0.,0.));
#57 = CIRCLE('',#58,1.9);
#58 = AXIS2_PLACEMENT_3D('',#59,#60,#61);
#59 = CARTESIAN_POINT('',(10.1,0.,1.9));
#60 = DIRECTION('',(-0.,1.,0.));
#61 = DIRECTION('',(1.,0.,0.));
#62 = ORIENTED_EDGE('',*,*,#39,.F.);
#63 = ORIENTED_EDGE('',*,*,#54,.T.);
#64 = ORIENTED_EDGE('',*,*,#65,.T.);
#65 = EDGE_CURVE('',#55,#55,#66,.T.);
#66 = CIRCLE('',#67,10.1);
#67 = AXIS2_PLACEMENT_3D('',#68,#69,#70);
#68 = CARTESIAN_POINT('',(0.,0.,0.));
#69 = DIRECTION('',(0.,0.,1.));
#70 = DIRECTION('',(1.,0.,-0.));
#71 = TOROIDAL_SURFACE('',#72,10.1,1.9);
#72 = AXIS2_PLACEMENT_3D('',#73,#74,#75);
#73 = CARTESIAN_POINT('',(0.,0.,1.9));
#74 = DIRECTION('',(-0.,-0.,-1.));
#75 = DIRECTION('',(1.,0.,0.));
#76 = ADVANCED_FACE('',(#77),#97,.T.);
#77 = FACE_BOUND('',#78,.F.);
#78 = EDGE_LOOP('',(#79,#88,#95,#96));
#79 = ORIENTED_EDGE('',*,*,#80,.F.);
#80 = EDGE_CURVE('',#81,#24,#83,.T.);
#81 = VERTEX_POINT('',#82);
#82 = CARTESIAN_POINT('',(10.,0.,9.));
#83 = CIRCLE('',#84,2.);
#84 = AXIS2_PLACEMENT_3D('',#85,#86,#87);
#85 = CARTESIAN_POINT('',(10.,0.,7.));
#86 = DIRECTION('',(-0.,1.,0.));
#87 = DIRECTION('',(1.,0.,0.));
#88 = ORIENTED_EDGE('',*,*,#89,.F.);
#89 = EDGE_CURVE('',#81,#81,#90,.T.);
#90 = CIRCLE('',#91,10.);
#91 = AXIS2_PLACEMENT_3D('',#92,#93,#94);
#92 = CARTESIAN_POINT('',(0.,0.,9.));
#93 = DIRECTION('',(0.,0.,1.));
#94 = DIRECTION('',(1.,0.,0.));
#95 = ORIENTED_EDGE('',*,*,#80,.T.);
#96 = ORIENTED_EDGE('',*,*,#31,.T.);
#97 = TOROIDAL_SURFACE('',#98,10.,2.);
#98 = AXIS2_PLACEMENT_3D('',#99,#100,#101);
#99 = CARTESIAN_POINT('',(0.,0.,7.));
#100 = DIRECTION('',(-0.,-0.,-1.));
#101 = DIRECTION('',(1.,0.,0.));
#102 = ADVANCED_FACE('',(#103,#106),#117,.F.);
#103 = FACE_BOUND('',#104,.F.);
#104 = EDGE_LOOP('',(#105));
#105 = ORIENTED_EDGE('',*,*,#65,.T.);
#106 = FACE_BOUND('',#107,.F.);
#107 = EDGE_LOOP('',(#108));
#108 = ORIENTED_EDGE('',*,*,#109,.F.);
#109 = EDGE_CURVE('',#110,#110,#112,.T.);
#110 = VERTEX_POINT('',#111);
#111 = CARTESIAN_POINT('',(0.,9.916515138991,0.));
#112 = CIRCLE('',#113,9.916515138991);
#113 = AXIS2_PLACEMENT_3D('',#114,#115,#116);
#114 = CARTESIAN_POINT('',(0.,0.,0.));
#115 = DIRECTION('',(0.,-0.,1.));
#116 = DIRECTION('',(0.,1.,0.));
#117 = PLANE('',#118);
#118 = AXIS2_PLACEMENT_3D('',#119,#120,#121);
#119 = CARTESIAN_POINT('',(-9.1E-16,-3.E-17,0.));
#120 = DIRECTION('',(0.,0.,1.));
#121 = DIRECTION('',(1.,0.,0.));
#122 = ADVANCED_FACE('',(#123,#126),#137,.T.);
#123 = FACE_BOUND('',#124,.T.);
#124 = EDGE_LOOP('',(#125));
#125 = ORIENTED_EDGE('',*,*,#89,.T.);
#126 = FACE_BOUND('',#127,.T.);
#127 = EDGE_LOOP('',(#128));
#128 = ORIENTED_EDGE('',*,*,#129,.F.);
#129 = EDGE_CURVE('',#130,#130,#132,.T.);
#130 = VERTEX_POINT('',#131);
#131 = CARTESIAN_POINT('',(7.5,0.,9.));
#132 = CIRCLE('',#133,7.5);
#133 = AXIS2_PLACEMENT_3D('',#134,#135,#136);
#134 = CARTESIAN_POINT('',(0.,0.,9.));
#135 = DIRECTION('',(0.,0.,1.));
#136 = DIRECTION('',(1.,0.,0.));
#137 = PLANE('',#138);
#138 = AXIS2_PLACEMENT_3D('',#139,#140,#141);
#139 = CARTESIAN_POINT('',(-9.1E-16,-3.E-17,9.));
#140 = DIRECTION('',(0.,0.,1.));
#141 = DIRECTION('',(1.,0.,0.));
#142 = ADVANCED_FACE('',(#143),#163,.F.);
#143 = FACE_BOUND('',#144,.F.);
#144 = EDGE_LOOP('',(#145,#154,#161,#162));
#145 = ORIENTED_EDGE('',*,*,#146,.T.);
#146 = EDGE_CURVE('',#110,#147,#149,.T.);
#147 = VERTEX_POINT('',#148);
#148 = CARTESIAN_POINT('',(0.,10.,0.4));
#149 = CIRCLE('',#150,1.);
#150 = AXIS2_PLACEMENT_3D('',#151,#152,#153);
#151 = CARTESIAN_POINT('',(0.,9.,0.4));
#152 = DIRECTION('',(1.,0.,0.));
#153 = DIRECTION('',(0.,1.,0.));
#154 = ORIENTED_EDGE('',*,*,#155,.F.);
#155 = EDGE_CURVE('',#147,#147,#156,.T.);
#156 = CIRCLE('',#157,10.);
#157 = AXIS2_PLACEMENT_3D('',#158,#159,#160);
#158 = CARTESIAN_POINT('',(0.,0.,0.4));
#159 = DIRECTION('',(0.,-0.,1.));
#160 = DIRECTION('',(0.,1.,0.));
#161 = ORIENTED_EDGE('',*,*,#146,.F.);
#162 = ORIENTED_EDGE('',*,*,#109,.T.);
#163 = TOROIDAL_SURFACE('',#164,9.,1.);
#164 = AXIS2_PLACEMENT_3D('',#165,#166,#167);
#165 = CARTESIAN_POINT('',(0.,0.,0.4));
#166 = DIRECTION('',(0.,0.,1.));
#167 = DIRECTION('',(0.,1.,0.));
#168 = ADVANCED_FACE('',(#169),#188,.T.);
#169 = FACE_BOUND('',#170,.F.);
#170 = EDGE_LOOP('',(#171,#179,#186,#187));
#171 = ORIENTED_EDGE('',*,*,#172,.T.);
#172 = EDGE_CURVE('',#130,#173,#175,.T.);
#173 = VERTEX_POINT('',#174);
#174 = CARTESIAN_POINT('',(7.5,0.,9.1));
#175 = LINE('',#176,#177);
#176 = CARTESIAN_POINT('',(7.5,0.,9.));
#177 = VECTOR('',#178,1.);
#178 = DIRECTION('',(0.,0.,1.));
#179 = ORIENTED_EDGE('',*,*,#180,.T.);
#180 = EDGE_CURVE('',#173,#173,#181,.T.);
#181 = CIRCLE('',#182,7.5);
#182 = AXIS2_PLACEMENT_3D('',#183,#184,#185);
#183 = CARTESIAN_POINT('',(0.,0.,9.1));
#184 = DIRECTION('',(0.,0.,1.));
#185 = DIRECTION('',(1.,0.,0.));
#186 = ORIENTED_EDGE('',*,*,#172,.F.);
#187 = ORIENTED_EDGE('',*,*,#129,.F.);
#188 = CYLINDRICAL_SURFACE('',#189,7.5);
#189 = AXIS2_PLACEMENT_3D('',#190,#191,#192);
#190 = CARTESIAN_POINT('',(0.,0.,9.));
#191 = DIRECTION('',(-0.,-0.,-1.));
#192 = DIRECTION('',(1.,0.,0.));
#193 = ADVANCED_FACE('',(#194),#224,.F.);
#194 = FACE_BOUND('',#195,.F.);
#195 = EDGE_LOOP('',(#196,#205,#206,#207,#216,#223));
#196 = ORIENTED_EDGE('',*,*,#197,.F.);
#197 = EDGE_CURVE('',#147,#198,#200,.T.);
#198 = VERTEX_POINT('',#199);
#199 = CARTESIAN_POINT('',(0.,8.,0.400000001205));
#200 = CIRCLE('',#201,1.);
#201 = AXIS2_PLACEMENT_3D('',#202,#203,#204);
#202 = CARTESIAN_POINT('',(0.,9.,0.4));
#203 = DIRECTION('',(1.,0.,0.));
#204 = DIRECTION('',(0.,1.,0.));
#205 = ORIENTED_EDGE('',*,*,#155,.T.);
#206 = ORIENTED_EDGE('',*,*,#197,.T.);
#207 = ORIENTED_EDGE('',*,*,#208,.T.);
#208 = EDGE_CURVE('',#198,#209,#211,.T.);
#209 = VERTEX_POINT('',#210);
#210 = CARTESIAN_POINT('',(0.,8.083484861009,0.));
#211 = CIRCLE('',#212,1.);
#212 = AXIS2_PLACEMENT_3D('',#213,#214,#215);
#213 = CARTESIAN_POINT('',(0.,9.,0.4));
#214 = DIRECTION('',(1.,0.,0.));
#215 = DIRECTION('',(0.,1.,0.));
#216 = ORIENTED_EDGE('',*,*,#217,.F.);
#217 = EDGE_CURVE('',#209,#209,#218,.T.);
#218 = CIRCLE('',#219,8.083484861009);
#219 = AXIS2_PLACEMENT_3D('',#220,#221,#222);
#220 = CARTESIAN_POINT('',(0.,0.,0.));
#221 = DIRECTION('',(0.,-0.,1.));
#222 = DIRECTION('',(0.,1.,0.));
#223 = ORIENTED_EDGE('',*,*,#208,.F.);
#224 = TOROIDAL_SURFACE('',#225,9.,1.);
#225 = AXIS2_PLACEMENT_3D('',#226,#227,#228);
#226 = CARTESIAN_POINT('',(0.,0.,0.4));
#227 = DIRECTION('',(0.,0.,1.));
#228 = DIRECTION('',(0.,1.,0.));
#229 = ADVANCED_FACE('',(#230),#249,.T.);
#230 = FACE_BOUND('',#231,.F.);
#231 = EDGE_LOOP('',(#232,#240,#247,#248));
#232 = ORIENTED_EDGE('',*,*,#233,.F.);
#233 = EDGE_CURVE('',#234,#173,#236,.T.);
#234 = VERTEX_POINT('',#235);
#235 = CARTESIAN_POINT('',(6.,0.,10.6));
#236 = LINE('',#237,#238);
#237 = CARTESIAN_POINT('',(7.5,0.,9.1));
#238 = VECTOR('',#239,1.);
#239 = DIRECTION('',(0.707106781187,0.,-0.707106781187));
#240 = ORIENTED_EDGE('',*,*,#241,.T.);
#241 = EDGE_CURVE('',#234,#234,#242,.T.);
#242 = CIRCLE('',#243,6.);
#243 = AXIS2_PLACEMENT_3D('',#244,#245,#246);
#244 = CARTESIAN_POINT('',(0.,0.,10.6));
#245 = DIRECTION('',(0.,0.,1.));
#246 = DIRECTION('',(1.,0.,0.));
#247 = ORIENTED_EDGE('',*,*,#233,.T.);
#248 = ORIENTED_EDGE('',*,*,#180,.F.);
#249 = CONICAL_SURFACE('',#250,7.5,0.785398163397);
#250 = AXIS2_PLACEMENT_3D('',#251,#252,#253);
#251 = CARTESIAN_POINT('',(0.,0.,9.1));
#252 = DIRECTION('',(-0.,-0.,-1.));
#253 = DIRECTION('',(1.,0.,0.));
#254 = ADVANCED_FACE('',(#255,#258),#432,.F.);
#255 = FACE_BOUND('',#256,.F.);
#256 = EDGE_LOOP('',(#257));
#257 = ORIENTED_EDGE('',*,*,#217,.T.);
#258 = FACE_BOUND('',#259,.F.);
#259 = EDGE_LOOP('',(#260));
#260 = ORIENTED_EDGE('',*,*,#261,.T.);
#261 = EDGE_CURVE('',#262,#262,#264,.T.);
#262 = VERTEX_POINT('',#263);
#263 = CARTESIAN_POINT('',(0.,7.959899496853,-1.E-15));
#264 = B_SPLINE_CURVE_WITH_KNOTS('',6,(#265,#266,#267,#268,#269,#270,
#271,#272,#273,#274,#275,#276,#277,#278,#279,#280,#281,#282,#283,
#284,#285,#286,#287,#288,#289,#290,#291,#292,#293,#294,#295,#296,
#297,#298,#299,#300,#301,#302,#303,#304,#305,#306,#307,#308,#309,
#310,#311,#312,#313,#314,#315,#316,#317,#318,#319,#320,#321,#322,
#323,#324,#325,#326,#327,#328,#329,#330,#331,#332,#333,#334,#335,
#336,#337,#338,#339,#340,#341,#342,#343,#344,#345,#346,#347,#348,
#349,#350,#351,#352,#353,#354,#355,#356,#357,#358,#359,#360,#361,
#362,#363,#364,#365,#366,#367,#368,#369,#370,#371,#372,#373,#374,
#375,#376,#377,#378,#379,#380,#381,#382,#383,#384,#385,#386,#387,
#388,#389,#390,#391,#392,#393,#394,#395,#396,#397,#398,#399,#400,
#401,#402,#403,#404,#405,#406,#407,#408,#409,#410,#411,#412,#413,
#414,#415,#416,#417,#418,#419,#420,#421,#422,#423,#424,#425,#426,
#427,#428,#429,#430,#431),.UNSPECIFIED.,.T.,.F.,(7,5,5,5,5,5,5,5,5,5
,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,7),(0.,
1.900049665728E-02,4.200109787471E-02,6.400167295201E-02,
9.300243101292E-02,0.108002823111,0.132003450468,0.161004208529,
0.185004835887,0.214005593948,0.237006195165,0.266006953226,
0.295007711287,0.319008338645,0.347009070565,0.374009776344,
0.403010534405,0.420010978782,0.442011553859,0.462012076656,
0.486012704014,0.516013488216,0.545014246277,0.573014978197,
0.602015736258,0.627016389756,0.648016938693,0.66801746149,
0.691018062708,0.803003200132,0.8520044812,0.876005108557,
0.904005840477,1.),.UNSPECIFIED.);
#265 = CARTESIAN_POINT('',(1.75E-15,7.959899496853,0.));
#266 = CARTESIAN_POINT('',(0.158376135629,7.959899497669,0.));
#267 = CARTESIAN_POINT('',(0.316752351616,7.956118089688,0.));
#268 = CARTESIAN_POINT('',(0.475015617318,7.948555279547,0.));
#269 = CARTESIAN_POINT('',(0.633053169985,7.937215556685,0.));
#270 = CARTESIAN_POINT('',(0.790752514768,7.922107893339,0.));
#271 = CARTESIAN_POINT('',(1.138355338001,7.880412624282,0.));
#272 = CARTESIAN_POINT('',(1.328049519396,7.852077734661,0.));
#273 = CARTESIAN_POINT('',(1.516884753828,7.81826499274,0.));
#274 = CARTESIAN_POINT('',(1.704663662893,7.779007782072,0.));
#275 = CARTESIAN_POINT('',(1.891190704861,7.734348952714,0.));
#276 = CARTESIAN_POINT('',(2.253306633934,7.63650695822,0.));
#277 = CARTESIAN_POINT('',(2.429018836525,7.583778745675,0.));
#278 = CARTESIAN_POINT('',(2.603239302083,7.526201992934,0.));
#279 = CARTESIAN_POINT('',(2.775801188964,7.463830138133,0.));
#280 = CARTESIAN_POINT('',(2.946540294248,7.396724248196,0.));
#281 = CARTESIAN_POINT('',(3.337744400845,7.23034554941,0.));
#282 = CARTESIAN_POINT('',(3.556746610884,7.127631172373,0.));
#283 = CARTESIAN_POINT('',(3.771931109825,7.016967583615,0.));
#284 = CARTESIAN_POINT('',(3.982938862859,6.898533945567,0.));
#285 = CARTESIAN_POINT('',(4.189422374394,6.772530887207,0.));
#286 = CARTESIAN_POINT('',(4.495333685936,6.570206123623,0.));
#287 = CARTESIAN_POINT('',(4.598321567445,6.4992659464,0.));
#288 = CARTESIAN_POINT('',(4.699962971259,6.426390636936,0.));
#289 = CARTESIAN_POINT('',(4.800212565896,6.351612267911,0.));
#290 = CARTESIAN_POINT('',(4.899026049716,6.274964320139,0.));
#291 = CARTESIAN_POINT('',(5.152094667792,6.07090950342,0.));
#292 = CARTESIAN_POINT('',(5.304042208553,5.940640308207,0.));
#293 = CARTESIAN_POINT('',(5.45202528765,5.805817242063,0.));
#294 = CARTESIAN_POINT('',(5.595874245688,5.666591784137,0.));
#295 = CARTESIAN_POINT('',(5.735427249427,5.523123747585,0.));
#296 = CARTESIAN_POINT('',(6.033779745648,5.197300879326,0.));
#297 = CARTESIAN_POINT('',(6.190532634937,5.013070743487,0.));
#298 = CARTESIAN_POINT('',(6.340517043336,4.823187948851,0.));
#299 = CARTESIAN_POINT('',(6.483480451658,4.627964327476,0.));
#300 = CARTESIAN_POINT('',(6.619189737838,4.42772646668,0.));
#301 = CARTESIAN_POINT('',(6.853562076147,4.05323432989,0.));
#302 = CARTESIAN_POINT('',(6.954578645737,3.880451891451,0.));
#303 = CARTESIAN_POINT('',(7.050359943099,3.704661692808,0.));
#304 = CARTESIAN_POINT('',(7.140795146125,3.526062350936,0.));
#305 = CARTESIAN_POINT('',(7.225783553202,3.344857800697,0.));
#306 = CARTESIAN_POINT('',(7.401237885347,2.939406779224,0.));
#307 = CARTESIAN_POINT('',(7.489156626833,2.714057037385,0.));
#308 = CARTESIAN_POINT('',(7.56883094046,2.485577711821,0.));
#309 = CARTESIAN_POINT('',(7.640124113834,2.254346048998,0.));
#310 = CARTESIAN_POINT('',(7.702922589384,2.020746899341,0.));
#311 = CARTESIAN_POINT('',(7.800132809305,1.598337937264,0.));
#312 = CARTESIAN_POINT('',(7.837729669059,1.410260228425,0.));
#313 = CARTESIAN_POINT('',(7.86988156502,1.221135129971,0.));
#314 = CARTESIAN_POINT('',(7.896553047583,1.031159659721,0.));
#315 = CARTESIAN_POINT('',(7.917718196142,0.840532314065,0.));
#316 = CARTESIAN_POINT('',(7.953083678491,0.408527174328,0.));
#317 = CARTESIAN_POINT('',(7.964026809915,0.166881857539,0.));
#318 = CARTESIAN_POINT('',(7.96615723779,-7.508148625279E-02,0.));
#319 = CARTESIAN_POINT('',(7.959466556881,-0.316961690591,0.));
#320 = CARTESIAN_POINT('',(7.943970732293,-0.558357818713,0.));
#321 = CARTESIAN_POINT('',(7.895449487125,-1.039380510448,0.));
#322 = CARTESIAN_POINT('',(7.862423933096,-1.27900839704,0.));
#323 = CARTESIAN_POINT('',(7.820673939692,-1.517352133087,0.));
#324 = CARTESIAN_POINT('',(7.770263934502,-1.754015670283,0.));
#325 = CARTESIAN_POINT('',(7.71128227038,-1.988607602261,0.));
#326 = CARTESIAN_POINT('',(7.588027935622,-2.412851780118,0.));
#327 = CARTESIAN_POINT('',(7.526420639738,-2.603279350229,0.));
#328 = CARTESIAN_POINT('',(7.459082978329,-2.791804919369,0.));
#329 = CARTESIAN_POINT('',(7.38608929913,-2.978213539503,0.));
#330 = CARTESIAN_POINT('',(7.307524657077,-3.162294270118,0.));
#331 = CARTESIAN_POINT('',(7.125438372101,-3.555643678098,0.));
#332 = CARTESIAN_POINT('',(7.019939177843,-3.76399782198,0.));
#333 = CARTESIAN_POINT('',(6.907139533304,-3.96857376379,0.));
#334 = CARTESIAN_POINT('',(6.787210104706,-4.16905320895,0.));
#335 = CARTESIAN_POINT('',(6.66033992272,-4.365128414381,0.));
#336 = CARTESIAN_POINT('',(6.39790439774,-4.741041209999,0.));
#337 = CARTESIAN_POINT('',(6.262810860483,-4.921209429162,0.));
#338 = CARTESIAN_POINT('',(6.12164178035,-5.096740501076,0.));
#339 = CARTESIAN_POINT('',(5.974597240315,-5.267379797952,0.));
#340 = CARTESIAN_POINT('',(5.821891396666,-5.432884409128,0.));
#341 = CARTESIAN_POINT('',(5.493899612152,-5.765023980942,0.));
#342 = CARTESIAN_POINT('',(5.317778109013,-5.930835402093,0.));
#343 = CARTESIAN_POINT('',(5.135671008924,-6.090170905226,0.));
#344 = CARTESIAN_POINT('',(4.94787706243,-6.242762622309,0.));
#345 = CARTESIAN_POINT('',(4.754710731296,-6.388361316561,0.));
#346 = CARTESIAN_POINT('',(4.440310899176,-6.607852860349,0.));
#347 = CARTESIAN_POINT('',(4.32238669345,-6.686487188298,0.));
#348 = CARTESIAN_POINT('',(4.202795938003,-6.762593037977,0.));
#349 = CARTESIAN_POINT('',(4.08160651871,-6.836126525555,0.));
#350 = CARTESIAN_POINT('',(3.958887840648,-6.907046211699,0.));
#351 = CARTESIAN_POINT('',(3.67401119217,-7.063658476263,0.));
#352 = CARTESIAN_POINT('',(3.51086900792,-7.1475612191,0.));
#353 = CARTESIAN_POINT('',(3.345438129381,-7.226936766351,0.));
#354 = CARTESIAN_POINT('',(3.177875801637,-7.301707879731,0.));
#355 = CARTESIAN_POINT('',(3.008342660805,-7.371804646398,0.));
#356 = CARTESIAN_POINT('',(2.681239152791,-7.496582516025,0.));
#357 = CARTESIAN_POINT('',(2.523982134607,-7.552085819632,0.));
#358 = CARTESIAN_POINT('',(2.365354878931,-7.603627403417,0.));
#359 = CARTESIAN_POINT('',(2.205482222939,-7.651165545667,0.));
#360 = CARTESIAN_POINT('',(2.044490641548,-7.694663789319,0.));
#361 = CARTESIAN_POINT('',(1.688129411634,-7.781403520843,0.));
#362 = CARTESIAN_POINT('',(1.492323407707,-7.822853818679,0.));
#363 = CARTESIAN_POINT('',(1.295311790344,-7.858387935907,0.));
#364 = CARTESIAN_POINT('',(1.09731797362,-7.887963253361,0.));
#365 = CARTESIAN_POINT('',(0.898567230977,-7.911548432262,0.));
#366 = CARTESIAN_POINT('',(0.450186155614,-7.951092147012,0.));
#367 = CARTESIAN_POINT('',(0.200256625253,-7.963670023027,0.));
#368 = CARTESIAN_POINT('',(-5.005765232589E-02,-7.966817966631,0.));
#369 = CARTESIAN_POINT('',(-0.300312608957,-7.96052481238,0.));
#370 = CARTESIAN_POINT('',(-0.550064351841,-7.944807305014,0.));
#371 = CARTESIAN_POINT('',(-1.039380510447,-7.895449487125,0.));
#372 = CARTESIAN_POINT('',(-1.27900839704,-7.862423933096,0.));
#373 = CARTESIAN_POINT('',(-1.517352133087,-7.820673939692,0.));
#374 = CARTESIAN_POINT('',(-1.754015670283,-7.770263934502,0.));
#375 = CARTESIAN_POINT('',(-1.988607602261,-7.71128227038,0.));
#376 = CARTESIAN_POINT('',(-2.444870148825,-7.578725744846,0.));
#377 = CARTESIAN_POINT('',(-2.666708515307,-7.505723906384,0.));
#378 = CARTESIAN_POINT('',(-2.885908270162,-7.424936882384,0.));
#379 = CARTESIAN_POINT('',(-3.102129092468,-7.336485586311,0.));
#380 = CARTESIAN_POINT('',(-3.315038334248,-7.240510672782,0.));
#381 = CARTESIAN_POINT('',(-3.741057717922,-7.030143782343,0.));
#382 = CARTESIAN_POINT('',(-3.953904597841,-6.915215905132,0.));
#383 = CARTESIAN_POINT('',(-4.162490591287,-6.792567294051,0.));
#384 = CARTESIAN_POINT('',(-4.366467363345,-6.662397117274,0.));
#385 = CARTESIAN_POINT('',(-4.565499313135,-6.524925323022,0.));
#386 = CARTESIAN_POINT('',(-4.926301794497,-6.255795466567,0.));
#387 = CARTESIAN_POINT('',(-5.08942592189,-6.125950428497,0.));
#388 = CARTESIAN_POINT('',(-5.248429351289,-5.991011678914,0.));
#389 = CARTESIAN_POINT('',(-5.403114347759,-5.851143496091,0.));
#390 = CARTESIAN_POINT('',(-5.553292046128,-5.706520283009,0.));
#391 = CARTESIAN_POINT('',(-5.820994420566,-5.432003823187,0.));
#392 = CARTESIAN_POINT('',(-5.939899288526,-5.303455881577,0.));
#393 = CARTESIAN_POINT('',(-6.055390477644,-5.171792049896,0.));
#394 = CARTESIAN_POINT('',(-6.167366506686,-5.037125987889,0.));
#395 = CARTESIAN_POINT('',(-6.275730990412,-4.899575707687,0.));
#396 = CARTESIAN_POINT('',(-6.480070406405,-4.625632966639,0.));
#397 = CARTESIAN_POINT('',(-6.576389727827,-4.489497097743,0.));
#398 = CARTESIAN_POINT('',(-6.669271774128,-4.350961663368,0.));
#399 = CARTESIAN_POINT('',(-6.758642333318,-4.210135372312,0.));
#400 = CARTESIAN_POINT('',(-6.844431811118,-4.067129945918,0.));
#401 = CARTESIAN_POINT('',(-7.021040154892,-3.755229839557,0.));
#402 = CARTESIAN_POINT('',(-7.110683334025,-3.585669086845,0.));
#403 = CARTESIAN_POINT('',(-7.195405922937,-3.413552468801,0.));
#404 = CARTESIAN_POINT('',(-7.275117788537,-3.239058727476,0.));
#405 = CARTESIAN_POINT('',(-7.349737510064,-3.062370738114,0.));
#406 = CARTESIAN_POINT('',(-7.757352875972,-2.013649693212,0.));
#407 = CARTESIAN_POINT('',(-7.973282061516,-1.095508224133,0.));
#408 = CARTESIAN_POINT('',(-8.057895117922,-0.151905736054,0.));
#409 = CARTESIAN_POINT('',(-8.008906731552,0.794215378184,0.));
#410 = CARTESIAN_POINT('',(-7.827735889287,1.719842893081,0.));
#411 = CARTESIAN_POINT('',(-7.389092770737,2.987998676376,0.));
#412 = CARTESIAN_POINT('',(-7.231806238386,3.3657885693,0.));
#413 = CARTESIAN_POINT('',(-7.05138858479,3.733518071333,0.));
#414 = CARTESIAN_POINT('',(-6.848656421229,4.089432648516,0.));
#415 = CARTESIAN_POINT('',(-6.624601885028,4.431870703153,0.));
#416 = CARTESIAN_POINT('',(-6.260779345283,4.919620275415,0.));
#417 = CARTESIAN_POINT('',(-6.136329640465,5.076369723055,0.));
#418 = CARTESIAN_POINT('',(-6.007179879082,5.229329162117,0.));
#419 = CARTESIAN_POINT('',(-5.873475038158,5.378323344476,0.));
#420 = CARTESIAN_POINT('',(-5.735368717774,5.523184528493,0.));
#421 = CARTESIAN_POINT('',(-5.426953360878,5.827748379869,0.));
#422 = CARTESIAN_POINT('',(-5.255112824258,5.985901341385,0.));
#423 = CARTESIAN_POINT('',(-5.07775944125,6.137956769802,0.));
#424 = CARTESIAN_POINT('',(-4.895164622458,6.283676390738,0.));
#425 = CARTESIAN_POINT('',(-4.707613279045,6.422838249183,0.));
#426 = CARTESIAN_POINT('',(-3.856458223064,7.009134450453,0.));
#427 = CARTESIAN_POINT('',(-3.142544053826,7.383692786948,0.));
#428 = CARTESIAN_POINT('',(-2.386074209915,7.670231393488,0.));
#429 = CARTESIAN_POINT('',(-1.600552180122,7.863379363923,0.));
#430 = CARTESIAN_POINT('',(-0.800145275911,7.959899704658,0.));
#431 = CARTESIAN_POINT('',(-2.E-17,7.959899496853,0.));
#432 = PLANE('',#433);
#433 = AXIS2_PLACEMENT_3D('',#434,#435,#436);
#434 = CARTESIAN_POINT('',(-9.1E-16,-3.E-17,0.));
#435 = DIRECTION('',(0.,0.,1.));
#436 = DIRECTION('',(1.,0.,0.));
#437 = ADVANCED_FACE('',(#438,#441),#452,.T.);
#438 = FACE_BOUND('',#439,.T.);
#439 = EDGE_LOOP('',(#440));
#440 = ORIENTED_EDGE('',*,*,#241,.T.);
#441 = FACE_BOUND('',#442,.T.);
#442 = EDGE_LOOP('',(#443));
#443 = ORIENTED_EDGE('',*,*,#444,.F.);
#444 = EDGE_CURVE('',#445,#445,#447,.T.);
#445 = VERTEX_POINT('',#446);
#446 = CARTESIAN_POINT('',(3.95,0.,10.6));
#447 = CIRCLE('',#448,3.95);
#448 = AXIS2_PLACEMENT_3D('',#449,#450,#451);
#449 = CARTESIAN_POINT('',(0.,0.,10.6));
#450 = DIRECTION('',(0.,0.,1.));
#451 = DIRECTION('',(1.,0.,0.));
#452 = PLANE('',#453);
#453 = AXIS2_PLACEMENT_3D('',#454,#455,#456);
#454 = CARTESIAN_POINT('',(-3.6E-16,6.E-17,10.6));
#455 = DIRECTION('',(0.,0.,1.));
#456 = DIRECTION('',(1.,0.,0.));
#457 = ADVANCED_FACE('',(#458),#479,.F.);
#458 = FACE_BOUND('',#459,.F.);
#459 = EDGE_LOOP('',(#460,#461,#468,#477,#478));
#460 = ORIENTED_EDGE('',*,*,#261,.F.);
#461 = ORIENTED_EDGE('',*,*,#462,.T.);
#462 = EDGE_CURVE('',#262,#198,#463,.T.);
#463 = ELLIPSE('',#464,8.,4.);
#464 = AXIS2_PLACEMENT_3D('',#465,#466,#467);
#465 = CARTESIAN_POINT('',(0.,0.,0.4));
#466 = DIRECTION('',(1.,0.,-0.));
#467 = DIRECTION('',(0.,1.,4.7E-16));
#468 = ORIENTED_EDGE('',*,*,#469,.T.);
#469 = EDGE_CURVE('',#198,#470,#472,.T.);
#470 = VERTEX_POINT('',#471);
#471 = CARTESIAN_POINT('',(0.,-1.13E-13,4.4));
#472 = ELLIPSE('',#473,8.,4.);
#473 = AXIS2_PLACEMENT_3D('',#474,#475,#476);
#474 = CARTESIAN_POINT('',(0.,0.,0.4));
#475 = DIRECTION('',(1.,0.,-0.));
#476 = DIRECTION('',(0.,1.,4.7E-16));
#477 = ORIENTED_EDGE('',*,*,#469,.F.);
#478 = ORIENTED_EDGE('',*,*,#462,.F.);
#479 = SURFACE_OF_REVOLUTION('',#480,#485);
#480 = ELLIPSE('',#481,8.,4.);
#481 = AXIS2_PLACEMENT_3D('',#482,#483,#484);
#482 = CARTESIAN_POINT('',(0.,0.,0.4));
#483 = DIRECTION('',(1.,0.,-0.));
#484 = DIRECTION('',(0.,1.,4.7E-16));
#485 = AXIS1_PLACEMENT('',#486,#487);
#486 = CARTESIAN_POINT('',(0.,0.,0.));
#487 = DIRECTION('',(0.,0.,1.));
#488 = ADVANCED_FACE('',(#489),#508,.T.);
#489 = FACE_BOUND('',#490,.F.);
#490 = EDGE_LOOP('',(#491,#499,#506,#507));
#491 = ORIENTED_EDGE('',*,*,#492,.T.);
#492 = EDGE_CURVE('',#445,#493,#495,.T.);
#493 = VERTEX_POINT('',#494);
#494 = CARTESIAN_POINT('',(3.95,0.,17.6));
#495 = LINE('',#496,#497);
#496 = CARTESIAN_POINT('',(3.95,0.,10.6));
#497 = VECTOR('',#498,1.);
#498 = DIRECTION('',(0.,0.,1.));
#499 = ORIENTED_EDGE('',*,*,#500,.T.);
#500 = EDGE_CURVE('',#493,#493,#501,.T.);
#501 = CIRCLE('',#502,3.95);
#502 = AXIS2_PLACEMENT_3D('',#503,#504,#505);
#503 = CARTESIAN_POINT('',(0.,0.,17.6));
#504 = DIRECTION('',(0.,0.,1.));
#505 = DIRECTION('',(1.,0.,0.));
#506 = ORIENTED_EDGE('',*,*,#492,.F.);
#507 = ORIENTED_EDGE('',*,*,#444,.F.);
#508 = CYLINDRICAL_SURFACE('',#509,3.95);
#509 = AXIS2_PLACEMENT_3D('',#510,#511,#512);
#510 = CARTESIAN_POINT('',(0.,0.,10.6));
#511 = DIRECTION('',(-0.,-0.,-1.));
#512 = DIRECTION('',(1.,0.,0.));
#513 = ADVANCED_FACE('',(#514),#534,.T.);
#514 = FACE_BOUND('',#515,.T.);
#515 = EDGE_LOOP('',(#516,#525,#526,#527));
#516 = ORIENTED_EDGE('',*,*,#517,.F.);
#517 = EDGE_CURVE('',#493,#518,#520,.T.);
#518 = VERTEX_POINT('',#519);
#519 = CARTESIAN_POINT('',(2.95,0.,18.6));
#520 = CIRCLE('',#521,1.);
#521 = AXIS2_PLACEMENT_3D('',#522,#523,#524);
#522 = CARTESIAN_POINT('',(2.95,0.,17.6));
#523 = DIRECTION('',(0.,-1.,0.));
#524 = DIRECTION('',(1.,0.,0.));
#525 = ORIENTED_EDGE('',*,*,#500,.T.);
#526 = ORIENTED_EDGE('',*,*,#517,.T.);
#527 = ORIENTED_EDGE('',*,*,#528,.F.);
#528 = EDGE_CURVE('',#518,#518,#529,.T.);
#529 = CIRCLE('',#530,2.95);
#530 = AXIS2_PLACEMENT_3D('',#531,#532,#533);
#531 = CARTESIAN_POINT('',(0.,0.,18.6));
#532 = DIRECTION('',(0.,0.,1.));
#533 = DIRECTION('',(1.,0.,0.));
#534 = TOROIDAL_SURFACE('',#535,2.95,1.);
#535 = AXIS2_PLACEMENT_3D('',#536,#537,#538);
#536 = CARTESIAN_POINT('',(0.,0.,17.6));
#537 = DIRECTION('',(0.,0.,1.));
#538 = DIRECTION('',(1.,0.,0.));
#539 = ADVANCED_FACE('',(#540),#543,.T.);
#540 = FACE_BOUND('',#541,.T.);
#541 = EDGE_LOOP('',(#542));
#542 = ORIENTED_EDGE('',*,*,#528,.T.);
#543 = PLANE('',#544);
#544 = AXIS2_PLACEMENT_3D('',#545,#546,#547);
#545 = CARTESIAN_POINT('',(-3.5E-16,1.E-17,18.6));
#546 = DIRECTION('',(0.,0.,1.));
#547 = DIRECTION('',(1.,0.,0.));
#548 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3)
GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#552)) GLOBAL_UNIT_ASSIGNED_CONTEXT
((#549,#550,#551)) REPRESENTATION_CONTEXT('Context #1',
'3D Context with UNIT and UNCERTAINTY') );
#549 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) );
#550 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) );
#551 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() );
#552 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(2.E-07),#549,
'distance_accuracy_value','confusion accuracy');
#553 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#7));
#554 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#555)
,#548);
#555 = STYLED_ITEM('color',(#556),#15);
#556 = PRESENTATION_STYLE_ASSIGNMENT((#557,#563));
#557 = SURFACE_STYLE_USAGE(.BOTH.,#558);
#558 = SURFACE_SIDE_STYLE('',(#559));
#559 = SURFACE_STYLE_FILL_AREA(#560);
#560 = FILL_AREA_STYLE('',(#561));
#561 = FILL_AREA_STYLE_COLOUR('',#562);
#562 = COLOUR_RGB('',0.650980421574,0.411764706019,0.956862747054);
#563 = CURVE_STYLE('',#564,POSITIVE_LENGTH_MEASURE(0.1),#565);
#564 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous');
#565 = COLOUR_RGB('',9.803921802644E-02,9.803921802644E-02,
9.803921802644E-02);
ENDSEC;
END-ISO-10303-21;

File diff suppressed because it is too large Load Diff

BIN
CAD/Zusatzteile.FCStd Normal file

Binary file not shown.

View File

@@ -40,6 +40,8 @@ Elektronik:
* 1x Micro Servo
* 1x CNC Shield (z.B. AZDelivery)
* 2x Schrittmotor Treiber DRV8825
* Konfiguriert auf 32 Mikroschritte
* Auf 0,5V kalibriert
* 1x ESP32 Arduino UNO Formfaktor
* 1x Netzteil 12V min. 1A
* 1x Micro USB Kabel

BIN
firmware/boot_app0.bin Normal file

Binary file not shown.

BIN
firmware/bootloader.bin Normal file

Binary file not shown.

BIN
firmware/firmware.bin Normal file

Binary file not shown.

BIN
firmware/firmware.elf Executable file

Binary file not shown.

131335
firmware/firmware.map Normal file

File diff suppressed because one or more lines are too long

28
firmware/manifest.json Normal file
View File

@@ -0,0 +1,28 @@
{
"name": "EggDuino ESP32 Firmware",
"version": "1.6a",
"new_install_prompt_erase": true,
"builds": [
{
"chipFamily": "ESP32",
"parts": [
{
"path": "bootloader.bin",
"offset": 4096
},
{
"path": "partitions.bin",
"offset": 32768
},
{
"path": "boot_app0.bin",
"offset": 57344
},
{
"path": "firmware.bin",
"offset": 65536
}
]
}
]
}

BIN
firmware/partitions.bin Normal file

Binary file not shown.

View File

@@ -14,25 +14,21 @@
#include "SerialCommand.h"
#include "button.h"
// implemented Eggbot-Protocol-Version v13
#define initSting "EBBv13_and_above Protocol emulated by Eggduino-Firmware V1.6a"
#ifdef ESP32
// Rotational Stepper
static const int kDefaultRotDirPin = 16;
static const int kDefaultRotStepPin = 25;
static const int kDefaultRotDirPin = 27;
static const int kDefaultRotEnablePin = 12;
static const int kDefaultRotStepPin = 26;
#define rotMicrostep 32
static const int kDefaultRotMicrostep = rotMicrostep;
static const int kDefaultRotMicrostep = 32;
// Pen Stepper
static const int kDefaultPenStepPin = 25;
static const int kDefaultPenDirPin = 27;
static const int kDefaultPenDirPin = 16;
static const int kDefaultPenEnablePin = 12;
#define penMicrostep 32
static const int kDefaultPenMicrostep = penMicrostep;
static const int kDefaultPenMicrostep = 32;
// Servo Pin
static const int kDefaultServoPin = 17;
@@ -104,6 +100,7 @@ extern int g_iMaxAcclSpeed;
extern String g_sHostname;
extern String g_sWifiSsid;
extern String g_sWifiPassword;
extern String g_strConnectionState;
enum ProtocolTransport {
PROTOCOL_TRANSPORT_SERIAL = 0,

5
inkscape/README.md Normal file
View File

@@ -0,0 +1,5 @@
# Inkscape
Das Verzeichnis ernthält die funktionierenden AxiDraw Plugins für Inkscape. Nach der Installation müssen allerdings noch zwei Datei gepatched werden.
1. Installationsort des Inkscape Plugins öffnen. Diese findet man indem man Inkscape öffnet und in Bearbeiten->Einstellung unter System den Eintrag Benutzererweiterungen sucht.
2. Im Ordner die Datei eggbot.py durch die im Ordner Patch enthaltene Datei ersetzen.
3. Im Ordner des Plugins unter axidraw_deps/plotink die Datei ebb_serial.py ersetzen.

15
inkscape/killegg.sh Executable file
View File

@@ -0,0 +1,15 @@
#!/bin/bash
# killegg.sh
# Simple helper script to terminate any running instance of the Python program "eggbot.py" which is started by inkscape.
# It searches for the process by name and sends a termination signal.
PROCESS="eggbot.py"
PIDS=$(pgrep -f "$PROCESS")
if [ -z "$PIDS" ]; then
echo "Kein laufender Prozess für $PROCESS gefunden."
else
echo "Beende Prozess(e): $PIDS"
kill $PIDS
fi

View File

@@ -64,6 +64,9 @@ def findPort():
if port[0].startswith("/dev/ttyUSB"):
ebb_port = port[0] # Success; EBB found by name match.
break # stop searching-- we are done.
elif port[0].startswith("COM"):
ebb_port = port[0] # Success; EBB found by name match.
break # stop searching-- we are done.
for port in com_ports_list:
if port[1].startswith("EiBotBoard"):
ebb_port = port[0] # Success; EBB found by name match.
@@ -215,6 +218,8 @@ def listEBBports():
port_has_ebb = False
if port[0].startswith("/dev/ttyUSB"):
port_has_ebb = True
elif port[0].startswith("COM"):
port_has_ebb = True
elif port[1].startswith("EiBotBoard"):
port_has_ebb = True
elif port[2].startswith("USB VID:PID=04D8:FD92"):

Binary file not shown.

View File

@@ -8,53 +8,45 @@
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:uno]
[platformio]
default_envs = uno_linux
extra_configs = platformio_override.ini
[env]
platform = platformio/espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
lib_deps =
arminjo/ServoEasing
madhephaestus/ESP32Servo@^3.0.6
bblanchon/ArduinoJson@^6.21.5
links2004/WebSockets@^2.6.1
[env:uno_linux]
upload_speed = 576000
upload_port = /dev/ttyUSB*
lib_deps =
arminjo/ServoEasing
madhephaestus/ESP32Servo@^3.0.6
bblanchon/ArduinoJson@^6.21.5
gin66/FastAccelStepper@^0.33.13
h2zero/NimBLE-Arduino@^2.3.6
links2004/WebSockets@^2.6.1
${env.lib_deps}
gin66/FastAccelStepper@^0.33.13
h2zero/NimBLE-Arduino@^2.3.6
[env:uno_windows]
platform = platformio/espressif32
board = esp32dev
framework = arduino
extra_scripts = pre:scripts/patch_legacy_esp32_libs.py
build_flags =
-DEGGDUINO_WINDOWS_BUILD_FIXES=1
-include $PROJECT_INCLUDE_DIR/ArduinoEsp32Compat.h
monitor_speed = 115200
-DEGGDUINO_WINDOWS_BUILD_FIXES=1
-include $PROJECT_INCLUDE_DIR/ArduinoEsp32Compat.h
monitor_port = COM*
#upload_speed = 576000
upload_port = COM8
; Keep this aligned with [env:uno] for Arduino-ESP32 1.0.6 compatibility.
lib_deps =
arminjo/ServoEasing
madhephaestus/ESP32Servo@^3.0.6
bblanchon/ArduinoJson@^6.21.5
gin66/FastAccelStepper@0.30.15
h2zero/NimBLE-Arduino@2.2.3
links2004/WebSockets@2.6.1
${env.lib_deps}
gin66/FastAccelStepper@0.30.15
h2zero/NimBLE-Arduino@2.2.3
[env:uno_macos]
platform = platformio/espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
monitor_port = /dev/cu.usb*
upload_port = /dev/cu.usb*
lib_deps =
arminjo/ServoEasing
madhephaestus/ESP32Servo@^3.0.6
bblanchon/ArduinoJson@^6.21.5
gin66/FastAccelStepper@^0.33.13
h2zero/NimBLE-Arduino@^2.3.6
links2004/WebSockets@^2.6.1
${env.lib_deps}
gin66/FastAccelStepper@^0.33.13
h2zero/NimBLE-Arduino@^2.3.6

View File

@@ -0,0 +1,5 @@
# Copy file to platformio_override.ini and change default_envs to your needs.
# In this example file it uses the mac configuration.
[platformio]
default_envs = uno_mac

101
scripts/package_firmware.py Normal file
View File

@@ -0,0 +1,101 @@
#!/usr/bin/env python3
import json
import re
import shutil
from pathlib import Path
BUILD_ARTIFACTS = (
"bootloader.bin",
"partitions.bin",
"firmware.bin",
"firmware.elf",
"firmware.map",
)
MANIFEST_PARTS = (
{"path": "bootloader.bin", "offset": 4096},
{"path": "partitions.bin", "offset": 32768},
{"path": "boot_app0.bin", "offset": 57344},
{"path": "firmware.bin", "offset": 65536},
)
VERSION_PATTERN = re.compile(r'Eggduino-Firmware V([^"\\]+)')
def extract_firmware_version(header_text: str) -> str:
match = VERSION_PATTERN.search(header_text)
if not match:
raise ValueError("Could not extract firmware version from include/EggDuino.h")
return match.group(1).strip()
def build_manifest(version: str) -> dict:
return {
"name": "EggDuino ESP32 Firmware",
"version": version,
"new_install_prompt_erase": True,
"builds": [
{
"chipFamily": "ESP32",
"parts": list(MANIFEST_PARTS),
}
],
}
def package_bundle(build_dir: Path, boot_app0_path: Path, header_path: Path, output_dir: Path) -> None:
build_dir = Path(build_dir)
boot_app0_path = Path(boot_app0_path)
header_path = Path(header_path)
output_dir = Path(output_dir)
if output_dir.exists():
shutil.rmtree(output_dir)
output_dir.mkdir(parents=True, exist_ok=True)
for artifact_name in BUILD_ARTIFACTS:
artifact_path = build_dir / artifact_name
if not artifact_path.is_file():
raise FileNotFoundError(f"Missing build artifact: {artifact_path}")
shutil.copy2(artifact_path, output_dir / artifact_name)
if not boot_app0_path.is_file():
raise FileNotFoundError(f"Missing boot_app0.bin: {boot_app0_path}")
shutil.copy2(boot_app0_path, output_dir / "boot_app0.bin")
version = extract_firmware_version(header_path.read_text(encoding="utf-8"))
manifest_path = output_dir / "manifest.json"
manifest_path.write_text(
json.dumps(build_manifest(version), indent=4) + "\n",
encoding="utf-8",
)
def _get_boot_app0_path(env) -> Path:
framework_dir = env.PioPlatform().get_package_dir("framework-arduinoespressif32")
if not framework_dir:
raise FileNotFoundError("PlatformIO framework-arduinoespressif32 package is not installed")
boot_app0_path = Path(framework_dir) / "tools" / "partitions" / "boot_app0.bin"
if not boot_app0_path.is_file():
raise FileNotFoundError(f"Could not find boot_app0.bin in {boot_app0_path.parent}")
return boot_app0_path
def _package_platformio_bundle(target, source, env) -> None:
del target, source
project_dir = Path(env.subst("$PROJECT_DIR"))
package_bundle(
build_dir=Path(env.subst("$BUILD_DIR")),
boot_app0_path=_get_boot_app0_path(env),
header_path=project_dir / "include" / "EggDuino.h",
output_dir=project_dir / "firmware",
)
print(f"Packaged firmware bundle to {project_dir / 'firmware'}")
if "Import" in globals():
Import("env")
env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", _package_platformio_bundle)

View File

@@ -3,6 +3,8 @@
#include <DNSServer.h>
#include <string.h>
String g_strConnectionState = "No Wifi connection";
namespace
{
const char *kConfigPath = "/config.json";
@@ -594,7 +596,8 @@ void startWebInterface()
staConnectionKnown = staConnected;
if (staConnected)
{
Serial.println(String("Connected: http://") + WiFi.localIP().toString());
g_strConnectionState = String("Connected: http://") + WiFi.localIP().toString();
Serial.println(g_strConnectionState);
}
else
{
@@ -620,7 +623,8 @@ void startWebInterface()
{
apModeActive = true;
dnsServer.start(kDnsPort, "*", WiFi.softAPIP());
Serial.println(String("AP aktiv: ") + hostName + " / http://" + WiFi.softAPIP().toString() + " (Name: " + hostName + ")");
g_strConnectionState = String("AP aktiv: http://" + WiFi.softAPIP().toString() + " (" + hostName + ")");
Serial.println(g_strConnectionState);
}
else
{

View File

@@ -318,11 +318,12 @@ void stepperModeConfigure()
void sendVersion()
{
Log(__FUNCTION__);
protocolWrite(initSting);
Log(__FUNCTION__);
protocolWrite("EBB: " + g_strConnectionState);
protocolWrite("\r\n");
}
void unrecognized(const char *command)
{
Log(__FUNCTION__);

669
svg/chicken.svg Normal file
View File

@@ -0,0 +1,669 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
id="svg6435"
version="1.1"
viewBox="0 0 3200 1024"
sodipodi:docname="chicken.svg"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview287"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="0.30819089"
inkscape:cx="1489.3367"
inkscape:cy="340.69794"
inkscape:window-width="3454"
inkscape:window-height="2088"
inkscape:window-x="386"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg6435" />
<!-- Generator: Adobe Illustrator 30.2.1, SVG Export Plug-In . SVG Version: 2.1.1 Build 1) -->
<defs
id="defs4">
<style
id="style2">
.st0 {
stroke-miterlimit: 4;
stroke-width: 1px;
}
.st0, .st1 {
fill: none;
stroke: #000;
}
</style>
</defs>
<g
id="g34">
<path
class="st1"
d="M624.26,266.87s183.01,17.85,435.95,214.26c0,0-116.06,324.36-369,226.16-252.94-98.2-66.96-440.42-66.96-440.42h.01Z"
id="path6" />
<path
class="st1"
d="M645.19,260.45s13.96-95.11,53.22-89.87c0,0,15.28-.66,12.06,22.14,0,0-.72,19.74,12.37,6.65,13.09-13.09,20.94-14.83,30.54-10.47s0,19.2,0,19.2c0,0-3.49,16.37,11.34,7.31s25.1-7.39,30.54,0,9.6,18.86-14.83,35.44c-24.43,16.58-44.39,27.05-59.28,35.77"
id="path8" />
<path
class="st1"
d="M569.95,333.83s-49.41,44.04-39.21,76.81c10.21,32.76,42.43-24.72,46.19-69.29"
id="path10" />
<path
class="st1"
d="M682.48,460.32s-46.3,168.45,147.76,151.7c0,0,93.58-13.79,129.05-80.78"
id="path12" />
<path
class="st1"
d="M677.65,708.56l-98.5,61.08-34.58-43.82s-9.71-8.07-15.19-2.17"
id="path14" />
<path
class="st1"
d="M591.33,799.49s6.32-7.16,4.21-11.8-16.4-18.06-16.4-18.06"
id="path16" />
<path
id="line18"
class="st1"
style="fill:none;stroke:#000000"
d="m 801.54999,732.08002 45.16998,92.90997" />
<path
class="st1"
d="M781.49,850.33s1.28-13.73,9.09-16.89,90.16-8.45,90.16-8.45c0,0,6.33,0,10.56,12.67"
id="path20" />
<path
class="st1"
d="M1043.32,451.24s16.9-114.19,49.62-130.06c21.03-10.2,21.12,14.98,8.45,43.49-12.67,28.51-51.73,95.65-51.73,95.65,0,0,90.8-138.33,116.14-126.49s-94.07,120.29-101.51,131.59c0,0,117.58-116.04,158.52-116.58,24.74-.33,32.23,30.32,6.33,48.57-22.1,15.58-153.09,76.02-153.09,76.02,0,0,141.07-66.3,175.61-53.12,23.01,8.78,19.71,44.67-6.68,53.12s-165.76,18.43-165.76,18.43c0,0,103.47.58,118.25,14.3,14.78,13.73,10.56,46.45-13.73,47.51-24.28,1.06-116.14-49.62-116.14-49.62"
id="path22" />
<path
class="st1"
d="M763.11,527.4s15.52,90.93,67.13,84.62"
id="path24" />
<path
class="st1"
d="M792.42,531.27s36.67,84.64,85.31,66.26"
id="path26" />
<path
class="st1"
d="M532.03,278.8s31.51,38.04,71.49,29.73"
id="path28" />
<path
class="st1"
d="M645.19,318.87s27.03-22.09,32.46,10.61"
id="path30" />
<path
class="st1"
d="M615.96,266.87h-90.35s21.51,47.2,61.1,66.96"
id="path32" />
</g>
<g
id="g58">
<path
id="circle36"
class="st1"
style="fill:none;stroke:#000000"
d="m 1863.5199,697.33002 a 111.58,111.58 0 0 1 -111.58,111.58 111.58,111.58 0 0 1 -111.58,-111.58 111.58,111.58 0 0 1 111.58,-111.58 111.58,111.58 0 0 1 111.58,111.58 z" />
<path
id="polyline38"
class="st1"
style="fill:none;stroke:#000000"
d="m 1659.98,632.74 -54.71,0.96 35.09,45.53" />
<path
id="polyline40"
class="st1"
style="fill:none;stroke:#000000"
d="m 1718.47,803.8 -23.22,9.47 3.75,25.75" />
<path
id="line42"
class="st1"
style="fill:none;stroke:#000000"
d="m 1769.73,807.41998 10.04,34.90003" />
<path
id="line44"
class="st1"
style="fill:none;stroke:#000000"
d="m 1740.55,842.32001 h 58.37" />
<path
id="line46"
class="st1"
style="fill:none;stroke:#000000"
d="m 1674.27,842.32001 44.2,-7.75" />
<path
class="st1"
d="M1742.55,697.33s-9.11,70.2,92.1,71.13c0,0-29.54-32.25-35.73-55.64"
id="path48" />
<path
class="st1"
d="M1863.53,687.29s49.55-50.45,67.79-40.28c18.24,10.17,10.95,24.77,4.56,26.59-6.39,1.82-72.35,23.72-72.35,23.72,0,0,63.23-17.34,68.7-3.66,5.47,13.68-5.47,19.15-10.95,19.15s-57.75-6.38-57.75-6.38"
id="path50" />
<path
class="st1"
d="M1695.25,633.7s7.26,34.59,31.8,0"
id="path52" />
<path
class="st1"
d="M1605.27,633.7s20.05,17.21,40.02,19.49"
id="path54" />
<path
class="st1"
d="M1751.94,585.75s25.63-71.09,36.55-59.37c10.92,11.71-25.88,59.37-25.88,59.37,0,0,40.14-56.04,46-39.31,5.86,16.73-33.86,39.31-33.86,39.31,0,0,41.39-25.09,38.04-12.55-3.35,12.55-24.3,18.67-24.3,18.67"
id="path56" />
</g>
<g
id="g94">
<g
id="g78">
<path
id="circle60"
class="st1"
style="fill:none;stroke:#000000"
d="m 1483.55,697.33002 a 111.58,111.58 0 0 1 -111.58,111.58 111.58,111.58 0 0 1 -111.58,-111.58 111.58,111.58 0 0 1 111.58,-111.58 111.58,111.58 0 0 1 111.58,111.58 z" />
<path
id="polyline62"
class="st1"
style="fill:none;stroke:#000000"
d="m 1280.01,632.74 -49.21,-10.23 29.91,34.51 -41.33,16.77 42.43,10.07" />
<path
id="circle64"
class="st1"
style="fill:none;stroke:#000000"
d="m 1350.97,647.01001 a 13.31,13.31 0 0 1 -13.31,13.31 13.31,13.31 0 0 1 -13.31,-13.31 13.31,13.31 0 0 1 13.31,-13.31 13.31,13.31 0 0 1 13.31,13.31 z" />
<path
id="line66"
class="st1"
style="fill:none;stroke:#000000"
d="m 1319.64,795.15002 -54.3299,24.52997" />
<path
id="line68"
class="st1"
style="fill:none;stroke:#000000"
d="m 1430.75,792.17999 23.9301,50.14002" />
<path
id="line70"
class="st1"
style="fill:none;stroke:#000000"
d="m 1415.46,842.32001 h 58.37" />
<path
id="line72"
class="st1"
style="fill:none;stroke:#000000"
d="m 1244.87,799.65997 33.89,31.56" />
<path
class="st1"
d="M1362.57,697.33s-9.11,70.2,92.1,71.13"
id="path74" />
<path
class="st1"
d="M1483.56,687.29s49.55-50.45,67.79-40.28c18.24,10.17,10.95,24.77,4.56,26.59s-72.35,23.72-72.35,23.72c0,0,63.23-17.34,68.7-3.66,5.47,13.68-5.47,19.15-10.95,19.15s-57.75-6.38-57.75-6.38"
id="path76" />
</g>
<path
class="st1"
d="M1386.86,578.9s10.66-23.41,28.62-36.54c17.96-13.12,46.37-9.86,62.11,17.06,15.73,26.93-13.35,67.99-17.05,63.09-29.77-40.11-75.48-40.11-75.48-40.11,0,0-64.35-25.28-73.51-31.51-9.17-6.23-3.22-17.72,8.97-10.92s66.36,38.94,66.36,38.94h0Z"
id="path80" />
<path
class="st1"
d="M1451.85,537.16s5.76-7.64,10.72-4.5c4.96,3.14,4.24,7.24,2.37,11.83"
id="path82" />
<path
class="st1"
d="M1450.58,539.98s-25.06,10.19-35.77,44.64"
id="path84" />
<path
class="st1"
d="M1464.68,547.54s5.23,14.62-18.28,54.56"
id="path86" />
<path
class="st1"
d="M1451.85,531.91s-17.29-33.55-24.61-35.38c-4.38-1.1-6.06,2.83-4.03,7.26,2.02,4.44,28.66,28.12,28.66,28.12h-.01Z"
id="path88" />
<path
class="st1"
d="M1470.87,544.49s20.63,14.27,30.57,17.04c3.75,1.05,10.21-.94,6.58-8.14-3.63-7.2-37.15-8.9-37.15-8.9h0Z"
id="path90" />
<path
id="circle92"
class="st1"
style="fill:none;stroke:#000000"
d="m 1345.96,647.12 a 10.25,10.25 0 0 1 -10.25,10.25 10.25,10.25 0 0 1 -10.25,-10.25 10.25,10.25 0 0 1 10.25,-10.25 10.25,10.25 0 0 1 10.25,10.25 z" />
</g>
<g
id="g126">
<path
class="st1"
d="M2234.44,769.7c-20.47,23.99-50.92,39.2-84.92,39.2-61.63,0-111.58-49.95-111.58-111.58s49.95-111.58,111.58-111.58,111.58,49.95,111.58,111.58c0,22.22-6.5,42.93-17.69,60.31"
id="path96" />
<path
id="polyline98"
class="st1"
style="fill:none;stroke:#000000"
d="m 2057.55,632.74 -59.6,17.29 40.95,32.51" />
<path
class="st1"
d="M2155.04,708.52s-3.14,59.01,98.1,59.92c0,0-27.27-23.41-36.91-39.26"
id="path100" />
<path
class="st1"
d="M2261.08,687.29s49.55-50.45,67.79-40.28,10.95,24.77,4.56,26.59-72.35,23.72-72.35,23.72c0,0,63.23-17.34,68.7-3.66,5.47,13.68-5.47,19.15-10.95,19.15s-57.75-6.38-57.75-6.38"
id="path102" />
<path
class="st1"
d="M2109.83,650.03c.23-.98.36-1.98.36-3.02,0-7.34-5.96-13.31-13.31-13.31s-13.31,5.96-13.31,13.31c0,1.05.13,2.05.36,3.02"
id="path104" />
<path
class="st1"
d="M2150.08,582.52l23.6-50.29,3.44,41.32,37.73-44.83-8.79,51.04,26.18-17.64-17.38,40.36s-32.82-22.05-64.78-19.97h0Z"
id="path106" />
<path
class="st1"
d="M1997.95,650.03s28.16,10.15,48.38,4.77"
id="path108" />
<path
id="circle110"
class="st1"
style="fill:none;stroke:#000000"
d="m 2127.6899,686.03998 a 17.5,17.5 0 0 1 -17.5,17.5 17.5,17.5 0 0 1 -17.5,-17.5 17.5,17.5 0 0 1 17.5,-17.5 17.5,17.5 0 0 1 17.5,17.5 z" />
<path
id="line112"
class="st1"
style="fill:none;stroke:#000000"
d="m 2057.55,762.76001 -59.6,13.77997" />
<path
id="line114"
class="st1"
style="fill:none;stroke:#000000"
d="M 1990.23,746.22998 2001.9301,788.94" />
<path
id="polyline116"
class="st1"
style="fill:none;stroke:#000000"
d="m 2120.85,805.19 -24.5,18.66 7.52,23.63" />
<path
id="line118"
class="st1"
style="fill:none;stroke:#000000"
d="m 2079.76,847.47998 h 43.3699" />
<path
id="line120"
class="st1"
style="fill:none;stroke:#000000"
d="m 2107.6299,639.15997 6.2002,-4.09997" />
<path
id="line122"
class="st1"
style="fill:none;stroke:#000000"
d="m 2110.1899,641.87 6.21,-2.71003" />
<path
id="line124"
class="st1"
style="fill:none;stroke:#000000"
d="m 2110.73,645.65997 5.6699,-0.76996" />
</g>
<g
id="g144"
style="display:inline">
<path
class="st1"
d="m 2622.6,730.38 c -16.73,59.47 -75.78,94.88 -131.9,79.09 -56.12,-15.79 -88.06,-76.78 -71.33,-136.25 16.73,-59.47 85.78,-130.42 141.91,-114.65 56.13,15.78 78.06,112.34 61.33,171.81 z"
id="path128" />
<path
id="polyline130"
class="st1"
style="fill:none;stroke:#000000"
d="m 2526.72,808.32 -19.3,-8.53 14.08,-2.84 -4.43,-10.78 21,11.07 7.37,-26.4 v 23.28 l 9.65,-4.54 3.42,9.09 29.65,-12.83" />
<path
id="polyline132"
class="st1"
style="fill:none;stroke:#000000"
d="m 2483.57,807.18 7.39,-8.51 h -7.39 l -11.35,-27.83 -3.4,19.3 -24.85,-9.34" />
<path
id="polyline134"
class="st1"
style="fill:none;stroke:#000000"
d="m 2540.33,802.07 -6.24,26.11 13.7,22.14 h -33.56" />
<path
id="polyline136"
class="st1"
style="fill:none;stroke:#000000"
d="m 2474.91,792.8 -41.44,23.07 -20.44,-27.62" />
<path
id="polyline138"
class="st1"
style="fill:none;stroke:#000000"
d="m 2442.6,625.17 -41.24,-17.54 29.33,38.03 -46.62,7.54 38.32,10.67" />
<path
id="polyline140"
class="st1"
style="fill:none;stroke:#000000"
d="m 2451.55,613.01 h 15.91 l -15.91,16.47 23.36,6.27 -23.36,6.12 3.53,26.65 -12.48,-4.65 7.01,39.68 -16.39,-24.32 -13.85,-6.02" />
<path
id="line142"
class="st1"
style="fill:none;stroke:#000000"
d="m 2433.47,815.87 10.5,15.17999" />
</g>
<path
class="st1"
d="M428.41,145.55s72.28-49.69,79.06,0,50.59,33.88,60.31,45.18,3.01,76.15,3.01,76.15"
id="path146" />
<path
class="st1"
d="M580.92,311.58s66.44,290.37,403.14,14.59C1320.76,50.39,1411.5,55.29,1509.05,111.8s150.6,292.51,350.69,275.1c159.64-13.89,206.27-127.28,257.03-198.72,150.96-212.44,403.89,36.16,528.72-4.86,11.32-3.72,13.63-2.75,27.71-13.95,7.98-6.35,14.2-16.92,13.24-29.67-.87-11.47-12.82-21.2-38.56-12.99-51.47,16.41-129.03,129.9-54.86,249.23"
id="path148" />
<path
id="polyline150"
class="st1"
style="fill:none;stroke:#000000"
d="m 1232.18,144.76 74.97,63.5 2.21,-103.55" />
<path
id="polyline152"
class="st1"
style="fill:none;stroke:#000000"
d="m 1368.27,90.42 77.41,72.83 8.09,-72.34" />
<path
id="polyline154"
class="st1"
style="fill:none;stroke:#000000"
d="m 1509.05,111.79 -7.24,97.63 61,-40.79" />
<path
id="polyline156"
class="st1"
style="fill:none;stroke:#000000"
d="m 1586.65,201.31 -27.13,91.75 67.78,-28.37" />
<path
id="polyline158"
class="st1"
style="fill:none;stroke:#000000"
d="m 1651.86,295.15 -21.04,87.47 76.76,-41.85" />
<path
id="polyline160"
class="st1"
style="fill:none;stroke:#000000"
d="m 1731.64,357.63 17.47,94.15 62.36,-65.71" />
<path
id="polyline162"
class="st1"
style="fill:none;stroke:#000000"
d="m 1859.74,386.9 53.5,71.31 22.26,-87.89" />
<path
id="polyline164"
class="st1"
style="fill:none;stroke:#000000"
d="m 1977.79,349.46 73.65,47.81 -17.18,-95.93" />
<path
id="polyline166"
class="st1"
style="fill:none;stroke:#000000"
d="m 2061.96,266.82 93.23,12.94 -38.42,-91.58" />
<path
id="polyline168"
class="st1"
style="fill:none;stroke:#000000"
d="m 2158.71,141.59 73.9,47.43 3.02,-82.02" />
<path
id="polyline170"
class="st1"
style="fill:none;stroke:#000000"
d="m 2295.6,104.74 29.35,90.22 55.17,-76.77" />
<path
class="st1"
d="M2826.74,409.03s-39.7,10.62-34.86,56.63l21.48-12.99,13.38,18.12,12.51-19.18,21.79,16.7s12-44.65-34.3-59.28h0Z"
id="path172" />
<path
class="st1"
d="M2791.88,465.65s-43.45,77.18-35.66,103.45,25.72,10.53,29.68,3.41c9.73-17.51,23.35-77.97,26.27-106.85"
id="path174" />
<path
class="st1"
d="M2812.17,465.65s-25.82,106.37-20.7,121.93,35.29,20.43,43.56,1.95,0-117.3,0-117.3"
id="path176" />
<path
class="st1"
d="M2857.91,468.3s30.19,82.3,19.92,101.53c-10.27,19.24-28.25,17.1-35.09,2.12s-7.7-99.72-7.7-99.72"
id="path178" />
<path
class="st1"
d="M2819.37,412.01c-3.44,3.21-3.43-65.85,64.52-54.06s36.95,194.18,36.95,194.18l-48.77,328.54h-18.49s59.93-324.51,63.42-365.63c6.1-72.1-1.5-145.18-40.18-148.41-49.73-4.16-41.78,45.61-41.78,45.61"
id="path180" />
<path
class="st1"
d="M2894.91,726.81l27.24-16.55s.85-93.33,94.02-79.28c0,0,7.02,88.6-87.97,87.75l-35.77,24.81"
id="path182" />
<path
class="st1"
d="M2867.07,806.97l-19.47-31.49s31.34-87.25-67.76-95.72c0,0-28.8,92.33,58.87,98.26l23.73,40.66"
id="path184" />
<path
id="line186"
class="st1"
style="fill:none;stroke:#000000"
d="m 3002.6201,643.34003 -67.77,65.21997" />
<path
id="polyline188"
class="st1"
style="fill:none;stroke:#000000"
d="m 2990.05,641.46 -0.93,14.86 15.53,-1.69" />
<path
id="polyline190"
class="st1"
style="fill:none;stroke:#000000"
d="m 2976.6,641.46 v 26.92 l 26.02,-2.01" />
<path
id="polyline192"
class="st1"
style="fill:none;stroke:#000000"
d="m 2962,648.89 1.32,32.27 32.46,-1.4" />
<path
class="st1"
d="M2947.11,660.93l4.82,31.2s31.83.85,31.83,0"
id="path194" />
<path
class="st1"
d="M2934.85,681.16l5.12,22.47s25.17.62,25.46,0"
id="path196" />
<path
id="line198"
class="st1"
style="fill:none;stroke:#000000"
d="m 2784.79,686.53003 53.5301,82.03998" />
<path
id="polyline200"
class="st1"
style="fill:none;stroke:#000000"
d="m 2783.07,700.44 h 10.79 l 2.95,-11.45" />
<path
id="polyline202"
class="st1"
style="fill:none;stroke:#000000"
d="m 2781.35,713.32 h 20.92 l 5.7,-20.79" />
<path
id="polyline204"
class="st1"
style="fill:none;stroke:#000000"
d="m 2784.79,727.55 h 26.76 l 6.67,-27.11" />
<path
id="polyline206"
style="display:inline;fill:none;stroke:#000000"
class="st1"
d="m 2789.94,741.95 h 31.01 l 8.21,-33.39" />
<path
id="polyline208"
class="st1"
style="fill:none;stroke:#000000"
d="m 2803.97,757.12 h 26.88 l 7.47,-33.49" />
<path
class="st1"
d="M2908.76,130s-47.51,156.81,25.31,176.6c0,0,26.26,6.73,51.71,0l-77.02-176.6Z"
id="path210" />
<path
class="st1"
d="M2963.82,256.24l55.4-136.3s39.79,123.35,15.92,156.78-49.36,29.87-49.36,29.87"
id="path212" />
<path
id="polyline214"
class="st1"
style="fill:none;stroke:#000000"
d="m 2926.22,170.03 33.31,-54.07 41.11,49.7" />
<path
class="st1"
d="M2946.46,308.18s4.77,22.77,24.65,22.51c17.32-.23,23.81-13.52,24.65-24.88"
id="path216" />
<path
class="st1"
d="M2971.1,330.7s89.96,254.5,59.46,549.97H167.52"
id="path218" />
<path
class="st1"
d="M2982.21,328.28s89.86,223.58,65.72,552.39c0,0,84.28-151.25,84.28-227.75s-47.44-261.07-35.58-324.64c0,0-58.52,13.94-39.42,255.45"
id="path220" />
<g
id="g274"
style="display:inline">
<path
id="ellipse222"
class="st0"
transform="rotate(-66.78,296.31639,619.81639)"
style="fill:none;stroke:#000000;stroke-width:1px"
d="m 320.68001,619.82001 a 24.360001,36.130001 0 0 1 -24.36,36.13 24.360001,36.130001 0 0 1 -24.36,-36.13 24.360001,36.130001 0 0 1 24.36,-36.13 24.360001,36.130001 0 0 1 24.36,36.13 z" />
<path
class="st1"
d="m 288.95,590.6 c 0,0 7.37,-53.85 0,-63.2 -3.7,-4.69 -25.07,-12.01 -8.11,63.2"
id="path224" />
<path
class="st1"
d="m 276.75,591.96 c 0,0 -7.05,-53.89 -16.63,-60.98 -4.8,-3.55 -27.35,-4.99 8.8,63.11"
id="path226" />
<path
class="st1"
d="m 266.24,595.31 c 0,0 -26.11,-47.67 -37.6,-50.8 -5.77,-1.57 -27.3,5.26 31.08,55.63"
id="path228" />
<path
class="st1"
d="m 259.96,602.4 c 0,0 -41.41,-35.21 -53.26,-34.03 -5.95,0.59 -23.62,14.66 48.89,40.87 0,0 -40.01,-4.43 -41.51,3.95 -1.5,8.38 3,14.18 9,15.28 6,1.1 36.88,-11.02 36.88,-11.02 l -32.38,20.12 c 0,0 -6,8 5.5,13.5 11.5,5.5 29.68,-19.99 29.68,-19.99"
id="path230" />
<path
class="st1"
d="m 299.7,593.32 c 0,0 24.74,-48.4 20.86,-59.66 -1.94,-5.65 -19.7,-19.62 -28.52,56.98"
id="path232" />
<path
class="st1"
d="m 313.08,597.51 c 0,0 35.13,-41.47 33.93,-53.32 -0.6,-5.95 -14.7,-23.6 -40.77,48.97"
id="path234" />
<path
class="st1"
d="m 323.69,607.04 c 0,0 43.28,-32.88 44.67,-44.71 0.7,-5.93 -9.24,-26.22 -50.41,38.97"
id="path236" />
<path
class="st1"
d="m 331.93,617.45 c 0,0 49.83,-21.72 53.98,-32.88 2.08,-5.6 -2.78,-27.66 -58.2,25.95"
id="path238" />
<path
class="st1"
d="m 335.13,628.47 c 0,0 54.26,-3.22 62,-12.26 3.88,-4.54 6.92,-26.93 -63.57,4.31"
id="path240" />
<path
class="st1"
d="m 333.33,638.91 c 0,0 49.93,21.48 60.91,16.87 5.51,-2.31 18.27,-20.96 -58.75,-24.68"
id="path242" />
<path
class="st1"
d="m 329.87,642.05 c 72.18,27.1 54.33,40.95 48.38,41.47 -11.86,1.03 -52.83,-34.69 -52.83,-34.69 0,0 21.31,23.26 17.75,30.76 -3.56,7.5 -17.06,4.22 -27.56,-27.4"
id="path244" />
<path
class="st1"
d="m 266.24,637.07 c 0,0 -24.6,13.69 -23.13,19.35 1.47,5.66 5.81,12.16 19.65,10.66 13.84,-1.5 11.62,-27.51 11.62,-27.51"
id="path246" />
<path
class="st1"
d="m 312.35,651.86 c 0,0 13.8,23.47 8.63,28.92 -5.17,5.45 -13.25,1.7 -16.72,-5.94 -1.65,-3.63 -3.31,-19.69 -1.81,-24.09"
id="path248" />
<path
class="st1"
d="m 279.02,644.81 c 0,0 -11.43,22.33 -8.58,27.55 2.48,4.55 9.1,7.06 16.09,1.61 6.46,-5.04 -0.25,-27.58 -0.25,-27.58"
id="path250" />
<path
class="st1"
d="m 292.04,648.11 c 0,0 -5.7,19.72 0,26.89 2.8,3.53 8.59,5.11 9.82,0 1.78,-7.4 -1.73,-24.25 -1.73,-24.25"
id="path252" />
<path
class="st1"
d="m 253.7,667.3 c 0,0 -39.13,90.39 -22.11,209.82"
id="path254" />
<path
class="st1"
d="m 261.97,667.3 c 0,0 -39.13,90.39 -22.11,209.82"
id="path256" />
<path
class="st1"
d="m 235.59,819.54 c 0,0 48.82,-112.23 107.59,-87.46 58.77,24.77 69.77,76.43 69.77,76.43 0,0 -25.41,11.86 -52.52,-5.08 -27.11,-16.94 -70.15,-27.95 -124.86,28.8"
id="path258" />
<path
class="st1"
d="m 227.31,772.21 c 0,0 -17.65,-95.85 -36.28,-105.16 -18.63,-9.31 -56.75,5.93 -56.75,5.93 0,0 -32.19,-2.55 -49.98,35.57 0,0 47.44,10.17 87.25,-4.23 0,0 37.84,0 55.77,90.64"
id="path260" />
<path
id="circle262"
class="st1"
style="fill:none;stroke:#000000"
d="m 278.81,604.83002 a 1.03,1.03 0 0 1 -1.03,1.03 1.03,1.03 0 0 1 -1.03,-1.03 1.03,1.03 0 0 1 1.03,-1.03 1.03,1.03 0 0 1 1.03,1.03 z" />
<path
id="circle264"
class="st1"
style="fill:none;stroke:#000000"
d="m 278.03999,611.71997 a 1.3,1.3 0 0 1 -1.3,1.3 1.3,1.3 0 0 1 -1.3,-1.3 1.3,1.3 0 0 1 1.3,-1.3 1.3,1.3 0 0 1 1.3,1.3 z" />
<path
id="circle266"
class="st1"
style="fill:none;stroke:#000000"
d="m 287.81001,611.78003 a 1.36,1.36 0 0 1 -1.36,1.36 1.36,1.36 0 0 1 -1.36,-1.36 1.36,1.36 0 0 1 1.36,-1.36 1.36,1.36 0 0 1 1.36,1.36 z" />
<path
id="circle268"
class="st1"
style="fill:none;stroke:#000000"
d="m 295.30001,606.62 a 0.75999999,0.75999999 0 0 1 -0.76,0.76 0.75999999,0.75999999 0 0 1 -0.76,-0.76 0.75999999,0.75999999 0 0 1 0.76,-0.76 0.75999999,0.75999999 0 0 1 0.76,0.76 z" />
<path
id="circle270"
class="st1"
style="fill:none;stroke:#000000"
d="m 286.45001,623.46997 a 1.22,1.22 0 0 1 -1.22,1.22 1.22,1.22 0 0 1 -1.22,-1.22 1.22,1.22 0 0 1 1.22,-1.22 1.22,1.22 0 0 1 1.22,1.22 z" />
<path
id="circle272"
class="st1"
style="fill:none;stroke:#000000"
d="m 297.66001,625.87 a 1.1799999,1.1799999 0 0 1 -1.18,1.18 1.1799999,1.1799999 0 0 1 -1.18,-1.18 1.1799999,1.1799999 0 0 1 1.18,-1.18 1.1799999,1.1799999 0 0 1 1.18,1.18 z" />
</g>
<g
id="g284">
<path
class="st1"
d="M231.04,397.37s-61.7-60.98-55.77-12.8,42.72,38.54,56.44,35.68c0,0-29.62,18.49-20.7,30.22s30.96,14.48,33.85,5.15c2.89-9.33.58-22.09.58-22.09"
id="path276" />
<path
class="st1"
d="M261.15,449.43c-28.02-40.68-25.21-70.98-25.21-70.98,0,0-13.97-6.09-20.88-21.17"
id="path278" />
<path
class="st1"
d="M246.2,391.31s-3.68-53.04,13.76-54.35c17.45-1.31,35.56,13.22,35.41,34.75s-38.86,39.05-38.86,39.05c0,0,33.21-8.14,38.5,5.15s-7.41,32.93-17.09,29.25-25.24-24.7-25.24-24.7"
id="path280" />
<path
class="st1"
d="M213.16,365.46s9.86,11.91,19.57,13.64"
id="path282" />
</g>
<eggbot
layer="0"
node="0"
lastpath="0"
lastpathnc="0"
totaldeltax="0"
totaldeltay="0" />
</svg>

After

Width:  |  Height:  |  Size: 23 KiB

View File

@@ -0,0 +1,23 @@
import re
import unittest
from pathlib import Path
class DeployWorkflowTests(unittest.TestCase):
def test_deploy_workflow_triggers_on_master_pushes(self):
workflow_path = Path(__file__).resolve().parents[1] / ".gitea" / "workflows" / "deploy-ftp.yml"
workflow_text = workflow_path.read_text(encoding="utf-8")
branch_block_match = re.search(
r"on:\s*\n\s*push:\s*\n\s*branches:\s*\n(?P<branches>(?:\s*-\s*[^\n]+\n)+)",
workflow_text,
)
self.assertIsNotNone(branch_block_match, "workflow should define push branches")
branches = re.findall(r"-\s*([^\n]+)", branch_block_match.group("branches"))
self.assertEqual(branches, ["master"])
if __name__ == "__main__":
unittest.main()

View File

@@ -0,0 +1,83 @@
import json
import tempfile
import unittest
from pathlib import Path
from scripts.package_firmware import build_manifest, extract_firmware_version, package_bundle
class PackageFirmwareTests(unittest.TestCase):
def test_extract_firmware_version_reads_init_string(self):
header_text = '#define initSting "EBBv13_and_above Protocol emulated by Eggduino-Firmware V1.6a"\n'
self.assertEqual(extract_firmware_version(header_text), "1.6a")
def test_build_manifest_matches_expected_esp32_offsets(self):
manifest = build_manifest("1.6a")
self.assertEqual(manifest["name"], "EggDuino ESP32 Firmware")
self.assertEqual(manifest["version"], "1.6a")
self.assertTrue(manifest["new_install_prompt_erase"])
self.assertEqual(manifest["builds"][0]["chipFamily"], "ESP32")
self.assertEqual(
manifest["builds"][0]["parts"],
[
{"path": "bootloader.bin", "offset": 4096},
{"path": "partitions.bin", "offset": 32768},
{"path": "boot_app0.bin", "offset": 57344},
{"path": "firmware.bin", "offset": 65536},
],
)
def test_package_bundle_copies_outputs_and_removes_stale_files(self):
with tempfile.TemporaryDirectory() as temp_dir:
temp_path = Path(temp_dir)
build_dir = temp_path / "build"
build_dir.mkdir()
header_path = temp_path / "EggDuino.h"
output_dir = temp_path / "firmware"
output_dir.mkdir()
boot_app0_path = temp_path / "boot_app0.bin"
build_artifacts = {
"bootloader.bin": "bootloader",
"partitions.bin": "partitions",
"firmware.bin": "firmware-bin",
"firmware.elf": "firmware-elf",
"firmware.map": "firmware-map",
}
for file_name, contents in build_artifacts.items():
(build_dir / file_name).write_text(contents, encoding="utf-8")
header_path.write_text(
'#define initSting "EBBv13_and_above Protocol emulated by Eggduino-Firmware V1.6b"\n',
encoding="utf-8",
)
boot_app0_path.write_text("boot-app0", encoding="utf-8")
(output_dir / "stale.txt").write_text("old", encoding="utf-8")
package_bundle(
build_dir=build_dir,
boot_app0_path=boot_app0_path,
header_path=header_path,
output_dir=output_dir,
)
self.assertFalse((output_dir / "stale.txt").exists())
expected_files = {
"bootloader.bin": "bootloader",
"partitions.bin": "partitions",
"firmware.bin": "firmware-bin",
"firmware.elf": "firmware-elf",
"firmware.map": "firmware-map",
"boot_app0.bin": "boot-app0",
}
for file_name, contents in expected_files.items():
self.assertEqual((output_dir / file_name).read_text(encoding="utf-8"), contents)
manifest = json.loads((output_dir / "manifest.json").read_text(encoding="utf-8"))
self.assertEqual(manifest["version"], "1.6b")
if __name__ == "__main__":
unittest.main()