diff --git a/CAD/.gitignore b/CAD/.gitignore new file mode 100644 index 0000000..fd26fce --- /dev/null +++ b/CAD/.gitignore @@ -0,0 +1 @@ +*.FCBak \ No newline at end of file diff --git a/CAD/Case.png b/CAD/Case.png new file mode 100644 index 0000000..f92fa86 Binary files /dev/null and b/CAD/Case.png differ diff --git a/CAD/Case_exploded.png b/CAD/Case_exploded.png new file mode 100644 index 0000000..ec6412f Binary files /dev/null and b/CAD/Case_exploded.png differ diff --git a/CAD/Flow_Controller_Case.FCStd b/CAD/Flow_Controller_Case.FCStd new file mode 100644 index 0000000..ea4d942 Binary files /dev/null and b/CAD/Flow_Controller_Case.FCStd differ diff --git a/Flow_Controller.kicad_pcb b/Flow_Controller.kicad_pcb index 8f38571..c1b25a0 100644 --- a/Flow_Controller.kicad_pcb +++ b/Flow_Controller.kicad_pcb @@ -115,7 +115,7 @@ (net 3 "/FLOW_PULSE_MCU") (net 4 "/ALARM _CNC") (net 5 "Net-(Q1-G)") - (net 6 "/RAW_SENSOR") + (net 6 "/HALL_SENSOR") (net 7 "/I2C_SDA") (net 8 "/I2C_SCL") (net 9 "/BUTTON_ADC") @@ -425,14 +425,14 @@ ) (embedded_fonts no) ) - (footprint "Connector_JST:JST_XH_B3B-XH-A_1x03_P2.50mm_Vertical" + (footprint "Connector_JST:JST_XH_S3B-XH-A_1x03_P2.50mm_Horizontal" (layer "F.Cu") (uuid "50452d58-a549-4ad4-bb7b-3d45113b8912") - (at 176.74 61.86 90) - (descr "JST XH series connector, B3B-XH-A (http://www.jst-mfg.com/product/pdf/eng/eXH.pdf), generated with kicad-footprint-generator") - (tags "connector JST XH vertical") + (at 175.795 61.86 90) + (descr "JST XH series connector, S3B-XH-A (http://www.jst-mfg.com/product/pdf/eng/eXH.pdf), generated with kicad-footprint-generator") + (tags "connector JST XH horizontal") (property "Reference" "J3" - (at -3.99 0.41 180) + (at -4.14 0.055 180) (layer "F.SilkS") (uuid "afb4b717-cf7d-40ea-bee7-67eba13f42c2") (effects @@ -443,7 +443,7 @@ ) ) (property "Value" "Conn_01x03_Pin" - (at 2.5 4.6 90) + (at 2.5 10.4 90) (layer "F.Fab") (uuid "20d2f18e-ad2d-42ea-ad78-779c05aabcaa") (effects @@ -483,173 +483,301 @@ (sheetfile "Flow_Controller.kicad_sch") (attr through_hole) (fp_line - (start -1.6 -2.75) - (end -2.85 -2.75) + (start 7.56 -2.41) + (end 6.14 -2.41) (stroke (width 0.12) (type solid) ) (layer "F.SilkS") - (uuid "1eb3314c-77cb-42df-abc2-1bb56e1d0606") + (uuid "6cb625db-4dce-4ba2-9389-981c0981b326") ) (fp_line - (start -2.85 -2.75) - (end -2.85 -1.5) + (start 6.14 -2.41) + (end 6.14 2.09) (stroke (width 0.12) (type solid) ) (layer "F.SilkS") - (uuid "2ae1a4fe-f06b-4a4c-92c8-1a46484442fd") + (uuid "1f46a9f3-8f11-4b96-96e3-7e95ab8cb02a") ) (fp_line - (start 7.55 -0.2) - (end 6.8 -0.2) + (start -1.14 -2.41) + (end -1.14 2.09) (stroke (width 0.12) (type solid) ) (layer "F.SilkS") - (uuid "b7325b0f-734f-4626-be23-ea8bb9d0ca80") + (uuid "9720703f-2b6a-4d07-afb2-6a136b549d87") ) (fp_line - (start 6.8 -0.2) - (end 6.8 2.75) + (start -2.56 -2.41) + (end -1.14 -2.41) (stroke (width 0.12) (type solid) ) (layer "F.SilkS") - (uuid "4af19c57-d7eb-4fe3-ab15-ad30667c6396") + (uuid "d449a2b8-e519-4beb-88c3-3f85de7a8de6") ) (fp_line - (start -1.8 -0.2) - (end -1.8 2.75) + (start 0.3 -2.1) + (end 0 -1.5) (stroke (width 0.12) (type solid) ) (layer "F.SilkS") - (uuid "795c76c0-cc29-47d0-a1e5-7605f996c438") + (uuid "db5e4ec6-839a-42e3-a3fb-e2e65fe3a96d") ) (fp_line - (start -2.55 -0.2) - (end -1.8 -0.2) + (start -0.3 -2.1) + (end 0.3 -2.1) (stroke (width 0.12) (type solid) ) (layer "F.SilkS") - (uuid "f12bd94c-98d3-4f6a-a6a3-4777dc42ba46") + (uuid "febc2303-4b80-467e-8eb6-4bc380368371") ) (fp_line - (start 6.8 2.75) - (end 2.5 2.75) + (start 0 -1.5) + (end -0.3 -2.1) (stroke (width 0.12) (type solid) ) (layer "F.SilkS") - (uuid "e0868de5-e30d-485d-9e04-030a7b2a7c94") + (uuid "2f1c4a69-659f-4151-a137-90a3e50f9ba4") ) (fp_line - (start -1.8 2.75) - (end 2.5 2.75) + (start 6.14 2.09) + (end 2.5 2.09) (stroke (width 0.12) (type solid) ) (layer "F.SilkS") - (uuid "63b89bdf-9b39-4579-ab8c-f033acb3f5fc") + (uuid "e9ab8b49-841b-4bd7-a201-b6e8e52dfe46") + ) + (fp_line + (start -1.14 2.09) + (end 2.5 2.09) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "abef5b23-438f-4f64-9e3e-e524b2e7a729") + ) + (fp_line + (start 7.56 9.31) + (end 7.56 -2.41) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "1fc1b67b-7604-4f5d-9c5e-c4688e4c8743") + ) + (fp_line + (start 2.5 9.31) + (end 7.56 9.31) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "288e17ab-b622-46ab-887f-a060db9e37d3") + ) + (fp_line + (start 2.5 9.31) + (end -2.56 9.31) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "3d8bbcf5-09bb-455e-8067-4cc8a23e4bb5") + ) + (fp_line + (start -2.56 9.31) + (end -2.56 -2.41) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "db4fa759-32b8-4ed6-ba35-e1458c83cbc8") ) (fp_rect - (start -2.56 -2.46) - (end 7.56 3.51) + (start 4.75 3.2) + (end 5.25 8.7) (stroke (width 0.12) (type solid) ) (fill no) (layer "F.SilkS") - (uuid "d8a52037-85b8-456b-9435-fccab605dc2e") + (uuid "837b5bb8-3aa2-47ee-84a1-ebd9e3748ff3") ) (fp_rect - (start 5.75 -2.45) - (end 7.55 -1.7) + (start 2.25 3.2) + (end 2.75 8.7) (stroke (width 0.12) (type solid) ) (fill no) (layer "F.SilkS") - (uuid "01399c0b-daf5-479f-a3f4-56905c94ff19") + (uuid "69856ddc-d104-4971-99c2-76295c0bef8d") ) (fp_rect - (start 0.75 -2.45) - (end 4.25 -1.7) + (start -0.25 3.2) + (end 0.25 8.7) (stroke (width 0.12) (type solid) ) (fill no) (layer "F.SilkS") - (uuid "7e6d98af-ab1b-4e7a-9d82-84acd077e1d7") + (uuid "9149520f-e55d-4ff6-bf35-0b96acb90618") ) (fp_rect - (start -2.55 -2.45) - (end -0.75 -1.7) - (stroke - (width 0.12) - (type solid) - ) - (fill no) - (layer "F.SilkS") - (uuid "f3e903d0-b535-419d-9afb-fdc0c7f652fe") - ) - (fp_rect - (start -2.95 -2.85) - (end 7.95 3.9) + (start -2.95 -2.81) + (end 7.95 9.7) (stroke (width 0.05) (type solid) ) (fill no) (layer "F.CrtYd") - (uuid "6ffdc8d7-b0a7-4d06-9234-616c4be30378") + (uuid "18170c48-7aa6-4f6e-a34c-06fe21945103") ) (fp_line - (start -0.625 -2.35) - (end 0 -1.35) + (start 7.45 -2.3) + (end 6.25 -2.3) (stroke (width 0.1) (type solid) ) (layer "F.Fab") - (uuid "e8229e67-c7b6-4d5e-9b61-41d68915d866") + (uuid "7028e07b-5a18-4b91-9c0f-263a3c21c701") ) (fp_line - (start 0 -1.35) - (end 0.625 -2.35) + (start 6.25 -2.3) + (end 6.25 2.2) (stroke (width 0.1) (type solid) ) (layer "F.Fab") - (uuid "85eee737-b175-4831-a3ff-aedc0d12759e") + (uuid "07a4667e-68f5-4068-989d-3094d335e0be") ) - (fp_rect - (start -2.45 -2.35) - (end 7.45 3.4) + (fp_line + (start -1.25 -2.3) + (end -1.25 2.2) (stroke (width 0.1) (type solid) ) - (fill no) (layer "F.Fab") - (uuid "30cb2286-da8f-4886-bffb-c06655021d49") + (uuid "79c96d7b-aa00-4b4f-ad3d-2b1b7291d662") + ) + (fp_line + (start -2.45 -2.3) + (end -1.25 -2.3) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "42e2a85d-d44f-422d-8248-4e2912fdbbe0") + ) + (fp_line + (start 0 1.2) + (end 0.625 2.2) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "010a05b4-7787-4ca7-8030-d2ee3c92fd59") + ) + (fp_line + (start 6.25 2.2) + (end 2.5 2.2) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "8c6e5558-2f2f-4ff2-baec-52043d444e03") + ) + (fp_line + (start -0.625 2.2) + (end 0 1.2) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "a963c59e-83f5-4a8a-bb16-806d601fbc02") + ) + (fp_line + (start -1.25 2.2) + (end 2.5 2.2) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "a3208ef7-4afe-4859-b969-b350000c520d") + ) + (fp_line + (start 7.45 9.2) + (end 7.45 -2.3) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "7a446cb7-12c7-48b2-b330-6eca6c95d94b") + ) + (fp_line + (start 2.5 9.2) + (end 7.45 9.2) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "666fe049-7d2a-41fa-a167-d5e5a74e54a5") + ) + (fp_line + (start 2.5 9.2) + (end -2.45 9.2) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "795090e6-e6cc-49da-a1eb-af149cb07311") + ) + (fp_line + (start -2.45 9.2) + (end -2.45 -2.3) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "ce085e35-9d75-4469-a0e2-c92c0e5b2e64") ) (fp_text user "${REFERENCE}" - (at 2.5 2.7 90) + (at 2.5 3.45 90) (layer "F.Fab") (uuid "60fff1e3-ee1b-4412-838b-3373857131ef") (effects @@ -694,7 +822,7 @@ (uuid "91431af4-8a00-400a-b208-e47f0938c877") ) (embedded_fonts no) - (model "${KICAD9_3DMODEL_DIR}/Connector_JST.3dshapes/JST_XH_B3B-XH-A_1x03_P2.50mm_Vertical.step" + (model "${KICAD9_3DMODEL_DIR}/Connector_JST.3dshapes/JST_XH_S3B-XH-A_1x03_P2.50mm_Horizontal.step" (offset (xyz 0 0 0) ) @@ -1612,7 +1740,7 @@ (footprint "Connector_JST:JST_XH_S3B-XH-A_1x03_P2.50mm_Horizontal" (layer "F.Cu") (uuid "ecb096f9-32d0-46b9-93e2-1e869173e9b6") - (at 176.75 80.85 90) + (at 175.805 80.85 90) (descr "JST XH series connector, S3B-XH-A (http://www.jst-mfg.com/product/pdf/eng/eXH.pdf), generated with kicad-footprint-generator") (tags "connector JST XH horizontal") (property "Reference" "J2" @@ -2000,7 +2128,7 @@ (drill 0.95) (layers "*.Cu" "*.Mask") (remove_unused_layers no) - (net 6 "/RAW_SENSOR") + (net 6 "/HALL_SENSOR") (pinfunction "Pin_3") (pintype "passive") (uuid "34a89448-dd3d-4fe0-98da-97605966383c") @@ -2439,7 +2567,7 @@ (size 1.3 1.75) (layers "B.Cu" "B.Mask" "B.Paste") (roundrect_rratio 0.192308) - (net 6 "/RAW_SENSOR") + (net 6 "/HALL_SENSOR") (pintype "passive") (uuid "07ef026b-9076-4512-9c7f-f5ef8bd0eb36") ) @@ -3538,7 +3666,7 @@ (size 1.3 1.75) (layers "B.Cu" "B.Mask" "B.Paste") (roundrect_rratio 0.192308) - (net 6 "/RAW_SENSOR") + (net 6 "/HALL_SENSOR") (pintype "passive") (uuid "9586c56a-a6cf-45c0-9e42-7db0f26058d2") ) @@ -5009,7 +5137,7 @@ ) ) (gr_text "ALARM" - (at 173.69 57.407 0) + (at 172.745 57.407 0) (layer "F.SilkS") (uuid "2f7f6508-ef26-4dea-8caf-e8ebe7fd9244") (effects @@ -5022,7 +5150,7 @@ ) ) (gr_text "GND" - (at 173.69 59.82 0) + (at 172.745 59.82 0) (layer "F.SilkS") (uuid "8948749b-a073-4ecd-9f42-de712c65cd57") (effects @@ -5035,7 +5163,7 @@ ) ) (gr_text "+24V" - (at 173.69 62.36 0) + (at 172.745 62.36 0) (layer "F.SilkS") (uuid "5513a844-1234-4868-ac79-aef15e566972") (effects @@ -5048,7 +5176,7 @@ ) ) (gr_text "+5V" - (at 173.8 81.6 0) + (at 172.855 81.6 0) (layer "F.SilkS") (uuid "a81b4cab-0cc2-45c5-87dc-0f22d013f287") (effects @@ -5060,8 +5188,8 @@ (justify right bottom) ) ) - (gr_text "HALL SENSOR" - (at 173.85 76.65 0) + (gr_text "SENSOR" + (at 172.905 76.65 0) (layer "F.SilkS") (uuid "3274ea7c-b64f-4229-b4b2-adc8cbdd17a6") (effects @@ -5074,7 +5202,7 @@ ) ) (gr_text "GND" - (at 173.85 79 0) + (at 172.905 79 0) (layer "F.SilkS") (uuid "bc6ab40f-3d22-4085-b38c-bc97d22490fb") (effects @@ -5287,20 +5415,20 @@ (uuid "f6f42b19-356e-4237-8a57-5410eb735aba") ) (segment - (start 171.1375 55) - (end 174.88 55) + (start 173.935 55) + (end 175.795 56.86) (width 0.4) (layer "B.Cu") (net 4) - (uuid "7626aac9-e3bb-49fb-a96a-a67907bae0df") + (uuid "1fde1dc0-51aa-4dcd-9a97-c3f5cb0e8e19") ) (segment - (start 174.88 55) - (end 176.74 56.86) + (start 171.1375 55) + (end 173.935 55) (width 0.4) (layer "B.Cu") (net 4) - (uuid "b2b1526b-e3c6-4d1e-ba77-ec0b081853bf") + (uuid "e92385cd-76b2-49a1-a4b3-9a64759d2fa0") ) (segment (start 158.8 57.35) @@ -5366,14 +5494,6 @@ (net 6) (uuid "5fc61649-74bf-4d1c-9b7d-e3a945729acd") ) - (segment - (start 176.3 75.85) - (end 176.75 75.4) - (width 0.4) - (layer "B.Cu") - (net 6) - (uuid "81203bd2-8860-47a6-a0fc-7813853b273f") - ) (segment (start 175.5 75.85) (end 176.3 75.85) @@ -6075,42 +6195,42 @@ (xy 140.723187 77.10719) (xy 140.72319 77.107187) (xy 140.80935 76.992093) (xy 140.809354 76.992086) (xy 140.85077 76.881046) (xy 140.859596 76.85738) (xy 140.859598 76.857372) (xy 140.865999 76.797844) (xy 140.866 76.797827) (xy 140.866 76.15) (xy 139.949012 76.15) (xy 139.981925 76.092993) (xy 140.016 75.965826) - (xy 140.016 75.834174) (xy 139.991761 75.743713) (xy 175.2745 75.743713) (xy 175.2745 75.956286) - (xy 175.307753 76.166239) (xy 175.373444 76.368414) (xy 175.469951 76.55782) (xy 175.59489 76.729786) - (xy 175.745209 76.880105) (xy 175.745214 76.880109) (xy 175.910218 76.999991) (xy 175.952884 77.05532) - (xy 175.958863 77.124934) (xy 175.926258 77.186729) (xy 175.910218 77.200627) (xy 175.74554 77.320272) - (xy 175.745535 77.320276) (xy 175.595276 77.470535) (xy 175.595272 77.47054) (xy 175.470379 77.642442) - (xy 175.373904 77.831782) (xy 175.308242 78.03387) (xy 175.308242 78.033873) (xy 175.297769 78.1) - (xy 176.345854 78.1) (xy 176.30737 78.166657) (xy 176.275 78.287465) (xy 176.275 78.412535) (xy 176.30737 78.533343) - (xy 176.345854 78.6) (xy 175.297769 78.6) (xy 175.308242 78.666126) (xy 175.308242 78.666129) (xy 175.373904 78.868217) - (xy 175.470379 79.057557) (xy 175.595272 79.229459) (xy 175.595276 79.229464) (xy 175.734143 79.368331) - (xy 175.767628 79.429654) (xy 175.762644 79.499346) (xy 175.720772 79.555279) (xy 175.711559 79.561551) - (xy 175.556342 79.657289) (xy 175.432289 79.781342) (xy 175.340187 79.930663) (xy 175.340186 79.930666) - (xy 175.285001 80.097203) (xy 175.285001 80.097204) (xy 175.285 80.097204) (xy 175.2745 80.199983) - (xy 175.2745 81.500001) (xy 175.274501 81.500018) (xy 175.285 81.602796) (xy 175.285001 81.602799) - (xy 175.340185 81.769331) (xy 175.340186 81.769334) (xy 175.432288 81.918656) (xy 175.556344 82.042712) - (xy 175.705666 82.134814) (xy 175.872203 82.189999) (xy 175.974991 82.2005) (xy 177.525008 82.200499) - (xy 177.627797 82.189999) (xy 177.794334 82.134814) (xy 177.943656 82.042712) (xy 178.067712 81.918656) - (xy 178.159814 81.769334) (xy 178.214999 81.602797) (xy 178.2255 81.500009) (xy 178.225499 80.199992) - (xy 178.214999 80.097203) (xy 178.159814 79.930666) (xy 178.067712 79.781344) (xy 177.943656 79.657288) - (xy 177.794334 79.565186) (xy 177.794332 79.565185) (xy 177.78844 79.561551) (xy 177.741716 79.509603) - (xy 177.730493 79.440641) (xy 177.758337 79.376558) (xy 177.765856 79.36833) (xy 177.904728 79.229458) - (xy 178.02962 79.057557) (xy 178.126095 78.868217) (xy 178.191757 78.666129) (xy 178.191757 78.666126) - (xy 178.202231 78.6) (xy 177.154146 78.6) (xy 177.19263 78.533343) (xy 177.225 78.412535) (xy 177.225 78.287465) - (xy 177.19263 78.166657) (xy 177.154146 78.1) (xy 178.202231 78.1) (xy 178.191757 78.033873) (xy 178.191757 78.03387) - (xy 178.126095 77.831782) (xy 178.02962 77.642442) (xy 177.904727 77.47054) (xy 177.904723 77.470535) - (xy 177.754464 77.320276) (xy 177.754459 77.320272) (xy 177.589781 77.200627) (xy 177.547115 77.145297) - (xy 177.541136 77.075684) (xy 177.573741 77.013889) (xy 177.589776 76.999994) (xy 177.754792 76.880104) - (xy 177.905104 76.729792) (xy 177.905106 76.729788) (xy 177.905109 76.729786) (xy 178.030048 76.55782) - (xy 178.030047 76.55782) (xy 178.030051 76.557816) (xy 178.126557 76.368412) (xy 178.192246 76.166243) - (xy 178.2255 75.956287) (xy 178.2255 75.743713) (xy 178.192246 75.533757) (xy 178.126557 75.331588) - (xy 178.030051 75.142184) (xy 178.030049 75.142181) (xy 178.030048 75.142179) (xy 177.905109 74.970213) - (xy 177.754786 74.81989) (xy 177.58282 74.694951) (xy 177.393414 74.598444) (xy 177.393413 74.598443) - (xy 177.393412 74.598443) (xy 177.191243 74.532754) (xy 177.191241 74.532753) (xy 177.19124 74.532753) - (xy 177.029957 74.507208) (xy 176.981287 74.4995) (xy 176.518713 74.4995) (xy 176.470042 74.507208) - (xy 176.30876 74.532753) (xy 176.106585 74.598444) (xy 175.917179 74.694951) (xy 175.745213 74.81989) - (xy 175.59489 74.970213) (xy 175.469951 75.142179) (xy 175.373444 75.331585) (xy 175.307753 75.53376) - (xy 175.2745 75.743713) (xy 139.991761 75.743713) (xy 139.981925 75.707007) (xy 139.949012 75.65) + (xy 140.016 75.834174) (xy 139.991761 75.743713) (xy 174.3295 75.743713) (xy 174.3295 75.956286) + (xy 174.362753 76.166239) (xy 174.428444 76.368414) (xy 174.524951 76.55782) (xy 174.64989 76.729786) + (xy 174.800209 76.880105) (xy 174.800214 76.880109) (xy 174.965218 76.999991) (xy 175.007884 77.05532) + (xy 175.013863 77.124934) (xy 174.981258 77.186729) (xy 174.965218 77.200627) (xy 174.80054 77.320272) + (xy 174.800535 77.320276) (xy 174.650276 77.470535) (xy 174.650272 77.47054) (xy 174.525379 77.642442) + (xy 174.428904 77.831782) (xy 174.363242 78.03387) (xy 174.363242 78.033873) (xy 174.352769 78.1) + (xy 175.400854 78.1) (xy 175.36237 78.166657) (xy 175.33 78.287465) (xy 175.33 78.412535) (xy 175.36237 78.533343) + (xy 175.400854 78.6) (xy 174.352769 78.6) (xy 174.363242 78.666126) (xy 174.363242 78.666129) (xy 174.428904 78.868217) + (xy 174.525379 79.057557) (xy 174.650272 79.229459) (xy 174.650276 79.229464) (xy 174.789143 79.368331) + (xy 174.822628 79.429654) (xy 174.817644 79.499346) (xy 174.775772 79.555279) (xy 174.766559 79.561551) + (xy 174.611342 79.657289) (xy 174.487289 79.781342) (xy 174.395187 79.930663) (xy 174.395186 79.930666) + (xy 174.340001 80.097203) (xy 174.340001 80.097204) (xy 174.34 80.097204) (xy 174.3295 80.199983) + (xy 174.3295 81.500001) (xy 174.329501 81.500018) (xy 174.34 81.602796) (xy 174.340001 81.602799) + (xy 174.395185 81.769331) (xy 174.395186 81.769334) (xy 174.487288 81.918656) (xy 174.611344 82.042712) + (xy 174.760666 82.134814) (xy 174.927203 82.189999) (xy 175.029991 82.2005) (xy 176.580008 82.200499) + (xy 176.682797 82.189999) (xy 176.849334 82.134814) (xy 176.998656 82.042712) (xy 177.122712 81.918656) + (xy 177.214814 81.769334) (xy 177.269999 81.602797) (xy 177.2805 81.500009) (xy 177.280499 80.199992) + (xy 177.269999 80.097203) (xy 177.214814 79.930666) (xy 177.122712 79.781344) (xy 176.998656 79.657288) + (xy 176.849334 79.565186) (xy 176.849332 79.565185) (xy 176.84344 79.561551) (xy 176.796716 79.509603) + (xy 176.785493 79.440641) (xy 176.813337 79.376558) (xy 176.820856 79.36833) (xy 176.959728 79.229458) + (xy 177.08462 79.057557) (xy 177.181095 78.868217) (xy 177.246757 78.666129) (xy 177.246757 78.666126) + (xy 177.257231 78.6) (xy 176.209146 78.6) (xy 176.24763 78.533343) (xy 176.28 78.412535) (xy 176.28 78.287465) + (xy 176.24763 78.166657) (xy 176.209146 78.1) (xy 177.257231 78.1) (xy 177.246757 78.033873) (xy 177.246757 78.03387) + (xy 177.181095 77.831782) (xy 177.08462 77.642442) (xy 176.959727 77.47054) (xy 176.959723 77.470535) + (xy 176.809464 77.320276) (xy 176.809459 77.320272) (xy 176.644781 77.200627) (xy 176.602115 77.145297) + (xy 176.596136 77.075684) (xy 176.628741 77.013889) (xy 176.644776 76.999994) (xy 176.809792 76.880104) + (xy 176.960104 76.729792) (xy 176.960106 76.729788) (xy 176.960109 76.729786) (xy 177.085048 76.55782) + (xy 177.085047 76.55782) (xy 177.085051 76.557816) (xy 177.181557 76.368412) (xy 177.247246 76.166243) + (xy 177.2805 75.956287) (xy 177.2805 75.743713) (xy 177.247246 75.533757) (xy 177.181557 75.331588) + (xy 177.085051 75.142184) (xy 177.085049 75.142181) (xy 177.085048 75.142179) (xy 176.960109 74.970213) + (xy 176.809786 74.81989) (xy 176.63782 74.694951) (xy 176.448414 74.598444) (xy 176.448413 74.598443) + (xy 176.448412 74.598443) (xy 176.246243 74.532754) (xy 176.246241 74.532753) (xy 176.24624 74.532753) + (xy 176.084957 74.507208) (xy 176.036287 74.4995) (xy 175.573713 74.4995) (xy 175.525042 74.507208) + (xy 175.36376 74.532753) (xy 175.161585 74.598444) (xy 174.972179 74.694951) (xy 174.800213 74.81989) + (xy 174.64989 74.970213) (xy 174.524951 75.142179) (xy 174.428444 75.331585) (xy 174.362753 75.53376) + (xy 174.3295 75.743713) (xy 139.991761 75.743713) (xy 139.981925 75.707007) (xy 139.949012 75.65) (xy 140.866 75.65) (xy 140.866 75.002172) (xy 140.865999 75.002155) (xy 140.859598 74.942627) (xy 140.859596 74.94262) (xy 140.809354 74.807913) (xy 140.80935 74.807906) (xy 140.72319 74.692812) (xy 140.723187 74.692809) (xy 140.608093 74.606649) (xy 140.608088 74.606646) (xy 140.476528 74.557577) (xy 140.420595 74.515705) @@ -6189,42 +6309,42 @@ (xy 139.409713 56.7695) (xy 139.361042 56.777208) (xy 139.19976 56.802753) (xy 138.997585 56.868444) (xy 138.808179 56.964951) (xy 138.636213 57.08989) (xy 138.48589 57.240213) (xy 138.360951 57.412179) (xy 138.264444 57.601585) (xy 138.198753 57.80376) (xy 138.185077 57.890109) (xy 138.1655 58.013713) - (xy 132.6505 58.013713) (xy 132.6505 56.753713) (xy 175.2645 56.753713) (xy 175.2645 56.966287) - (xy 175.297754 57.176243) (xy 175.318539 57.240213) (xy 175.363444 57.378414) (xy 175.459951 57.56782) - (xy 175.58489 57.739786) (xy 175.735209 57.890105) (xy 175.735214 57.890109) (xy 175.900218 58.009991) - (xy 175.942884 58.06532) (xy 175.948863 58.134934) (xy 175.916258 58.196729) (xy 175.900218 58.210627) - (xy 175.73554 58.330272) (xy 175.735535 58.330276) (xy 175.585276 58.480535) (xy 175.585272 58.48054) - (xy 175.460379 58.652442) (xy 175.363904 58.841782) (xy 175.298242 59.04387) (xy 175.298242 59.043873) - (xy 175.287769 59.11) (xy 176.335854 59.11) (xy 176.29737 59.176657) (xy 176.265 59.297465) (xy 176.265 59.422535) - (xy 176.29737 59.543343) (xy 176.335854 59.61) (xy 175.287769 59.61) (xy 175.298242 59.676126) (xy 175.298242 59.676129) - (xy 175.363904 59.878217) (xy 175.460379 60.067557) (xy 175.585272 60.239459) (xy 175.585276 60.239464) - (xy 175.724143 60.378331) (xy 175.757628 60.439654) (xy 175.752644 60.509346) (xy 175.710772 60.565279) - (xy 175.701559 60.571551) (xy 175.546342 60.667289) (xy 175.422289 60.791342) (xy 175.330187 60.940663) - (xy 175.330186 60.940666) (xy 175.275001 61.107203) (xy 175.275001 61.107204) (xy 175.275 61.107204) - (xy 175.2645 61.209983) (xy 175.2645 62.510001) (xy 175.264501 62.510018) (xy 175.275 62.612796) - (xy 175.275001 62.612799) (xy 175.297795 62.681585) (xy 175.330186 62.779334) (xy 175.422288 62.928656) - (xy 175.546344 63.052712) (xy 175.695666 63.144814) (xy 175.862203 63.199999) (xy 175.964991 63.2105) - (xy 177.515008 63.210499) (xy 177.617797 63.199999) (xy 177.784334 63.144814) (xy 177.933656 63.052712) - (xy 178.057712 62.928656) (xy 178.149814 62.779334) (xy 178.204999 62.612797) (xy 178.2155 62.510009) - (xy 178.215499 61.209992) (xy 178.204999 61.107203) (xy 178.149814 60.940666) (xy 178.057712 60.791344) - (xy 177.933656 60.667288) (xy 177.784334 60.575186) (xy 177.784332 60.575185) (xy 177.77844 60.571551) - (xy 177.731716 60.519603) (xy 177.720493 60.450641) (xy 177.748337 60.386558) (xy 177.755856 60.37833) - (xy 177.894728 60.239458) (xy 178.01962 60.067557) (xy 178.116095 59.878217) (xy 178.181757 59.676129) - (xy 178.181757 59.676126) (xy 178.192231 59.61) (xy 177.144146 59.61) (xy 177.18263 59.543343) (xy 177.215 59.422535) - (xy 177.215 59.297465) (xy 177.18263 59.176657) (xy 177.144146 59.11) (xy 178.192231 59.11) (xy 178.181757 59.043873) - (xy 178.181757 59.04387) (xy 178.116095 58.841782) (xy 178.01962 58.652442) (xy 177.894727 58.48054) - (xy 177.894723 58.480535) (xy 177.744464 58.330276) (xy 177.744459 58.330272) (xy 177.579781 58.210627) - (xy 177.537115 58.155297) (xy 177.531136 58.085684) (xy 177.563741 58.023889) (xy 177.579776 58.009994) - (xy 177.744792 57.890104) (xy 177.895104 57.739792) (xy 177.895106 57.739788) (xy 177.895109 57.739786) - (xy 178.020048 57.56782) (xy 178.020047 57.56782) (xy 178.020051 57.567816) (xy 178.116557 57.378412) - (xy 178.182246 57.176243) (xy 178.2155 56.966287) (xy 178.2155 56.753713) (xy 178.182246 56.543757) - (xy 178.116557 56.341588) (xy 178.020051 56.152184) (xy 178.020049 56.152181) (xy 178.020048 56.152179) - (xy 177.895109 55.980213) (xy 177.744786 55.82989) (xy 177.57282 55.704951) (xy 177.383414 55.608444) - (xy 177.383413 55.608443) (xy 177.383412 55.608443) (xy 177.181243 55.542754) (xy 177.181241 55.542753) - (xy 177.18124 55.542753) (xy 177.019957 55.517208) (xy 176.971287 55.5095) (xy 176.508713 55.5095) - (xy 176.460042 55.517208) (xy 176.29876 55.542753) (xy 176.096585 55.608444) (xy 175.907179 55.704951) - (xy 175.735213 55.82989) (xy 175.58489 55.980213) (xy 175.459951 56.152179) (xy 175.363444 56.341585) - (xy 175.297753 56.54376) (xy 175.2645 56.753713) (xy 132.6505 56.753713) (xy 132.6505 47.074875) + (xy 132.6505 58.013713) (xy 132.6505 56.753713) (xy 174.3195 56.753713) (xy 174.3195 56.966287) + (xy 174.352754 57.176243) (xy 174.373539 57.240213) (xy 174.418444 57.378414) (xy 174.514951 57.56782) + (xy 174.63989 57.739786) (xy 174.790209 57.890105) (xy 174.790214 57.890109) (xy 174.955218 58.009991) + (xy 174.997884 58.06532) (xy 175.003863 58.134934) (xy 174.971258 58.196729) (xy 174.955218 58.210627) + (xy 174.79054 58.330272) (xy 174.790535 58.330276) (xy 174.640276 58.480535) (xy 174.640272 58.48054) + (xy 174.515379 58.652442) (xy 174.418904 58.841782) (xy 174.353242 59.04387) (xy 174.353242 59.043873) + (xy 174.342769 59.11) (xy 175.390854 59.11) (xy 175.35237 59.176657) (xy 175.32 59.297465) (xy 175.32 59.422535) + (xy 175.35237 59.543343) (xy 175.390854 59.61) (xy 174.342769 59.61) (xy 174.353242 59.676126) (xy 174.353242 59.676129) + (xy 174.418904 59.878217) (xy 174.515379 60.067557) (xy 174.640272 60.239459) (xy 174.640276 60.239464) + (xy 174.779143 60.378331) (xy 174.812628 60.439654) (xy 174.807644 60.509346) (xy 174.765772 60.565279) + (xy 174.756559 60.571551) (xy 174.601342 60.667289) (xy 174.477289 60.791342) (xy 174.385187 60.940663) + (xy 174.385186 60.940666) (xy 174.330001 61.107203) (xy 174.330001 61.107204) (xy 174.33 61.107204) + (xy 174.3195 61.209983) (xy 174.3195 62.510001) (xy 174.319501 62.510018) (xy 174.33 62.612796) + (xy 174.330001 62.612799) (xy 174.352795 62.681585) (xy 174.385186 62.779334) (xy 174.477288 62.928656) + (xy 174.601344 63.052712) (xy 174.750666 63.144814) (xy 174.917203 63.199999) (xy 175.019991 63.2105) + (xy 176.570008 63.210499) (xy 176.672797 63.199999) (xy 176.839334 63.144814) (xy 176.988656 63.052712) + (xy 177.112712 62.928656) (xy 177.204814 62.779334) (xy 177.259999 62.612797) (xy 177.2705 62.510009) + (xy 177.270499 61.209992) (xy 177.259999 61.107203) (xy 177.204814 60.940666) (xy 177.112712 60.791344) + (xy 176.988656 60.667288) (xy 176.839334 60.575186) (xy 176.839332 60.575185) (xy 176.83344 60.571551) + (xy 176.786716 60.519603) (xy 176.775493 60.450641) (xy 176.803337 60.386558) (xy 176.810856 60.37833) + (xy 176.949728 60.239458) (xy 177.07462 60.067557) (xy 177.171095 59.878217) (xy 177.236757 59.676129) + (xy 177.236757 59.676126) (xy 177.247231 59.61) (xy 176.199146 59.61) (xy 176.23763 59.543343) (xy 176.27 59.422535) + (xy 176.27 59.297465) (xy 176.23763 59.176657) (xy 176.199146 59.11) (xy 177.247231 59.11) (xy 177.236757 59.043873) + (xy 177.236757 59.04387) (xy 177.171095 58.841782) (xy 177.07462 58.652442) (xy 176.949727 58.48054) + (xy 176.949723 58.480535) (xy 176.799464 58.330276) (xy 176.799459 58.330272) (xy 176.634781 58.210627) + (xy 176.592115 58.155297) (xy 176.586136 58.085684) (xy 176.618741 58.023889) (xy 176.634776 58.009994) + (xy 176.799792 57.890104) (xy 176.950104 57.739792) (xy 176.950106 57.739788) (xy 176.950109 57.739786) + (xy 177.075048 57.56782) (xy 177.075047 57.56782) (xy 177.075051 57.567816) (xy 177.171557 57.378412) + (xy 177.237246 57.176243) (xy 177.2705 56.966287) (xy 177.2705 56.753713) (xy 177.237246 56.543757) + (xy 177.171557 56.341588) (xy 177.075051 56.152184) (xy 177.075049 56.152181) (xy 177.075048 56.152179) + (xy 176.950109 55.980213) (xy 176.799786 55.82989) (xy 176.62782 55.704951) (xy 176.438414 55.608444) + (xy 176.438413 55.608443) (xy 176.438412 55.608443) (xy 176.236243 55.542754) (xy 176.236241 55.542753) + (xy 176.23624 55.542753) (xy 176.074957 55.517208) (xy 176.026287 55.5095) (xy 175.563713 55.5095) + (xy 175.515042 55.517208) (xy 175.35376 55.542753) (xy 175.151585 55.608444) (xy 174.962179 55.704951) + (xy 174.790213 55.82989) (xy 174.63989 55.980213) (xy 174.514951 56.152179) (xy 174.418444 56.341585) + (xy 174.352753 56.54376) (xy 174.3195 56.753713) (xy 132.6505 56.753713) (xy 132.6505 47.074875) (xy 138.6223 47.074875) (xy 138.6223 47.283524) (xy 138.654937 47.489589) (xy 138.719412 47.68802) (xy 138.797825 47.841914) (xy 138.81413 47.873914) (xy 138.936765 48.042705) (xy 139.084295 48.190235) (xy 139.253086 48.31287) (xy 139.340916 48.357621) (xy 139.438979 48.407587) (xy 139.438981 48.407587) @@ -6443,70 +6563,70 @@ (xy 138.816946 59.279516) (xy 138.867742 59.327491) (xy 138.884536 59.395312) (xy 138.861998 59.461447) (xy 138.816946 59.500484) (xy 138.808182 59.504949) (xy 138.636213 59.62989) (xy 138.48589 59.780213) (xy 138.360951 59.952179) (xy 138.264444 60.141585) (xy 138.198753 60.34376) (xy 138.1655 60.553713) - (xy 138.1655 60.766286) (xy 138.193118 60.940663) (xy 138.198754 60.976243) (xy 138.224463 61.055368) - (xy 138.264444 61.178414) (xy 138.360951 61.36782) (xy 138.48589 61.539786) (xy 138.636213 61.690109) - (xy 138.808182 61.81505) (xy 138.816946 61.819516) (xy 138.867742 61.867491) (xy 138.884536 61.935312) - (xy 138.861998 62.001447) (xy 138.816946 62.040484) (xy 138.808182 62.044949) (xy 138.636213 62.16989) - (xy 138.48589 62.320213) (xy 138.360951 62.492179) (xy 138.264444 62.681585) (xy 138.198753 62.88376) - (xy 138.1655 63.093713) (xy 138.1655 63.306286) (xy 138.198753 63.516239) (xy 138.264444 63.718414) - (xy 138.360951 63.90782) (xy 138.48589 64.079786) (xy 138.636213 64.230109) (xy 138.808182 64.35505) - (xy 138.816946 64.359516) (xy 138.867742 64.407491) (xy 138.884536 64.475312) (xy 138.861998 64.541447) - (xy 138.816946 64.580484) (xy 138.808182 64.584949) (xy 138.636213 64.70989) (xy 138.48589 64.860213) - (xy 138.360951 65.032179) (xy 138.264444 65.221585) (xy 138.264443 65.221587) (xy 138.264443 65.221588) - (xy 138.24774 65.272993) (xy 138.198753 65.42376) (xy 138.1655 65.633713) (xy 138.1655 65.846287) - (xy 138.167641 65.859802) (xy 138.197832 66.050426) (xy 138.198754 66.056243) (xy 138.255839 66.231933) - (xy 138.264444 66.258414) (xy 138.360951 66.44782) (xy 138.48589 66.619786) (xy 138.636213 66.770109) - (xy 138.808182 66.89505) (xy 138.816946 66.899516) (xy 138.867742 66.947491) (xy 138.884536 67.015312) - (xy 138.861998 67.081447) (xy 138.816946 67.120484) (xy 138.808182 67.124949) (xy 138.636213 67.24989) - (xy 138.48589 67.400213) (xy 138.360951 67.572179) (xy 138.264444 67.761585) (xy 138.264443 67.761587) - (xy 138.264443 67.761588) (xy 138.232596 67.859602) (xy 138.198753 67.96376) (xy 138.1655 68.173713) - (xy 138.1655 68.386286) (xy 138.197908 68.590905) (xy 138.198754 68.596243) (xy 138.262464 68.792322) - (xy 138.264444 68.798414) (xy 138.360951 68.98782) (xy 138.48589 69.159786) (xy 138.636213 69.310109) - (xy 138.808182 69.43505) (xy 138.816946 69.439516) (xy 138.867742 69.487491) (xy 138.884536 69.555312) - (xy 138.861998 69.621447) (xy 138.816946 69.660484) (xy 138.808182 69.664949) (xy 138.636213 69.78989) - (xy 138.48589 69.940213) (xy 138.360951 70.112179) (xy 138.264444 70.301585) (xy 138.198753 70.50376) - (xy 138.169511 70.688389) (xy 138.1655 70.713713) (xy 138.1655 70.926287) (xy 138.198754 71.136243) - (xy 138.21864 71.197447) (xy 138.264444 71.338414) (xy 138.360951 71.52782) (xy 138.48589 71.699786) - (xy 138.636213 71.850109) (xy 138.808182 71.97505) (xy 138.816946 71.979516) (xy 138.867742 72.027491) - (xy 138.884536 72.095312) (xy 138.861998 72.161447) (xy 138.816946 72.200484) (xy 138.808182 72.204949) - (xy 138.636213 72.32989) (xy 138.485898 72.480205) (xy 138.485898 72.480206) (xy 138.485896 72.480208) - (xy 138.465422 72.508386) (xy 138.410094 72.551051) (xy 138.365106 72.5595) (xy 137.46794 72.5595) - (xy 137.400901 72.539815) (xy 137.380259 72.523181) (xy 136.736819 71.879741) (xy 136.703334 71.818418) - (xy 136.7005 71.79206) (xy 136.7005 56.332939) (xy 136.720185 56.2659) (xy 136.736819 56.245258) - (xy 137.545258 55.436819) (xy 137.606581 55.403334) (xy 137.632939 55.4005) (xy 148.96706 55.4005) - (xy 149.034099 55.420185) (xy 149.054741 55.436819) (xy 149.938181 56.320259) (xy 149.971666 56.381582) - (xy 149.9745 56.40794) (xy 149.9745 56.952983) (xy 149.954815 57.020022) (xy 149.902011 57.065777) - (xy 149.88951 57.070686) (xy 149.831559 57.08989) (xy 149.830666 57.090186) (xy 149.830663 57.090187) - (xy 149.681342 57.182289) (xy 149.557289 57.306342) (xy 149.465187 57.455663) (xy 149.465186 57.455666) - (xy 149.410001 57.622203) (xy 149.410001 57.622204) (xy 149.41 57.622204) (xy 149.3995 57.724983) - (xy 149.3995 58.625001) (xy 149.399501 58.625019) (xy 149.41 58.727796) (xy 149.410001 58.727799) - (xy 149.465185 58.894331) (xy 149.465187 58.894336) (xy 149.480604 58.919331) (xy 149.557288 59.043656) - (xy 149.681344 59.167712) (xy 149.830666 59.259814) (xy 149.997203 59.314999) (xy 150.099991 59.3255) - (xy 151.450008 59.325499) (xy 151.552797 59.314999) (xy 151.719334 59.259814) (xy 151.868656 59.167712) - (xy 151.992712 59.043656) (xy 152.084814 58.894334) (xy 152.139999 58.727797) (xy 152.149225 58.637486) - (xy 153.250001 58.637486) (xy 153.260494 58.740197) (xy 153.315641 58.906619) (xy 153.315643 58.906624) - (xy 153.407684 59.055845) (xy 153.531654 59.179815) (xy 153.680875 59.271856) (xy 153.68088 59.271858) - (xy 153.847302 59.327005) (xy 153.847309 59.327006) (xy 153.950019 59.337499) (xy 154.399999 59.337499) - (xy 154.4 59.337498) (xy 154.4 58.425) (xy 153.250001 58.425) (xy 153.250001 58.637486) (xy 152.149225 58.637486) - (xy 152.1505 58.625009) (xy 152.150499 58.155297) (xy 152.150499 57.724998) (xy 152.150498 57.724982) - (xy 152.15019 57.721966) (xy 152.15019 57.721965) (xy 152.149224 57.712513) (xy 153.25 57.712513) - (xy 153.25 57.925) (xy 154.4 57.925) (xy 154.4 57.0125) (xy 153.950028 57.0125) (xy 153.950012 57.012501) - (xy 153.847302 57.022994) (xy 153.68088 57.078141) (xy 153.680875 57.078143) (xy 153.531654 57.170184) - (xy 153.407684 57.294154) (xy 153.315643 57.443375) (xy 153.315641 57.44338) (xy 153.260494 57.609802) - (xy 153.260493 57.609809) (xy 153.25 57.712513) (xy 152.149224 57.712513) (xy 152.139999 57.622203) - (xy 152.139998 57.6222) (xy 152.09343 57.481668) (xy 152.084814 57.455666) (xy 151.992712 57.306344) - (xy 151.868656 57.182288) (xy 151.719334 57.090186) (xy 151.660493 57.070688) (xy 151.603051 57.030916) - (xy 151.576228 56.9664) (xy 151.5755 56.952983) (xy 151.5755 55.946156) (xy 151.57015 55.919263) - (xy 151.560581 55.871158) (xy 151.544737 55.791503) (xy 151.540722 55.781811) (xy 151.528268 55.751745) - (xy 151.507042 55.7005) (xy 151.484394 55.645821) (xy 151.484392 55.645819) (xy 151.484392 55.645817) - (xy 151.39679 55.514712) (xy 151.364479 55.482401) (xy 151.285289 55.403211) (xy 150.836819 54.954741) - (xy 150.803334 54.893418) (xy 150.8005 54.86706) (xy 150.8005 53.979423) (xy 150.820185 53.912384) - (xy 150.872989 53.866629) (xy 150.900309 53.857806) (xy 150.971827 53.84358) (xy 151.078246 53.7995) - (xy 151.099306 53.790777) (xy 151.099307 53.790776) (xy 151.09931 53.790775) (xy 151.214042 53.714114) - (xy 154.971337 49.956819) (xy 155.03266 49.923334) (xy 155.059018 49.9205) (xy 163.698996 49.9205) - (xy 163.79004 49.902389) (xy 163.834328 49.89358) (xy 163.898069 49.867177) (xy 163.961807 49.840777) - (xy 163.961808 49.840776) (xy 163.961811 49.840775) (xy 164.076543 49.764114) (xy 165.417744 48.422913) - (xy 166.713837 47.126819) (xy 166.77516 47.093334) (xy 166.801518 47.0905) (xy 167.565501 47.0905) + (xy 138.1655 60.766286) (xy 138.198753 60.976239) (xy 138.264444 61.178414) (xy 138.360951 61.36782) + (xy 138.48589 61.539786) (xy 138.636213 61.690109) (xy 138.808182 61.81505) (xy 138.816946 61.819516) + (xy 138.867742 61.867491) (xy 138.884536 61.935312) (xy 138.861998 62.001447) (xy 138.816946 62.040484) + (xy 138.808182 62.044949) (xy 138.636213 62.16989) (xy 138.48589 62.320213) (xy 138.360951 62.492179) + (xy 138.264444 62.681585) (xy 138.198753 62.88376) (xy 138.1655 63.093713) (xy 138.1655 63.306286) + (xy 138.198753 63.516239) (xy 138.264444 63.718414) (xy 138.360951 63.90782) (xy 138.48589 64.079786) + (xy 138.636213 64.230109) (xy 138.808182 64.35505) (xy 138.816946 64.359516) (xy 138.867742 64.407491) + (xy 138.884536 64.475312) (xy 138.861998 64.541447) (xy 138.816946 64.580484) (xy 138.808182 64.584949) + (xy 138.636213 64.70989) (xy 138.48589 64.860213) (xy 138.360951 65.032179) (xy 138.264444 65.221585) + (xy 138.264443 65.221587) (xy 138.264443 65.221588) (xy 138.24774 65.272993) (xy 138.198753 65.42376) + (xy 138.1655 65.633713) (xy 138.1655 65.846287) (xy 138.167641 65.859802) (xy 138.197832 66.050426) + (xy 138.198754 66.056243) (xy 138.255839 66.231933) (xy 138.264444 66.258414) (xy 138.360951 66.44782) + (xy 138.48589 66.619786) (xy 138.636213 66.770109) (xy 138.808182 66.89505) (xy 138.816946 66.899516) + (xy 138.867742 66.947491) (xy 138.884536 67.015312) (xy 138.861998 67.081447) (xy 138.816946 67.120484) + (xy 138.808182 67.124949) (xy 138.636213 67.24989) (xy 138.48589 67.400213) (xy 138.360951 67.572179) + (xy 138.264444 67.761585) (xy 138.264443 67.761587) (xy 138.264443 67.761588) (xy 138.232596 67.859602) + (xy 138.198753 67.96376) (xy 138.1655 68.173713) (xy 138.1655 68.386286) (xy 138.197908 68.590905) + (xy 138.198754 68.596243) (xy 138.262464 68.792322) (xy 138.264444 68.798414) (xy 138.360951 68.98782) + (xy 138.48589 69.159786) (xy 138.636213 69.310109) (xy 138.808182 69.43505) (xy 138.816946 69.439516) + (xy 138.867742 69.487491) (xy 138.884536 69.555312) (xy 138.861998 69.621447) (xy 138.816946 69.660484) + (xy 138.808182 69.664949) (xy 138.636213 69.78989) (xy 138.48589 69.940213) (xy 138.360951 70.112179) + (xy 138.264444 70.301585) (xy 138.198753 70.50376) (xy 138.169511 70.688389) (xy 138.1655 70.713713) + (xy 138.1655 70.926287) (xy 138.198754 71.136243) (xy 138.21864 71.197447) (xy 138.264444 71.338414) + (xy 138.360951 71.52782) (xy 138.48589 71.699786) (xy 138.636213 71.850109) (xy 138.808182 71.97505) + (xy 138.816946 71.979516) (xy 138.867742 72.027491) (xy 138.884536 72.095312) (xy 138.861998 72.161447) + (xy 138.816946 72.200484) (xy 138.808182 72.204949) (xy 138.636213 72.32989) (xy 138.485898 72.480205) + (xy 138.485898 72.480206) (xy 138.485896 72.480208) (xy 138.465422 72.508386) (xy 138.410094 72.551051) + (xy 138.365106 72.5595) (xy 137.46794 72.5595) (xy 137.400901 72.539815) (xy 137.380259 72.523181) + (xy 136.736819 71.879741) (xy 136.703334 71.818418) (xy 136.7005 71.79206) (xy 136.7005 56.332939) + (xy 136.720185 56.2659) (xy 136.736819 56.245258) (xy 137.545258 55.436819) (xy 137.606581 55.403334) + (xy 137.632939 55.4005) (xy 148.96706 55.4005) (xy 149.034099 55.420185) (xy 149.054741 55.436819) + (xy 149.938181 56.320259) (xy 149.971666 56.381582) (xy 149.9745 56.40794) (xy 149.9745 56.952983) + (xy 149.954815 57.020022) (xy 149.902011 57.065777) (xy 149.88951 57.070686) (xy 149.831559 57.08989) + (xy 149.830666 57.090186) (xy 149.830663 57.090187) (xy 149.681342 57.182289) (xy 149.557289 57.306342) + (xy 149.465187 57.455663) (xy 149.465186 57.455666) (xy 149.410001 57.622203) (xy 149.410001 57.622204) + (xy 149.41 57.622204) (xy 149.3995 57.724983) (xy 149.3995 58.625001) (xy 149.399501 58.625019) + (xy 149.41 58.727796) (xy 149.410001 58.727799) (xy 149.465185 58.894331) (xy 149.465187 58.894336) + (xy 149.480604 58.919331) (xy 149.557288 59.043656) (xy 149.681344 59.167712) (xy 149.830666 59.259814) + (xy 149.997203 59.314999) (xy 150.099991 59.3255) (xy 151.450008 59.325499) (xy 151.552797 59.314999) + (xy 151.719334 59.259814) (xy 151.868656 59.167712) (xy 151.992712 59.043656) (xy 152.084814 58.894334) + (xy 152.139999 58.727797) (xy 152.149225 58.637486) (xy 153.250001 58.637486) (xy 153.260494 58.740197) + (xy 153.315641 58.906619) (xy 153.315643 58.906624) (xy 153.407684 59.055845) (xy 153.531654 59.179815) + (xy 153.680875 59.271856) (xy 153.68088 59.271858) (xy 153.847302 59.327005) (xy 153.847309 59.327006) + (xy 153.950019 59.337499) (xy 154.399999 59.337499) (xy 154.4 59.337498) (xy 154.4 58.425) (xy 153.250001 58.425) + (xy 153.250001 58.637486) (xy 152.149225 58.637486) (xy 152.1505 58.625009) (xy 152.150499 58.155297) + (xy 152.150499 57.724998) (xy 152.150498 57.724982) (xy 152.15019 57.721966) (xy 152.15019 57.721965) + (xy 152.149224 57.712513) (xy 153.25 57.712513) (xy 153.25 57.925) (xy 154.4 57.925) (xy 154.4 57.0125) + (xy 153.950028 57.0125) (xy 153.950012 57.012501) (xy 153.847302 57.022994) (xy 153.68088 57.078141) + (xy 153.680875 57.078143) (xy 153.531654 57.170184) (xy 153.407684 57.294154) (xy 153.315643 57.443375) + (xy 153.315641 57.44338) (xy 153.260494 57.609802) (xy 153.260493 57.609809) (xy 153.25 57.712513) + (xy 152.149224 57.712513) (xy 152.139999 57.622203) (xy 152.139998 57.6222) (xy 152.09343 57.481668) + (xy 152.084814 57.455666) (xy 151.992712 57.306344) (xy 151.868656 57.182288) (xy 151.719334 57.090186) + (xy 151.660493 57.070688) (xy 151.603051 57.030916) (xy 151.576228 56.9664) (xy 151.5755 56.952983) + (xy 151.5755 55.946156) (xy 151.57015 55.919263) (xy 151.560581 55.871158) (xy 151.544737 55.791503) + (xy 151.540722 55.781811) (xy 151.528268 55.751745) (xy 151.507042 55.7005) (xy 151.484394 55.645821) + (xy 151.484392 55.645819) (xy 151.484392 55.645817) (xy 151.39679 55.514712) (xy 151.364479 55.482401) + (xy 151.285289 55.403211) (xy 150.836819 54.954741) (xy 150.803334 54.893418) (xy 150.8005 54.86706) + (xy 150.8005 53.979423) (xy 150.820185 53.912384) (xy 150.872989 53.866629) (xy 150.900309 53.857806) + (xy 150.971827 53.84358) (xy 151.078246 53.7995) (xy 151.099306 53.790777) (xy 151.099307 53.790776) + (xy 151.09931 53.790775) (xy 151.214042 53.714114) (xy 154.971337 49.956819) (xy 155.03266 49.923334) + (xy 155.059018 49.9205) (xy 163.698996 49.9205) (xy 163.79004 49.902389) (xy 163.834328 49.89358) + (xy 163.898069 49.867177) (xy 163.961807 49.840777) (xy 163.961808 49.840776) (xy 163.961811 49.840775) + (xy 164.076543 49.764114) (xy 165.417744 48.422913) (xy 166.713837 47.126819) (xy 166.77516 47.093334) + (xy 166.801518 47.0905) (xy 167.565501 47.0905) ) ) (filled_polygon @@ -6514,28 +6634,27 @@ (pts (xy 171.664099 44.750185) (xy 171.684741 44.766819) (xy 179.113181 52.195259) (xy 179.146666 52.256582) (xy 179.1495 52.28294) (xy 179.1495 60.31706) (xy 179.129815 60.384099) (xy 179.113181 60.404741) - (xy 178.494741 61.023181) (xy 178.467813 61.037884) (xy 178.441995 61.054477) (xy 178.435794 61.055368) - (xy 178.433418 61.056666) (xy 178.40706 61.0595) (xy 178.278733 61.0595) (xy 178.211694 61.039815) - (xy 178.165939 60.987011) (xy 178.161028 60.974506) (xy 178.156495 60.960829) (xy 178.149814 60.940666) - (xy 178.057712 60.791344) (xy 177.933656 60.667288) (xy 177.784334 60.575186) (xy 177.784332 60.575185) - (xy 177.77844 60.571551) (xy 177.731716 60.519603) (xy 177.720493 60.450641) (xy 177.748337 60.386558) - (xy 177.755856 60.37833) (xy 177.894728 60.239458) (xy 178.01962 60.067557) (xy 178.116095 59.878217) - (xy 178.181757 59.676129) (xy 178.181757 59.676126) (xy 178.192231 59.61) (xy 177.144146 59.61) - (xy 177.18263 59.543343) (xy 177.215 59.422535) (xy 177.215 59.297465) (xy 177.18263 59.176657) - (xy 177.144146 59.11) (xy 178.192231 59.11) (xy 178.181757 59.043873) (xy 178.181757 59.04387) (xy 178.116095 58.841782) - (xy 178.01962 58.652442) (xy 177.894727 58.48054) (xy 177.894723 58.480535) (xy 177.744464 58.330276) - (xy 177.744459 58.330272) (xy 177.579781 58.210627) (xy 177.537115 58.155297) (xy 177.531136 58.085684) - (xy 177.563741 58.023889) (xy 177.579776 58.009994) (xy 177.744792 57.890104) (xy 177.895104 57.739792) - (xy 177.895106 57.739788) (xy 177.895109 57.739786) (xy 178.020048 57.56782) (xy 178.020047 57.56782) - (xy 178.020051 57.567816) (xy 178.116557 57.378412) (xy 178.182246 57.176243) (xy 178.2155 56.966287) - (xy 178.2155 56.753713) (xy 178.182246 56.543757) (xy 178.116557 56.341588) (xy 178.020051 56.152184) - (xy 178.020049 56.152181) (xy 178.020048 56.152179) (xy 177.895109 55.980213) (xy 177.744786 55.82989) - (xy 177.57282 55.704951) (xy 177.383414 55.608444) (xy 177.383413 55.608443) (xy 177.383412 55.608443) - (xy 177.181243 55.542754) (xy 177.181241 55.542753) (xy 177.18124 55.542753) (xy 177.004194 55.514712) - (xy 176.971287 55.5095) (xy 176.508713 55.5095) (xy 176.508708 55.5095) (xy 176.460137 55.517193) - (xy 176.390844 55.508239) (xy 176.353058 55.482401) (xy 175.326546 54.455888) (xy 175.326545 54.455887) - (xy 175.211807 54.379222) (xy 175.084332 54.326421) (xy 175.084322 54.326418) (xy 174.948996 54.2995) - (xy 174.948994 54.2995) (xy 174.948993 54.2995) (xy 172.105969 54.2995) (xy 172.042848 54.282232) + (xy 178.494741 61.023181) (xy 178.433418 61.056666) (xy 178.40706 61.0595) (xy 177.333733 61.0595) + (xy 177.266694 61.039815) (xy 177.220939 60.987011) (xy 177.216028 60.974506) (xy 177.211495 60.960829) + (xy 177.204814 60.940666) (xy 177.112712 60.791344) (xy 176.988656 60.667288) (xy 176.839334 60.575186) + (xy 176.839332 60.575185) (xy 176.83344 60.571551) (xy 176.786716 60.519603) (xy 176.775493 60.450641) + (xy 176.803337 60.386558) (xy 176.810856 60.37833) (xy 176.949728 60.239458) (xy 177.07462 60.067557) + (xy 177.171095 59.878217) (xy 177.236757 59.676129) (xy 177.236757 59.676126) (xy 177.247231 59.61) + (xy 176.199146 59.61) (xy 176.23763 59.543343) (xy 176.27 59.422535) (xy 176.27 59.297465) (xy 176.23763 59.176657) + (xy 176.199146 59.11) (xy 177.247231 59.11) (xy 177.236757 59.043873) (xy 177.236757 59.04387) (xy 177.171095 58.841782) + (xy 177.07462 58.652442) (xy 176.949727 58.48054) (xy 176.949723 58.480535) (xy 176.799464 58.330276) + (xy 176.799459 58.330272) (xy 176.634781 58.210627) (xy 176.592115 58.155297) (xy 176.586136 58.085684) + (xy 176.618741 58.023889) (xy 176.634776 58.009994) (xy 176.799792 57.890104) (xy 176.950104 57.739792) + (xy 176.950106 57.739788) (xy 176.950109 57.739786) (xy 177.075048 57.56782) (xy 177.075047 57.56782) + (xy 177.075051 57.567816) (xy 177.171557 57.378412) (xy 177.237246 57.176243) (xy 177.2705 56.966287) + (xy 177.2705 56.753713) (xy 177.237246 56.543757) (xy 177.171557 56.341588) (xy 177.075051 56.152184) + (xy 177.075049 56.152181) (xy 177.075048 56.152179) (xy 176.950109 55.980213) (xy 176.799786 55.82989) + (xy 176.62782 55.704951) (xy 176.438414 55.608444) (xy 176.438413 55.608443) (xy 176.438412 55.608443) + (xy 176.236243 55.542754) (xy 176.236241 55.542753) (xy 176.23624 55.542753) (xy 176.059194 55.514712) + (xy 176.026287 55.5095) (xy 175.563713 55.5095) (xy 175.563708 55.5095) (xy 175.515137 55.517193) + (xy 175.445844 55.508239) (xy 175.408058 55.482401) (xy 174.381546 54.455888) (xy 174.381545 54.455887) + (xy 174.266807 54.379222) (xy 174.139332 54.326421) (xy 174.139322 54.326418) (xy 174.003996 54.2995) + (xy 174.003994 54.2995) (xy 174.003993 54.2995) (xy 172.105969 54.2995) (xy 172.042848 54.282232) (xy 171.985396 54.248255) (xy 171.985393 54.248254) (xy 171.827573 54.202402) (xy 171.827567 54.202401) (xy 171.790701 54.1995) (xy 171.790694 54.1995) (xy 170.484306 54.1995) (xy 170.484298 54.1995) (xy 170.447432 54.202401) (xy 170.447426 54.202402) (xy 170.289606 54.248254) (xy 170.289603 54.248255) @@ -6919,161 +7038,158 @@ (xy 170.5005 56.165694) (xy 170.5005 55.9245) (xy 170.520185 55.857461) (xy 170.572989 55.811706) (xy 170.6245 55.8005) (xy 171.790686 55.8005) (xy 171.790694 55.8005) (xy 171.827569 55.797598) (xy 171.827571 55.797597) (xy 171.827573 55.797597) (xy 171.913171 55.772728) (xy 171.985398 55.751744) - (xy 172.042848 55.717767) (xy 172.105969 55.7005) (xy 174.538481 55.7005) (xy 174.60552 55.720185) - (xy 174.626162 55.736819) (xy 175.277214 56.387871) (xy 175.310699 56.449194) (xy 175.307465 56.513866) - (xy 175.297754 56.543754) (xy 175.297753 56.543759) (xy 175.283014 56.636819) (xy 175.2645 56.753713) - (xy 175.2645 56.966287) (xy 175.27182 57.012501) (xy 175.291928 57.139463) (xy 175.297754 57.176243) - (xy 175.342782 57.314825) (xy 175.363444 57.378414) (xy 175.459951 57.56782) (xy 175.58489 57.739786) - (xy 175.735209 57.890105) (xy 175.735214 57.890109) (xy 175.900218 58.009991) (xy 175.942884 58.06532) - (xy 175.948863 58.134934) (xy 175.916258 58.196729) (xy 175.900218 58.210627) (xy 175.73554 58.330272) - (xy 175.735535 58.330276) (xy 175.585276 58.480535) (xy 175.585272 58.48054) (xy 175.460379 58.652442) - (xy 175.363904 58.841782) (xy 175.298242 59.04387) (xy 175.298242 59.043873) (xy 175.287769 59.11) - (xy 176.335854 59.11) (xy 176.29737 59.176657) (xy 176.265 59.297465) (xy 176.265 59.422535) (xy 176.29737 59.543343) - (xy 176.335854 59.61) (xy 175.287769 59.61) (xy 175.298242 59.676126) (xy 175.298242 59.676129) - (xy 175.363904 59.878217) (xy 175.460379 60.067557) (xy 175.585272 60.239459) (xy 175.585276 60.239464) - (xy 175.724143 60.378331) (xy 175.757628 60.439654) (xy 175.752644 60.509346) (xy 175.710772 60.565279) - (xy 175.701559 60.571551) (xy 175.546342 60.667289) (xy 175.422289 60.791342) (xy 175.330187 60.940663) - (xy 175.330185 60.940668) (xy 175.318398 60.976239) (xy 175.275001 61.107203) (xy 175.275001 61.107204) - (xy 175.275 61.107204) (xy 175.2645 61.209983) (xy 175.2645 62.510001) (xy 175.264501 62.510018) - (xy 175.275 62.612796) (xy 175.275001 62.612799) (xy 175.330185 62.779331) (xy 175.330187 62.779336) - (xy 175.365069 62.835888) (xy 175.422288 62.928656) (xy 175.546344 63.052712) (xy 175.695666 63.144814) - (xy 175.862203 63.199999) (xy 175.964991 63.2105) (xy 177.515008 63.210499) (xy 177.617797 63.199999) - (xy 177.784334 63.144814) (xy 177.933656 63.052712) (xy 178.057712 62.928656) (xy 178.149814 62.779334) - (xy 178.161028 62.745494) (xy 178.174897 62.725462) (xy 178.18502 62.703297) (xy 178.194432 62.697248) - (xy 178.200801 62.68805) (xy 178.223299 62.678696) (xy 178.243798 62.665523) (xy 178.260901 62.663063) - (xy 178.265317 62.661228) (xy 178.278733 62.6605) (xy 178.40706 62.6605) (xy 178.474099 62.680185) - (xy 178.494741 62.696819) (xy 179.113181 63.315259) (xy 179.146666 63.376582) (xy 179.1495 63.40294) - (xy 179.1495 78.667059) (xy 179.129815 78.734098) (xy 179.113181 78.75474) (xy 178.164825 79.703095) - (xy 178.103502 79.73658) (xy 178.03381 79.731596) (xy 177.989463 79.703095) (xy 177.943657 79.657289) - (xy 177.943656 79.657288) (xy 177.794334 79.565186) (xy 177.794332 79.565185) (xy 177.78844 79.561551) - (xy 177.741716 79.509603) (xy 177.730493 79.440641) (xy 177.758337 79.376558) (xy 177.765856 79.36833) - (xy 177.904728 79.229458) (xy 178.02962 79.057557) (xy 178.126095 78.868217) (xy 178.191757 78.666129) - (xy 178.191757 78.666126) (xy 178.202231 78.6) (xy 177.154146 78.6) (xy 177.19263 78.533343) (xy 177.225 78.412535) - (xy 177.225 78.287465) (xy 177.19263 78.166657) (xy 177.154146 78.1) (xy 178.202231 78.1) (xy 178.191757 78.033873) - (xy 178.191757 78.03387) (xy 178.126095 77.831782) (xy 178.02962 77.642442) (xy 177.904727 77.47054) - (xy 177.904723 77.470535) (xy 177.754464 77.320276) (xy 177.754459 77.320272) (xy 177.589781 77.200627) - (xy 177.547115 77.145297) (xy 177.541136 77.075684) (xy 177.573741 77.013889) (xy 177.589776 76.999994) - (xy 177.754792 76.880104) (xy 177.905104 76.729792) (xy 177.905106 76.729788) (xy 177.905109 76.729786) - (xy 178.030048 76.55782) (xy 178.030047 76.55782) (xy 178.030051 76.557816) (xy 178.126557 76.368412) - (xy 178.192246 76.166243) (xy 178.2255 75.956287) (xy 178.2255 75.743713) (xy 178.192246 75.533757) - (xy 178.126557 75.331588) (xy 178.030051 75.142184) (xy 178.030049 75.142181) (xy 178.030048 75.142179) - (xy 177.905109 74.970213) (xy 177.754786 74.81989) (xy 177.58282 74.694951) (xy 177.393414 74.598444) - (xy 177.393413 74.598443) (xy 177.393412 74.598443) (xy 177.191243 74.532754) (xy 177.191241 74.532753) - (xy 177.19124 74.532753) (xy 177.029957 74.507208) (xy 176.981287 74.4995) (xy 176.518713 74.4995) - (xy 176.470042 74.507208) (xy 176.30876 74.532753) (xy 176.106585 74.598444) (xy 175.917179 74.694951) - (xy 175.745213 74.81989) (xy 175.594894 74.970209) (xy 175.59489 74.970214) (xy 175.498841 75.102416) - (xy 175.443512 75.145082) (xy 175.422715 75.151148) (xy 175.295677 75.176418) (xy 175.295667 75.176421) - (xy 175.168192 75.229222) (xy 175.053454 75.305887) (xy 175.053453 75.305888) (xy 173.346162 77.013181) - (xy 173.284839 77.046666) (xy 173.258481 77.0495) (xy 172.275884 77.0495) (xy 172.208845 77.029815) - (xy 172.16309 76.977011) (xy 172.153146 76.907853) (xy 172.170345 76.860403) (xy 172.234356 76.756624) - (xy 172.234358 76.756619) (xy 172.289505 76.590197) (xy 172.289506 76.59019) (xy 172.299999 76.487486) - (xy 172.3 76.487473) (xy 172.3 76.275) (xy 169.500001 76.275) (xy 169.500001 76.487486) (xy 169.510494 76.590197) - (xy 169.565641 76.756619) (xy 169.565643 76.756624) (xy 169.629655 76.860403) (xy 169.648095 76.927796) - (xy 169.627172 76.994459) (xy 169.57353 77.039229) (xy 169.524116 77.0495) (xy 168.741519 77.0495) - (xy 168.67448 77.029815) (xy 168.653838 77.013181) (xy 168.061818 76.421161) (xy 168.028333 76.359838) - (xy 168.025499 76.33348) (xy 168.025499 75.562513) (xy 169.5 75.562513) (xy 169.5 75.775) (xy 170.65 75.775) - (xy 171.15 75.775) (xy 172.299999 75.775) (xy 172.299999 75.562528) (xy 172.299998 75.562513) (xy 172.289505 75.459802) - (xy 172.234358 75.29338) (xy 172.234356 75.293375) (xy 172.142315 75.144154) (xy 172.018345 75.020184) - (xy 171.869124 74.928143) (xy 171.869119 74.928141) (xy 171.702697 74.872994) (xy 171.70269 74.872993) - (xy 171.599986 74.8625) (xy 171.15 74.8625) (xy 171.15 75.775) (xy 170.65 75.775) (xy 170.65 74.8625) - (xy 170.200028 74.8625) (xy 170.200012 74.862501) (xy 170.097302 74.872994) (xy 169.93088 74.928141) - (xy 169.930875 74.928143) (xy 169.781654 75.020184) (xy 169.657684 75.144154) (xy 169.565643 75.293375) - (xy 169.565641 75.29338) (xy 169.510494 75.459802) (xy 169.510493 75.459809) (xy 169.5 75.562513) - (xy 168.025499 75.562513) (xy 168.025499 75.549998) (xy 168.025498 75.549981) (xy 168.014999 75.447203) - (xy 168.014998 75.4472) (xy 167.982623 75.3495) (xy 167.959814 75.280666) (xy 167.867712 75.131344) - (xy 167.743656 75.007288) (xy 167.594334 74.915186) (xy 167.427797 74.860001) (xy 167.427795 74.86) - (xy 167.32501 74.8495) (xy 165.974998 74.8495) (xy 165.974981 74.849501) (xy 165.872203 74.86) (xy 165.8722 74.860001) - (xy 165.705668 74.915185) (xy 165.705663 74.915187) (xy 165.556342 75.007289) (xy 165.432289 75.131342) - (xy 165.336395 75.286813) (xy 165.3346 75.285706) (xy 165.295313 75.330337) (xy 165.229092 75.3495) - (xy 163.490638 75.3495) (xy 163.423599 75.329815) (xy 163.385099 75.290597) (xy 163.382765 75.286813) - (xy 163.317712 75.181344) (xy 163.193656 75.057288) (xy 163.044334 74.965186) (xy 162.877797 74.910001) - (xy 162.877795 74.91) (xy 162.77501 74.8995) (xy 161.424998 74.8995) (xy 161.424981 74.899501) (xy 161.322203 74.91) - (xy 161.3222 74.910001) (xy 161.155668 74.965185) (xy 161.155663 74.965187) (xy 161.006342 75.057289) - (xy 160.882289 75.181342) (xy 160.790187 75.330663) (xy 160.790186 75.330666) (xy 160.735001 75.497203) - (xy 160.735001 75.497204) (xy 160.735 75.497204) (xy 160.7245 75.599983) (xy 160.7245 76.500001) - (xy 160.724501 76.500019) (xy 160.735 76.602796) (xy 160.735001 76.602799) (xy 160.790185 76.769331) - (xy 160.790187 76.769336) (xy 160.821051 76.819374) (xy 160.882288 76.918656) (xy 161.006344 77.042712) - (xy 161.155666 77.134814) (xy 161.322203 77.189999) (xy 161.424991 77.2005) (xy 162.775008 77.200499) - (xy 162.877797 77.189999) (xy 163.044334 77.134814) (xy 163.193656 77.042712) (xy 163.317712 76.918656) - (xy 163.385099 76.809402) (xy 163.437047 76.762679) (xy 163.490638 76.7505) (xy 165.290202 76.7505) - (xy 165.357241 76.770185) (xy 165.395739 76.809401) (xy 165.432288 76.868656) (xy 165.556344 76.992712) - (xy 165.705666 77.084814) (xy 165.872203 77.139999) (xy 165.974991 77.1505) (xy 166.75848 77.150499) - (xy 166.825519 77.170183) (xy 166.846161 77.186818) (xy 167.953453 78.294111) (xy 167.953454 78.294112) - (xy 168.068192 78.370777) (xy 168.195667 78.423578) (xy 168.195672 78.42358) (xy 168.195676 78.42358) - (xy 168.195677 78.423581) (xy 168.331003 78.4505) (xy 168.331006 78.4505) (xy 173.668996 78.4505) - (xy 173.76004 78.432389) (xy 173.804328 78.42358) (xy 173.868069 78.397177) (xy 173.931807 78.370777) - (xy 173.931808 78.370776) (xy 173.931811 78.370775) (xy 174.046543 78.294114) (xy 175.515199 76.825456) - (xy 175.576522 76.791972) (xy 175.646213 76.796956) (xy 175.690561 76.825457) (xy 175.745209 76.880105) - (xy 175.745214 76.880109) (xy 175.910218 76.999991) (xy 175.952884 77.05532) (xy 175.958863 77.124934) - (xy 175.926258 77.186729) (xy 175.910218 77.200627) (xy 175.74554 77.320272) (xy 175.745535 77.320276) - (xy 175.595276 77.470535) (xy 175.595272 77.47054) (xy 175.470379 77.642442) (xy 175.373904 77.831782) - (xy 175.308242 78.03387) (xy 175.308242 78.033873) (xy 175.297769 78.1) (xy 176.345854 78.1) (xy 176.30737 78.166657) - (xy 176.275 78.287465) (xy 176.275 78.412535) (xy 176.30737 78.533343) (xy 176.345854 78.6) (xy 175.297769 78.6) - (xy 175.308242 78.666126) (xy 175.308242 78.666129) (xy 175.373904 78.868217) (xy 175.470379 79.057557) - (xy 175.595272 79.229459) (xy 175.595276 79.229464) (xy 175.734143 79.368331) (xy 175.767628 79.429654) - (xy 175.762644 79.499346) (xy 175.720772 79.555279) (xy 175.711559 79.561551) (xy 175.556342 79.657289) - (xy 175.432289 79.781342) (xy 175.340187 79.930663) (xy 175.340185 79.930668) (xy 175.339648 79.932289) - (xy 175.299978 80.052005) (xy 175.260206 80.109449) (xy 175.195691 80.136272) (xy 175.182273 80.137) - (xy 172.311668 80.137) (xy 172.244629 80.117315) (xy 172.20613 80.078097) (xy 172.192714 80.056347) - (xy 172.192711 80.056343) (xy 172.068657 79.932289) (xy 172.068656 79.932288) (xy 171.919334 79.840186) - (xy 171.752797 79.785001) (xy 171.752795 79.785) (xy 171.65001 79.7745) (xy 170.249998 79.7745) - (xy 170.249981 79.774501) (xy 170.147203 79.785) (xy 170.1472 79.785001) (xy 169.980668 79.840185) - (xy 169.980663 79.840187) (xy 169.831342 79.932289) (xy 169.707289 80.056342) (xy 169.615187 80.205663) - (xy 169.615186 80.205666) (xy 169.560001 80.372203) (xy 169.560001 80.372204) (xy 169.56 80.372204) - (xy 169.5495 80.474983) (xy 169.5495 81.400001) (xy 169.549501 81.400019) (xy 169.56 81.502796) - (xy 169.560001 81.502799) (xy 169.578754 81.55939) (xy 169.615186 81.669334) (xy 169.707288 81.818656) - (xy 169.831344 81.942712) (xy 169.980666 82.034814) (xy 170.147203 82.089999) (xy 170.249991 82.1005) - (xy 171.650008 82.100499) (xy 171.752797 82.089999) (xy 171.919334 82.034814) (xy 172.068656 81.942712) - (xy 172.192712 81.818656) (xy 172.198337 81.809534) (xy 172.20613 81.796903) (xy 172.258078 81.750178) - (xy 172.311668 81.738) (xy 175.251652 81.738) (xy 175.318691 81.757685) (xy 175.357189 81.796901) - (xy 175.432288 81.918656) (xy 175.556344 82.042712) (xy 175.705666 82.134814) (xy 175.872203 82.189999) - (xy 175.974991 82.2005) (xy 177.525008 82.200499) (xy 177.627797 82.189999) (xy 177.794334 82.134814) - (xy 177.943656 82.042712) (xy 178.067712 81.918656) (xy 178.159814 81.769334) (xy 178.174391 81.725343) - (xy 178.214161 81.667899) (xy 178.267905 81.64273) (xy 178.293276 81.637683) (xy 178.383497 81.619737) - (xy 178.529179 81.559394) (xy 178.660289 81.471789) (xy 180.571788 79.56029) (xy 180.585512 79.53975) - (xy 180.612406 79.499502) (xy 180.612406 79.499501) (xy 180.659394 79.429179) (xy 180.719737 79.283497) - (xy 180.7505 79.128842) (xy 180.7505 62.941158) (xy 180.743001 62.903457) (xy 180.719738 62.786503) - (xy 180.659394 62.640821) (xy 180.659392 62.640818) (xy 180.65939 62.640814) (xy 180.571789 62.509711) - (xy 180.571786 62.509707) (xy 180.009759 61.947681) (xy 179.976274 61.886358) (xy 179.981258 61.816667) - (xy 180.009759 61.772319) (xy 180.571786 61.210292) (xy 180.571789 61.210289) (xy 180.659394 61.079179) - (xy 180.719738 60.933497) (xy 180.7505 60.778842) (xy 180.7505 60.621157) (xy 180.7505 51.821158) - (xy 180.7505 51.821155) (xy 180.750499 51.821153) (xy 180.719737 51.666503) (xy 180.719735 51.666498) - (xy 180.659397 51.520827) (xy 180.65939 51.520814) (xy 180.57179 51.389712) (xy 180.519057 51.336979) - (xy 180.460289 51.278211) (xy 177.32036 48.138282) (xy 174.138926 44.956847) (xy 174.056117 44.874038) - (xy 177.5495 44.874038) (xy 177.5495 45.125961) (xy 177.58891 45.374785) (xy 177.66676 45.614383) - (xy 177.723111 45.724977) (xy 177.772394 45.8217) (xy 177.781132 45.838848) (xy 177.929201 46.042649) - (xy 177.929205 46.042654) (xy 178.107345 46.220794) (xy 178.10735 46.220798) (xy 178.272539 46.340814) - (xy 178.311155 46.36887) (xy 178.454184 46.441747) (xy 178.535616 46.483239) (xy 178.535618 46.483239) - (xy 178.535621 46.483241) (xy 178.775215 46.56109) (xy 179.024038 46.6005) (xy 179.024039 46.6005) - (xy 179.275961 46.6005) (xy 179.275962 46.6005) (xy 179.524785 46.56109) (xy 179.764379 46.483241) - (xy 179.988845 46.36887) (xy 180.192656 46.220793) (xy 180.370793 46.042656) (xy 180.51887 45.838845) - (xy 180.633241 45.614379) (xy 180.71109 45.374785) (xy 180.7505 45.125962) (xy 180.7505 44.874038) - (xy 180.71109 44.625215) (xy 180.633241 44.385621) (xy 180.633239 44.385618) (xy 180.633239 44.385616) - (xy 180.591747 44.304184) (xy 180.51887 44.161155) (xy 180.499952 44.135117) (xy 180.370798 43.95735) - (xy 180.370794 43.957345) (xy 180.192654 43.779205) (xy 180.192649 43.779201) (xy 179.988848 43.631132) - (xy 179.988847 43.631131) (xy 179.988845 43.63113) (xy 179.918747 43.595413) (xy 179.764383 43.51676) - (xy 179.524785 43.43891) (xy 179.275962 43.3995) (xy 179.024038 43.3995) (xy 178.899626 43.419205) - (xy 178.775214 43.43891) (xy 178.535616 43.51676) (xy 178.311151 43.631132) (xy 178.10735 43.779201) - (xy 178.107345 43.779205) (xy 177.929205 43.957345) (xy 177.929201 43.95735) (xy 177.781132 44.161151) - (xy 177.66676 44.385616) (xy 177.58891 44.625214) (xy 177.5495 44.874038) (xy 174.056117 44.874038) - (xy 172.490292 43.308213) (xy 172.490288 43.30821) (xy 172.359185 43.220609) (xy 172.359172 43.220602) - (xy 172.213501 43.160264) (xy 172.213489 43.160261) (xy 172.058845 43.1295) (xy 172.058842 43.1295) - (xy 153.448843 43.1295) (xy 153.291158 43.1295) (xy 153.291155 43.1295) (xy 153.13651 43.160261) - (xy 153.136498 43.160264) (xy 152.990827 43.220602) (xy 152.990814 43.220609) (xy 152.859711 43.30821) - (xy 152.859707 43.308213) (xy 150.765406 45.402516) (xy 150.069711 46.098211) (xy 150.031757 46.136165) - (xy 149.958209 46.209712) (xy 149.870609 46.340814) (xy 149.870602 46.340827) (xy 149.810264 46.486498) - (xy 149.810261 46.48651) (xy 149.7795 46.641153) (xy 149.7795 48.353705) (xy 149.759815 48.420744) - (xy 149.720599 48.459242) (xy 149.691347 48.477285) (xy 149.691343 48.477288) (xy 149.567289 48.601342) - (xy 149.475187 48.750663) (xy 149.475185 48.750668) (xy 149.475115 48.75088) (xy 149.420001 48.917203) - (xy 149.420001 48.917204) (xy 149.42 48.917204) (xy 149.4095 49.019983) (xy 149.4095 50.420001) - (xy 149.409501 50.420018) (xy 149.42 50.522796) (xy 149.420001 50.522799) (xy 149.432399 50.560213) - (xy 149.475186 50.689334) (xy 149.567096 50.838345) (xy 149.567289 50.838657) (xy 149.686451 50.957819) - (xy 149.719936 51.019142) (xy 149.714952 51.088834) (xy 149.67308 51.144767) (xy 149.607616 51.169184) - (xy 149.598771 51.1695) (xy 149.503137 51.1695) (xy 149.385746 51.184953) (xy 149.385734 51.184957) - (xy 149.264298 51.235257) (xy 149.194829 51.242726) (xy 149.169394 51.235258) (xy 149.049128 51.185443) - (xy 148.93183 51.17) (xy 148.53 51.17) (xy 148.53 53.046) (xy 148.510315 53.113039) (xy 148.457511 53.158794) - (xy 148.406 53.17) (xy 148.33 53.17) (xy 148.33 53.246) (xy 148.310315 53.313039) (xy 148.257511 53.358794) - (xy 148.206 53.37) (xy 147.17549 53.37) (xy 147.175488 53.370001) (xy 147.182942 53.426627) (xy 147.182944 53.426633) + (xy 172.042848 55.717767) (xy 172.105969 55.7005) (xy 173.593481 55.7005) (xy 173.66052 55.720185) + (xy 173.681162 55.736819) (xy 174.332214 56.387871) (xy 174.365699 56.449194) (xy 174.362465 56.513866) + (xy 174.352754 56.543754) (xy 174.352753 56.543759) (xy 174.338014 56.636819) (xy 174.3195 56.753713) + (xy 174.3195 56.966287) (xy 174.32682 57.012501) (xy 174.346928 57.139463) (xy 174.352754 57.176243) + (xy 174.397782 57.314825) (xy 174.418444 57.378414) (xy 174.514951 57.56782) (xy 174.63989 57.739786) + (xy 174.790209 57.890105) (xy 174.790214 57.890109) (xy 174.955218 58.009991) (xy 174.997884 58.06532) + (xy 175.003863 58.134934) (xy 174.971258 58.196729) (xy 174.955218 58.210627) (xy 174.79054 58.330272) + (xy 174.790535 58.330276) (xy 174.640276 58.480535) (xy 174.640272 58.48054) (xy 174.515379 58.652442) + (xy 174.418904 58.841782) (xy 174.353242 59.04387) (xy 174.353242 59.043873) (xy 174.342769 59.11) + (xy 175.390854 59.11) (xy 175.35237 59.176657) (xy 175.32 59.297465) (xy 175.32 59.422535) (xy 175.35237 59.543343) + (xy 175.390854 59.61) (xy 174.342769 59.61) (xy 174.353242 59.676126) (xy 174.353242 59.676129) + (xy 174.418904 59.878217) (xy 174.515379 60.067557) (xy 174.640272 60.239459) (xy 174.640276 60.239464) + (xy 174.779143 60.378331) (xy 174.812628 60.439654) (xy 174.807644 60.509346) (xy 174.765772 60.565279) + (xy 174.756559 60.571551) (xy 174.601342 60.667289) (xy 174.477289 60.791342) (xy 174.385187 60.940663) + (xy 174.385185 60.940668) (xy 174.373398 60.976239) (xy 174.330001 61.107203) (xy 174.330001 61.107204) + (xy 174.33 61.107204) (xy 174.3195 61.209983) (xy 174.3195 62.510001) (xy 174.319501 62.510018) + (xy 174.33 62.612796) (xy 174.330001 62.612799) (xy 174.385185 62.779331) (xy 174.385187 62.779336) + (xy 174.420069 62.835888) (xy 174.477288 62.928656) (xy 174.601344 63.052712) (xy 174.750666 63.144814) + (xy 174.917203 63.199999) (xy 175.019991 63.2105) (xy 176.570008 63.210499) (xy 176.672797 63.199999) + (xy 176.839334 63.144814) (xy 176.988656 63.052712) (xy 177.112712 62.928656) (xy 177.204814 62.779334) + (xy 177.216028 62.745494) (xy 177.255801 62.68805) (xy 177.320317 62.661228) (xy 177.333733 62.6605) + (xy 178.40706 62.6605) (xy 178.474099 62.680185) (xy 178.494741 62.696819) (xy 179.113181 63.315259) + (xy 179.146666 63.376582) (xy 179.1495 63.40294) (xy 179.1495 78.66706) (xy 179.129815 78.734099) + (xy 179.113181 78.754741) (xy 177.854741 80.013181) (xy 177.793418 80.046666) (xy 177.76706 80.0495) + (xy 177.343733 80.0495) (xy 177.276694 80.029815) (xy 177.230939 79.977011) (xy 177.226028 79.964506) + (xy 177.221495 79.950829) (xy 177.214814 79.930666) (xy 177.122712 79.781344) (xy 176.998656 79.657288) + (xy 176.849334 79.565186) (xy 176.849332 79.565185) (xy 176.84344 79.561551) (xy 176.796716 79.509603) + (xy 176.785493 79.440641) (xy 176.813337 79.376558) (xy 176.820856 79.36833) (xy 176.959728 79.229458) + (xy 177.08462 79.057557) (xy 177.181095 78.868217) (xy 177.246757 78.666129) (xy 177.246757 78.666126) + (xy 177.257231 78.6) (xy 176.209146 78.6) (xy 176.24763 78.533343) (xy 176.28 78.412535) (xy 176.28 78.287465) + (xy 176.24763 78.166657) (xy 176.209146 78.1) (xy 177.257231 78.1) (xy 177.246757 78.033873) (xy 177.246757 78.03387) + (xy 177.181095 77.831782) (xy 177.08462 77.642442) (xy 176.959727 77.47054) (xy 176.959723 77.470535) + (xy 176.809464 77.320276) (xy 176.809459 77.320272) (xy 176.644781 77.200627) (xy 176.602115 77.145297) + (xy 176.596136 77.075684) (xy 176.628741 77.013889) (xy 176.644776 76.999994) (xy 176.809792 76.880104) + (xy 176.960104 76.729792) (xy 176.960106 76.729788) (xy 176.960109 76.729786) (xy 177.085048 76.55782) + (xy 177.085047 76.55782) (xy 177.085051 76.557816) (xy 177.181557 76.368412) (xy 177.247246 76.166243) + (xy 177.2805 75.956287) (xy 177.2805 75.743713) (xy 177.247246 75.533757) (xy 177.181557 75.331588) + (xy 177.085051 75.142184) (xy 177.085049 75.142181) (xy 177.085048 75.142179) (xy 176.960109 74.970213) + (xy 176.809786 74.81989) (xy 176.63782 74.694951) (xy 176.448414 74.598444) (xy 176.448413 74.598443) + (xy 176.448412 74.598443) (xy 176.246243 74.532754) (xy 176.246241 74.532753) (xy 176.24624 74.532753) + (xy 176.084957 74.507208) (xy 176.036287 74.4995) (xy 175.573713 74.4995) (xy 175.525042 74.507208) + (xy 175.36376 74.532753) (xy 175.161585 74.598444) (xy 174.972179 74.694951) (xy 174.800213 74.81989) + (xy 174.64989 74.970213) (xy 174.524951 75.142179) (xy 174.428444 75.331585) (xy 174.362753 75.53376) + (xy 174.3295 75.743713) (xy 174.3295 75.956295) (xy 174.329674 75.957394) (xy 174.329619 75.957814) + (xy 174.329882 75.961151) (xy 174.329181 75.961206) (xy 174.320713 76.026686) (xy 174.29488 76.064461) + (xy 173.346162 77.013181) (xy 173.284839 77.046666) (xy 173.258481 77.0495) (xy 172.275884 77.0495) + (xy 172.208845 77.029815) (xy 172.16309 76.977011) (xy 172.153146 76.907853) (xy 172.170345 76.860403) + (xy 172.234356 76.756624) (xy 172.234358 76.756619) (xy 172.289505 76.590197) (xy 172.289506 76.59019) + (xy 172.299999 76.487486) (xy 172.3 76.487473) (xy 172.3 76.275) (xy 169.500001 76.275) (xy 169.500001 76.487486) + (xy 169.510494 76.590197) (xy 169.565641 76.756619) (xy 169.565643 76.756624) (xy 169.629655 76.860403) + (xy 169.648095 76.927796) (xy 169.627172 76.994459) (xy 169.57353 77.039229) (xy 169.524116 77.0495) + (xy 168.741519 77.0495) (xy 168.67448 77.029815) (xy 168.653838 77.013181) (xy 168.061818 76.421161) + (xy 168.028333 76.359838) (xy 168.025499 76.33348) (xy 168.025499 75.562513) (xy 169.5 75.562513) + (xy 169.5 75.775) (xy 170.65 75.775) (xy 171.15 75.775) (xy 172.299999 75.775) (xy 172.299999 75.562528) + (xy 172.299998 75.562513) (xy 172.289505 75.459802) (xy 172.234358 75.29338) (xy 172.234356 75.293375) + (xy 172.142315 75.144154) (xy 172.018345 75.020184) (xy 171.869124 74.928143) (xy 171.869119 74.928141) + (xy 171.702697 74.872994) (xy 171.70269 74.872993) (xy 171.599986 74.8625) (xy 171.15 74.8625) (xy 171.15 75.775) + (xy 170.65 75.775) (xy 170.65 74.8625) (xy 170.200028 74.8625) (xy 170.200012 74.862501) (xy 170.097302 74.872994) + (xy 169.93088 74.928141) (xy 169.930875 74.928143) (xy 169.781654 75.020184) (xy 169.657684 75.144154) + (xy 169.565643 75.293375) (xy 169.565641 75.29338) (xy 169.510494 75.459802) (xy 169.510493 75.459809) + (xy 169.5 75.562513) (xy 168.025499 75.562513) (xy 168.025499 75.549998) (xy 168.025498 75.549981) + (xy 168.014999 75.447203) (xy 168.014998 75.4472) (xy 167.982623 75.3495) (xy 167.959814 75.280666) + (xy 167.867712 75.131344) (xy 167.743656 75.007288) (xy 167.594334 74.915186) (xy 167.427797 74.860001) + (xy 167.427795 74.86) (xy 167.32501 74.8495) (xy 165.974998 74.8495) (xy 165.974981 74.849501) (xy 165.872203 74.86) + (xy 165.8722 74.860001) (xy 165.705668 74.915185) (xy 165.705663 74.915187) (xy 165.556342 75.007289) + (xy 165.432289 75.131342) (xy 165.336395 75.286813) (xy 165.3346 75.285706) (xy 165.295313 75.330337) + (xy 165.229092 75.3495) (xy 163.490638 75.3495) (xy 163.423599 75.329815) (xy 163.385099 75.290597) + (xy 163.382765 75.286813) (xy 163.317712 75.181344) (xy 163.193656 75.057288) (xy 163.044334 74.965186) + (xy 162.877797 74.910001) (xy 162.877795 74.91) (xy 162.77501 74.8995) (xy 161.424998 74.8995) (xy 161.424981 74.899501) + (xy 161.322203 74.91) (xy 161.3222 74.910001) (xy 161.155668 74.965185) (xy 161.155663 74.965187) + (xy 161.006342 75.057289) (xy 160.882289 75.181342) (xy 160.790187 75.330663) (xy 160.790186 75.330666) + (xy 160.735001 75.497203) (xy 160.735001 75.497204) (xy 160.735 75.497204) (xy 160.7245 75.599983) + (xy 160.7245 76.500001) (xy 160.724501 76.500019) (xy 160.735 76.602796) (xy 160.735001 76.602799) + (xy 160.790185 76.769331) (xy 160.790187 76.769336) (xy 160.821051 76.819374) (xy 160.882288 76.918656) + (xy 161.006344 77.042712) (xy 161.155666 77.134814) (xy 161.322203 77.189999) (xy 161.424991 77.2005) + (xy 162.775008 77.200499) (xy 162.877797 77.189999) (xy 163.044334 77.134814) (xy 163.193656 77.042712) + (xy 163.317712 76.918656) (xy 163.385099 76.809402) (xy 163.437047 76.762679) (xy 163.490638 76.7505) + (xy 165.290202 76.7505) (xy 165.357241 76.770185) (xy 165.395739 76.809401) (xy 165.432288 76.868656) + (xy 165.556344 76.992712) (xy 165.705666 77.084814) (xy 165.872203 77.139999) (xy 165.974991 77.1505) + (xy 166.75848 77.150499) (xy 166.825519 77.170183) (xy 166.846161 77.186818) (xy 167.953453 78.294111) + (xy 167.953454 78.294112) (xy 168.068192 78.370777) (xy 168.195667 78.423578) (xy 168.195672 78.42358) + (xy 168.195676 78.42358) (xy 168.195677 78.423581) (xy 168.331003 78.4505) (xy 168.331006 78.4505) + (xy 173.668996 78.4505) (xy 173.76004 78.432389) (xy 173.804328 78.42358) (xy 173.868069 78.397177) + (xy 173.931807 78.370777) (xy 173.931808 78.370776) (xy 173.931811 78.370775) (xy 174.046543 78.294114) + (xy 174.206274 78.134382) (xy 174.267593 78.1009) (xy 174.295604 78.102903) (xy 174.295604 78.1) + (xy 175.400854 78.1) (xy 175.36237 78.166657) (xy 175.33 78.287465) (xy 175.33 78.412535) (xy 175.36237 78.533343) + (xy 175.400854 78.6) (xy 174.352769 78.6) (xy 174.363242 78.666126) (xy 174.363242 78.666129) (xy 174.428904 78.868217) + (xy 174.525379 79.057557) (xy 174.650272 79.229459) (xy 174.650276 79.229464) (xy 174.789143 79.368331) + (xy 174.822628 79.429654) (xy 174.817644 79.499346) (xy 174.775772 79.555279) (xy 174.766559 79.561551) + (xy 174.611342 79.657289) (xy 174.487289 79.781342) (xy 174.395187 79.930663) (xy 174.395185 79.930668) + (xy 174.379829 79.977011) (xy 174.354978 80.052005) (xy 174.315206 80.109449) (xy 174.250691 80.136272) + (xy 174.237273 80.137) (xy 172.311668 80.137) (xy 172.244629 80.117315) (xy 172.20613 80.078097) + (xy 172.192714 80.056347) (xy 172.192711 80.056343) (xy 172.068657 79.932289) (xy 172.068656 79.932288) + (xy 171.919334 79.840186) (xy 171.752797 79.785001) (xy 171.752795 79.785) (xy 171.65001 79.7745) + (xy 170.249998 79.7745) (xy 170.249981 79.774501) (xy 170.147203 79.785) (xy 170.1472 79.785001) + (xy 169.980668 79.840185) (xy 169.980663 79.840187) (xy 169.831342 79.932289) (xy 169.707289 80.056342) + (xy 169.615187 80.205663) (xy 169.615186 80.205666) (xy 169.560001 80.372203) (xy 169.560001 80.372204) + (xy 169.56 80.372204) (xy 169.5495 80.474983) (xy 169.5495 81.400001) (xy 169.549501 81.400019) + (xy 169.56 81.502796) (xy 169.560001 81.502799) (xy 169.578754 81.55939) (xy 169.615186 81.669334) + (xy 169.707288 81.818656) (xy 169.831344 81.942712) (xy 169.980666 82.034814) (xy 170.147203 82.089999) + (xy 170.249991 82.1005) (xy 171.650008 82.100499) (xy 171.752797 82.089999) (xy 171.919334 82.034814) + (xy 172.068656 81.942712) (xy 172.192712 81.818656) (xy 172.198337 81.809534) (xy 172.20613 81.796903) + (xy 172.258078 81.750178) (xy 172.311668 81.738) (xy 174.306652 81.738) (xy 174.373691 81.757685) + (xy 174.412189 81.796901) (xy 174.487288 81.918656) (xy 174.611344 82.042712) (xy 174.760666 82.134814) + (xy 174.927203 82.189999) (xy 175.029991 82.2005) (xy 176.580008 82.200499) (xy 176.682797 82.189999) + (xy 176.849334 82.134814) (xy 176.998656 82.042712) (xy 177.122712 81.918656) (xy 177.214814 81.769334) + (xy 177.226028 81.735494) (xy 177.265801 81.67805) (xy 177.330317 81.651228) (xy 177.343733 81.6505) + (xy 178.228844 81.6505) (xy 178.228845 81.650499) (xy 178.383497 81.619737) (xy 178.529179 81.559394) + (xy 178.660289 81.471789) (xy 180.571788 79.56029) (xy 180.585512 79.53975) (xy 180.612406 79.499502) + (xy 180.612406 79.499501) (xy 180.659394 79.429179) (xy 180.719737 79.283497) (xy 180.7505 79.128842) + (xy 180.7505 62.941158) (xy 180.743001 62.903457) (xy 180.719738 62.786503) (xy 180.659394 62.640821) + (xy 180.659392 62.640818) (xy 180.65939 62.640814) (xy 180.571789 62.509711) (xy 180.571786 62.509707) + (xy 180.009759 61.947681) (xy 179.976274 61.886358) (xy 179.981258 61.816667) (xy 180.009759 61.772319) + (xy 180.571786 61.210292) (xy 180.571789 61.210289) (xy 180.659394 61.079179) (xy 180.719738 60.933497) + (xy 180.7505 60.778842) (xy 180.7505 60.621157) (xy 180.7505 51.821158) (xy 180.7505 51.821155) + (xy 180.750499 51.821153) (xy 180.719737 51.666503) (xy 180.719735 51.666498) (xy 180.659397 51.520827) + (xy 180.65939 51.520814) (xy 180.57179 51.389712) (xy 180.519057 51.336979) (xy 180.460289 51.278211) + (xy 177.32036 48.138282) (xy 174.138926 44.956847) (xy 174.056117 44.874038) (xy 177.5495 44.874038) + (xy 177.5495 45.125961) (xy 177.58891 45.374785) (xy 177.66676 45.614383) (xy 177.723111 45.724977) + (xy 177.772394 45.8217) (xy 177.781132 45.838848) (xy 177.929201 46.042649) (xy 177.929205 46.042654) + (xy 178.107345 46.220794) (xy 178.10735 46.220798) (xy 178.272539 46.340814) (xy 178.311155 46.36887) + (xy 178.454184 46.441747) (xy 178.535616 46.483239) (xy 178.535618 46.483239) (xy 178.535621 46.483241) + (xy 178.775215 46.56109) (xy 179.024038 46.6005) (xy 179.024039 46.6005) (xy 179.275961 46.6005) + (xy 179.275962 46.6005) (xy 179.524785 46.56109) (xy 179.764379 46.483241) (xy 179.988845 46.36887) + (xy 180.192656 46.220793) (xy 180.370793 46.042656) (xy 180.51887 45.838845) (xy 180.633241 45.614379) + (xy 180.71109 45.374785) (xy 180.7505 45.125962) (xy 180.7505 44.874038) (xy 180.71109 44.625215) + (xy 180.633241 44.385621) (xy 180.633239 44.385618) (xy 180.633239 44.385616) (xy 180.591747 44.304184) + (xy 180.51887 44.161155) (xy 180.499952 44.135117) (xy 180.370798 43.95735) (xy 180.370794 43.957345) + (xy 180.192654 43.779205) (xy 180.192649 43.779201) (xy 179.988848 43.631132) (xy 179.988847 43.631131) + (xy 179.988845 43.63113) (xy 179.918747 43.595413) (xy 179.764383 43.51676) (xy 179.524785 43.43891) + (xy 179.275962 43.3995) (xy 179.024038 43.3995) (xy 178.899626 43.419205) (xy 178.775214 43.43891) + (xy 178.535616 43.51676) (xy 178.311151 43.631132) (xy 178.10735 43.779201) (xy 178.107345 43.779205) + (xy 177.929205 43.957345) (xy 177.929201 43.95735) (xy 177.781132 44.161151) (xy 177.66676 44.385616) + (xy 177.58891 44.625214) (xy 177.5495 44.874038) (xy 174.056117 44.874038) (xy 172.490292 43.308213) + (xy 172.490288 43.30821) (xy 172.359185 43.220609) (xy 172.359172 43.220602) (xy 172.213501 43.160264) + (xy 172.213489 43.160261) (xy 172.058845 43.1295) (xy 172.058842 43.1295) (xy 153.448843 43.1295) + (xy 153.291158 43.1295) (xy 153.291155 43.1295) (xy 153.13651 43.160261) (xy 153.136498 43.160264) + (xy 152.990827 43.220602) (xy 152.990814 43.220609) (xy 152.859711 43.30821) (xy 152.859707 43.308213) + (xy 150.765406 45.402516) (xy 150.069711 46.098211) (xy 150.031757 46.136165) (xy 149.958209 46.209712) + (xy 149.870609 46.340814) (xy 149.870602 46.340827) (xy 149.810264 46.486498) (xy 149.810261 46.48651) + (xy 149.7795 46.641153) (xy 149.7795 48.353705) (xy 149.759815 48.420744) (xy 149.720599 48.459242) + (xy 149.691347 48.477285) (xy 149.691343 48.477288) (xy 149.567289 48.601342) (xy 149.475187 48.750663) + (xy 149.475185 48.750668) (xy 149.475115 48.75088) (xy 149.420001 48.917203) (xy 149.420001 48.917204) + (xy 149.42 48.917204) (xy 149.4095 49.019983) (xy 149.4095 50.420001) (xy 149.409501 50.420018) + (xy 149.42 50.522796) (xy 149.420001 50.522799) (xy 149.432399 50.560213) (xy 149.475186 50.689334) + (xy 149.567096 50.838345) (xy 149.567289 50.838657) (xy 149.686451 50.957819) (xy 149.719936 51.019142) + (xy 149.714952 51.088834) (xy 149.67308 51.144767) (xy 149.607616 51.169184) (xy 149.598771 51.1695) + (xy 149.503137 51.1695) (xy 149.385746 51.184953) (xy 149.385734 51.184957) (xy 149.264298 51.235257) + (xy 149.194829 51.242726) (xy 149.169394 51.235258) (xy 149.049128 51.185443) (xy 148.93183 51.17) + (xy 148.53 51.17) (xy 148.53 53.046) (xy 148.510315 53.113039) (xy 148.457511 53.158794) (xy 148.406 53.17) + (xy 148.33 53.17) (xy 148.33 53.246) (xy 148.310315 53.313039) (xy 148.257511 53.358794) (xy 148.206 53.37) + (xy 147.17549 53.37) (xy 147.175488 53.370001) (xy 147.182942 53.426627) (xy 147.182944 53.426633) (xy 147.243399 53.572586) (xy 147.264445 53.600013) (xy 147.289639 53.665183) (xy 147.275601 53.733627) (xy 147.226787 53.783617) (xy 147.166069 53.7995) (xy 137.171155 53.7995) (xy 137.016508 53.830261) (xy 137.016498 53.830264) (xy 136.870827 53.890602) (xy 136.870814 53.890609) (xy 136.739712 53.978209) diff --git a/Flow_Controller.kicad_sch b/Flow_Controller.kicad_sch index e084a6d..fa1c7cf 100644 --- a/Flow_Controller.kicad_sch +++ b/Flow_Controller.kicad_sch @@ -4824,7 +4824,7 @@ ) ) ) - (property "Footprint" "Connector_JST:JST_XH_B3B-XH-A_1x03_P2.50mm_Vertical" + (property "Footprint" "Connector_JST:JST_XH_S3B-XH-A_1x03_P2.50mm_Horizontal" (at 44.45 49.53 0) (effects (font diff --git a/Readme.md b/Readme.md index ea52086..e119223 100644 --- a/Readme.md +++ b/Readme.md @@ -6,6 +6,10 @@ A fail-safe water flow monitoring module designed to protect CNC spindles and la ![Front](images/Flow_Controller_front.png) ![Back](images/Flow_Controller_back.png) +![Panel](images/Flow_Controller_Panel.png) + +![Case](CAD/Case.png) +![Case_exploded](CAD/Case_exploded.png) ![ZJ-S401](images/Sensor_ZJ-S401.png) @@ -31,7 +35,9 @@ A fail-safe water flow monitoring module designed to protect CNC spindles and la * **Output:** 3-pin CNC interface (+24V, GND, ALARM_CNC). Connects directly to standard CNC active-low sinking inputs. ## Panel Design and GCode -The [scripts](scripts) folder contains a guide to panelize the board (`Flow_Controller_Panel.kicad_pcb`) and howto generate gcode. +The [../kicad2panel](../kicad2panel) folder contains a guide to panelize the board. +The [../kicad2msla](../kicad2msla) folder contains a guide to use the MSLA for UV exposure. +The [../kicad2gcode](../kicad2gcode) folder contains a guide to generate G-code to use CNC for drilling and cutting (optionally also for the isolation trace routing). ## Microcontroller Pin Mapping (Per Schematic) | Pin | Schematic Net | Function | MCU Port (SOP8) | diff --git a/images/Flow_Controller_Panel.png b/images/Flow_Controller_Panel.png index 85d114f..bc04161 100644 Binary files a/images/Flow_Controller_Panel.png and b/images/Flow_Controller_Panel.png differ diff --git a/images/Flow_Controller_back.png b/images/Flow_Controller_back.png index 6c9b5ec..881e212 100644 Binary files a/images/Flow_Controller_back.png and b/images/Flow_Controller_back.png differ diff --git a/images/Flow_Controller_front.png b/images/Flow_Controller_front.png index 637fcdd..bed2d61 100644 Binary files a/images/Flow_Controller_front.png and b/images/Flow_Controller_front.png differ diff --git a/images/spoke_width.png b/images/spoke_width.png deleted file mode 100644 index f4d3809..0000000 Binary files a/images/spoke_width.png and /dev/null differ diff --git a/scripts/.gitignore b/scripts/.gitignore deleted file mode 100644 index 2dd4566..0000000 --- a/scripts/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -__pycache__/ -panel/ -output/ -gcode/ -.venv/ \ No newline at end of file diff --git a/scripts/Dummy.pm4n b/scripts/Dummy.pm4n deleted file mode 100644 index e54b8b4..0000000 Binary files a/scripts/Dummy.pm4n and /dev/null differ diff --git a/scripts/Readme.md b/scripts/Readme.md deleted file mode 100644 index 7076ba8..0000000 --- a/scripts/Readme.md +++ /dev/null @@ -1,164 +0,0 @@ -TODO: Add table of content -# KiKit Processor -Processing script for KiKit panelizes PCBs and draws a fixture sketch and positions the whole panel for easy CNC and MSLA processing. - -The script: - -- Panelizes the board -- Moves the finished panel to the origin `(0, 0)` -- Adds alignment holes -- Adds silskcreen text -- Extends the copper layers - -The resulting output is intended for repeatable CNC/MSLA processing. - -![Panel](../images/Flow_Controller_Panel.png) - -## Install kikit -Install `kikit`: -```bash -pipx install --system-site-packages kikit -``` - -## Usage - -```bash -# Panelize the PCB using the preset defined in `myPreset.json`. -kikit panelize \ - -p myPreset.json \ - ../Flow_Controller.kicad_pcb \ - panel/Flow_Controller_Panel.kicad_pcb -``` - -The new `panel/Flow_Controller_Panel.kicad_pcb` file will contain the panelized PCB with the following feature specified in `myPreset.json`. E.g.: Grid of 1 x 2 with space 2.1 mm, new mounting holes and fiducials. - -```json - "layout": { - "type": "grid", - "rows": 1, - "cols": 2, - "hspace": "2.1mm", - "vspace": "2.1mm" - } -``` -See all values in [default.json](https://raw.githubusercontent.com/yaqwsx/KiKit/refs/heads/master/kikit/resources/panelizePresets/default.json) - -Check the kikit panelization [examples](https://yaqwsx.github.io/KiKit/latest/panelization/examples/). - -# Exporting gcode for CNC - -## pcb2gcode -Use CNC for drilling holes and milling board outlines. You can also use CNC for isolation traces milling. However, the best result will give you MSLA PCB exposure. TODO: Add link to the section - -Adapt milling and drilling parameters in `millproject`. Look up [pcb2gcode/wiki](https://github.com/pcb2gcode/pcb2gcode/wiki) for help. -```bash -nano millproject -``` -*Make sure to set `mirror-axis` in the `millproject` to half of your board width!!!* - -```bash -./export_for_cnc.sh panel/Flow_Controller_Panel.kicad_pcb -``` - -Launch the `gSender` program. -* Load the `output/gcode/drill.ngc` file for drilling holes. -* Load the `output/gcode/outline.ngc` file for milling the board outlines. -* Load the `output/gcode/back.ngc` file if you want to mill the isolation traces. -* Load the `output/gcode/front.ngc` file if you want to mill the isolation traces. - -## Milling tip: Increase the thermal spoke and trace width -When routing for milling, use the widest traces possible. 1mm, 2mm and wider, the machine doesn't care, but later you won't be soldering leads to small fragile strips of copper. You can use copper pours for routing too. - -Set up the entire back side as one big GND pour. Then, increase the thermal spoke width to be larger than 1mm. This avoids small features and gives more room for error if a larger drill is used for the holes. - -![Thermal spoke width](../images/spoke_width.png) - - -# MSLA PCB Exposure: KiCad → Photon Mono 4 - -Convert KiCad PCB layers to `.pm4n` files for direct UV exposure on an **Anycubic Photon Mono 4** (9024×5120 px, 17 µm/px). - ---- - -## Setup - -### 1. Create the Dummy.pm4n - -Open **CHITUBOX Basic** slicer, select printer **Anycubic Photon Mono 4**, slice any tiny STL (a 1×1×0.05 mm box), and save as `Dummy.pm4n` in the same directory as `export_for_msla.sh`. - -This file is reused for every job — it carries the correct LCD resolution metadata. - -### 2. Install dependencies - -```bash -python3 -m venv .venv -source .venv/bin/activate -pip install pygerber Pillow numpy -``` - -Or activate the venv once and put `source .venv/bin/activate` in your shell profile. - -### 3. Export multiple layers (e.g. copper + soldermask) - -```bash -./export_for_msla.sh \ - --layers Front,Back,F.Mask,B.Mask,F.SilkS,B.SilkS \ - --invert Front,Back,F.Mask,B.Mask,F.SilkS,B.SilkS \ - --mirror Front,F.Mask,F.SilkS \ - --exposure 60 \ - panel/Flow_Controller_Panel.kicad_pcb -``` - -#### Using gerber_to_pm4n.py directly - -```bash -python3 gerber_to_pm4n.py Dummy.pm4n output/gerbers/Flow_Controller_Panel-Front.gbr \ - --invert --mirror --exposure 60 -``` - ---- - -## Output structure - -``` -output/ -├── gerbers/ -│ ├── Flow_Controller_Panel-Front.gbr -│ └── Flow_Controller_Panel-F_Mask.gbr -└── pm4n/ - ├── Flow_Controller_Panel-Front.pm4n ← copy to USB, print on Mono 4 - ├── Flow_Controller_Panel-Front.preview.png ← visual check before printing - ├── Flow_Controller_Panel-F_Mask.pm4n - └── Flow_Controller_Panel-F_Mask.preview.png -``` - ---- - -## Troubleshooting - -**`kicad-cli: command not found`** — add KiCad to PATH: -```bash -export PATH="/usr/lib/kicad/bin:$PATH" -``` -Or on Flatpak: -```bash -alias kicad-cli='flatpak run --command=kicad-cli org.kicad.KiCad' -``` - -**Expected Gerber not found** — KiCad's layer→filename mapping: - -| Layer | Filename stem | -|---|---| -| `F.Cu` | `Front` | -| `B.Cu` | `Back` | -| `F.Mask` | `F_Mask` | -| `B.Mask` | `B_Mask` | -| `F.SilkS` | `F_Silkscreen` | - ---- -First print checklist - -Open the `.pm4n` in `Chitubox Basic` slicer to visually verify before printing. -Check the `.preview.png` — traces should appear black on white background (background = UV exposed = resist removed = etched away; traces = dark = resist kept = copper stays) -Start with `--exposure 60` and bracket from there — Bungard presensitized at 405nm typically lands between 30–120s depending on board vintage and storage. - diff --git a/scripts/cleanup.py b/scripts/cleanup.py deleted file mode 100644 index b492d8f..0000000 --- a/scripts/cleanup.py +++ /dev/null @@ -1,96 +0,0 @@ -import pcbnew -from shapely.geometry import MultiPolygon, Polygon - -# --------------------------------------------------------------------------- -# KiKit postprocess hook – cleanup.py -# -# 1. Copy all Edge.Cuts content (substrate rings) to Eco1_User as segments, -# EXCEPT the outermost panel rectangle. -# --------------------------------------------------------------------------- - -TOLERANCE_NM = 1_000 # 1 µm - - -def _mm(nm_val): - return f"{pcbnew.ToMM(int(nm_val)):.4f} mm" - - -def _collect_rings(geom): - """Return all rings as list of (shapely_ring, coord_list).""" - rings = [] - if isinstance(geom, Polygon): - rings.append((geom.exterior, list(geom.exterior.coords))) - for interior in geom.interiors: - rings.append((interior, list(interior.coords))) - elif isinstance(geom, MultiPolygon): - for poly in geom.geoms: - rings.extend(_collect_rings(poly)) - return rings - - -def _is_outer_frame(ring_geom, x0, y0, x1, y1, tol=TOLERANCE_NM): - """True if the ring's bounding box equals the panel bounding box.""" - b = ring_geom.bounds - return (abs(b[0] - x0) <= tol and abs(b[1] - y0) <= tol and - abs(b[2] - x1) <= tol and abs(b[3] - y1) <= tol) - - -def _shapely_to_segments(board, coords, layer, width_mm=0.05): - pts = list(coords) - if not pts: - return 0 - if pts[0] != pts[-1]: - pts.append(pts[0]) - count = 0 - for i in range(len(pts) - 1): - seg = pcbnew.PCB_SHAPE(board) - seg.SetShape(pcbnew.SHAPE_T_SEGMENT) - seg.SetLayer(layer) - seg.SetWidth(pcbnew.FromMM(width_mm)) - seg.SetStart(pcbnew.VECTOR2I(int(pts[i][0]), int(pts[i][1]))) - seg.SetEnd (pcbnew.VECTOR2I(int(pts[i+1][0]), int(pts[i+1][1]))) - board.Add(seg) - count += 1 - return count - - -def kikitPostprocess(panel, arg): - print("=" * 60) - print("[cleanup] START") - - board = panel.board - substrate = panel.boardSubstrate - - # outer panel bbox - b = substrate.bounds() - x0, y0, x1, y1 = int(b[0]), int(b[1]), int(b[2]), int(b[3]) - print(f"[cleanup] Panel bbox: ({_mm(x0)},{_mm(y0)})–({_mm(x1)},{_mm(y1)})") - - # get substrate geometry - geom = None - for attr in ("substrates", "substrate", "_substrate", "geometry"): - if hasattr(substrate, attr): - geom = getattr(substrate, attr) - break - if geom is None: - print("[cleanup] ERROR: cannot access substrate geometry") - return - - rings = _collect_rings(geom) - print(f"[cleanup] Total rings in substrate: {len(rings)}") - - total = 0 - for i, (ring_geom, coords) in enumerate(rings): - rb = ring_geom.bounds - if _is_outer_frame(ring_geom, x0, y0, x1, y1): - print(f"[cleanup] ring[{i}] pts={len(coords)-1} → OUTER FRAME, skipped") - continue - n = _shapely_to_segments(board, coords, pcbnew.Eco1_User) - total += n - print(f"[cleanup] ring[{i}] pts={len(coords)-1}" - f" bbox=({_mm(rb[0])},{_mm(rb[1])})–({_mm(rb[2])},{_mm(rb[3])})" - f" → {n} segments on Eco1_User") - - print(f"[cleanup] Total Eco1_User segments added: {total}") - print("[cleanup] END") - print("=" * 60) \ No newline at end of file diff --git a/scripts/diagnose_pm4n.py b/scripts/diagnose_pm4n.py deleted file mode 100644 index 71ee2ec..0000000 --- a/scripts/diagnose_pm4n.py +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env python3 -"""Run this on your machine: python3 diagnose_pm4n.py Dummy.pm4n""" -import struct, sys - -path = sys.argv[1] if len(sys.argv) > 1 else 'Dummy.pm4n' -data = open(path, 'rb').read() -fsize = len(data) -print(f"File: {path} ({fsize} bytes)") -print() - -# Parse ANYCUBIC header -magic = data[0:8] -version = struct.unpack_from(' fsize: - break - off = struct.unpack_from('" - exit 1 -} - -PCB_FILE="$1" - -mkdir -p "$GERBERS_DIR" -mkdir -p "$GCODE_DIR" - -# Export drill, front and back layers as gerber files. -echo "Exporting gerbers..." -kicad-cli pcb export drill -o "$GERBERS_DIR" "$PCB_FILE" -kicad-cli pcb export gerbers -o "$GERBERS_DIR" -l Front "$PCB_FILE" -kicad-cli pcb export gerbers -o "$GERBERS_DIR" -l Back "$PCB_FILE" -kicad-cli pcb export gerbers -o "$GERBERS_DIR" -l Edge.Cuts "$PCB_FILE" - -# Export outlines of the penelized board i.e. use the layer 'User.Eco1'. -# echo "Exporting panelized outlines from layer 'User.Eco1'..." -# python3 export_panel_outlines_gerber.py \ -# --layers User.Eco1 \ -# --output "$GERBERS_DIR" \ -# "$PCB_FILE" - -# Input layers/filenames and all milling/drilling parameters are taken from the config file: 'millproject'. -echo "Exporting Gcode..." -docker run --rm -i -t \ - -u "$(id -u):$(id -g)" \ - -v "$(pwd):/data" \ - ptodorov/pcb2gcode diff --git a/scripts/export_for_msla.sh b/scripts/export_for_msla.sh deleted file mode 100755 index 07fa936..0000000 --- a/scripts/export_for_msla.sh +++ /dev/null @@ -1,148 +0,0 @@ -#!/usr/bin/env bash -# export_for_msla.sh — KiCad Gerber export + pm4n generation for Anycubic Photon Mono 4 -# -# Usage: -# ./export_for_msla.sh [OPTIONS] -# -# Options: -# --layers LAYER,LAYER,... KiCad layer names to export (default: F.Cu) -# --invert LAYER,LAYER,... Layers to invert (comma-separated) -# --mirror LAYER,LAYER,... Layers to mirror (comma-separated) -# --exposure SECONDS Exposure time in seconds (default: 60) -# --dummy FILE Dummy .pm4n template (default: Dummy.pm4n beside this script) -# --out DIR Output directory (default: ./output) -# --dpmm N Render resolution in dots/mm (default: native 58.824) -# --pos X,Y Board position on LCD in mm (default: centred) -# --verbose Print detailed progress -# -h, --help Show this help -# -# Normal output: one output filepath per layer. -# Verbose output: full progress from KiCad and the converter. -# -# Example: -# ./export_for_msla.sh --invert F.Cu,B.Mask --mirror F.Cu,F.Mask panel/board.kicad_pcb -# -# KiCad layer name → Gerber filename stem: -# F.Cu → F_Cu B.Cu → B_Cu -# F.Mask → F_Mask B.Mask → B_Mask -# F.SilkS → F_Silkscreen B.SilkS → B_Silkscreen -# F.Paste → F_Paste B.Paste → B_Paste -# Edge.Cuts → Edge_Cuts -# Front → Front Back → Back - -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PYTHON="${PYTHON:-python3}" -CONVERTER="$SCRIPT_DIR/gerber_to_pm4n.py" - -# ---- defaults ---- -LAYERS="F.Cu" -INVERT_LAYERS="" -MIRROR_LAYERS="" -EXPOSURE="60" -DUMMY="$SCRIPT_DIR/Dummy.pm4n" -OUT_DIR="./output" -DPMM="" -POS="" -VERBOSE=0 - -# ---- helpers ---- -usage() { - grep '^#' "$0" | sed 's/^# \{0,1\}//' - exit 0 -} - -log() { [[ $VERBOSE -eq 1 ]] && echo "$@" || true; } - -contains() { - local list="$1" item="$2" - echo "$list" | tr ',' '\n' | grep -qx "$item" -} - -layer_to_filename() { - case "$1" in - F.SilkS) echo "F_Silkscreen" ;; - B.SilkS) echo "B_Silkscreen" ;; - Edge.Cuts) echo "Edge_Cuts" ;; - *) echo "${1//./_}" ;; - esac -} - -# ---- parse arguments ---- -PCB_FILE="" -while [[ $# -gt 0 ]]; do - case "$1" in - --layers) LAYERS="$2"; shift 2 ;; - --invert) INVERT_LAYERS="$2"; shift 2 ;; - --mirror) MIRROR_LAYERS="$2"; shift 2 ;; - --exposure) EXPOSURE="$2"; shift 2 ;; - --dummy) DUMMY="$2"; shift 2 ;; - --out) OUT_DIR="$2"; shift 2 ;; - --dpmm) DPMM="$2"; shift 2 ;; - --pos) POS="$2"; shift 2 ;; - --verbose) VERBOSE=1; shift ;; - -h|--help) usage ;; - -*) echo "ERROR: unknown option: $1" >&2; exit 1 ;; - *) PCB_FILE="$1"; shift ;; - esac -done - -[[ -z "$PCB_FILE" ]] && { echo "ERROR: no .kicad_pcb file specified" >&2; exit 1; } -[[ ! -f "$PCB_FILE" ]] && { echo "ERROR: file not found: $PCB_FILE" >&2; exit 1; } -[[ ! -f "$DUMMY" ]] && { echo "ERROR: Dummy.pm4n not found: $DUMMY" >&2; exit 1; } - -BOARD_NAME="$(basename "$PCB_FILE" .kicad_pcb)" -GERBERS_DIR="$OUT_DIR/gerbers" -PM4N_DIR="$OUT_DIR/pm4n" -mkdir -p "$GERBERS_DIR" "$PM4N_DIR" - -# ---- Step 1: export Gerbers ---- -log "=== Exporting Gerbers ===" -log " Board: $PCB_FILE" -log " Layers: $LAYERS" - -kicad-cli pcb export gerbers \ - --output "$GERBERS_DIR" \ - --layers "$LAYERS" \ - --no-protel-ext \ - --subtract-soldermask \ - --no-netlist \ - "$PCB_FILE" \ - 2>/dev/null - -log "" - -# ---- Step 2: convert to pm4n ---- -log "=== Converting to .pm4n ===" - -IFS=',' read -ra LAYER_LIST <<< "$LAYERS" -for LAYER in "${LAYER_LIST[@]}"; do - LAYER_STEM="$(layer_to_filename "$LAYER")" - GBR_FILE="$GERBERS_DIR/${BOARD_NAME}-${LAYER_STEM}.gbr" - - if [[ ! -f "$GBR_FILE" ]]; then - echo "WARNING: Gerber not found for layer $LAYER (expected: $GBR_FILE)" >&2 - continue - fi - - OUT_PM4N="$PM4N_DIR/${BOARD_NAME}-${LAYER_STEM}.pm4n" - - FLAGS=() - contains "$INVERT_LAYERS" "$LAYER" && FLAGS+=(--invert) - contains "$MIRROR_LAYERS" "$LAYER" && FLAGS+=(--mirror) - [[ -n "$DPMM" ]] && FLAGS+=(--dpmm "$DPMM") - [[ -n "$POS" ]] && FLAGS+=(--pos "$POS") - [[ $VERBOSE -eq 1 ]] && FLAGS+=(--verbose) - - log " $LAYER → $OUT_PM4N [${FLAGS[*]:-} exposure=${EXPOSURE}s]" - - "$PYTHON" "$CONVERTER" \ - "$DUMMY" \ - "$GBR_FILE" \ - --output "$OUT_PM4N" \ - --exposure "$EXPOSURE" \ - "${FLAGS[@]}" -done - -log "=== Done ===" \ No newline at end of file diff --git a/scripts/export_panel_outlines_gerber.py b/scripts/export_panel_outlines_gerber.py deleted file mode 100755 index 9c3f38e..0000000 --- a/scripts/export_panel_outlines_gerber.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env python3 -import argparse -import os -import pcbnew - -def main(): - parser = argparse.ArgumentParser( - description="Export a single PCB layer to a Gerber file using pcbnew." - ) - parser.add_argument("input", help="Input .kicad_pcb file") - parser.add_argument("--output", "-o", required=True, help="Output directory") - parser.add_argument("--layers", "-l", required=True, - help="Layer name to export (e.g. User.Eco1)") - args = parser.parse_args() - - board = pcbnew.LoadBoard(args.input) - - # Resolve layer name to ID - layer_id = board.GetLayerID(args.layers) - if layer_id == -1: - parser.error(f"Unknown layer: {args.layers!r}. " - f"Run with a known layer name (e.g. User.Eco1, Edge.Cuts).") - - # Resolve output directory to absolute path so pcbnew doesn't make it - # relative to the board file location - output_dir = os.path.abspath(args.output) - os.makedirs(output_dir, exist_ok=True) - - prefix = args.layers.replace(".", "-") - - pc = pcbnew.PLOT_CONTROLLER(board) - po = pc.GetPlotOptions() - po.SetOutputDirectory(output_dir) - po.SetPlotFrameRef(False) - - pc.SetLayer(layer_id) - pc.OpenPlotfile(prefix, pcbnew.PLOT_FORMAT_GERBER, args.layers) - print(f"Plotting layer {args.layers!r} (id={layer_id}) to {pc.GetPlotFileName()}") - pc.PlotLayer() - pc.ClosePlot() - print("Done.") - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/scripts/gerber_to_pm4n.py b/scripts/gerber_to_pm4n.py deleted file mode 100755 index 5b33325..0000000 --- a/scripts/gerber_to_pm4n.py +++ /dev/null @@ -1,320 +0,0 @@ -#!/usr/bin/env python3 -""" -gerber_to_pm4n.py – Anycubic Photon Mono 4 PCB exposure file generator - -Usage: - python3 gerber_to_pm4n.py [options] - -Options: - -o OUTPUT Output file path [default: .pm4n] - --invert Invert the image (for positive-working resist like Bungard standard) - --mirror Mirror X axis (for copper-side-down placement on FEP) - --exposure SEC Exposure time in seconds [default: 60] - --dpmm N Render resolution in dots/mm [default: 58.824, native 17µm/px] - --pos X,Y Board position mm from top-left (default: centred) - --verbose Print detailed progress - -Photon Mono 4 specs: 9024 × 5120 px | 153.408 × 87.040 mm | 17.001 µm/px -""" - -import argparse -import struct -import sys -import io -from pathlib import Path -from PIL import Image, ImageOps - -# --------------------------------------------------------------------------- -# Printer constants -# --------------------------------------------------------------------------- -LCD_W_PX = 9024 -LCD_H_PX = 5120 -LCD_W_MM = 153.408 -LCD_H_MM = 87.040 -NATIVE_DPMM = LCD_W_PX / LCD_W_MM # 58.824 dpmm (1 px ≈ 17.001 µm) - -# --------------------------------------------------------------------------- -# pm4n / ANYCUBIC file format constants (reverse-engineered from Dummy.pm4n) -# -# File layout: -# 0x00 ANYCUBIC magic (8 bytes) -# 0x08 unknown u32 (0) -# 0x0C version u32 (0x00000206) -# 0x10 section_count u32 (5) -# 0x14 header_size u32 (0x40 = 64) -# 0x18 section table: 5 × (length:u32, offset:u32) -# entry 0: PREV preview images -# entry 1: LAYE layer definitions -# entry 2: MACH machine params -# entry 3: Mode layer image data (header + RLE blocks) -# entry 4: HEAD printer config -# -# Sections located by scanning for 4-byte tags from known offsets. -# Tags: HEAD(0x40), PREV(0xB0), LAYE(0x0126D4), MACH(0x0127F0), Mode(0x012974) -# Note: actual offsets vary per dummy file — we scan for tags. -# -# LAYE section layout (at its offset): -# +0x00 'LAYE' tag -# +0x04 'REDF' sub-tag -# +0x08 u32=0 -# +0x0C u32 payload_size -# +0x10 u32 (AA level or mode) -# +0x14 u32 composite_image_offset (absolute file offset of block 0) -# +0x18 u32 image_block_size (size of EACH block, all identical) -# +0x1C layer entries begin (N entries × 32 bytes): -# +0x00 f32 bottom_exposure -# +0x04 f32 normal_exposure ← patched with --exposure value -# +0x08 f32 lift_mm -# +0x0C f32 layer_height -# +0x10 u32 unknown -# +0x14 u32 unknown -# +0x18 u32 image_data_offset (absolute file offset for this layer) -# +0x1C u32 image_data_size (patched when RLE size changes) -# -# Mode section layout: -# +0x00 'Model\0\0\0' tag (8 bytes) -# +0x04 u32 sub-header size (108) -# +0x08..+0x2B bounding box / Z params as floats -# +0x2C 'SUBIMGS\0\0\0\0\0' sub-tag (12 bytes) -# +0x38 u32 SUBIMGS table size -# +0x3C u32 layer_count (N) -# +0x40 u32 bytes_per_pixel (1) -# +0x44 u32 first_image_offset (= composite_image_offset, same as LAYE+0x14) -# +0x48 u32 first_image_size (= image_block_size, same as LAYE+0x18) -# +0x4C u32 unknown -# then N RLE image blocks follow (at offsets stored in LAYE entries) -# --------------------------------------------------------------------------- -LAYE_TAG = b'LAYE' -MODE_TAG = b'Mode' -ENTRY_STRIDE = 0x20 # 32 bytes per layer entry -LAYE_HDR_SIZE = 0x1C # bytes before first entry within LAYE section - - -def find_tag(data: bytes, tag: bytes, start: int = 0) -> int: - """Return file offset of first occurrence of tag aligned to 4 bytes.""" - i = (start + 3) & ~3 - while i + 4 <= len(data): - if data[i:i+4] == tag: - return i - i += 4 - pos = data.find(tag, start) - if pos < 0: - raise ValueError(f"Tag {tag!r} not found in file") - return pos - - -def count_laye_entries(data: bytes, laye_off: int) -> int: - """Count layer entries by scanning until EXTR tag or implausible float.""" - entry_start = laye_off + LAYE_HDR_SIZE - n = 0 - while True: - pos = entry_start + n * ENTRY_STRIDE - if pos + 4 > len(data): - break - word = data[pos:pos+4] - if word in (b'EXTR', b'MACH', b'Mode', b'HEAD', b'PREV', b'LAYE'): - break - v = struct.unpack_from(' int: - return struct.unpack_from(' bytes: - out = bytearray() - i, n = 0, len(pixels) - while i < n: - colour = pixels[i] - nibble = 0xF if colour >= 0x80 else 0x0 - j = i + 1 - while j < n and pixels[j] == colour and (j - i) < MAX_RUN: - j += 1 - run = j - i - enc = run - 1 - out.append((nibble << 4) | ((enc >> 8) & 0x0F)) - out.append(enc & 0xFF) - i = j - return bytes(out) - - -# --------------------------------------------------------------------------- -# Gerber → PIL Image at LCD resolution -# --------------------------------------------------------------------------- - -def render_gerber(gbr_path: Path, dpmm: float, - invert: bool, mirror: bool, - pos_mm: tuple | None, - verbose: bool = False) -> Image.Image: - try: - from pygerber.gerberx3.api.v2 import ( - GerberFile, ColorScheme, PixelFormatEnum, ImageFormatEnum - ) - except ImportError: - sys.exit( - "ERROR: pygerber not found.\n" - "Activate the venv: source .venv/bin/activate\n" - "Or install: pip install pygerber Pillow" - ) - - buf = io.BytesIO() - GerberFile.from_file(str(gbr_path)).parse().render_raster( - buf, - dpmm=int(round(dpmm)), - color_scheme=ColorScheme.DEFAULT_GRAYSCALE, - pixel_format=PixelFormatEnum.RGB, - image_format=ImageFormatEnum.PNG, - ) - buf.seek(0) - layer_img = Image.open(buf).convert('L') - - cw, ch = layer_img.size - canvas = Image.new('L', (LCD_W_PX, LCD_H_PX), 0) - - if pos_mm is not None: - px = max(0, int(round(pos_mm[0] * dpmm))) - py = max(0, int(round(pos_mm[1] * dpmm))) - else: - px = (LCD_W_PX - cw) // 2 - py = (LCD_H_PX - ch) // 2 - - canvas.paste(layer_img, (px, py)) - - if mirror: - canvas = ImageOps.mirror(canvas) - if invert: - canvas = ImageOps.invert(canvas) - - canvas = canvas.point(lambda v: 255 if v >= 128 else 0) - - if verbose: - print(f" Gerber rendered: {layer_img.size[0]}×{layer_img.size[1]} px" - f" placed at ({px},{py}) invert={invert} mirror={mirror}") - - return canvas - - -# --------------------------------------------------------------------------- -# pm4n surgery -# --------------------------------------------------------------------------- - -def patch_pm4n(dummy_path: Path, image: Image.Image, - exposure_sec: float, output_path: Path, - verbose: bool = False): - - def log(*a): - if verbose: - print(*a) - - raw = bytearray(dummy_path.read_bytes()) - - new_rle = encode_rle(image.convert('L').tobytes()) - new_rle_size = len(new_rle) - - laye_off = find_tag(raw, LAYE_TAG) - n_entries = count_laye_entries(raw, laye_off) - log(f" LAYE at 0x{laye_off:06X}, {n_entries} layer entries") - - composite_off = unpack_u32(raw, laye_off + 0x14) - old_block_size = unpack_u32(raw, laye_off + 0x18) - log(f" Image blocks: first=0x{composite_off:06X}, " - f"old_size={old_block_size}, new_size={new_rle_size}") - - # Patch exposure in all entries - for i in range(n_entries): - base = laye_off + LAYE_HDR_SIZE + i * ENTRY_STRIDE - struct.pack_into(' tol and v2.Length > tol: - v1.normalize() - v2.normalize() - if abs(v1.dot(v2) + 1.0) < 1e-4: - lines.pop(j) - lines.pop(i) - lines.append((other1, other2)) - merged = True - break - if merged: break - return lines - -def optimize_toolpath_order(lines): - if not lines: return [] - - # Phase 1: Build continuous chains (Polylines) - unvisited = lines.copy() - chains = [] - tol = 1e-3 - - while unvisited: - current_chain = [unvisited.pop(0)] - growing = True - - while growing: - growing = False - chain_start = current_chain[0][0] - chain_end = current_chain[-1][1] - - for i, line in enumerate(unvisited): - l_start, l_end = line[0], line[1] - - if (l_start - chain_end).Length < tol: - current_chain.append(unvisited.pop(i)) - growing = True; break - elif (l_end - chain_end).Length < tol: - current_chain.append((l_end, l_start)) # Flip - unvisited.pop(i) - growing = True; break - elif (l_end - chain_start).Length < tol: - current_chain.insert(0, unvisited.pop(i)) - growing = True; break - elif (l_start - chain_start).Length < tol: - current_chain.insert(0, (l_end, l_start)) # Flip - unvisited.pop(i) - growing = True; break - - chains.append(current_chain) - - # Phase 2: Traveling Salesperson between chains - unvisited_chains = chains.copy() - optimized_lines = [] - - # Start with the chain closest to global Origin (0,0,0) - start_idx = 0 - best_origin_dist = float('inf') - for i, chain in enumerate(unvisited_chains): - d1 = chain[0][0].Length - d2 = chain[-1][1].Length - if min(d1, d2) < best_origin_dist: - best_origin_dist = min(d1, d2) - start_idx = i - - current_chain = unvisited_chains.pop(start_idx) - # Ensure it starts at the point closer to origin - if current_chain[-1][1].Length < current_chain[0][0].Length: - current_chain.reverse() - current_chain = [(l[1], l[0]) for l in current_chain] - - optimized_lines.extend(current_chain) - current_pos = current_chain[-1][1] # Position after cutting first chain - - while unvisited_chains: - best_dist = float('inf') - best_idx = -1 - reverse_chain = False - - for i, chain in enumerate(unvisited_chains): - c_start = chain[0][0] - c_end = chain[-1][1] - - dist_to_start = (c_start - current_pos).Length - dist_to_end = (c_end - current_pos).Length - - if dist_to_start < best_dist: - best_dist = dist_to_start - best_idx = i - reverse_chain = False - - if dist_to_end < best_dist: - best_dist = dist_to_end - best_idx = i - reverse_chain = True - - next_chain = unvisited_chains.pop(best_idx) - - if reverse_chain: - next_chain.reverse() - next_chain = [(l[1], l[0]) for l in next_chain] - - optimized_lines.extend(next_chain) - current_pos = next_chain[-1][1] - - return optimized_lines - -def show_message(title, message): - msg = QMessageBox() - msg.setIcon(QMessageBox.Information) - msg.setWindowTitle(title) - msg.setText(message) - try: - msg.exec() - except AttributeError: - msg.exec_() - -def process_sketch(): - sketch = prepare_working_sketch() - if not sketch: - App.Console.PrintError("Could not find a sketch. Select one in the tree view and run.\n") - return - - geo = sketch.Geometry - - # --- STEP 1: IDENTIFY MICRO-SEGMENTS TO INFER ARC DATA --- - graph = {} - pt_dict = {} - def get_pt_key(pt): return (round(pt.x, 3), round(pt.y, 3)) - - for i, g in enumerate(geo): - if isinstance(g, Part.LineSegment) and not sketch.GeometryFacadeList[i].Construction: - if (g.EndPoint - g.StartPoint).Length < MAX_SEGMENT_LENGTH: - k1 = get_pt_key(g.StartPoint) - k2 = get_pt_key(g.EndPoint) - - if k1 not in graph: graph[k1] = [] - if k2 not in graph: graph[k2] = [] - - graph[k1].append((k2, i)) - graph[k2].append((k1, i)) - - pt_dict[k1] = g.StartPoint - pt_dict[k2] = g.EndPoint - - paths = [] - visited_edges = set() - - for node, edges in graph.items(): - if len(edges) == 1: - first_edge = edges[0][1] - if first_edge in visited_edges: continue - - path_nodes = [node] - curr = node; prev = None - - while True: - neighbors = graph[curr] - next_node = None; next_idx = None - for n, idx in neighbors: - if n != prev: - next_node = n; next_idx = idx - break - if next_node is None: break - path_nodes.append(next_node) - visited_edges.add(next_idx) - if len(graph[next_node]) > 2: break - prev = curr; curr = next_node - - if len(path_nodes) >= 3: - paths.append(path_nodes) - - # --- STEP 2: CALCULATE TRUE ARC CENTERS & DIRECTIONS --- - arc_data = [] - - for path_nodes in paths: - p1 = pt_dict[path_nodes[0]] - p2 = pt_dict[path_nodes[len(path_nodes)//2]] - p3 = pt_dict[path_nodes[-1]] - - center, radius = get_circumcenter(p1, p2, p3) - if center: - v1 = p1 - center - v3 = p3 - center - if v1.Length > 1e-4 and v3.Length > 1e-4: - dot = max(-1.0, min(1.0, v1.dot(v3) / (v1.Length * v3.Length))) - angle = math.acos(dot) - if angle > 2.0: - chord = p3 - p1 - perp = App.Vector(-chord.y, chord.x, 0) - if perp.Length > 1e-6: - perp.normalize() - if perp.dot(center - p2) < 0: perp = -perp - arc_data.append((center, perp)) - - # Existing native Arcs - for i, g in enumerate(geo): - if isinstance(g, Part.ArcOfCircle) and not sketch.GeometryFacadeList[i].Construction: - p1 = g.StartPoint - p3 = g.EndPoint - center = g.Center - v1 = p1 - center - v3 = p3 - center - if v1.Length > 1e-4 and v3.Length > 1e-4: - dot = max(-1.0, min(1.0, v1.dot(v3) / (v1.Length * v3.Length))) - angle = math.acos(dot) - if angle > 2.0: - chord = p3 - p1 - perp = App.Vector(-chord.y, chord.x, 0) - if perp.Length > 1e-6: - perp.normalize() - mid_u = (g.FirstParameter + g.LastParameter) / 2.0 - p2 = g.value(mid_u) - if perp.dot(center - p2) < 0: perp = -perp - arc_data.append((center, perp)) - - # --- STEP 3: WIPE THE SKETCH CLEAN --- - for i in range(sketch.ConstraintCount - 1, -1, -1): - sketch.delConstraint(i) - for i in range(sketch.GeometryCount - 1, -1, -1): - sketch.delGeometry(i) - - # --- STEP 4: CALCULATE TOOLPATHS --- - raw_lines = [] - - for i, (c1, dir1) in enumerate(arc_data): - min_t = float('inf') - best_stop = None - - for j, (c2, dir2) in enumerate(arc_data): - if i == j: continue - cross = dir1.x * dir2.y - dir1.y * dir2.x - - if abs(cross) < 1e-4: - vec = c2 - c1 - dist_cross = vec.x * dir1.y - vec.y * dir1.x - if abs(dist_cross) < 1e-2: - t1 = vec.dot(dir1) - t2 = (-vec).dot(dir2) - if t1 > 1e-2 and t2 > 1e-2: - if t1 < min_t: - min_t = t1 - best_stop = c2 - else: - dx = c2.x - c1.x - dy = c2.y - c1.y - t1 = (dx * dir2.y - dy * dir2.x) / cross - t2 = (dx * dir1.y - dy * dir1.x) / cross - if t1 > 1e-2 and t2 > -1e-2: - if t1 < min_t: - min_t = t1 - best_stop = c1 + dir1 * t1 - - if best_stop is not None: - if (c1 - best_stop).Length > 1e-3: - pts = sorted([(round(c1.x, 3), round(c1.y, 3)), (round(best_stop.x, 3), round(best_stop.y, 3))]) - pA = App.Vector(pts[0][0], pts[0][1], 0) - pB = App.Vector(pts[1][0], pts[1][1], 0) - if not any((l[0]-pA).Length < 1e-3 and (l[1]-pB).Length < 1e-3 for l in raw_lines): - raw_lines.append((pA, pB)) - - # --- STEP 5: MERGE AND OPTIMIZE PATHS FOR CNC --- - merged_lines = merge_collinear_lines(raw_lines) - optimized_lines = optimize_toolpath_order(merged_lines) - - # Draw the final optimized lines sequentially - for pA, pB in optimized_lines: - sketch.addGeometry(Part.LineSegment(pA, pB), False) - - App.ActiveDocument.recompute() - App.Console.PrintMessage(f"Skeletonizer successful: Created '{sketch.Label}'.\n") - show_message("CAM Toolpath Complete", f"Successfully generated continuous, optimized CNC toolpaths in:\n\n{sketch.Label}") - -# Run it -process_sketch() diff --git a/scripts/millproject b/scripts/millproject deleted file mode 100644 index bb16877..0000000 --- a/scripts/millproject +++ /dev/null @@ -1,55 +0,0 @@ -front=output/gerbers/Flow_Controller_Panel-Front.gtl -back=output/gerbers/Flow_Controller_Panel-Back.gbl -drill=output/gerbers/Flow_Controller_Panel.drl -outline=output/gerbers/Flow_Controller_Panel-Edge_Cuts.gm1 - -# Use the 'User-Eco1' layer instead as it contains panelized board's slot outlines only. -#outline=output/gerbers/Flow_Controller_Panel-User-Eco1.gbr - -# Generic -metric=true # use metric units for parameters -metricoutput=true # use metric units for output -nog64=true # do not set an explicit g64 -#nom6=true # do not emit m6 -zsafe=2 # The height in mm at which the bit can move freely without obstruction -zchange=35 # Tool changing height in mm -output-dir=output/gcode - -# Place a 5x7cm board in the lower right quadrant of the coordinate system -# This will allow you to probe the fixed jaw of the vise for (0,0) on the CNC. - -# For two-sided boards, the PCB needs to be flipped along the axis x=VALUE -mirror-axis=80 # set this to half of your board width - -# Drilling -zdrill=-2.2 # drilling depth -drill-feed=400 # Vertical mm/min feed -drill-speed=24000 # Spindle RPM -#onedrill=true # Use a single drill for all holes -nog81=true # replace G81 with G0+G1 (no G81 in GRBL) -drill-side=back - -# Milling -zwork=-0.1 # V-bit plunge depth -#mill-diameters=0.11 # 60 deg V-bit dia at -0.1 plunge depth -#mill-diameters=0.08 # 45 deg V-bit dia at -0.1 plunge depth -mill-diameters=0.05 # 30 deg V-bit dia at -0.1 plunge depth -mill-speed=24000 # Spindle RPM -mill-feed=600 # Horizontal feedrate in mm/min -mill-vertfeed=100 # Plunge rate in mm/min -voronoi=true # cuts the milling time significantly, but check with this on and off if everything looks ok -preserve-thermal-reliefs = true # has effect only if voronoi=true - -# Cutting -zcut=-4 -cutter-diameter=2.1 -cut-feed=400 -cut-vertfeed=50 -cut-infeed=4 -cut-speed=24000 -cut-side=back - -# Tabs -#bridgesnum=4 # Total 4 tabs -#bridges=0.5 # Tab width 0.5 mm -#zbridges=0 # bridges height (default to zsafe) diff --git a/scripts/myPreset.json b/scripts/myPreset.json deleted file mode 100644 index c9eb428..0000000 --- a/scripts/myPreset.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "layout": { - "type": "grid", - "rows": 1, - "cols": 2, - "hspace": "2.1mm", - "vspace": "2.1mm" - }, - "tabs": { - "type": "fixed", - "hcount": 1, - "vcount": 1, - "hwidth": "3mm", - "vwidth": "3mm" - }, - "cuts": { - "type": "mousebites", - "offset": "0.2mm", - "prolong": "0.7mm", - "drill": "0.5mm", - "spacing": "0.8mm" - }, - "framing": { - "type": "tightframe", - "copperFill": true, - "slotwidth": "2.1mm", - "mintotalheight": "87mm", - "mintotalwidth": "153.4mm", - "maxtotalheight": "87mm", - "maxtotalwidth": "153.4mm" - }, - "tooling": { - "type": "3hole", - "layout": "3hole", - "hoffset": "6mm", - "voffset": "6mm", - "size": "2mm", - "paste": true, - "soldermaskmargin": "0mm" - }, - "text": { - "type": "simple", - "text": "Front", - "anchor": "mt", - "hoffset": "0mm", - "voffset": "10mm", - "orientation": "0deg", - "width": "3.5mm", - "height": "3.5mm", - "hjustify": "center", - "vjustify": "center", - "thickness": "0.3mm", - "layer": "F.SilkS" - }, - "text2": { - "type": "simple", - "text": "Back", - "anchor": "mt", - "hoffset": "0mm", - "voffset": "10mm", - "orientation": "0deg", - "width": "3.5mm", - "height": "3.5mm", - "hjustify": "center", - "vjustify": "center", - "thickness": "0.3mm", - "layer": "B.SilkS" - }, - "copperfill": { - "type": "solid", - "clearance": "0.5mm", - "edgeclearance": "0.5mm", - "layers": "F.Cu,B.Cu" - }, - "post": { - "type": "auto", - "copperfill": false, - "reconstructarcs": false, - "millradius": "1mm", - "millradiusouter": "0mm", - "script": "cleanup.py", - "scriptarg": "", - "origin": "tl", - "refillzones": false, - "dimensions": true, - "edgewidth": "0.1mm" - }, - "page": { - "type": "inherit", - "anchor": "tl", - "posx": "0mm", - "posy": "0mm", - "width": "1000mm", - "height": "1000mm" - }, - "debug": { - "type": "none", - "drawPartitionLines": false, - "drawBackboneLines": false, - "drawboxes": false, - "trace": false, - "deterministic": false, - "drawtabfail": false, - "drawTabFillet": false - } -} diff --git a/scripts/tooling_plugin.py b/scripts/tooling_plugin.py deleted file mode 100644 index b9cd6eb..0000000 --- a/scripts/tooling_plugin.py +++ /dev/null @@ -1,131 +0,0 @@ -from kikit.plugin import ToolingPlugin -import pcbnew - -class CustomTooling(ToolingPlugin): - def buildTooling(self, panel): - board = panel.board - - # panelBBox() -> (xmin, ymin, xmax, ymax) - xmin, ymin, xmax, ymax = panel.panelBBox() - - min_x = pcbnew.ToMM(xmin) - min_y = pcbnew.ToMM(ymin) - max_x = pcbnew.ToMM(xmax) - max_y = pcbnew.ToMM(ymax) - - margin_x_mm = 10 - margin_y_mm = 2.5 - - center_x = (min_x + max_x) / 2 - center_y = (min_y + max_y) / 2 - - holes = [ - (min_x + margin_x_mm, min_y + margin_y_mm), # top left - (center_x, min_y + margin_y_mm), # top center - (max_x - margin_x_mm, min_y + margin_y_mm), # top right - - (min_x + margin_x_mm, max_y - margin_y_mm), # bottom left - (center_x, max_y - margin_y_mm), # bottom center - (max_x - margin_x_mm, max_y - margin_y_mm), # bottom right - ] - - hole_d = pcbnew.FromMM(3.172) - - for x_mm, y_mm in holes: - fp = pcbnew.FOOTPRINT(board) - fp.SetReference("") - - pos = pcbnew.VECTOR2I( - pcbnew.FromMM(x_mm), - pcbnew.FromMM(y_mm) - ) - - fp.SetPosition(pos) - - pad = pcbnew.PAD(fp) - pad.SetShape(pcbnew.PAD_SHAPE_CIRCLE) - pad.SetAttribute(pcbnew.PAD_ATTRIB_NPTH) - - pad.SetSize(pcbnew.VECTOR2I(hole_d, hole_d)) - pad.SetDrillSize(pcbnew.VECTOR2I(hole_d, hole_d)) - pad.SetPosition(pos) - - fp.Add(pad) - board.Add(fp) - - # ========================= - # SCREEN RECTANGLE - # ========================= - - screen_w = 153.4 - screen_h = 87.0 - - # Panel center - center_x = (min_x + max_x) / 2 - center_y = (min_y + max_y) / 2 - - # Screen rectangle corners - screen_x0 = center_x - (screen_w / 2) - screen_y0 = center_y - (screen_h / 2) - - screen_x1 = center_x + (screen_w / 2) - screen_y1 = center_y + (screen_h / 2) - - screen = pcbnew.PCB_SHAPE(board) - screen.SetShape(pcbnew.SHAPE_T_RECT) - screen.SetLayer(pcbnew.Dwgs_User) - - screen.SetStart( - pcbnew.VECTOR2I( - pcbnew.FromMM(screen_x0), - pcbnew.FromMM(screen_y0) - ) - ) - - screen.SetEnd( - pcbnew.VECTOR2I( - pcbnew.FromMM(screen_x1), - pcbnew.FromMM(screen_y1) - ) - ) - - screen.SetWidth(pcbnew.FromMM(0.2)) - - board.Add(screen) - - # ========================= - # FIXTURE RECTANGLE - # ========================= - - fixture_w = 200.0 - fixture_h = 130.0 - - # Fixture rectangle corners - fixture_x0 = center_x - (fixture_w / 2) - fixture_y0 = center_y - (fixture_h / 2) - - fixture_x1 = center_x + (fixture_w / 2) - fixture_y1 = center_y + (fixture_h / 2) - - fixture = pcbnew.PCB_SHAPE(board) - fixture.SetShape(pcbnew.SHAPE_T_RECT) - fixture.SetLayer(pcbnew.Dwgs_User) - - fixture.SetStart( - pcbnew.VECTOR2I( - pcbnew.FromMM(fixture_x0), - pcbnew.FromMM(fixture_y0) - ) - ) - - fixture.SetEnd( - pcbnew.VECTOR2I( - pcbnew.FromMM(fixture_x1), - pcbnew.FromMM(fixture_y1) - ) - ) - - fixture.SetWidth(pcbnew.FromMM(0.2)) - - board.Add(fixture) -