569 lines
101 KiB
OpenSCAD
569 lines
101 KiB
OpenSCAD
// Generated by SolidPython <Unknown> on 2025-09-08 06:43:27
|
|
|
|
|
|
scale(v = 0.0000010000) {
|
|
translate(v = [-176162531, -72954546, 0]) {
|
|
difference() {
|
|
linear_extrude(convexity = 10, height = 2850000) {
|
|
polygon(points = [[221111162.7417431474, 51504136.1925114766], [221002100.8549067378, 51602983.4876628667], [220898028.5565539300, 51707053.7829912156], [220799187.4055767059, 51816104.6726151481], [220705815.4567403793, 51929873.5120421499], [220618137.5924647748, 52048086.2937974632], [220536364.9812073708, 52170458.3073561117], [220460694.5688712001, 52296694.8248580173], [220391308.6044689715, 52426491.8109482452], [220328374.2011841536, 52559536.6550326645], [220272042.9338865876, 52695508.9241863117], [220222450.4740695357, 52834081.1349053234], [220179716.2630916834, 52974919.5418341309], [220143943.2245068550, 53117684.9415800571], [220115217.5161775053, 53262033.4896680042], [220093608.3227665722, 53407617.5286776870], [220079167.6891097724, 53554086.4255596548], [220071930.3948673010, 53701087.4161216170], [220071913.8707585931, 53848266.4546466470], [220079118.1565813422, 53995269.0665961355], [220093525.9011154175, 54141741.2023476064], [220115102.4039127231, 54287330.0899088308], [220143795.6988714933, 54431685.0845522285], [220179536.6793950796, 54574458.5133318007], [220222239.2648314238, 54715306.5124343708], [220271800.6077955961, 54853889.8553650752], [220328101.3418724537, 54989874.7699568421], [220391005.8691067100, 55122933.7422496080], [220460362.6865841150, 55252746.3052921742], [220536004.7513197660, 55378999.8109728545], [220617749.8825751543, 55501390.1830215976], [220705401.2006317377, 55619622.6493629590], [220798747.6009678245, 55733412.4520627260], [220897564.2626952529, 55842485.5331561118], [221001613.1900311112, 55946579.1947044656], [221110652.8785194755, 56045450.9765909687], [221180934.9343814850, 56106104.2244711742], [221180953.3225782514, 56106120.4915215373], [221344551.1388930082, 56254466.1425165683], [221344569.1222088039, 56254482.8560757861], [221371176.6604992151, 56279827.5169951245], [221371211.3693811297, 56279862.2430811599], [221396542.8419271708, 56306482.3375511691], [221396559.5465727746, 56306500.3291470855], [221544824.1090993881, 56470171.6374789476], [221544840.3670355678, 56470190.0337345377], [221568834.7095992565, 56498021.3911554590], [221568865.8464210331, 56498059.3530556262], [221591465.2180591226, 56527034.8829472438], [221591480.0781772435, 56527054.4257105514], [221722982.6177988648, 56704474.1533214524], [221722996.9936838746, 56704494.0549957156], [221744146.9161808193, 56734543.9087273777], [221744174.1808887720, 56734584.7406172901], [221763823.6700828969, 56765636.4797864035], [221763836.5424722433, 56765657.3853909448], [221877309.8193014860, 56955115.8059417307], [221877322.1746004224, 56955137.0212498009], [221895423.8632837832, 56987115.7922980860], [221895446.9931383133, 56987159.1006963924], [221911957.2452446222, 57019987.8153588995], [221911968.0058588982, 57020009.8823453113], [222006318.5211482048, 57219681.2572004274], [222006328.7367977500, 57219703.5816984698], [222021207.7525883913, 57253303.1028273180], [222021226.5246959031, 57253348.4703874663], [222034438.4367032051, 57287637.8027235493], [222034446.9818463922, 57287660.8184406981], [222108765.5156174600, 57495620.9906144068], [222108773.4931733012, 57495644.2091697305], [222120286.4526627660, 57530540.6945905685], [222120300.6861236393, 57530587.6841226742], [222130086.9398685098, 57566007.2008976862], [222130093.1871944070, 57566030.9435518682], [222183663.5600438714, 57780275.8800737187], [222183669.2226293385, 57780299.7689379528], [222191705.1798125505, 57816156.9345130622], [222191714.7374642789, 57816205.0931968987], [222197981.0265470445, 57852413.4700194299], [222197984.9158525169, 57852437.7108117267], [222230290.8905013800, 58070902.8148307130], [222230294.1835482717, 58070927.1437959746], [222234775.6989666820, 58107399.4476787969], [222234780.4887058437, 58107448.3114274666], [222237466.4272851348, 58144096.6219602451], [222237467.9210904241, 58144121.1272913814], [222248198.1771662235, 58364701.1338128000], [222248199.0689406991, 58364725.6684301123], [222249969.0919772685, 58438291.0878120512], [222249969.3811834455, 58438315.6369274780], [222245501.6701330841, 67454047.5810131580], [222249043.7261606157, 67601261.9571875334], [222259806.3593977690, 67748112.7928943783], [222277763.9207385778, 67894258.3648860902], [222302873.1215502620, 68039346.3735452592], [222335073.4334041476, 68183027.0686249435], [222374287.2339859605, 68324954.0923593193], [222420419.9942122102, 68464785.3143943846], [222473360.5061040521, 68602183.6565344334], [222532981.1508640647, 68736817.9052991718], [222599138.2065169811, 68868363.5103545785], [222671672.1943659186, 68996503.3668738455], [222750408.2634333372, 69120928.5799535215], [222835156.6119576097, 69241339.2092369944], [222925712.9449315071, 69357444.9919544607], [223021858.9665760994, 69468966.0426308215], [223123362.9065673649, 69575633.5277812481], [223229980.0787429214, 69677190.3139625043], [223341453.4709432721, 69773391.5876197666], [223457514.3645704389, 69864005.4452389181], [223577882.9823589325, 69948813.4523713440], [223702269.1628118157, 70027611.1701961309], [223830373.0596654117, 70100208.6483410448], [223961885.8647005558, 70166430.8827781230], [224096490.5521587133, 70226118.2376902550], [224233862.6429656744, 70279126.8302897066], [224373670.9869244695, 70325328.8776638508], [224515578.5609878898, 70364613.0048092008], [224659243.2816880643, 70396884.5131127089], [224804318.8297671378, 70422065.6086333841], [224950455.4850156903, 70440095.5896326154], [225097300.9693112969, 70450930.9929023236], [225244513.5721580386, 70454546.0000000000], [228626562.9769260883, 70454546.0000000000], [228626587.6185330153, 70454546.3036504984], [228700429.5018147826, 70456366.4389982969], [228700454.1284568310, 70456367.3497653753], [228870876.4017981589, 70464773.9659038335], [228870900.8483169973, 70464775.4721206874], [228907461.1312516332, 70467477.8570905924], [228907509.8769856691, 70467482.6630683690], [228943893.9726715982, 70471972.0676938146], [228943918.2426441908, 70471975.3645716459], [229113837.9105246663, 70497180.5663088858], [229113862.1419389844, 70497184.4651764631], [229150056.3508282900, 70503464.7561804354], [229150104.4901797175, 70503474.3316927850], [229185946.9422862530, 70511523.0234656483], [229185970.8212260008, 70511528.6943424940], [229352528.6769503355, 70553249.2653188556], [229352552.4095278978, 70553255.5205062479], [229387956.7572444081, 70563053.2230444252], [229388003.7262273431, 70563067.4709296227], [229422884.6773790419, 70574590.5807094723], [229422907.8854920268, 70574598.5648248941], [229584574.3885568678, 70632443.7645664066], [229584597.3937399983, 70632452.3158327490], [229618870.9170604944, 70645673.0726735443], [229618916.2633379698, 70645691.8557166755], [229652499.7909074426, 70660578.4096571207], [229652522.1046868563, 70660588.6301196963], [229807740.3182907701, 70734001.3777311146], [229807762.3745269775, 70734012.1427230537], [229840575.0006864667, 70750528.6307510585], [229840618.2875490189, 70750551.7680611461], [229872580.9638073444, 70768658.4005100280], [229872602.1683593392, 70768670.7588911355], [230019877.2562547922, 70856944.0494816452], [230019898.1511304677, 70856956.9245263934], [230050933.8766011596, 70876610.0809327215], [230050974.6871727109, 70876637.3496848196], [230081008.6940752566, 70897789.6838737726], [230081028.5851883292, 70897804.0611554384], [230218942.2077699602, 71000087.7746814638], [230218961.7400560379, 71000102.6357853264], [230247921.6738363802, 71022703.1899305582], [230247959.6150887609, 71022734.3275116682], [230275775.7087302208, 71046728.6548990011], [230275794.0948421061, 71046744.9126201570], [230403018.0685333312, 71162054.0010065883], [230403036.0501232147, 71162070.7050489932], [230429641.2922197580, 71187401.0012420416], [230429675.9987579584, 71187435.7077802569], [230455006.2949510217, 71214040.9498767853], [230455022.9989933968, 71214058.9314666688], [230570332.0873798430, 71341282.9051578939], [230570348.3451009989, 71341301.2912697941], [230594342.6724883318, 71369117.3849112540], [230594373.8100694418, 71369155.3261636198], [230616974.3642146587, 71398115.2599439472], [230616989.2253185511, 71398134.7922300398], [230719272.9388445318, 71536048.4148116410], [230719287.3161261976, 71536068.3059247136], [230740439.6503151059, 71566102.3128272295], [230740466.9190672040, 71566143.1233987659], [230760120.0754736662, 71597178.8488696814], [230760132.9505184293, 71597199.7437453717], [230848406.2411091328, 71744474.8316411823], [230848418.5994902253, 71744496.0361931473], [230866525.2319389284, 71776458.7124511451], [230866548.3692490160, 71776501.9993137121], [230883064.8572768867, 71809314.6254729033], [230883075.6222688258, 71809336.6817091256], [230956488.3698801398, 71964554.8953128010], [230956498.5903427005, 71964577.2090922296], [230971385.1442833543, 71998160.7366621345], [230971403.9273265004, 71998206.0829396099], [230984624.6841671467, 72032479.6062596738], [230984633.2354334593, 72032502.6114428192], [231042478.4351751208, 72194169.1145079732], [231042486.4192905426, 72194192.3226209581], [231054009.5290703773, 72229073.2737726718], [231054023.7769555748, 72229120.2427556068], [231063821.4794937372, 72264524.5904721171], [231063827.7346811295, 72264548.3230496794], [231105548.3056575060, 72431106.1787739843], [231105553.9765343666, 72431130.0577137321], [231113602.6683072150, 72466972.5098202974], [231113612.2438195646, 72467020.6491716951], [231119892.5348235369, 72503214.8580610305], [231119896.4336911142, 72503239.0894753337], [231145090.5839974284, 72673084.2546603382], [231145093.8870220780, 72673108.5744595975], [231149590.6474861503, 72709567.3451128900], [231149595.4584082365, 72709616.1912244856], [231152297.8552426696, 72746251.6912700534], [231152299.3602421880, 72746276.1881593317], [231160724.4564382732, 72917772.9610165507], [231160725.3598007560, 72917797.4874623567], [231161626.8826947808, 72954521.4587714970], [231161626.8826947808, 72954570.5412285328], [231160725.3598007560, 72991294.5125376433], [231160724.4564382732, 72991319.0389834493], [231152299.3602421880, 73162815.8118406087], [231152297.8552426696, 73162840.3087298870], [231149595.4584082365, 73199475.8087754250], [231149590.6474861503, 73199524.6548870206], [231145093.8870220482, 73235983.4255405962], [231145090.5839974284, 73236007.7453398556], [231119896.4336911440, 73405852.9105245769], [231119892.5348235369, 73405877.1419388801], [231113612.2438195646, 73442071.3508282900], [231113602.6683072150, 73442119.4901796877], [231105553.9765343070, 73477961.9422863573], [231105548.3056574762, 73477985.8212261051], [231063827.7346811295, 73644543.6769503206], [231063821.4794937372, 73644567.4095278829], [231054023.7769555748, 73679971.7572443932], [231054009.5290703773, 73680018.7262273282], [231042486.4192905426, 73714899.6773790419], [231042478.4351751208, 73714922.8854920268], [230984633.2354335785, 73876589.3885568678], [230984624.6841672659, 73876612.3937400132], [230971403.9273264408, 73910885.9170605093], [230971385.1442833245, 73910931.2633379847], [230956498.5903428793, 73944514.7909074277], [230956488.3698803186, 73944537.1046868563], [230883075.6222688854, 74099755.3182907552], [230883064.8572769463, 74099777.3745269775], [230866548.3692489266, 74132590.0006864518], [230866525.2319388390, 74132633.2875490189], [230848418.5994899869, 74164595.9638073593], [230848406.2411088645, 74164617.1683593243], [230760132.9505183697, 74311892.2562547773], [230760120.0754736066, 74311913.1511304677], [230740466.9190672636, 74342948.8766011596], [230740439.6503151655, 74342989.6871726960], [230719287.3161262274, 74373023.6940752566], [230719272.9388445616, 74373043.5851883292], [230616989.2253185511, 74510957.2077699602], [230616974.3642146587, 74510976.7400560528], [230594373.8100694418, 74539936.6738363802], [230594342.6724883318, 74539974.6150887460], [230570348.3451009989, 74567790.7087302059], [230570332.0873798430, 74567809.0948421061], [230455022.9989933968, 74695033.0685333312], [230455006.2949510217, 74695051.0501232147], [230429675.9987579584, 74721656.2922197431], [230429641.2922197580, 74721690.9987579584], [230403036.0501232147, 74747021.2949510068], [230403018.0685333312, 74747037.9989934117], [230275794.0948421061, 74862347.0873798430], [230275775.7087302208, 74862363.3451009989], [230247959.6150887609, 74886357.6724883318], [230247921.6738363802, 74886388.8100694418], [230218961.7400560379, 74908989.3642146736], [230218942.2077699602, 74909004.2253185362], [230081028.5851883590, 75011287.9388445318], [230081008.6940752864, 75011302.3161261976], [230050974.6871727705, 75032454.6503151208], [230050933.8766012192, 75032481.9190672189], [230019898.1511303186, 75052135.0754736811], [230019877.2562546134, 75052147.9505184293], [229872602.1683588028, 75140421.2411091328], [229872580.9638068676, 75140433.5994902402], [229840618.2875488400, 75158540.2319389284], [229840575.0006862879, 75158563.3692490160], [229807762.3745270967, 75175079.8572768867], [229807740.3182908893, 75175090.6222688258], [229652522.1046872139, 75248503.3698801398], [229652499.7909077704, 75248513.5903427154], [229618916.2633378506, 75263400.1442833692], [229618870.9170603752, 75263418.9273265004], [229584597.3937403262, 75276639.6841671318], [229584574.3885571957, 75276648.2354334742], [229422907.8854920268, 75334493.4351751059], [229422884.6773790419, 75334501.4192905277], [229388003.7262273431, 75346024.5290703773], [229387956.7572444081, 75346038.7769555748], [229352552.4095278978, 75355836.4794937521], [229352528.6769503355, 75355842.7346811444], [229185970.8212261200, 75397563.3056574762], [229185946.9422863722, 75397568.9765343219], [229150104.4901796877, 75405617.6683072150], [229150056.3508282900, 75405627.2438195646], [229113862.1419388652, 75411907.5348235518], [229113837.9105245769, 75411911.4336911291], [228943918.2426442504, 75437116.6354283392], [228943893.9726716876, 75437119.9323061705], [228907509.8769856691, 75441609.3369316310], [228907461.1312516332, 75441614.1429094076], [228870900.8483168781, 75444316.5278793275], [228870876.4017980397, 75444318.0340961814], [228700454.1284568310, 75452724.6502346247], [228700429.5018147826, 75452725.5610017031], [228626587.6185330153, 75454545.6963495016], [228626562.9769260883, 75454546.0000000000], [225239063.5481050611, 75454546.0000000000], [225091943.7250114977, 75458156.4491203874], [224945190.3419673443, 75468978.2015584111], [224799144.4491491020, 75486985.5042897910], [224654157.6619927585, 75512135.0035065114], [224510579.0460658073, 75544366.1500758529], [224368754.2766665220, 75583601.3453168869], [224229024.8065888882, 75629746.1278242469], [224091727.0440516770, 75682689.4008902609], [223957191.5427706540, 75742303.6999786198], [223825742.2061302662, 75808445.4996030778], [223697695.5073632896, 75880955.5588752627], [223573359.7276202738, 75959659.3048876673], [223453034.2137605548, 76044367.2530105412], [223337008.6576561928, 76134875.4630878568], [223225562.3987373710, 76230966.0304382741], [223118963.7514644265, 76332407.6104750335], [223017469.3593428731, 76438955.9756832570], [222921323.5770351887, 76550354.6036159992], [222830757.8820629716, 76666335.2944866866], [222745990.3175057769, 76786618.8168819249], [222667224.9670501947, 76910915.5800269693], [222594651.4636430144, 77038926.3309974819], [222528444.5329380631, 77170342.8751891553], [222468763.5726307034, 77304848.8183204681], [222415752.2686990798, 77442120.3281691521], [222369538.2494683266, 77581826.9142245650], [222330232.7783380747, 77723632.2233635634], [222297930.4859078228, 77867194.8496436477], [222272709.1421469450, 78012169.1562628001], [222254629.4691588283, 78158206.1077011973], [222243734.9949878156, 78304954.1100495905], [222240051.6416610777, 78452072.1259352416], [222224992.8672352731, 108840311.6740783453], [222224992.5541999936, 108840336.2028812915], [222223152.5955155194, 108913839.9126072973], [222223151.6809085011, 108913864.4263516068], [222212220.5576677322, 109134254.4667775333], [222212219.0420393944, 109134278.9507117718], [222209501.1981136203, 109170894.9135504812], [222209496.3678022325, 109170943.7330818027], [222204986.0322219133, 109207382.3428691030], [222204982.7204455435, 109207406.6490885317], [222172512.9503852725, 109425665.6085987538], [222172509.0433991551, 109425689.8262705058], [222166217.0710924268, 109461863.3869842291], [222166207.4812520742, 109461911.4984538555], [222158149.0149735510, 109497732.9519623071], [222158143.3378901184, 109497756.8168086112], [222104447.3101381660, 109711784.8429595828], [222104441.0493831038, 109711808.5613725036], [222094635.4832707047, 109747191.6969519854], [222094621.2261645794, 109747238.6374832094], [222083092.1590638161, 109782098.2993006557], [222083084.1712921262, 109782121.4931720197], [222008678.4911480546, 109989859.4389989376], [222008669.9368582964, 109989882.4299600273], [221995445.1155275106, 110024134.7220154554], [221995426.3283221126, 110024180.0399971008], [221980537.5806558728, 110057742.5280321687], [221980527.3590456247, 110057764.8277821541], [221886127.8777600229, 110257214.0626961589], [221886117.1122356951, 110257236.1050111800], [221869600.2706629038, 110290028.0149076432], [221869577.1341084242, 110290071.2743389159], [221851471.9493572414, 110322013.6865108162], [221851459.5922497511, 110322034.8775952607], [221737974.5198781490, 110511276.5160447359], [221737961.6466935277, 110511297.3976462930], [221718311.6921238005, 110542313.4369752109], [221718284.4288152754, 110542354.2216604948], [221697136.9955514669, 110572369.2425095141], [221697122.6218335330, 110572389.1210506707], [221565643.7894139290, 110749602.4839786440], [221565628.9324209094, 110749622.0039664507], [221543034.9155371785, 110778563.7698286176], [221543003.7877727151, 110778601.6873816550], [221519017.5638036728, 110806400.5447313190], [221519001.3117637038, 110806418.9194792807], [221370793.6668995619, 110969899.0509273410], [221370776.9690361321, 110969917.0215011388], [221345456.2651131749, 110996506.0674237609], [221345421.5723706484, 110996540.7530427128], [221318827.3272888958, 111021855.9962517023], [221318809.3532865047, 111021872.6904244274], [221155298.7901809216, 111170046.7607859820], [221155280.4120959640, 111170063.0090522766], [221127476.6296541691, 111194043.5238952786], [221127438.7057096958, 111194074.6438725144], [221098492.3006742001, 111216662.7169592232], [221098472.7776358724, 111216677.5699434131], [220921232.4186777472, 111348120.0080315471], [220921212.5371853113, 111348134.3776670247], [220891193.1742486060, 111369275.6467660815], [220891152.3839655519, 111369302.9016987234], [220860132.3100842834, 111388946.4865714312], [220860111.4258396029, 111388959.3554676473], [220670846.4867121577, 111502405.5638274997], [220670825.2930905521, 111502417.9165830314], [220638879.1636111438, 111520516.5414350331], [220638835.8994295895, 111520539.6691055000], [220606040.5984169245, 111537049.7763644308], [220606018.5538916290, 111537060.5373620391], [220406549.9378272295, 111631419.0588622689], [220406527.6359786987, 111631429.2758929580], [220372962.0911794901, 111646311.1310382038], [220372916.7693407834, 111646329.9089369625], [220338661.7622315288, 111659547.6961270720], [220338638.7695142627, 111659556.2456953675], [220130885.5485274792, 111733919.2643521279], [220130862.3530162573, 111733927.2473607063], [220096000.3243882656, 111745449.1556305438], [220095953.3809302449, 111745463.4030969143], [220060568.2324798703, 111755261.7029170543], [220060544.5127817690, 111755267.9588012844], [219846505.4644235373, 111808920.0338064581], [219846481.5984119177, 111808925.7059890181], [219810658.4908164442, 111816976.8160016090], [219810610.3773785233, 111816986.3959618211], [219774435.5253425837, 111823270.9397331029], [219774411.3068690300, 111823274.8417459130], [219556145.6841481924, 111855699.7906657457], [219556121.3772491813, 111855703.0974506736], [219519681.8420131505, 111860205.9501039386], [219519633.0214909315, 111860210.7703899443], [219483016.5013024211, 111862921.0950063318], [219482992.0170574188, 111862922.6056067497], [219262599.7365230322, 111873808.4705342650], [219262575.2225914299, 111873809.3801072240], [219189071.1365723610, 111875634.2444365919], [219189046.6077056527, 111875634.5524347574], [181660672.9855911434, 111886524.9716200531], [181513534.9926947653, 111890179.0632814020], [181366765.6735552549, 111901046.2351506054], [181220706.2076064348, 111919100.6216504574], [181075708.3349229097, 111944298.7442483902], [180932121.2390536070, 111976579.9208825231], [180790290.7061163485, 112015866.4120966643], [180650558.2920792103, 112062063.6082517654], [180513260.5002254844, 112115060.2573645264], [180378727.9707856178, 112174728.7330249399], [180247284.6846917868, 112240925.3417453021], [180119247.1833679378, 112313490.6690024287], [179994923.8064343929, 112392249.9631396979], [179874613.9491658509, 112477013.5562034249], [179758607.3414870501, 112567577.3207015246], [179647183.3502480984, 112663723.1611812711], [179540610.3064522147, 112765219.5394474119], [179439144.8590608835, 112871822.0321529061], [179343031.3569359183, 112983273.9194149673], [179252501.2603941858, 113099306.8030525595], [179167772.5838086605, 113219641.2529387921], [179089049.3705872893, 113343987.4799227118], [179016521.2017926574, 113472046.0337039381], [178950362.7395972311, 113603508.5239621699], [178890733.3066587746, 113738058.3630281985], [178837776.5024430156, 113875371.5282836258], [178791619.8574057221, 114015117.3424751908], [178752374.5258748829, 114156959.2700499892], [178720135.0183687210, 114300555.7276001126], [178694978.9739962518, 114445560.9064616859], [178676966.9734864235, 114591625.6054920703], [178666142.3932981193, 114738398.0720137060], [178662531.0000000000, 114885537.1191011965], [178662531.0000000000, 125418577.9769262373], [178662530.6963495016, 125418602.6185331643], [178660710.5610017180, 125492444.5018143207], [178660709.6502346396, 125492469.1284563839], [178652303.0340961814, 125662891.4017978758], [178652301.5278793275, 125662915.8483167142], [178649599.1429093778, 125699476.1312516332], [178649594.3369316161, 125699524.8769856691], [178645104.9323061407, 125735908.9726718068], [178645101.6354283094, 125735933.2426443994], [178619896.4336911142, 125905852.9105247408], [178619892.5348235369, 125905877.1419390440], [178613612.2438195646, 125942071.3508284241], [178613602.6683072150, 125942119.4901798218], [178605553.9765343368, 125977961.9422863722], [178605548.3056574762, 125977985.8212261200], [178563827.7346811295, 126144543.6769503355], [178563821.4794937372, 126144567.4095278978], [178554023.7769555449, 126179971.7572444677], [178554009.5290703475, 126180018.7262274027], [178542486.4192903638, 126214899.6773795038], [178542478.4351749420, 126214922.8854924887], [178484633.2354337275, 126376589.3885565102], [178484624.6841673851, 126376612.3937396556], [178471403.9273263812, 126410885.9170606583], [178471385.1442832351, 126410931.2633381337], [178456498.5903427005, 126444514.7909077853], [178456488.3698801398, 126444537.1046872139], [178383075.6222693026, 126599755.3182898760], [178383064.8572773635, 126599777.3745260984], [178366548.3692490160, 126632590.0006862283], [178366525.2319389284, 126632633.2875487953], [178348418.5994898677, 126664595.9638074636], [178348406.2411087751, 126664617.1683594286], [178260132.9505181611, 126811892.2562550604], [178260120.0754733980, 126811913.1511307508], [178240466.9190672934, 126842948.8766010851], [178240439.6503151953, 126842989.6871726215], [178219287.3161260784, 126873023.6940754205], [178219272.9388444126, 126873043.5851884931], [178116989.2253185213, 127010957.2077700049], [178116974.3642146587, 127010976.7400560975], [178094373.8100695014, 127039936.6738362759], [178094342.6724883914, 127039974.6150886416], [178070348.3451009393, 127067790.7087302655], [178070332.0873797834, 127067809.0948421657], [177955022.9989930391, 127195033.0685337633], [177955006.2949506342, 127195051.0501236469], [177929675.9987582266, 127221656.2922194898], [177929641.2922200263, 127221690.9987577051], [177903036.0501227677, 127247021.2949514389], [177903018.0685328543, 127247037.9989938438], [177775794.0948420465, 127362347.0873798728], [177775775.7087301612, 127362363.3451010287], [177747959.6150887012, 127386357.6724883765], [177747921.6738363206, 127386388.8100694865], [177718961.7400564551, 127408989.3642143458], [177718942.2077703774, 127409004.2253182083], [177581028.5851882696, 127511287.9388445914], [177581008.6940751970, 127511302.3161262572], [177550974.6871728003, 127532454.6503151059], [177550933.8766012788, 127532481.9190672040], [177519898.1511303186, 127552135.0754736960], [177519877.2562546134, 127552147.9505184442], [177372602.1683593392, 127640421.2411088347], [177372580.9638073742, 127640433.5994899422], [177340618.2875488997, 127658540.2319388986], [177340575.0006863177, 127658563.3692489862], [177307762.3745269775, 127675079.8572769314], [177307740.3182907701, 127675090.6222688705], [177152522.1046873629, 127748503.3698800802], [177152499.7909079194, 127748513.5903426558], [177118916.2633378506, 127763400.1442833692], [177118870.9170604050, 127763418.9273265004], [177084597.3937393725, 127776639.6841675043], [177084574.3885562122, 127776648.2354338467], [176922907.8854923546, 127834493.4351750016], [176922884.6773793697, 127834501.4192904234], [176888003.7262274921, 127846024.5290703326], [176887956.7572445571, 127846038.7769555300], [176852552.4095285535, 127855836.4794935584], [176852528.6769509912, 127855842.7346809506], [176685970.8212257922, 127897563.3056575507], [176685946.9422860444, 127897568.9765343964], [176650104.4901795387, 127905617.6683072448], [176650056.3508281410, 127905627.2438195944], [176613862.1419388950, 127911907.5348235518], [176613837.9105245769, 127911911.4336911291], [176443992.7453399599, 127937105.5839973986], [176443968.4255407155, 127937108.8870220333], [176407509.6548869014, 127941605.6474861801], [176407460.8087753057, 127941610.4584082663], [176370825.3087300062, 127944312.8552426547], [176370800.8118407428, 127944314.3602421731], [176199304.0389834642, 127952739.4564382732], [176199279.5125376582, 127952740.3598007709], [176162555.5412285328, 127953641.8826947808], [176162506.4587714672, 127953641.8826947808], [176125782.4874623418, 127952740.3598007709], [176125757.9610165358, 127952739.4564382732], [175954261.1881592572, 127944314.3602421731], [175954236.6912699938, 127944312.8552426547], [175917601.1912246943, 127941610.4584082663], [175917552.3451130986, 127941605.6474861801], [175881093.5744592845, 127937108.8870220333], [175881069.2546600401, 127937105.5839973986], [175711224.0894754231, 127911911.4336911291], [175711199.8580611050, 127911907.5348235518], [175675005.6491718590, 127905627.2438195944], [175674957.5098204613, 127905617.6683072448], [175639115.0577139556, 127897568.9765343964], [175639091.1787742078, 127897563.3056575507], [175472533.3230490088, 127855842.7346809506], [175472509.5904714465, 127855836.4794935584], [175437105.2427554429, 127846038.7769555300], [175437058.2737725079, 127846024.5290703326], [175402177.3226206303, 127834501.4192904234], [175402154.1145076454, 127834493.4351750016], [175240487.6114435792, 127776648.2354337722], [175240464.6062604189, 127776639.6841674298], [175206191.0829395950, 127763418.9273265153], [175206145.7366621494, 127763400.1442833841], [175172562.2090926468, 127748513.5903429091], [175172539.8953132033, 127748503.3698803335], [175017321.6817091703, 127675090.6222688407], [175017299.6254729629, 127675079.8572769016], [174984486.9993138313, 127658563.3692490757], [174984443.7124512494, 127658540.2319389880], [174952481.0361923277, 127640433.5994897783], [174952459.8316403627, 127640421.2411086708], [174805184.7437449098, 127552147.9505181462], [174805163.8488692045, 127552135.0754733980], [174774128.1233989596, 127532481.9190673530], [174774087.3128274381, 127532454.6503152549], [174744053.3059245348, 127511302.3161260784], [174744033.4148114622, 127511287.9388444126], [174606119.7922296226, 127409004.2253182083], [174606100.2599435449, 127408989.3642143458], [174577140.3261636794, 127386388.8100694865], [174577102.3849112988, 127386357.6724883765], [174549286.2912698388, 127362363.3451010287], [174549267.9051579535, 127362347.0873798728], [174422043.9314671457, 127247037.9989938438], [174422025.9498772323, 127247021.2949514389], [174395420.7077799737, 127221690.9987577051], [174395386.0012417734, 127221656.2922194898], [174370055.7050493658, 127195051.0501236469], [174370039.0010069609, 127195033.0685337633], [174254729.9126197398, 127067809.0948416293], [174254713.6548985839, 127067790.7087297291], [174230719.3275118172, 127039974.6150889397], [174230688.1899307072, 127039936.6738365740], [174208087.6357853413, 127010976.7400560975], [174208072.7746814787, 127010957.2077700049], [174105789.0611555874, 126873043.5851884931], [174105774.6838739216, 126873023.6940754205], [174084622.3496848047, 126842989.6871726215], [174084595.0809327066, 126842948.8766010851], [174064941.9245266020, 126811913.1511307508], [174064929.0494818389, 126811892.2562550604], [173976655.7588912249, 126664617.1683594286], [173976643.4005101323, 126664595.9638074636], [173958536.7680610716, 126632633.2875487953], [173958513.6307509840, 126632590.0006862283], [173941997.1427226365, 126599777.3745260984], [173941986.3777306974, 126599755.3182898760], [173868573.6301198602, 126444537.1046872139], [173868563.4096572995, 126444514.7909077853], [173853676.8557167649, 126410931.2633381337], [173853658.0726736188, 126410885.9170606583], [173840437.3158326149, 126376612.3937396556], [173840428.7645662725, 126376589.3885565102], [173782583.5648250878, 126214922.8854926229], [173782575.5807096660, 126214899.6773796380], [173771052.4709296823, 126180018.7262274921], [173771038.2230444849, 126179971.7572445571], [173761240.5205061734, 126144567.4095275849], [173761234.2653187811, 126144543.6769500226], [173719513.6943425238, 125977985.8212261200], [173719508.0234656632, 125977961.9422863722], [173711459.3316927850, 125942119.4901798218], [173711449.7561804354, 125942071.3508284241], [173705169.4651764631, 125905877.1419390440], [173705165.5663088858, 125905852.9105247408], [173679960.3645716906, 125735933.2426445186], [173679957.0676938593, 125735908.9726719260], [173675467.6630683541, 125699524.8769855499], [173675462.8570905924, 125699476.1312515140], [173672760.4721207023, 125662915.8483168036], [173672758.9659038484, 125662891.4017979652], [173664352.3497653604, 125492469.1284563839], [173664351.4389982820, 125492444.5018143207], [173662531.3036504984, 125418602.6185331643], [173662531.0000000000, 125418577.9769262373], [173662531.0000000000, 114888728.6509692222], [173658916.9375521243, 114741535.2720941901], [173648084.3634417951, 114594708.8711131066], [173630059.0825468898, 114448591.0216381699], [173604884.5353906751, 114303533.8644135296], [173572621.3920682073, 114159886.9839406759], [173533347.4060322940, 114017996.5659848452], [173487157.2267105877, 113878204.5632783175], [173434162.1714003980, 113740847.8714156747], [173374489.9569990933, 113606257.5169507563], [173308284.3922069073, 113474757.8596231937], [173235705.0309530497, 113346665.8106637448], [173156926.7878728509, 113222290.0690420568], [173072139.5167689323, 113101930.3775116652], [172981547.5530656874, 112985876.8002333939], [172885369.2213677168, 112874409.0237306654], [172783836.3093011081, 112767795.6828491986], [172677193.5089105666, 112666293.7133534551], [172565697.8269576430, 112570147.7327175140], [172449617.9655389786, 112479589.4506016672], [172329233.6745224893, 112394837.1104389280], [172204835.0773537755, 112316094.9634712040], [172076721.9718666673, 112243552.7765096277], [171945203.1077774763, 112177385.3746009022], [171810595.4426040053, 112117752.2197021246], [171673223.3778054714, 112064797.0263814330], [171533417.9769825637, 112018647.4154691547], [171391516.1680205464, 111979414.6064941734], [171247859.9311030805, 111947193.1496480256], [171102795.4745436907, 111922060.6979200393], [170956672.4004358649, 111904077.8199563771], [170809842.8621157110, 111893287.8540902138], [170662648.4406671226, 111889716.5060763806], [133112703.0837392211, 111900613.1851981431], [133112678.5323465765, 111900612.8908939958], [133039106.4807585478, 111898827.4190122485], [133039081.9439919591, 111898826.5220280439], [132818483.2156139314, 111888048.9127251655], [132818458.7082655728, 111888047.4136016816], [132781807.4853080511, 111885353.4360980690], [132781758.6179370582, 111885348.6354106963], [132745283.8207076192, 111880858.7772638798], [132745259.4901450872, 111880855.4785941243], [132526780.6999322176, 111848498.5001909435], [132526756.4576902688, 111848494.6051684171], [132490546.0293531120, 111842219.6917252839], [132490497.8682273328, 111842210.1223725677], [132454639.1145348549, 111834165.2828670442], [132454615.2246853709, 111834159.6143058240], [132240362.1701750755, 111780535.1380158812], [132240338.4266972542, 111780528.8846363127], [132204917.8054900467, 111770733.5157116205], [132204870.8148082495, 111770719.2699273229], [132169973.7275612652, 111759196.9888697863], [132169950.5086859763, 111759189.0050532371], [131961988.2578616440, 111684813.8878677487], [131961965.2419983447, 111684805.3364040405], [131927675.8279116750, 111671583.9242001921], [131927630.4605913162, 111671565.1392916292], [131894031.3937238157, 111656676.4736460298], [131894009.0696168244, 111656666.2515258044], [131694342.0568463504, 111562257.3545117229], [131694319.9904348552, 111562246.5873867571], [131661492.2803718448, 111545726.5658626556], [131661448.9736837149, 111545703.4228872955], [131629471.7702206075, 111527591.8763569295], [131629450.5560517311, 111527579.5144584477], [131440003.2624403834, 111414046.7933262885], [131439982.3581668139, 111414033.9143184870], [131408932.7604675293, 111394374.5109248906], [131408891.9318210781, 111394347.2329452038], [131378844.8025320768, 111373187.3728183359], [131378824.9027730823, 111373172.9902911782], [131201423.3071452677, 111241610.7248308659], [131201403.7664944530, 111241595.8580739498], [131172431.5512446463, 111218986.5590451360], [131172393.5941649079, 111218955.4089786410], [131144566.1468925476, 111194951.1835719049], [131144547.7533463240, 111194934.9190413803], [130980901.7326331437, 111046611.1659574062], [130980883.7439467311, 111046594.4547439069], [130954268.1584786475, 111021253.1787437201], [130954233.4388131201, 111021218.4568288773], [130928893.8870982230, 110994601.2297391295], [130928877.1770501137, 110994583.2399701625], [130780564.0257208049, 110830927.6107763499], [130780547.7623818815, 110830909.2161764950], [130756545.3397644460, 110803080.2139018476], [130756514.1921570003, 110803042.2548041940], [130733906.7700758278, 110774068.5749216825], [130733891.9045848250, 110774049.0333078057], [130602341.1319681406, 110596638.9150836766], [130602326.7507301867, 110596619.0143929720], [130581168.8371844888, 110566570.5143730938], [130581141.5618498623, 110566529.6839596033], [130561484.1699768603, 110535478.8127351552], [130561471.2923233211, 110535457.9076272845], [130447950.8443499804, 110346003.2594475895], [130447938.4838258326, 110345982.0444779098], [130429829.0089057386, 110314003.6677662581], [130429805.8687359393, 110313960.3595789522], [130413287.9739168584, 110281131.5793723911], [130413277.2082214355, 110281109.5122634470], [130318881.2463881075, 110081436.3838408142], [130318871.0257141292, 110081414.0590716302], [130303984.5367409289, 110047814.0277464241], [130303965.7547714412, 110047768.6592092365], [130290746.5639583170, 110013478.3886737078], [130290738.0139856339, 110013455.3722564429], [130216376.3693280518, 109805488.3036427498], [130216368.3870157301, 109805465.0842503160], [130204848.3667125404, 109770567.2506313473], [130204834.1239724457, 109770520.2590267807], [130195041.0497143567, 109735099.0033224374], [130195034.7978729606, 109735075.2594395429], [130141424.2016030848, 109520818.7314373702], [130141418.5345895290, 109520794.8412206918], [130133376.0181301832, 109484935.5664353371], [130133366.4518975019, 109484887.4046897590], [130127093.8842797279, 109448676.5699231625], [130127089.9908276796, 109448652.3274289221], [130094747.1661543846, 109230171.4414984584], [130094743.8690608442, 109230147.1107222736], [130090256.3738621473, 109193672.0227048695], [130090251.5763405561, 109193623.1550229937], [130087559.9732105434, 109156971.7576194704], [130087558.4756747186, 109156947.2501740307], [130076795.1573920846, 108936347.8240547329], [130076794.2619974315, 108936323.2872300744], [130075013.5563210249, 108862751.1201285571], [130075013.2636073828, 108862726.5687168986], [130085807.3617366850, 78454622.8433696479], [130082245.2535526454, 78307422.1262134016], [130071463.9094015062, 78160585.8687014431], [130053489.0171726644, 78014455.6967601627], [130028363.8995259404, 77869383.8098717630], [129996149.1124250293, 77725719.8568632901], [129956922.2991869748, 77583810.0931921452], [129910778.0033481121, 77443996.5464104116], [129857827.4407979846, 77306616.1918189377], [129798198.2317287028, 77172000.1402954459], [129732034.0930479467, 77040472.8402596414], [129659494.4919964075, 76912351.2956962436], [129580754.2618025243, 76787944.3021177649], [129496003.1803058386, 76667551.7023160458], [129405445.5125550926, 76551463.6636828780], [129309299.5184977353, 76439959.9788613915], [129207796.9269318879, 76333309.3913922608], [129101182.3770006001, 76231768.9479964226], [128989712.8285680413, 76135583.3790465444], [128873656.9429000020, 76044984.5087230504], [128753294.4351444244, 75960190.6962782294], [128628915.4001681805, 75881406.3097515404], [128500819.6133760512, 75808821.2334056944], [128369315.8082000911, 75742610.4100729823], [128234720.9319986403, 75682933.4195124805], [128097359.3821555376, 75629934.0937937945], [127957562.2242248654, 75583740.1706365645], [127815666.3940076530, 75544462.9855409861], [127672013.8854737282, 75512197.2034484595], [127526950.9264987409, 75487020.5905832201], [127380827.1443903148, 75468993.8270212263], [127233994.7232299149, 75458160.3604413867], [127086795.2798053324, 75454546.0000000000], [123698499.0230739117, 75454546.0000000000], [123698474.3814669847, 75454545.6963495016], [123624632.4981852174, 75452725.5610017031], [123624607.8715431690, 75452724.6502346247], [123454185.5982020497, 75444318.0340961814], [123454161.1516831815, 75444316.5278793275], [123417600.8687483072, 75441614.1429094076], [123417552.1230142713, 75441609.3369316310], [123381168.0273283720, 75437119.9323061854], [123381143.7573558092, 75437116.6354283541], [123211224.0894754231, 75411911.4336911291], [123211199.8580611050, 75411907.5348235518], [123175005.6491718590, 75405627.2438195944], [123174957.5098204613, 75405617.6683072448], [123139115.0577139556, 75397568.9765343964], [123139091.1787742078, 75397563.3056575507], [122972533.3230490088, 75355842.7346809506], [122972509.5904714465, 75355836.4794935584], [122937105.2427554429, 75346038.7769555300], [122937058.2737725079, 75346024.5290703326], [122902177.3226206303, 75334501.4192904234], [122902154.1145076454, 75334493.4351750016], [122740487.6114435792, 75276648.2354337722], [122740464.6062604189, 75276639.6841674298], [122706191.0829395950, 75263418.9273265153], [122706145.7366621494, 75263400.1442833841], [122672562.2090926468, 75248513.5903429091], [122672539.8953132033, 75248503.3698803335], [122517321.6817091703, 75175090.6222688407], [122517299.6254729629, 75175079.8572769016], [122484486.9993138313, 75158563.3692490757], [122484443.7124512494, 75158540.2319389880], [122452481.0361923277, 75140433.5994897783], [122452459.8316403627, 75140421.2411086708], [122305184.7437449098, 75052147.9505181462], [122305163.8488692045, 75052135.0754733980], [122274128.1233989596, 75032481.9190673530], [122274087.3128274381, 75032454.6503152549], [122244053.3059245348, 75011302.3161260784], [122244033.4148114622, 75011287.9388444126], [122106119.7922296226, 74909004.2253182083], [122106100.2599435449, 74908989.3642143458], [122077140.3261636794, 74886388.8100694865], [122077102.3849112988, 74886357.6724883765], [122049286.2912698388, 74862363.3451010287], [122049267.9051579535, 74862347.0873798728], [121922043.9314671457, 74747037.9989938438], [121922025.9498772323, 74747021.2949514389], [121895420.7077799737, 74721690.9987577051], [121895386.0012417734, 74721656.2922194898], [121870055.7050493658, 74695051.0501236469], [121870039.0010069609, 74695033.0685337633], [121754729.9126197398, 74567809.0948416293], [121754713.6548985839, 74567790.7087297291], [121730719.3275118172, 74539974.6150889397], [121730688.1899307072, 74539936.6738365740], [121708087.6357853413, 74510976.7400560975], [121708072.7746814787, 74510957.2077700049], [121605789.0611555874, 74373043.5851884931], [121605774.6838739216, 74373023.6940754205], [121584622.3496848047, 74342989.6871726215], [121584595.0809327066, 74342948.8766010851], [121564941.9245266020, 74311913.1511307508], [121564929.0494818389, 74311892.2562550604], [121476655.7588912249, 74164617.1683594286], [121476643.4005101323, 74164595.9638074636], [121458536.7680610716, 74132633.2875487953], [121458513.6307509840, 74132590.0006862283], [121441997.1427226365, 74099777.3745260984], [121441986.3777306974, 74099755.3182898760], [121368573.6301198602, 73944537.1046872139], [121368563.4096572995, 73944514.7909077853], [121353676.8557167649, 73910931.2633381337], [121353658.0726736188, 73910885.9170606583], [121340437.3158326149, 73876612.3937396556], [121340428.7645662725, 73876589.3885565102], [121282583.5648250878, 73714922.8854926229], [121282575.5807096660, 73714899.6773796380], [121271052.4709296823, 73680018.7262274921], [121271038.2230444849, 73679971.7572445571], [121261240.5205061734, 73644567.4095275849], [121261234.2653187811, 73644543.6769500226], [121219513.6943425238, 73477985.8212261200], [121219508.0234656632, 73477961.9422863722], [121211459.3316927850, 73442119.4901798218], [121211449.7561804354, 73442071.3508284241], [121205169.4651764631, 73405877.1419390440], [121205165.5663088858, 73405852.9105247408], [121179971.4160025120, 73236007.7453393936], [121179968.1129778922, 73235983.4255401343], [121175471.3525137901, 73199524.6548867226], [121175466.5415917039, 73199475.8087751269], [121172764.1447573304, 73162840.3087298870], [121172762.6397578120, 73162815.8118406087], [121164337.5435616970, 72991319.0389834493], [121164336.6401992142, 72991294.5125376433], [121163435.1173052192, 72954570.5412285179], [121163435.1173052192, 72954521.4587714821], [121164336.6401992142, 72917797.4874623567], [121164337.5435616970, 72917772.9610165507], [121172762.6397578120, 72746276.1881593913], [121172764.1447573304, 72746251.6912701130], [121175466.5415917039, 72709616.1912248731], [121175471.3525137901, 72709567.3451132774], [121179968.1129778922, 72673108.5744598657], [121179971.4160025120, 72673084.2546606064], [121205165.5663088858, 72503239.0894752592], [121205169.4651764631, 72503214.8580609560], [121211449.7561804354, 72467020.6491715759], [121211459.3316927850, 72466972.5098201782], [121219508.0234656632, 72431130.0577136278], [121219513.6943425238, 72431106.1787738800], [121261234.2653187811, 72264548.3230499774], [121261240.5205061734, 72264524.5904724151], [121271038.2230444849, 72229120.2427554429], [121271052.4709296823, 72229073.2737725079], [121282575.5807096660, 72194192.3226203620], [121282583.5648250878, 72194169.1145073771], [121340428.7645662725, 72032502.6114434898], [121340437.3158326149, 72032479.6062603444], [121353658.0726736188, 71998206.0829393417], [121353676.8557167649, 71998160.7366618663], [121368563.4096572995, 71964577.2090922147], [121368573.6301198602, 71964554.8953127861], [121441986.3777306974, 71809336.6817101240], [121441997.1427226365, 71809314.6254739016], [121458513.6307509840, 71776501.9993137717], [121458536.7680610716, 71776458.7124512047], [121476643.4005101323, 71744496.0361925364], [121476655.7588912249, 71744474.8316405714], [121564929.0494818389, 71597199.7437449396], [121564941.9245266020, 71597178.8488692492], [121584595.0809327066, 71566143.1233989149], [121584622.3496848047, 71566102.3128273785], [121605774.6838739216, 71536068.3059245795], [121605789.0611555874, 71536048.4148115069], [121708072.7746814787, 71398134.7922299951], [121708087.6357853413, 71398115.2599439025], [121730688.1899307072, 71369155.3261634260], [121730719.3275118172, 71369117.3849110603], [121754713.6548985839, 71341301.2912702709], [121754729.9126197398, 71341282.9051583707], [121870039.0010069609, 71214058.9314662367], [121870055.7050493658, 71214040.9498763531], [121895386.0012417734, 71187435.7077805102], [121895420.7077799737, 71187401.0012422949], [121922025.9498772323, 71162070.7050485611], [121922043.9314671457, 71162054.0010061562], [122049267.9051579535, 71046744.9126201272], [122049286.2912698388, 71046728.6548989713], [122077102.3849112988, 71022734.3275116235], [122077140.3261636794, 71022703.1899305135], [122106100.2599435449, 71000102.6357856542], [122106119.7922296226, 71000087.7746817917], [122244033.4148117304, 70897804.0611554086], [122244053.3059248030, 70897789.6838737428], [122274087.3128271997, 70876637.3496848941], [122274128.1233987212, 70876610.0809327960], [122305163.8488696814, 70856956.9245263040], [122305184.7437453866, 70856944.0494815558], [122452459.8316406608, 70768670.7588911653], [122452481.0361926258, 70768658.4005100578], [122484443.7124511003, 70750551.7680611014], [122484486.9993136823, 70750528.6307510138], [122517299.6254730225, 70734012.1427230686], [122517321.6817092299, 70734001.3777311295], [122672539.8953126371, 70660588.6301199198], [122672562.2090920806, 70660578.4096573442], [122706145.7366621494, 70645691.8557166308], [122706191.0829395950, 70645673.0726734996], [122740464.6062606275, 70632452.3158324957], [122740487.6114437878, 70632443.7645661533], [122902154.1145076454, 70574598.5648249984], [122902177.3226206303, 70574590.5807095766], [122937058.2737725079, 70563067.4709296674], [122937105.2427554429, 70563053.2230444700], [122972509.5904714465, 70553255.5205064416], [122972533.3230490088, 70553249.2653190494], [123139091.1787742078, 70511528.6943424493], [123139115.0577139556, 70511523.0234656036], [123174957.5098204613, 70503474.3316927552], [123175005.6491718590, 70503464.7561804056], [123211199.8580611050, 70497184.4651764482], [123211224.0894754231, 70497180.5663088709], [123381143.7573558092, 70471975.3645716459], [123381168.0273283720, 70471972.0676938146], [123417552.1230142713, 70467482.6630683690], [123417600.8687483072, 70467477.8570905924], [123454161.1516831815, 70464775.4721206725], [123454185.5982020497, 70464773.9659038186], [123624607.8715431690, 70456367.3497653753], [123624632.4981852174, 70456366.4389982969], [123698474.3814669847, 70454546.3036504984], [123698499.0230739117, 70454546.0000000000], [127090699.2937151790, 70454546.0000000000], [127237832.2762470841, 70450934.9045730978], [127384598.7225466371, 70440111.2164893299], [127530657.4888306856, 70422100.6980440766], [127675656.8657212555, 70396946.7185495198], [127819247.6948489845, 70364709.8487657905], [127961084.2096266150, 70325467.7150462419], [128100824.8678532541, 70279314.8124138415], [128238133.1741498411, 70226362.2770165354], [128372678.4902382791, 70166737.6185119301], [128504136.8311173618, 70100584.4130245596], [128632191.6452216506, 70028061.9574131966], [128756534.5766724050, 69949344.8856865019], [128876866.2078034282, 69864622.7484818995], [128992896.7801539302, 69774099.5566304624], [129104346.8922108710, 69677993.2898960859], [129210948.1722039878, 69576535.3720832020], [129312443.9243463576, 69469970.1137672812], [129408589.7469591796, 69358554.1239932477], [129499154.1209869683, 69242555.6923655570], [129583918.9674981534, 69122254.1430038661], [129662680.1728194952, 68997939.1619293988], [129735248.0800383687, 68869910.0995063782], [129801447.9456996024, 68738475.2496018857], [129861120.3605862260, 68603951.1072162390], [129914121.6335769296, 68466661.6063631475], [129960324.1376538277, 68326937.3400373906], [129999616.6172282398, 68185114.7641482502], [130031904.4560449719, 68041535.3873298764], [130057109.9050171375, 67896544.9485925138], [130075172.2694461048, 67750492.5847836733], [130086048.0551747084, 67603729.9898623675], [130089711.3788118362, 67456598.2984466553], [130100498.1251498163, 37069205.3383235484], [130100498.4347916842, 37069180.8072810993], [130102328.3861078620, 36995670.2658087239], [130102329.2974312603, 36995645.7497443706], [130113231.3830493689, 36775234.5118862763], [130113232.8955057859, 36775210.0255554542], [130115946.0759965181, 36738590.4260756597], [130115950.9003059566, 36738541.6015379727], [130120456.9165003598, 36702099.1505708024], [130120460.2254498005, 36702074.8417498693], [130152905.0920016170, 36483792.2270526141], [130152908.9962786436, 36483768.0067193657], [130159197.0017025769, 36447590.4252327457], [130159206.5864830017, 36447542.3082770482], [130167261.4452192187, 36411716.6796689704], [130167267.1199538708, 36411692.8120065704], [130220942.5620523095, 36197639.2762726024], [130220948.8205804527, 36197615.5550005659], [130230751.1437025070, 36162228.1154796779], [130230765.3967230022, 36162181.1691182777], [130242291.5889662802, 36127317.1001245677], [130242299.5748801827, 36127293.9032907188], [130316689.0928762853, 35919529.2074039206], [130316697.6454319954, 35919506.2134544402], [130329919.9619904757, 35885249.4366172031], [130329938.7460992932, 35885204.1125982106], [130344825.3594096899, 35851637.0877290219], [130344835.5796572566, 35851614.7849385813], [130439223.3497328758, 35652138.1745173484], [130439234.1140179038, 35652116.1291530058], [130455749.1903726757, 35619319.6557544395], [130455772.3248170316, 35619276.3902147338], [130473876.1106197834, 35587329.4129877687], [130473888.4668551981, 35587308.2188525349], [130587366.2291400135, 35398039.1862231940], [130587379.1015735567, 35398018.3015786782], [130607028.0190312862, 35366997.7203925624], [130607055.2811966538, 35366956.9296610057], [130628202.0332142711, 35336937.4144502208], [130628216.4065378904, 35336917.5329138115], [130759692.2049688101, 35159677.3465221226], [130759707.0616839826, 35159657.8235629201], [130782300.7457149923, 35130711.6345860139], [130782331.8732672632, 35130673.7111772820], [130806318.1038413346, 35102870.5250792801], [130806334.3559437990, 35102852.1474546343], [130954543.0457731485, 34939346.3264423534], [130954559.7438090742, 34939328.3530309424], [130979880.7834438086, 34912735.0951238647], [130979915.4768536687, 34912700.4039614052], [131006510.3750371337, 34887381.0871257484], [131006528.3495302498, 34887364.3902541995], [131170043.7713573575, 34739166.2928635776], [131170062.1500347853, 34739150.0419516861], [131197866.8899345100, 34715165.6125559807], [131197904.8153596520, 34715134.4874604791], [131226852.4679244757, 34692542.6786504239], [131226871.9918460846, 34692527.8232000098], [131404120.6950466335, 34561063.5069017261], [131404140.5775141120, 34561049.1348660961], [131434161.4625763595, 34539904.3275978789], [131434202.2550739050, 34539877.0680750385], [131465224.1090779901, 34520230.1602137089], [131465244.9945563674, 34520217.2891331464], [131654521.3780305088, 34406751.7881893516], [131654542.5729661584, 34406739.4333269447], [131686490.7229139507, 34388637.7171302214], [131686533.9899522364, 34388614.5854887217], [131719331.5331509709, 34372101.6337682456], [131719353.5792125762, 34372090.8709113449], [131918836.3037824035, 34277716.0233969837], [131918858.6072348952, 34277705.8045942485], [131952426.5964082181, 34262821.3658322915], [131952471.9216439724, 34262802.5846596733], [131986729.5549677312, 34249582.4873294756], [131986752.5494711995, 34249573.9362633675], [132194522.0639770925, 34175197.8776993603], [132194545.2613282502, 34175189.8932882026], [132229410.0769300163, 34163665.9596107751], [132229457.0242146552, 34163651.7096315548], [132264845.0986681879, 34153851.6789762601], [132264868.8203456104, 34153845.4219848216], [132478925.8327997327, 34100183.8466747552], [132478949.7008296847, 34100178.1734862998], [132514775.8511661291, 34092125.6355996653], [132514823.9687426388, 34092116.0539363325], [132551001.9574984014, 34085830.3921580911], [132551026.1780845225, 34085826.4894501045], [132769310.8941470385, 34053395.7636078522], [132769335.2031822801, 34053392.4562331811], [132805777.9459782243, 34048888.8008393273], [132805826.7708283365, 34048883.9796928018], [132842446.5459939837, 34046173.1714747697], [132842471.0324227214, 34046171.6606046185], [133062882.9760707617, 34035283.8535461053], [133062907.4921941161, 34035282.9438108951], [133136418.1520591378, 34033457.7546104044], [133136442.6831215918, 34033457.4465576857], [170664389.0186925828, 34022567.0977688730], [170811527.0114494860, 34018913.0059040189], [170958296.3304408789, 34008045.8338448852], [171104355.7962330580, 33989991.4471691251], [171249353.6687528193, 33964793.3244096562], [171392940.7644520402, 33932512.1476286277], [171534771.2972139120, 33893225.6562824175], [171674503.7110709846, 33847028.4600104466], [171811801.5027421415, 33794031.8107956424], [171946334.0319972634, 33734363.3350483030], [172077777.3179049790, 33668166.7262562066], [172205814.8190427423, 33595601.3989422247], [172330138.1957911849, 33516842.1047628000], [172450448.0528765321, 33432078.5116714425], [172566454.6603752077, 33341514.7471598201], [172677878.6514376998, 33245368.9066805169], [172784451.6950620711, 33143872.5284280740], [172885917.1422872245, 33037270.0357494354], [172982030.6442528069, 32925818.1485263556], [173072560.7406423390, 32809785.2649396583], [173157289.4170834124, 32689450.8151159808], [173236012.6301693916, 32565104.5882046968], [173308540.7988380492, 32437046.0345059410], [173374699.2609179318, 32305583.5443385206], [173434328.6937508881, 32171033.7053727433], [173487285.4978726208, 32033720.5402243249], [173533442.1428273916, 31893974.7261463702], [173572687.4742877483, 31752132.7986907847], [173604926.9817356467, 31608536.3412652835], [173630083.0260626972, 31463531.1625309177], [173648095.0265397727, 31317466.4636318497], [173658919.6067084372, 31170693.9972428568], [173662531.0000000000, 31023554.9502890110], [173662531.0000000000, 20490514.0230737589], [173662531.3036504984, 20490489.3814668283], [173664351.4389982820, 20416647.4981856756], [173664352.3497653604, 20416622.8715436198], [173672758.9659038186, 20246200.5982020833], [173672760.4721206725, 20246176.1516832411], [173675462.8570905924, 20209615.8687484376], [173675467.6630683541, 20209567.1230143942], [173679957.0676938593, 20173183.0273280442], [173679960.3645716906, 20173158.7573554590], [173705165.5663089454, 20003239.0894749723], [173705169.4651765227, 20003214.8580606692], [173711449.7561804354, 19967020.6491715610], [173711459.3316927850, 19966972.5098201632], [173719508.0234655440, 19931130.0577141158], [173719513.6943424046, 19931106.1787743717], [173761234.2653189600, 19764548.3230493478], [173761240.5205063522, 19764524.5904717743], [173771038.2230444551, 19729120.2427554689], [173771052.4709296525, 19729073.2737725452], [173782575.5807095170, 19694192.3226208128], [173782583.5648249388, 19694169.1145078205], [173840428.7645663321, 19532502.6114433296], [173840437.3158326745, 19532479.6062601879], [173853658.0726734400, 19498206.0829397775], [173853676.8557165861, 19498160.7366623059], [173868563.4096572101, 19464577.2090924978], [173868573.6301197708, 19464554.8953130729], [173941986.3777314126, 19309336.6817086488], [173941997.1427233517, 19309314.6254724227], [173958513.6307508349, 19276501.9993140288], [173958536.7680609226, 19276458.7124514543], [173976643.4005101025, 19244496.0361925922], [173976655.7588911951, 19244474.8316406310], [174064929.0494816899, 19097199.7437451966], [174064941.9245264530, 19097178.8488695025], [174084595.0809329748, 19066143.1233984865], [174084622.3496850729, 19066102.3128269538], [174105774.6838735342, 19036068.3059251010], [174105789.0611552000, 19036048.4148120284], [174208072.7746811807, 18898134.7922304347], [174208087.6357850432, 18898115.2599443458], [174230688.1899307072, 18869155.3261634819], [174230719.3275118172, 18869117.3849111088], [174254713.6548989713, 18841301.2912698276], [174254729.9126201272, 18841282.9051579349], [174370039.0010066628, 18714058.9314666055], [174370055.7050490677, 18714040.9498767145], [174395386.0012418628, 18687435.7077804208], [174395420.7077800632, 18687401.0012422055], [174422025.9498769343, 18662070.7050488517], [174422043.9314668477, 18662054.0010064505], [174549267.9051582813, 18546744.9126198553], [174549286.2912701666, 18546728.6548987031], [174577102.3849111497, 18522734.3275117651], [174577140.3261635303, 18522703.1899306439], [174606100.2599440515, 18500102.6357852630], [174606119.7922301292, 18500087.7746814080], [174744033.4148116112, 18397804.0611555018], [174744053.3059246838, 18397789.6838738322], [174774087.3128272891, 18376637.3496848457], [174774128.1233988106, 18376610.0809327476], [174805163.8488695323, 18356956.9245264046], [174805184.7437452376, 18356944.0494816527], [174952459.8316405416, 18268670.7588912249], [174952481.0361925066, 18268658.4005101174], [174984443.7124512792, 18250551.7680609897], [174984486.9993138611, 18250528.6307509020], [175017299.6254729927, 18234012.1427230574], [175017321.6817092001, 18234001.3777311295], [175172539.8953128159, 18160588.6301198527], [175172562.2090922594, 18160578.4096572734], [175206145.7366622686, 18145691.8557165749], [175206191.0829397142, 18145673.0726734437], [175240464.6062599719, 18132452.3158327341], [175240487.6114431322, 18132443.7645663880], [175402154.1145080626, 18074598.5648248382], [175402177.3226210475, 18074590.5807094276], [175437058.2737724483, 18063067.4709296860], [175437105.2427553833, 18063053.2230444811], [175472509.5904715657, 18053255.5205064043], [175472533.3230491281, 18053249.2653190047], [175639091.1787742972, 18011528.6943424195], [175639115.0577140450, 18011523.0234655775], [175674957.5098201334, 18003474.3316928148], [175675005.6491715312, 18003464.7561804652], [175711199.8580611646, 17997184.4651764482], [175711224.0894754827, 17997180.5663088709], [175881069.2546602488, 17971986.4160025753], [175881093.5744594932, 17971983.1129779406], [175917552.3451131284, 17967486.3525138088], [175917601.1912247241, 17967481.5415917300], [175954236.6912702620, 17964779.1447573304], [175954261.1881595254, 17964777.6397578046], [176125757.9610164762, 17956352.5435617119], [176125782.4874622822, 17956351.6401992217], [176162506.4587714672, 17955450.1173052117], [176162555.5412285328, 17955450.1173052117], [176199279.5125377178, 17956351.6401992217], [176199304.0389835238, 17956352.5435617119], [176370800.8118404746, 17964777.6397578046], [176370825.3087297380, 17964779.1447573304], [176407460.8087752759, 17967481.5415917300], [176407509.6548868716, 17967486.3525138088], [176443968.4255405068, 17971983.1129779406], [176443992.7453397512, 17971986.4160025753], [176613837.9105245173, 17997180.5663088709], [176613862.1419388354, 17997184.4651764482], [176650056.3508284688, 18003464.7561804652], [176650104.4901798666, 18003474.3316928148], [176685946.9422859550, 18011523.0234655775], [176685970.8212257028, 18011528.6943424195], [176852528.6769508719, 18053249.2653190047], [176852552.4095284343, 18053255.5205064043], [176887956.7572446167, 18063053.2230444811], [176888003.7262275517, 18063067.4709296860], [176922884.6773789525, 18074590.5807094276], [176922907.8854919374, 18074598.5648248382], [177084574.3885568678, 18132443.7645663880], [177084597.3937400281, 18132452.3158327341], [177118870.9170602858, 18145673.0726734437], [177118916.2633377314, 18145691.8557165749], [177152499.7909077406, 18160578.4096572734], [177152522.1046871841, 18160588.6301198527], [177307740.3182907999, 18234001.3777311295], [177307762.3745270073, 18234012.1427230574], [177340575.0006861389, 18250528.6307509020], [177340618.2875487208, 18250551.7680609897], [177372580.9638074934, 18268658.4005101174], [177372602.1683594584, 18268670.7588912249], [177519877.2562547624, 18356944.0494816527], [177519898.1511304677, 18356956.9245264046], [177550933.8766011894, 18376610.0809327476], [177550974.6871727109, 18376637.3496848457], [177581008.6940753162, 18397789.6838738322], [177581028.5851883888, 18397804.0611555018], [177718942.2077700198, 18500087.7746815160], [177718961.7400560975, 18500102.6357853711], [177747921.6738362908, 18522703.1899305098], [177747959.6150886714, 18522734.3275116310], [177775775.7087300122, 18546728.6548988521], [177775794.0948418975, 18546744.9126200043], [177903018.0685333610, 18662054.0010066442], [177903036.0501232743, 18662070.7050490454], [177929641.2922196984, 18687401.0012419783], [177929675.9987578988, 18687435.7077801935], [177955006.2949511707, 18714040.9498769753], [177955022.9989935756, 18714058.9314668663], [178070332.0873798728, 18841282.9051579349], [178070348.3451010287, 18841301.2912698276], [178094342.6724881828, 18869117.3849111088], [178094373.8100692928, 18869155.3261634819], [178116974.3642149568, 18898115.2599443458], [178116989.2253188193, 18898134.7922304347], [178219272.9388448000, 19036048.4148120284], [178219287.3161264658, 19036068.3059251010], [178240439.6503149271, 19066102.3128269538], [178240466.9190670252, 19066143.1233984865], [178260120.0754735470, 19097178.8488695025], [178260132.9505183101, 19097199.7437451966], [178348406.2411088049, 19244474.8316406310], [178348418.5994898975, 19244496.0361925922], [178366525.2319390774, 19276458.7124514543], [178366548.3692491651, 19276501.9993140288], [178383064.8572766483, 19309314.6254724227], [178383075.6222685874, 19309336.6817086488], [178456488.3698802292, 19464554.8953130729], [178456498.5903427899, 19464577.2090924978], [178471385.1442834139, 19498160.7366623059], [178471403.9273265600, 19498206.0829397775], [178484624.6841673255, 19532479.6062601879], [178484633.2354336679, 19532502.6114433296], [178542478.4351749718, 19694169.1145075597], [178542486.4192903936, 19694192.3226205520], [178554009.5290704072, 19729073.2737727761], [178554023.7769556046, 19729120.2427556999], [178563821.4794936180, 19764524.5904715657], [178563827.7346810102, 19764548.3230491392], [178605548.3056575954, 19931106.1787743717], [178605553.9765344560, 19931130.0577141158], [178613602.6683072150, 19966972.5098201632], [178613612.2438195646, 19967020.6491715610], [178619892.5348234773, 20003214.8580606692], [178619896.4336910546, 20003239.0894749723], [178645101.6354283094, 20173158.7573554590], [178645104.9323061407, 20173183.0273280442], [178649594.3369316459, 20209567.1230143942], [178649599.1429094076, 20209615.8687484376], [178652301.5278793275, 20246176.1516832411], [178652303.0340961814, 20246200.5982020833], [178660709.6502346396, 20416622.8715436198], [178660710.5610017180, 20416647.4981856756], [178662530.6963495016, 20490489.3814668283], [178662531.0000000000, 20490514.0230737589], [178662531.0000000000, 31020363.4027132653], [178666145.0624544621, 31167556.7817225382], [178676977.6365843713, 31314383.1828350462], [178695002.9175120890, 31460501.0324418917], [178720177.4647138119, 31605558.1897943243], [178752440.6080944836, 31749205.0703912228], [178791714.5942007005, 31891095.4884657227], [178837904.7736051083, 32030887.4912863448], [178890899.8290094435, 32168244.1832560636], [178950572.0435162187, 32302834.5378211215], [179016777.6084240675, 32434334.1952396072], [179089356.9698041677, 32562426.2442818768], [179168135.2130194902, 32686801.9859756306], [179252922.4842675924, 32807161.6775681265], [179343514.4481234252, 32923215.2548976801], [179439692.7799808979, 33034683.0314394049], [179541225.6922134459, 33141296.3723474219], [179647868.4927754998, 33242798.3418567479], [179759364.1749053895, 33338944.3224934377], [179875444.0365037322, 33429502.6045952812], [179995828.3277038634, 33514254.9447306171], [180120226.9250575602, 33592997.0916559845], [180248340.0307306349, 33665539.2785605118], [180379858.8950057328, 33731706.6803972721], [180514466.5603641868, 33791339.8352090865], [180651838.6253454983, 33844295.0284277052], [180791644.0263482034, 33890444.6392228827], [180933545.8354851604, 33929677.4480655789], [181077202.0725730956, 33961898.9047647715], [181222266.5292959809, 33987031.3563310057], [181368389.6035604775, 34005014.2341186330], [181515219.1420288086, 34015804.1997947395], [181662413.5636159480, 34019375.5476048738], [219212367.2329084575, 34008478.8124410138], [219212391.7787562609, 34008479.1066105887], [219285947.2294058502, 34010263.7672979161], [219285971.7606375813, 34010264.6638753787], [219506520.8325717449, 34021037.3944706023], [219506545.3344052434, 34021038.8929156885], [219543188.3372012973, 34023731.6531501934], [219543237.1936422884, 34023736.4516693726], [219579703.8901577592, 34028224.2859834060], [219579728.2153251171, 34028227.5831659734], [219798158.7843887210, 34060569.9911468178], [219798183.0212952495, 34060573.8844157234], [219834385.5276083052, 34066845.9772291109], [219834433.6782816052, 34066855.5422840491], [219870284.7471614778, 34074896.7779933289], [219870308.6319133639, 34074902.4440156072], [220084516.3156220317, 34128502.9393095747], [220084540.0541007817, 34128509.1898941398], [220119953.2852749527, 34138300.1893014684], [220120000.2662920058, 34138314.4287414625], [220154890.3146654367, 34149831.5957572535], [220154913.5288936794, 34149839.5760321990], [220362834.6284725070, 34224181.7659751624], [220362857.6398245692, 34224190.3136566207], [220397140.4211621284, 34237405.8921663389], [220397185.7799029946, 34237424.6688071564], [220430778.6734688580, 34252306.8095623329], [220430800.9935252070, 34252317.0272071660], [220630432.3757951260, 34346684.6915233210], [220630454.4383267164, 34346695.4539524242], [220663276.4859994054, 34363208.2913270071], [220663319.7854733765, 34363231.4242725670], [220695291.8868527412, 34381335.1626981273], [220695313.0977034569, 34381347.5192750022], [220884731.4934714437, 34494831.5102164000], [220884752.3946299255, 34494844.3837068155], [220915797.4976673722, 34514495.3935790360], [220915838.3207228184, 34514522.6599641740], [220945881.6074148417, 34535673.5827890784], [220945901.5047124624, 34535687.9592534751], [221123282.0377446711, 34667194.9604230970], [221123301.5761660933, 34667209.8209502921], [221152270.6428640783, 34689809.6834771782], [221152308.5962075591, 34689840.8206147328], [221180133.6281094551, 34713835.1576809809], [221180152.0201613903, 34713851.4155285656], [221343785.7882263064, 34862114.4750015736], [221343803.7756755650, 34862131.1793977097], [221370417.7150772810, 34887462.1651880443], [221370452.4330623746, 34887496.8730996549], [221395791.1409656405, 34914103.4605052471], [221395807.8505809009, 34914121.4431062490], [221544118.3891897798, 35077712.1793754846], [221544134.6523739100, 35077730.5667086914], [221568137.0630600452, 35105548.6344496459], [221568168.2112100720, 35105586.5787557289], [221590776.4794064164, 35134549.0859112963], [221590791.3456028700, 35134568.6200195029], [221722349.8158292770, 35311910.9831685945], [221722364.1980671287, 35311930.8762934208], [221743523.8383535743, 35341968.0238698423], [221743551.1165841222, 35342008.8390110731], [221763211.1347009540, 35373048.2381547093], [221763224.0142561793, 35373069.1355765089], [221876762.9683174491, 35562454.5911070853], [221876775.3310490251, 35562475.7983711287], [221894888.3467928767, 35594442.6448250860], [221894911.4923026562, 35594485.9375842065], [221911433.8537114859, 35627303.1919649541], [221911444.6225425303, 35627325.2513724491], [222005870.2145202756, 35826929.2403985634], [222005880.4386417866, 35826951.5574888736], [222020772.3271936774, 35860540.1309464797], [222020791.1169964671, 35860585.4842366129], [222034016.6435738802, 35894864.4290622026], [222034025.1979327202, 35894887.4379327968], [222108427.7219984531, 36102786.9551712945], [222108435.7090096772, 36102810.1670827344], [222119963.0003894567, 36137696.8717861101], [222119977.2534624338, 36137743.8486690074], [222129778.5291300714, 36173154.2370717525], [222129784.7866030931, 36173177.9737356305], [222183447.4412163496, 36387370.0939353183], [222183453.1141695678, 36387393.9770419598], [222191504.7532704473, 36423242.7109017372], [222191514.3322979808, 36423290.8587972969], [222197796.9305620790, 36459491.5434681550], [222197800.8308641911, 36459515.7792438716], [222230206.6245112419, 36677936.9535692632], [222230209.9287526608, 36677961.2777788043], [222234708.3452587724, 36714426.6704206988], [222234713.1579555273, 36714475.5254671574], [222237416.5516205132, 36751117.7452994809], [222237418.0571758151, 36751142.2466970831], [222248254.7891201377, 36971688.1831738502], [222248255.6928163767, 36971712.7141443640], [222250061.6987074018, 37045267.6438009888], [222250062.0000000000, 37045292.1895624101], [222250062.0000000000, 49113182.6128609553], [222250061.6988186836, 49113207.1540894806], [222248256.3598007560, 49186748.5125377104], [222248255.4564382732, 49186773.0389835089], [222237422.7235782743, 49407278.3820055351], [222237421.2185787559, 49407302.8788948134], [222234718.8217443824, 49443938.3789401948], [222234714.0108222961, 49443987.2250517905], [222230217.2503582239, 49480445.9957047701], [222230213.9473335743, 49480470.3155040294], [222197820.0738927126, 49698852.0715327710], [222197816.1750251353, 49698876.3029470742], [222191535.8840211332, 49735070.5118366256], [222191526.3085087836, 49735118.6511880234], [222183477.6167359948, 49770961.1032941192], [222183471.9458591640, 49770984.9822338670], [222129828.9025472403, 49985140.0155775473], [222129822.6473598480, 49985163.7481551170], [222120024.9448215961, 50020568.0958718657], [222120010.6969364285, 50020615.0648547858], [222108487.5871565342, 50055496.0160065815], [222108479.6030411124, 50055519.2241195813], [222034104.0016893148, 50263385.1047392190], [222034095.4504230022, 50263408.1099223569], [222020874.6935821772, 50297681.6332428902], [222020855.9105390310, 50297726.9795203656], [222005969.3565986156, 50331310.5070897564], [222005959.1361360550, 50331332.8208691776], [221911567.2544428408, 50530907.6867041886], [221911556.4894509017, 50530929.7429404110], [221895040.0014232397, 50563742.3690991774], [221895016.8641131520, 50563785.6559617519], [221876910.2316639423, 50595748.3322206736], [221876897.8732828498, 50595769.5367726386], [221763398.7566697598, 50785131.3727643192], [221763385.8816250265, 50785152.2676400170], [221743732.7252185345, 50816187.9931109771], [221743705.4564664364, 50816228.8036825061], [221722553.1222774386, 50846262.8105851337], [221722538.7449957728, 50846282.7016982064], [221591025.4519998133, 51023607.8498518988], [221591010.5908959508, 51023627.3821379915], [221568410.0367508531, 51052587.3159181401], [221568378.8991697431, 51052625.2571705133], [221544384.5717823505, 51080441.3508120552], [221544368.3140611947, 51080459.7369239479], [221396107.3895865679, 51244040.4591267332], [221396090.6855441928, 51244058.4407166243], [221370760.3893513083, 51270663.6828129888], [221370725.6828130782, 51270698.3893511966], [221344120.4407162070, 51296028.6855445430], [221344102.4591263533, 51296045.3895869479], [221180521.7369242311, 51444306.3140609488], [221180503.3508123159, 51444322.5717821047], [221111162.7417431474, 51504136.1925114766]]);
|
|
}
|
|
translate(v = [0, 0, -3000000]) {
|
|
linear_extrude(convexity = 10, height = 9000000) {
|
|
polygon(points = [[218250062.0000000000, 38008758.2351448461], [218250062.0000000000, 48150000.0000000000], [212625062.0000000000, 48150000.0000000000], [212527044.8596704304, 48154815.2733278051], [212429971.6779838800, 48169214.7195967659], [212334777.3227455318, 48193059.6642677933], [212242378.5676349103, 48226120.4674887136], [212153665.2631739974, 48268078.7356516421], [212069491.7669804096, 48318530.3876974583], [211990668.7158363461, 48376989.5466372594], [211917955.2188134491, 48442893.2188134491], [211852051.5466372669, 48515606.7158363536], [211793592.3876974583, 48594429.7669803947], [211743140.7356516421, 48678603.2631740049], [211701182.4674887061, 48767316.5676349103], [211668121.6642677784, 48859715.3227455392], [211644276.7195967734, 48954909.6779838726], [211629877.2733277977, 49051982.8596704379], [211625062.0000000000, 49150000.0000000000], [211625062.0000000000, 49750000.0000000000], [211629877.2733277977, 49848017.1403295621], [211644276.7195967734, 49945090.3220161274], [211668121.6642677784, 50040284.6772544608], [211701182.4674887061, 50132683.4323650897], [211743140.7356516421, 50221396.7368259951], [211793592.3876974583, 50305570.2330196053], [211852051.5466372669, 50384393.2841636464], [211917955.2188134491, 50457106.7811865509], [211990668.7158363461, 50523010.4533627406], [212069491.7669804096, 50581469.6123025417], [212075062.0000000000, 50584808.2814897224], [212075062.0000000000, 56982940.4849924147], [212015668.7158363461, 57026989.5466372594], [211942955.2188134491, 57092893.2188134491], [211877051.5466372669, 57165606.7158363536], [211818592.3876974583, 57244429.7669803947], [211768140.7356516421, 57328603.2631740049], [211726182.4674887061, 57417316.5676349103], [211693121.6642677784, 57509715.3227455392], [211669276.7195967734, 57604909.6779838726], [211654877.2733277977, 57701982.8596704379], [211650062.0000000000, 57800000.0000000000], [211650062.0000000000, 58400000.0000000000], [211654877.2733277977, 58498017.1403295621], [211669276.7195967734, 58595090.3220161274], [211693121.6642677784, 58690284.6772544608], [211726182.4674887061, 58782683.4323650897], [211768140.7356516421, 58871396.7368259951], [211818592.3876974583, 58955570.2330196053], [211877051.5466372669, 59034393.2841636464], [211942955.2188134491, 59107106.7811865509], [212015668.7158363461, 59173010.4533627406], [212094491.7669804096, 59231469.6123025417], [212178665.2631739974, 59281921.2643483579], [212267378.5676349103, 59323879.5325112864], [212359777.3227455318, 59356940.3357322067], [212454971.6779838800, 59380785.2804032341], [212552044.8596704304, 59395184.7266721949], [212650062.0000000000, 59400000.0000000000], [218249492.3310896456, 59400000.0000000000], [218225470.2796331644, 107875914.0057790428], [134075355.1404574513, 107900333.6632250249], [134100156.1915711164, 38033177.9520300925], [218250062.0000000000, 38008758.2351448461]]);
|
|
}
|
|
}
|
|
translate(v = [0, 0, 1400000]) {
|
|
linear_extrude(convexity = 10, height = 3000000) {
|
|
polygon(points = [[219300062.0000000000, 37008468.0000000000], [219300062.0000000000, 49150000.0000000000], [219299821.2363336086, 49154900.8570164815], [219299101.2640201449, 49159754.5161008090], [219297909.0167866051, 49164514.2338627204], [219296255.9766255617, 49169134.1716182530], [219294158.0632174015, 49173569.8368413001], [219291635.4806151390, 49177778.5116509795], [219288712.5226681232, 49181719.6642081812], [219285417.3390593231, 49185355.3390593305], [219281781.6642081738, 49188650.5226681381], [219277840.5116509795, 49191573.4806151241], [219273631.8368412852, 49194096.0632174164], [219269196.1716182530, 49196193.9766255617], [219264576.2338627279, 49197847.0167866126], [219259816.5161008239, 49199039.2640201598], [219254962.8570164740, 49199759.2363336086], [219250062.0000000000, 49200000.0000000000], [212675062.0000000000, 49200000.0000000000], [212675062.0000000000, 49700000.0000000000], [213075062.0000000000, 49700000.0000000000], [213079962.8570164740, 49700240.7636663914], [213084816.5161007941, 49700960.7359798402], [213089576.2338627279, 49702152.9832133874], [213094196.1716182530, 49703806.0233744383], [213098631.8368412852, 49705903.9367825836], [213102840.5116509795, 49708426.5193848759], [213106781.6642081738, 49711349.4773318619], [213110417.3390593231, 49714644.6609406695], [213113712.5226681232, 49718280.3357918188], [213116635.4806151390, 49722221.4883490205], [213119158.0632174313, 49726430.1631586999], [213121255.9766255617, 49730865.8283817470], [213122909.0167866051, 49735485.7661372796], [213124101.2640201747, 49740245.4838991910], [213124821.2363336086, 49745099.1429835185], [213125062.0000000000, 49750000.0000000000], [213125062.0000000000, 57800000.0000000000], [213124821.2363336086, 57804900.8570164815], [213124101.2640201747, 57809754.5161008090], [213122909.0167866051, 57814514.2338627204], [213121255.9766255617, 57819134.1716182530], [213119158.0632174313, 57823569.8368413001], [213116635.4806151390, 57827778.5116509795], [213113712.5226681232, 57831719.6642081812], [213110417.3390593231, 57835355.3390593305], [213106781.6642081738, 57838650.5226681381], [213102840.5116509795, 57841573.4806151241], [213098631.8368412852, 57844096.0632174164], [213094196.1716182530, 57846193.9766255617], [213089576.2338627279, 57847847.0167866126], [213084816.5161007941, 57849039.2640201598], [213079962.8570164740, 57849759.2363336086], [213075062.0000000000, 57850000.0000000000], [212700062.0000000000, 57850000.0000000000], [212700062.0000000000, 58350000.0000000000], [219249988.0000000000, 58350000.0000000000], [219254890.3981388211, 58350240.9154777899], [219259745.5537340045, 58350961.3403004557], [219264506.6795004308, 58352154.3320083842], [219269127.8942824900, 58353808.3941948861], [219273564.6651935279, 58355907.5872926787], [219277774.2367621660, 58358431.6821774468], [219281716.0429505706, 58361356.3551081717], [219285352.0980739594, 58364653.4221258014], [219288647.3628539443, 58368291.1106512994], [219291570.0820789933, 58372234.3656658977], [219294092.0906172395, 58376445.1875229701], [219296189.0848329067, 58380882.9981361181], [219297840.8567914963, 58385505.0320147872], [219299031.4889957905, 58390266.7483789697], [219299749.5077767372, 58395122.2603817284], [219299987.9938608408, 58400024.7773033231], [219274974.9938608408, 108875648.7773033231], [219274732.0434487462, 108880547.0709154904], [219274010.3843984306, 108885398.0000459552], [219272816.9597353935, 108890154.8942835182], [219271163.2513052821, 108894771.9879193306], [219269065.1693081260, 108899204.8602553010], [219266542.8992273211, 108903410.8629720360], [219263620.7076268196, 108907349.5304451138], [219260326.7086842656, 108910982.9690616578], [219256692.5937068760, 108914276.2217918485], [219252753.3262316883, 108917197.6045077294], [219248546.8056441844, 108919719.0108138472], [219244113.5025511384, 108921816.1824565530], [219239496.0694162250, 108923468.9427108914], [219234738.9302038550, 108924661.3904992342], [219229887.8529797792, 108925382.0533742905], [219224989.5095799267, 108925623.9978947192], [133075014.5095799267, 108950623.9978947192], [133070111.5764135122, 108950384.4593511671], [133065255.7600877881, 108949665.3069619238], [133060493.8631598949, 108948473.4722434431], [133055871.7829492390, 108946820.4426385760], [133051434.0691584647, 108944722.1507953852], [133047223.4944830835, 108942198.8210010380], [133043280.6423489153, 108939274.7742510140], [133039643.5157507360, 108935978.1938323081], [133036347.1709620953, 108932340.8536801338], [133033423.3796471059, 108928397.8121263981], [133030900.3226307631, 108924187.0739915371], [133028802.3182793856, 108919749.2242769003], [133027149.5881091654, 108915127.0369881094], [133025958.0618821084, 108910365.0628598481], [133025239.2240675986, 108905509.1999556273], [133025000.0031501651, 108900606.2512815297], [133050511.0031501651, 37033450.2512815222], [133050753.3081911802, 37028551.4864123166], [133051474.4137663543, 37023700.0314010680], [133052667.3809337616, 37018942.5700702518], [133054320.7301955223, 37014324.8817746565], [133056418.5519609749, 37009891.4008829519], [133058940.6596389413, 37005684.7892016321], [133061862.7838861644, 37001745.5254556313], [133065156.8061424494, 36998111.5157759860], [133068791.0292056799, 36994817.7289426476], [133072730.4822425544, 36991895.8598923758], [133076937.2573005557, 36989374.0247296616], [133081370.8740826845, 36987276.4901754707], [133085988.6694747806, 36985623.4400572404], [133090746.2080776393, 36984430.7810870856], [133095597.7097928822, 36983709.9897972122], [133100496.4903486669, 36983468.0021053031], [219250047.4903486669, 36958468.0021053031], [219254949.3195381761, 36958707.4322004691], [219259804.0637904108, 36959426.2607047483], [219264564.9520018399, 36960617.5623506755], [219269186.1172875762, 36962269.8600161150], [219273623.0388677418, 36964367.2352960557], [219277832.9709851742, 36966889.4818621352], [219281775.3547224402, 36969812.3001324758], [219285412.2087506652, 36973107.5313763618], [219288708.4952455163, 36976743.4289983362], [219291632.4574450254, 36980684.9643881321], [219294155.9255978465, 36984894.1643899232], [219296254.5883531868, 36989330.4771395847], [219297908.2269790173, 36993951.1627454832], [219299100.9101513028, 36998711.7050490305], [219299821.1474382877, 37003566.2404978499], [219300062.0000000000, 37008468.0000000000]]);
|
|
}
|
|
}
|
|
translate(v = [176162531, 125454546, 2850000]) {
|
|
union() {
|
|
cylinder(d = 4500000, h = 300000);
|
|
translate(v = [0, 0, -2250000.0]) {
|
|
cylinder(d1 = 0, d2 = 4500000, h = 2250000.0);
|
|
}
|
|
translate(v = [0, 0, -10000000]) {
|
|
cylinder(d = 2000000, h = 10000000);
|
|
}
|
|
}
|
|
}
|
|
translate(v = [176162531, 20454546, 2850000]) {
|
|
union() {
|
|
cylinder(d = 4500000, h = 300000);
|
|
translate(v = [0, 0, -2250000.0]) {
|
|
cylinder(d1 = 0, d2 = 4500000, h = 2250000.0);
|
|
}
|
|
translate(v = [0, 0, -10000000]) {
|
|
cylinder(d = 2000000, h = 10000000);
|
|
}
|
|
}
|
|
}
|
|
translate(v = [228662531, 72954546, 2850000]) {
|
|
union() {
|
|
cylinder(d = 4500000, h = 300000);
|
|
translate(v = [0, 0, -2250000.0]) {
|
|
cylinder(d1 = 0, d2 = 4500000, h = 2250000.0);
|
|
}
|
|
translate(v = [0, 0, -10000000]) {
|
|
cylinder(d = 2000000, h = 10000000);
|
|
}
|
|
}
|
|
}
|
|
translate(v = [123662531, 72954546, 2850000]) {
|
|
union() {
|
|
cylinder(d = 4500000, h = 300000);
|
|
translate(v = [0, 0, -2250000.0]) {
|
|
cylinder(d1 = 0, d2 = 4500000, h = 2250000.0);
|
|
}
|
|
translate(v = [0, 0, -10000000]) {
|
|
cylinder(d = 2000000, h = 10000000);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/***********************************************
|
|
********* SolidPython code: **********
|
|
************************************************
|
|
|
|
from pcbnewTransition import pcbnew
|
|
import numpy as np
|
|
import json
|
|
from collections import OrderedDict
|
|
from kikit.common import *
|
|
from kikit.defs import *
|
|
from kikit.substrate import Substrate, extractRings, toShapely, linestringToKicad
|
|
from kikit.export import gerberImpl, pasteDxfExport
|
|
from kikit.export import exportSettingsJlcpcb
|
|
# Allow importing solid from this dir
|
|
import os
|
|
import sys
|
|
cur_path = os.path.abspath(os.path.dirname(__file__))
|
|
if cur_path not in sys.path:
|
|
sys.path.insert(0, cur_path)
|
|
import solid
|
|
import solid.utils
|
|
import subprocess
|
|
import shutil
|
|
from kikit.common import removeComponents, parseReferences
|
|
|
|
from shapely.geometry import Point
|
|
|
|
|
|
OUTER_BORDER = fromMm(7.5)
|
|
INNER_BORDER = fromMm(5)
|
|
MOUNTING_HOLES_COUNT = 3
|
|
MOUNTING_HOLE_R = fromMm(1)
|
|
HOLE_SPACING = fromMm(20)
|
|
|
|
def addBottomCounterpart(board, item):
|
|
item = item.Duplicate()
|
|
item.SetLayer(Layer.B_Paste)
|
|
board.Add(item)
|
|
|
|
def addRoundedCorner(board, center, start, end, thickness):
|
|
corner = pcbnew.PCB_SHAPE()
|
|
corner.SetShape(STROKE_T.S_ARC)
|
|
corner.SetCenter(toKiCADPoint((center[0], center[1])))
|
|
corner.SetStart(toKiCADPoint((start[0], start[1])))
|
|
|
|
if np.cross(start - center, end - center) > 0:
|
|
corner.SetArcAngleAndEnd(fromDegrees(90), True)
|
|
else:
|
|
corner.SetArcAngleAndEnd(fromDegrees(-90), True)
|
|
corner.SetWidth(thickness)
|
|
corner.SetLayer(Layer.F_Paste)
|
|
board.Add(corner)
|
|
addBottomCounterpart(board, corner)
|
|
|
|
def addLine(board, start, end, thickness):
|
|
line = pcbnew.PCB_SHAPE()
|
|
line.SetShape(STROKE_T.S_SEGMENT)
|
|
line.SetStart(toKiCADPoint((start[0], start[1])))
|
|
line.SetEnd(toKiCADPoint((end[0], end[1])))
|
|
line.SetWidth(thickness)
|
|
line.SetLayer(Layer.F_Paste)
|
|
board.Add(line)
|
|
addBottomCounterpart(board, line)
|
|
|
|
def addBite(board, origin, direction, normal, thickness):
|
|
"""
|
|
Adds a bite to the stencil, direction points to the bridge, normal points
|
|
inside the stencil
|
|
"""
|
|
direction = normalize(direction) * thickness
|
|
normal = normalize(normal) * thickness
|
|
center = toKiCADPoint((origin[0], origin[1])) + toKiCADPoint((normal[0], normal[1]))
|
|
start = origin
|
|
end = center + toKiCADPoint((direction[0], direction[1]))
|
|
# addLine(board, end, end + normal / 2, thickness)
|
|
addRoundedCorner(board, center, start, end, thickness)
|
|
|
|
def numberOfCuts(length, bridgeWidth, bridgeSpacing):
|
|
"""
|
|
Return number of bridges which fit inside the length and cut length
|
|
"""
|
|
count = round(np.floor((length + bridgeWidth) / (bridgeWidth + bridgeSpacing)))
|
|
cutLength = round((length - (count - 1) * bridgeWidth) / count)
|
|
return count, cutLength
|
|
|
|
def addFrame(board, rect, bridgeWidth, bridgeSpacing, clearance):
|
|
"""
|
|
Add rectangular frame to the board
|
|
"""
|
|
R=fromMm(1)
|
|
|
|
corners = [
|
|
(tl(rect), toKiCADPoint((R, 0)), toKiCADPoint((0, R))), # TL
|
|
(tr(rect), toKiCADPoint((0, R)), toKiCADPoint((-R, 0))), # TR
|
|
(br(rect), toKiCADPoint((-R, 0)), toKiCADPoint((0, -R))), # BR
|
|
(bl(rect), toKiCADPoint((0, -R)), toKiCADPoint((R, 0))) # BL
|
|
]
|
|
for c, sOffset, eOffset in corners:
|
|
addRoundedCorner(board, c + sOffset + eOffset, c + sOffset, c + eOffset, clearance)
|
|
|
|
count, cutLength = numberOfCuts(rect.GetWidth() - 2 * R, bridgeWidth, bridgeSpacing)
|
|
for i in range(count):
|
|
start = round(rect.GetX() + R + i * bridgeWidth + i * cutLength)
|
|
end = start + cutLength
|
|
|
|
y1, y2 = rect.GetY(), rect.GetY() + rect.GetHeight()
|
|
addLine(board, toKiCADPoint((start, y1)), toKiCADPoint((end, y1)), clearance)
|
|
if i != 0:
|
|
addBite(board, toKiCADPoint((start, y1)), toKiCADPoint((-1, 0)), toKiCADPoint((0, 1)), clearance)
|
|
if i != count - 1:
|
|
addBite(board, toKiCADPoint((end, y1)), toKiCADPoint((1, 0)), toKiCADPoint((0, 1)), clearance)
|
|
addLine(board, toKiCADPoint((start, y2)), toKiCADPoint((end, y2)), clearance)
|
|
if i != 0:
|
|
addBite(board, toKiCADPoint((start, y2)), toKiCADPoint((-1, 0)), toKiCADPoint((0, -1)), clearance)
|
|
if i != count - 1:
|
|
addBite(board, toKiCADPoint((end, y2)), toKiCADPoint((1, 0)), toKiCADPoint((0, -1)), clearance)
|
|
|
|
count, cutLength = numberOfCuts(rect.GetHeight() - 2 * R, bridgeWidth, bridgeSpacing)
|
|
for i in range(count):
|
|
start = rect.GetY() + R + i * bridgeWidth + i * cutLength
|
|
end = start + cutLength
|
|
|
|
x1, x2 = rect.GetX(), rect.GetX() + rect.GetWidth()
|
|
addLine(board, toKiCADPoint((x1, start)), toKiCADPoint((x1, end)), clearance)
|
|
if i != 0:
|
|
addBite(board, toKiCADPoint((x1, start)), toKiCADPoint((0, -1)), toKiCADPoint((1, 0)), clearance)
|
|
if i != count - 1:
|
|
addBite(board, toKiCADPoint((x1, end)), toKiCADPoint((0, 1)), toKiCADPoint((1, 0)), clearance)
|
|
addLine(board, toKiCADPoint((x2, start)), toKiCADPoint((x2, end)), clearance)
|
|
if i != 0:
|
|
addBite(board, toKiCADPoint((x2, start)), toKiCADPoint((0, -1)), toKiCADPoint((-1, 0)), clearance)
|
|
if i != count - 1:
|
|
addBite(board, toKiCADPoint((x2, end)), toKiCADPoint((0, 1)), toKiCADPoint((-1, 0)), clearance)
|
|
|
|
def addHole(board, position, radius):
|
|
circle = pcbnew.PCB_SHAPE()
|
|
circle.SetShape(STROKE_T.S_CIRCLE)
|
|
circle.SetCenter(toKiCADPoint((position[0], position[1])))
|
|
# Set 3'oclock point of the circle to set radius
|
|
circle.SetEnd(toKiCADPoint((position[0], position[1])) + toKiCADPoint((radius/2, 0)))
|
|
|
|
circle.SetWidth(radius)
|
|
circle.SetLayer(Layer.F_Paste)
|
|
board.Add(circle)
|
|
addBottomCounterpart(board, circle)
|
|
|
|
def addJigFrame(board, jigFrameSize, bridgeWidth=fromMm(2),
|
|
bridgeSpacing=fromMm(10), clearance=fromMm(0.5)):
|
|
"""
|
|
Given a Pcbnew board finds the board outline and creates a stencil for
|
|
KiKit's stencil jig.
|
|
|
|
Mainly, adds mounting holes and mouse bites to define the panel outline.
|
|
|
|
jigFrameSize is a tuple (width, height).
|
|
"""
|
|
bBox = findBoardBoundingBox(board)
|
|
frameSize = rectByCenter(rectCenter(bBox),
|
|
jigFrameSize[0] + 2 * (OUTER_BORDER + INNER_BORDER),
|
|
jigFrameSize[1] + 2 * (OUTER_BORDER + INNER_BORDER))
|
|
cutSize = rectByCenter(rectCenter(bBox),
|
|
jigFrameSize[0] + 2 * (OUTER_BORDER + INNER_BORDER) - fromMm(1),
|
|
jigFrameSize[1] + 2 * (OUTER_BORDER + INNER_BORDER) - fromMm(1))
|
|
addFrame(board, cutSize, bridgeWidth, bridgeSpacing, clearance)
|
|
|
|
for i in range(MOUNTING_HOLES_COUNT):
|
|
x = frameSize.GetX() + OUTER_BORDER / 2 + (i + 1) * (frameSize.GetWidth() - OUTER_BORDER) / (MOUNTING_HOLES_COUNT + 1)
|
|
addHole(board, toKiCADPoint((x, OUTER_BORDER / 2 + frameSize.GetY())), MOUNTING_HOLE_R)
|
|
addHole(board, toKiCADPoint((x, - OUTER_BORDER / 2 +frameSize.GetY() + frameSize.GetHeight())), MOUNTING_HOLE_R)
|
|
for i in range(MOUNTING_HOLES_COUNT):
|
|
y = frameSize.GetY() + OUTER_BORDER / 2 + (i + 1) * (frameSize.GetHeight() - OUTER_BORDER) / (MOUNTING_HOLES_COUNT + 1)
|
|
addHole(board, toKiCADPoint((OUTER_BORDER / 2 + frameSize.GetX(), y)), MOUNTING_HOLE_R)
|
|
addHole(board, toKiCADPoint((- OUTER_BORDER / 2 +frameSize.GetX() + frameSize.GetWidth(), y)), MOUNTING_HOLE_R)
|
|
|
|
PIN_TOLERANCE = fromMm(0.05)
|
|
addHole(board, tl(frameSize) + toKiCADPoint((OUTER_BORDER / 2, OUTER_BORDER / 2)), MOUNTING_HOLE_R + PIN_TOLERANCE)
|
|
addHole(board, tr(frameSize) + toKiCADPoint((-OUTER_BORDER / 2, OUTER_BORDER / 2)), MOUNTING_HOLE_R + PIN_TOLERANCE)
|
|
addHole(board, br(frameSize) + toKiCADPoint((-OUTER_BORDER / 2, -OUTER_BORDER / 2)), MOUNTING_HOLE_R + PIN_TOLERANCE)
|
|
addHole(board, bl(frameSize) + toKiCADPoint((OUTER_BORDER / 2, -OUTER_BORDER / 2)), MOUNTING_HOLE_R + PIN_TOLERANCE)
|
|
|
|
def jigMountingHoles(jigFrameSize, origin=toKiCADPoint((0, 0))):
|
|
""" Get list of all mounting holes in a jig of given size """
|
|
w, h = jigFrameSize
|
|
holes = [
|
|
toKiCADPoint((0, (w + INNER_BORDER) / 2)),
|
|
toKiCADPoint((0, -(w + INNER_BORDER) / 2)),
|
|
toKiCADPoint(((h + INNER_BORDER) / 2, 0)),
|
|
toKiCADPoint((-(h + INNER_BORDER) / 2, 0)),
|
|
]
|
|
return [x + origin for x in holes]
|
|
|
|
def createOuterPolygon(board, jigFrameSize, outerBorder):
|
|
bBox = findBoardBoundingBox(board)
|
|
centerpoint = rectCenter(bBox)
|
|
holes = jigMountingHoles(jigFrameSize, centerpoint)
|
|
|
|
outerSubstrate = Substrate(collectEdges(board, Layer.Edge_Cuts))
|
|
outerSubstrate.substrates = outerSubstrate.substrates.buffer(outerBorder)
|
|
tabs = []
|
|
for hole in holes:
|
|
tab, _ = outerSubstrate.tab(hole, centerpoint - hole, INNER_BORDER, maxHeight=fromMm(1000))
|
|
tabs.append(tab)
|
|
outerSubstrate.union(tabs)
|
|
outerSubstrate.union([Point(x).buffer(INNER_BORDER / 2) for x in holes])
|
|
outerSubstrate.millFillets(fromMm(3))
|
|
return outerSubstrate.exterior(), holes
|
|
|
|
def createOffsetPolygon(board, offset):
|
|
outerSubstrate = Substrate(collectEdges(board, Layer.Edge_Cuts))
|
|
outerSubstrate.substrates = outerSubstrate.substrates.buffer(offset)
|
|
return outerSubstrate.exterior()
|
|
|
|
def m2countersink():
|
|
HEAD_DIA = fromMm(4.5)
|
|
HOLE_LEN = fromMm(10)
|
|
SINK_EXTRA = fromMm(0.3)
|
|
sinkH = np.sqrt(HEAD_DIA**2 / 4)
|
|
|
|
sink = solid.cylinder(d1=0, d2=HEAD_DIA, h=sinkH)
|
|
sinkE = solid.cylinder(d=HEAD_DIA, h=SINK_EXTRA)
|
|
hole = solid.cylinder(h=HOLE_LEN, d=fromMm(2))
|
|
return sinkE + solid.utils.down(sinkH)(sink) + solid.utils.down(HOLE_LEN)(hole)
|
|
|
|
def mirrorX(linestring, origin):
|
|
return [(2 * origin - x, y) for x, y in linestring]
|
|
|
|
def makeRegister(board, jigFrameSize, jigThickness, pcbThickness,
|
|
outerBorder, innerBorder, tolerance, topSide):
|
|
bBox = findBoardBoundingBox(board)
|
|
centerpoint = rectCenter(bBox)
|
|
|
|
top = jigThickness - fromMm(0.15)
|
|
pcbBottom = jigThickness - pcbThickness
|
|
|
|
outerPolygon, holes = createOuterPolygon(board, jigFrameSize, outerBorder)
|
|
outerRing = outerPolygon.exterior.coords
|
|
if topSide:
|
|
outerRing = mirrorX(outerRing, centerpoint[0])
|
|
body = solid.linear_extrude(height=top, convexity=10)(solid.polygon(
|
|
outerRing))
|
|
|
|
innerRings = [x.exterior.coords for x in listGeometries(createOffsetPolygon(board, - innerBorder))]
|
|
if topSide:
|
|
innerRings = [mirrorX(innerRing, centerpoint[0]) for innerRing in innerRings]
|
|
|
|
innerCutout = solid.utils.down(jigThickness)(
|
|
solid.linear_extrude(height=3 * jigThickness, convexity=10)(solid.polygon(innerRings[0])))
|
|
for innerRing in innerRings[1:]:
|
|
innerCutout = innerCutout + solid.utils.down(jigThickness)(
|
|
solid.linear_extrude(height=3 * jigThickness, convexity=10)(solid.polygon(innerRing)))
|
|
registerRing = createOffsetPolygon(board, tolerance).exterior.coords
|
|
if topSide:
|
|
registerRing = mirrorX(registerRing, centerpoint[0])
|
|
registerCutout = solid.utils.up(jigThickness - pcbThickness)(
|
|
solid.linear_extrude(height=jigThickness, convexity=10)(solid.polygon(registerRing)))
|
|
|
|
register = body - innerCutout - registerCutout
|
|
for hole in holes:
|
|
register = register - solid.translate([hole[0], hole[1], top])(m2countersink())
|
|
return solid.scale(toMm(1))(
|
|
solid.translate([-centerpoint[0], -centerpoint[1], 0])(register))
|
|
|
|
def makeTopRegister(board, jigFrameSize, jigThickness, pcbThickness,
|
|
outerBorder=fromMm(3), innerBorder=fromMm(1),
|
|
tolerance=fromMm(0.05)):
|
|
"""
|
|
Create a SolidPython representation of the top register
|
|
"""
|
|
return makeRegister(board, jigFrameSize, jigThickness, pcbThickness,
|
|
outerBorder, innerBorder, tolerance, True)
|
|
|
|
def makeBottomRegister(board, jigFrameSize, jigThickness, pcbThickness,
|
|
outerBorder=fromMm(3), innerBorder=fromMm(1),
|
|
tolerance=fromMm(0.05)):
|
|
"""
|
|
Create a SolidPython representation of the top register
|
|
"""
|
|
return makeRegister(board, jigFrameSize, jigThickness, pcbThickness,
|
|
outerBorder, innerBorder, tolerance, False)
|
|
|
|
def renderScad(infile, outfile):
|
|
infile = os.path.abspath(infile)
|
|
outfile = os.path.abspath(outfile)
|
|
try:
|
|
subprocess.run(["openscad", "-o", outfile, infile],
|
|
stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)
|
|
except subprocess.CalledProcessError as e:
|
|
message = f"Cannot render {outfile}, OpenSCAD error:\n"
|
|
message += (e.stdout.decode("utf-8") + "\n") if e.stdout is not None else ""
|
|
message += (e.stderr.decode("utf-8") + "\n") if e.stderr is not None else ""
|
|
raise RuntimeError(message)
|
|
except FileNotFoundError as e:
|
|
message = f"OpenSCAD is not available.\n"
|
|
message += f"Did you install it? Program `openscad` has to be in PATH"
|
|
raise RuntimeError(message)
|
|
|
|
def shapelyToSHAPE_POLY_SET(polygon):
|
|
p = pcbnew.SHAPE_POLY_SET()
|
|
p.AddOutline(linestringToKicad(polygon.exterior))
|
|
return p
|
|
|
|
def cutoutComponents(board, components):
|
|
topCutout = extractComponentPolygons(components, pcbnew.F_CrtYd)
|
|
for polygon in topCutout:
|
|
zone = pcbnew.PCB_SHAPE()
|
|
zone.SetShape(STROKE_T.S_POLYGON)
|
|
zone.SetPolyShape(shapelyToSHAPE_POLY_SET(polygon))
|
|
zone.SetLayer(Layer.F_Paste)
|
|
board.Add(zone)
|
|
bottomCutout = extractComponentPolygons(components, pcbnew.B_CrtYd)
|
|
for polygon in bottomCutout:
|
|
zone = pcbnew.PCB_SHAPE()
|
|
zone.SetShape(STROKE_T.S_POLYGON)
|
|
zone.SetPolyShape(shapelyToSHAPE_POLY_SET(polygon))
|
|
zone.SetLayer(Layer.B_Paste)
|
|
board.Add(zone)
|
|
|
|
def setStencilLayerVisibility(boardName):
|
|
prlPath = os.path.splitext(boardName)[0] + ".kicad_prl"
|
|
try:
|
|
with open(prlPath, encoding="utf-8") as f:
|
|
# We use ordered dict, so we preserve the ordering of the keys and
|
|
# thus, formatting
|
|
prl = json.load(f, object_pairs_hook=OrderedDict)
|
|
except FileNotFoundError:
|
|
# KiCAD didn't generate project local settings, let's create an empty one
|
|
prl = {
|
|
"board": {}
|
|
}
|
|
prl["board"]["visible_layers"] = "ffc000c_7ffffffe"
|
|
prl["board"]["visible_items"] = [
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
9,
|
|
10,
|
|
12,
|
|
13,
|
|
21,
|
|
22,
|
|
24,
|
|
25,
|
|
26,
|
|
27,
|
|
28,
|
|
29,
|
|
30,
|
|
34,
|
|
35
|
|
]
|
|
with open(prlPath, "w", encoding="utf-8") as f:
|
|
json.dump(prl, f, indent=2)
|
|
pass
|
|
|
|
from pathlib import Path
|
|
import os
|
|
|
|
def create(inputboard, outputdir, jigsize, jigthickness, pcbthickness,
|
|
registerborder, tolerance, ignore, cutout):
|
|
board = pcbnew.LoadBoard(inputboard)
|
|
refs = parseReferences(ignore)
|
|
removeComponents(board, refs)
|
|
|
|
Path(outputdir).mkdir(parents=True, exist_ok=True)
|
|
|
|
jigsize = (fromMm(jigsize[0]), fromMm(jigsize[1]))
|
|
addJigFrame(board, jigsize)
|
|
cutoutComponents(board, getComponents(board, parseReferences(cutout)))
|
|
|
|
stencilFile = os.path.join(outputdir, "stencil.kicad_pcb")
|
|
board.Save(stencilFile)
|
|
|
|
setStencilLayerVisibility(stencilFile)
|
|
|
|
plotPlan = [
|
|
# name, id, comment
|
|
("PasteBottom", pcbnew.B_Paste, "Paste Bottom"),
|
|
("PasteTop", pcbnew.F_Paste, "Paste top"),
|
|
]
|
|
# get a copy of exportSettingsJlcpcb dictionary and
|
|
# exclude the Edge.Cuts layer for creation of stencil gerber files
|
|
exportSettings = exportSettingsJlcpcb.copy()
|
|
exportSettings["ExcludeEdgeLayer"] = True
|
|
gerberDir = os.path.join(outputdir, "gerber")
|
|
gerberImpl(stencilFile, gerberDir, plotPlan, False, exportSettings)
|
|
|
|
shutil.make_archive(os.path.join(outputdir, "gerbers"), "zip", gerberDir)
|
|
|
|
jigthickness = fromMm(jigthickness)
|
|
pcbthickness = fromMm(pcbthickness)
|
|
outerBorder, innerBorder = fromMm(registerborder[0]), fromMm(registerborder[1])
|
|
tolerance = fromMm(tolerance)
|
|
topRegister = makeTopRegister(board, jigsize,jigthickness, pcbthickness,
|
|
outerBorder, innerBorder, tolerance)
|
|
bottomRegister = makeBottomRegister(board, jigsize,jigthickness, pcbthickness,
|
|
outerBorder, innerBorder, tolerance)
|
|
|
|
topRegisterFile = os.path.join(outputdir, "topRegister.scad")
|
|
solid.scad_render_to_file(topRegister, topRegisterFile)
|
|
renderScad(topRegisterFile, os.path.join(outputdir, "topRegister.stl"))
|
|
|
|
bottomRegisterFile = os.path.join(outputdir, "bottomRegister.scad")
|
|
solid.scad_render_to_file(bottomRegister, bottomRegisterFile)
|
|
renderScad(bottomRegisterFile, os.path.join(outputdir, "bottomRegister.stl"))
|
|
|
|
def printedStencilSubstrate(outlineDxf, thickness, frameHeight, frameWidth, frameClearance):
|
|
bodyOffset = solid.utils.up(0) if frameWidth + frameClearance == 0 else solid.offset(r=frameWidth + frameClearance)
|
|
body = solid.linear_extrude(height=thickness + frameHeight)(
|
|
bodyOffset(solid.import_dxf(outlineDxf)))
|
|
boardOffset = solid.utils.up(0) if frameClearance == 0 else solid.offset(r=frameClearance)
|
|
board = solid.utils.up(thickness)(
|
|
solid.linear_extrude(height=thickness + frameHeight)(
|
|
boardOffset(solid.import_dxf(outlineDxf))))
|
|
return body - board
|
|
|
|
def getComponents(board, references):
|
|
"""
|
|
Return a list of components based on designator
|
|
"""
|
|
return [f for f in board.GetFootprints() if f.GetReference() in references]
|
|
|
|
def collectFootprintEdges(footprint, layer):
|
|
"""
|
|
Return all edges on given layer in given footprint
|
|
"""
|
|
return [e for e in footprint.GraphicalItems() if e.GetLayer() == layer]
|
|
|
|
def extractComponentPolygons(footprints, srcLayer):
|
|
"""
|
|
Return a list of shapely polygons with holes for already placed components.
|
|
The source layer defines the geometry on which the cutout is computed.
|
|
Usually it a font or back courtyard
|
|
"""
|
|
polygons = []
|
|
for f in footprints:
|
|
edges = collectFootprintEdges(f, srcLayer)
|
|
for ring in extractRings(edges):
|
|
polygons.append(toShapely(ring, edges))
|
|
return polygons
|
|
|
|
def printedStencil(outlineDxf, holesDxf, extraHoles, thickness, frameHeight, frameWidth,
|
|
frameClearance, enlargeHoles, front):
|
|
zScale = -1 if front else 1
|
|
xRotate = 180 if front else 0
|
|
substrate = solid.scale([1, 1, zScale])(printedStencilSubstrate(outlineDxf,
|
|
thickness, frameHeight, frameWidth, frameClearance))
|
|
holesOffset = solid.utils.up(0) if enlargeHoles == 0 else solid.offset(delta=enlargeHoles)
|
|
holes = solid.linear_extrude(height=4*thickness, center=True)(
|
|
holesOffset(solid.import_dxf(holesDxf)))
|
|
substrate -= holes
|
|
for h in extraHoles:
|
|
substrate -= solid.scale([toMm(1), -toMm(1), 1])(
|
|
solid.linear_extrude(height=4*thickness, center=True)(
|
|
solid.polygon(h.exterior.coords)))
|
|
return solid.rotate(a=xRotate, v=[1, 0, 0])(substrate)
|
|
|
|
def createPrinted(inputboard, outputdir, pcbthickness, thickness, framewidth,
|
|
ignore, cutout, frameclearance, enlargeholes):
|
|
"""
|
|
Create a 3D printed self-registering stencil.
|
|
"""
|
|
board = pcbnew.LoadBoard(inputboard)
|
|
refs = parseReferences(ignore)
|
|
cutoutComponents = getComponents(board, parseReferences(cutout))
|
|
removeComponents(board, refs)
|
|
Path(outputdir).mkdir(parents=True, exist_ok=True)
|
|
|
|
# We create the stencil based on DXF export. Using it avoids the necessity
|
|
# to interpret KiCAD PAD shapes which constantly change with newer and newer
|
|
# versions.
|
|
height = min(pcbthickness, max(0.5, pcbthickness - 0.3))
|
|
bottomPaste, topPaste, outline = pasteDxfExport(board, outputdir)
|
|
# On Windows, OpenSCAD requires to use forward slashes instead of backslashes,
|
|
# hence, the replacement:
|
|
if os.name == "nt":
|
|
bottomPaste = bottomPaste.replace("\\", "/")
|
|
topPaste = topPaste.replace("\\", "/")
|
|
outline = outline.replace("\\", "/")
|
|
|
|
topCutout = extractComponentPolygons(cutoutComponents, pcbnew.F_CrtYd)
|
|
bottomCutout = extractComponentPolygons(cutoutComponents, pcbnew.B_CrtYd)
|
|
topStencil = printedStencil(outline, topPaste, topCutout, thickness, height,
|
|
framewidth, frameclearance, enlargeholes, True)
|
|
bottomStencil = printedStencil(outline, bottomPaste, bottomCutout, thickness,
|
|
height, framewidth, frameclearance, enlargeholes, False)
|
|
|
|
bottomStencilFile = os.path.join(outputdir, "bottomStencil.scad")
|
|
solid.scad_render_to_file(bottomStencil, bottomStencilFile,
|
|
file_header=f'$fa = 0.4; $fs = 0.4;', include_orig_code=True)
|
|
renderScad(bottomStencilFile, os.path.join(outputdir, "bottomStencil.stl"))
|
|
|
|
topStencilFile = os.path.join(outputdir, "topStencil.scad")
|
|
solid.scad_render_to_file(topStencil, topStencilFile,
|
|
file_header=f'$fa = 0.4; $fs = 0.4;', include_orig_code=True)
|
|
renderScad(topStencilFile, os.path.join(outputdir, "topStencil.stl"))
|
|
|
|
|
|
|
|
|
|
|
|
************************************************/
|