Add code and dialog to create/add/remove teardrops, step 1
|
@ -625,6 +625,9 @@ set( BMAPS_OTHER
|
|||
stroke_dashdotdot
|
||||
stroke_dot
|
||||
stroke_solid
|
||||
teardrop_sizes
|
||||
teardrop_rect_sizes
|
||||
teardrop_track_sizes
|
||||
tune_diff_pair_length_legend
|
||||
tune_diff_pair_skew_legend
|
||||
tune_single_track_length_legend
|
||||
|
|
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 5.4 KiB |
After Width: | Height: | Size: 5.4 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 3.8 KiB |
|
@ -0,0 +1,418 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
id="Слой_1"
|
||||
data-name="Слой 1"
|
||||
viewBox="0 0 220 88"
|
||||
version="1.1"
|
||||
sodipodi:docname="teardrop_rect_sizes.svg"
|
||||
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
|
||||
width="220"
|
||||
height="88"
|
||||
inkscape:export-filename="E:\kicad-launchpad\teardrop\bitmaps_png\png\teardrop_rect_sizes.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96">
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1540"
|
||||
inkscape:window-height="964"
|
||||
id="namedview30"
|
||||
showgrid="true"
|
||||
inkscape:zoom="25.34527"
|
||||
inkscape:cx="128.57922"
|
||||
inkscape:cy="48.270074"
|
||||
inkscape:window-x="232"
|
||||
inkscape:window-y="134"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="Слой_1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid_kicad"
|
||||
spacingx="0.5"
|
||||
spacingy="0.5"
|
||||
color="#9999ff"
|
||||
opacity="0.13"
|
||||
empspacing="2" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata43">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title>add_via</dc:title>
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#Attribution" />
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs115772">
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Send"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Send"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path863" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="marker2082"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow2Mend"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="scale(-0.6)"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="path2080" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="marker1866"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow2Mstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="scale(0.6)"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="path1864" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Lend"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lend"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(-0.8,0,0,-0.8,-10,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path851" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Tail"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Tail"
|
||||
inkscape:isstock="true">
|
||||
<g
|
||||
transform="scale(-1.2)"
|
||||
id="g896"
|
||||
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1">
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M -3.8048674,-3.9585227 0.54352094,0"
|
||||
id="path884" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M -1.2866832,-3.9585227 3.0617053,0"
|
||||
id="path886" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M 1.3053582,-3.9585227 5.6537466,0"
|
||||
id="path888" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M -3.8048674,4.1775838 0.54352094,0.21974226"
|
||||
id="path890" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M -1.2866832,4.1775838 3.0617053,0.21974226"
|
||||
id="path892" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M 1.3053582,4.1775838 5.6537466,0.21974226"
|
||||
id="path894" />
|
||||
</g>
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow2Mend"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow2Mend"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="scale(-0.6)"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="path875" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow2Sstart"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow2Sstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.3,0,0,0.3,-0.69,0)"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="path878" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Sstart"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Sstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.2,0,0,0.2,1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path860" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Mstart"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Mstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.4,0,0,0.4,4,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path854" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Lstart"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path848" />
|
||||
</marker>
|
||||
<style
|
||||
id="style115770">.cls-1{fill:#f29100;}.cls-2{fill:#b9b9b9;}</style>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Sstart-8"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Sstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.2,0,0,0.2,1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path860-9" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Send-0"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Send"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path863-8" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Sstart-9"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Sstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.2,0,0,0.2,1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path860-5" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Send-7"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Send"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path863-9" />
|
||||
</marker>
|
||||
</defs>
|
||||
<title
|
||||
id="title115774">add_via</title>
|
||||
<path
|
||||
style="fill:#84bb00;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 73,28.091225 120.02042,38.091226 73,48.091225"
|
||||
id="path15" />
|
||||
<path
|
||||
style="fill:none;stroke:#0000ea;stroke-width:0.932996;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Sstart);marker-end:url(#Arrow1Send)"
|
||||
d="M 24,28.5 V 48"
|
||||
id="path2066" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:26.7136px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ea;fill-opacity:1;stroke:#0000d8;stroke-width:0.410486;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="-0.12805457"
|
||||
y="48.483246"
|
||||
id="text2758"
|
||||
transform="scale(1.0422745,0.95944016)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan2756"
|
||||
x="-0.12805457"
|
||||
y="48.483246"
|
||||
style="font-size:26.7136px;fill:#0000ea;fill-opacity:1;stroke:#0000d8;stroke-width:0.410486;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">d</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#0000e6;stroke-width:1.0378;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 149,28.091225 H 73 v 0"
|
||||
id="path842-2" />
|
||||
<path
|
||||
style="fill:#0000ea;fill-opacity:1;stroke:#0000ea;stroke-width:1.0378;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 149,48.091225 H 73 v 0"
|
||||
id="path842-2-5" />
|
||||
<path
|
||||
style="fill:#a10000;fill-opacity:1;stroke:#a10000;stroke-width:7.57556;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 104,38 c 21.90787,0 33.7912,0 37.5,0"
|
||||
id="path2800"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:export-filename="E:\kicad-launchpad\teardrop\bitmaps_png\png\path2800.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:18.7478px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ef;fill-opacity:1;stroke:#0000d8;stroke-width:0.384113;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="142.04674"
|
||||
y="47.33836"
|
||||
id="text2804"
|
||||
transform="scale(1.0683649,0.93600979)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan2802"
|
||||
x="142.04674"
|
||||
y="47.33836"
|
||||
style="font-size:18.7478px;fill:#0000ef;fill-opacity:1;stroke:#0000d8;stroke-width:0.384113;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Height</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:17.2336px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#a10000;fill-opacity:1;stroke:#a10000;stroke-width:0.35309;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="61.532738"
|
||||
y="75.214935"
|
||||
id="text2808"
|
||||
transform="scale(1.0102575,0.98984664)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan2806"
|
||||
x="61.532738"
|
||||
y="75.214935"
|
||||
style="font-size:17.2336px;fill:#a10000;fill-opacity:1;stroke:#a10000;stroke-width:0.35309;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Lenght</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#9e0000;stroke-width:0.673085;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 73,39.212035 v 19.87919 0"
|
||||
id="path2810" />
|
||||
<path
|
||||
style="fill:none;stroke:#a10000;stroke-width:0.675133;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 108,40 V 59.091225"
|
||||
id="path2812" />
|
||||
<path
|
||||
style="fill:none;stroke:#0000ea;stroke-width:0.931666;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Sstart-8);marker-end:url(#Arrow1Send-0)"
|
||||
d="M 147,29.5 V 47"
|
||||
id="path2066-3" />
|
||||
<rect
|
||||
style="fill:#a10000;stroke:#a10000;stroke-width:0.494286;stroke-linecap:round;paint-order:fill markers stroke"
|
||||
id="rect979"
|
||||
width="43"
|
||||
height="22"
|
||||
x="30"
|
||||
y="27.091225" />
|
||||
<path
|
||||
style="fill:#0000cb;fill-opacity:1;stroke:#0000ea;stroke-width:0.944882;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 30,27.091225 h -8.948381 v 0"
|
||||
id="path842" />
|
||||
<path
|
||||
style="fill:none;stroke:#0000ea;stroke-width:0.944882;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 30,49.091225 H 21.051619"
|
||||
id="path844" />
|
||||
<path
|
||||
style="fill:#0000cb;fill-opacity:1;stroke:#0000cb;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 30,27.091225 c 0,-5 0,-5 0,-5 v 0"
|
||||
id="path64" />
|
||||
<path
|
||||
style="fill:#0000cb;fill-opacity:1;stroke:#0000cb;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 73.223192,26.591225 c 0,-5 0,-5 0,-5 v 0"
|
||||
id="path64-3" />
|
||||
<path
|
||||
style="fill:none;stroke:#0000ea;stroke-width:1.0129;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Sstart-9);marker-end:url(#Arrow1Send-7)"
|
||||
d="M 32,23.091225 H 71.5"
|
||||
id="path2066-2" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:11.3472px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ea;fill-opacity:1;stroke:#0000ea;stroke-width:0.303942;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="49.187962"
|
||||
y="20.724293"
|
||||
id="text1299"
|
||||
transform="scale(1.0136068,0.98657586)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan1297"
|
||||
x="49.187962"
|
||||
y="20.724293"
|
||||
style="font-size:11.3472px;stroke-width:0.303942;stroke-miterlimit:4;stroke-dasharray:none">L</tspan></text>
|
||||
</svg>
|
After Width: | Height: | Size: 17 KiB |
|
@ -0,0 +1,374 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
id="Слой_1"
|
||||
data-name="Слой 1"
|
||||
viewBox="0 0 220 88"
|
||||
version="1.1"
|
||||
sodipodi:docname="teardrop_sizes.svg"
|
||||
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
|
||||
width="220"
|
||||
height="88"
|
||||
inkscape:export-filename="E:\kicad-launchpad\teardrop\bitmaps_png\png\teardrop_sizes.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96">
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1540"
|
||||
inkscape:window-height="1040"
|
||||
id="namedview30"
|
||||
showgrid="true"
|
||||
inkscape:zoom="3.1454546"
|
||||
inkscape:cx="114.54299"
|
||||
inkscape:cy="85.991796"
|
||||
inkscape:window-x="306"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="Слой_1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid_kicad"
|
||||
spacingx="0.5"
|
||||
spacingy="0.5"
|
||||
color="#9999ff"
|
||||
opacity="0.13"
|
||||
empspacing="2" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata43">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title>add_arc</dc:title>
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#Attribution" />
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs115772">
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Send"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Send"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path863" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="marker2082"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow2Mend"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="scale(-0.6)"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="path2080" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="marker1866"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow2Mstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="scale(0.6)"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="path1864" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Lend"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lend"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(-0.8,0,0,-0.8,-10,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path851" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Tail"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Tail"
|
||||
inkscape:isstock="true">
|
||||
<g
|
||||
transform="scale(-1.2)"
|
||||
id="g896"
|
||||
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1">
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M -3.8048674,-3.9585227 0.54352094,0"
|
||||
id="path884" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M -1.2866832,-3.9585227 3.0617053,0"
|
||||
id="path886" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M 1.3053582,-3.9585227 5.6537466,0"
|
||||
id="path888" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M -3.8048674,4.1775838 0.54352094,0.21974226"
|
||||
id="path890" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M -1.2866832,4.1775838 3.0617053,0.21974226"
|
||||
id="path892" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M 1.3053582,4.1775838 5.6537466,0.21974226"
|
||||
id="path894" />
|
||||
</g>
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow2Mend"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow2Mend"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="scale(-0.6)"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="path875" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow2Sstart"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow2Sstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.3,0,0,0.3,-0.69,0)"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="path878" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Sstart"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Sstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.2,0,0,0.2,1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path860" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Mstart"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Mstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.4,0,0,0.4,4,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path854" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Lstart"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path848" />
|
||||
</marker>
|
||||
<style
|
||||
id="style115770">.cls-1{fill:#f29100;}.cls-2{fill:#b9b9b9;}</style>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Sstart-8"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Sstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.2,0,0,0.2,1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path860-9" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Send-0"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Send"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path863-8" />
|
||||
</marker>
|
||||
</defs>
|
||||
<title
|
||||
id="title115774">add_via</title>
|
||||
<path
|
||||
style="fill:#a10000;fill-opacity:1;stroke:#a10000;stroke-width:8.66228px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 95,36.673727 h 44"
|
||||
id="path2800" />
|
||||
<path
|
||||
style="fill:#84bb00;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 66,17.5 40,14.834766 V 41 L 66,55.5"
|
||||
id="path15"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
<g
|
||||
id="g13"
|
||||
transform="matrix(3.4281308,0,0,3.4106992,10.488631,-4.4654968)">
|
||||
<circle
|
||||
class="cls-1"
|
||||
cx="12"
|
||||
cy="12"
|
||||
r="7"
|
||||
id="circle115776" />
|
||||
<circle
|
||||
class="cls-2"
|
||||
cx="12"
|
||||
cy="12"
|
||||
id="circle115778"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke-width:1"
|
||||
r="3" />
|
||||
</g>
|
||||
<path
|
||||
style="fill:#0000cb;fill-opacity:1;stroke:#0000ea;stroke-width:0.910071;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 51.233231,12.798833 H 17.380055 v 0"
|
||||
id="path842" />
|
||||
<path
|
||||
style="fill:none;stroke:#0000ea;stroke-width:0.910071;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 51.233231,60.548622 H 17.380055"
|
||||
id="path844" />
|
||||
<path
|
||||
style="fill:none;stroke:#0000ea;stroke-width:0.896951;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Sstart);marker-end:url(#Arrow1Send)"
|
||||
d="M 20.380055,14.298833 V 58.759999"
|
||||
id="path2066" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:24.7884px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ea;fill-opacity:1;stroke:#0000d8;stroke-width:0.380903;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="3.3195524"
|
||||
y="50.654839"
|
||||
id="text2758"
|
||||
transform="scale(1.0520519,0.95052344)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan2756"
|
||||
x="3.3195524"
|
||||
y="50.654839"
|
||||
style="font-size:24.7884px;fill:#0000ea;fill-opacity:1;stroke:#0000d8;stroke-width:0.380903;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">d</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#0000e6;stroke-width:1.02433;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 146.62611,18 C 120.08407,18 93.542037,18 67,18"
|
||||
id="path842-2"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#0000ea;fill-opacity:1;stroke:#0000ea;stroke-width:1.03271;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 148,56 H 65.659821 v 0"
|
||||
id="path842-2-5" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:18.3391px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ef;fill-opacity:1;stroke:#0000d8;stroke-width:0.375739;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="144.81419"
|
||||
y="44.88063"
|
||||
id="text2804"
|
||||
transform="scale(1.0273491,0.97337897)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan2802"
|
||||
x="144.81419"
|
||||
y="44.88063"
|
||||
style="font-size:18.3391px;fill:#0000ef;fill-opacity:1;stroke:#0000d8;stroke-width:0.375739;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Height</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:18.1335px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#a10000;fill-opacity:1;stroke:#a10000;stroke-width:0.371526;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="55.345146"
|
||||
y="88.484619"
|
||||
id="text2808"
|
||||
transform="scale(1.0779659,0.92767313)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan2806"
|
||||
x="55.345146"
|
||||
y="88.484619"
|
||||
style="font-size:18.1335px;fill:#a10000;fill-opacity:1;stroke:#a10000;stroke-width:0.371526;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Lenght</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#9e0000;stroke-width:0.785628;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 76,36 v 30.677512 0"
|
||||
id="path2810" />
|
||||
<path
|
||||
style="fill:none;stroke:#a10000;stroke-width:0.795237;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 106,36 V 66.003785"
|
||||
id="path2812" />
|
||||
<path
|
||||
style="fill:none;stroke:#0000ea;stroke-width:0.806106;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Sstart-8);marker-end:url(#Arrow1Send-0)"
|
||||
d="M 144,19.089058 V 55"
|
||||
id="path2066-3" />
|
||||
</svg>
|
After Width: | Height: | Size: 14 KiB |
|
@ -0,0 +1,390 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
id="Слой_1"
|
||||
data-name="Слой 1"
|
||||
viewBox="0 0 220 88"
|
||||
version="1.1"
|
||||
sodipodi:docname="teardrop_track_sizes.svg"
|
||||
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
|
||||
width="220"
|
||||
height="88"
|
||||
inkscape:export-filename="E:\kicad-launchpad\teardrop\bitmaps_png\png\teardrop_track_sizes.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96">
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1904"
|
||||
inkscape:window-height="1001"
|
||||
id="namedview30"
|
||||
showgrid="true"
|
||||
inkscape:zoom="2.2402266"
|
||||
inkscape:cx="32.7838"
|
||||
inkscape:cy="102.50924"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="Слой_1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid_kicad"
|
||||
spacingx="0.5"
|
||||
spacingy="0.5"
|
||||
color="#9999ff"
|
||||
opacity="0.13"
|
||||
empspacing="2" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata43">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title>teardrop_track</dc:title>
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#Attribution" />
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs115772">
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Send"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Send"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path863" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="marker2082"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow2Mend"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="scale(-0.6)"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="path2080" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="marker1866"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow2Mstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="scale(0.6)"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="path1864" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Lend"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lend"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(-0.8,0,0,-0.8,-10,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path851" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Tail"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Tail"
|
||||
inkscape:isstock="true">
|
||||
<g
|
||||
transform="scale(-1.2)"
|
||||
id="g896"
|
||||
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1">
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M -3.8048674,-3.9585227 0.54352094,0"
|
||||
id="path884" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M -1.2866832,-3.9585227 3.0617053,0"
|
||||
id="path886" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M 1.3053582,-3.9585227 5.6537466,0"
|
||||
id="path888" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M -3.8048674,4.1775838 0.54352094,0.21974226"
|
||||
id="path890" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M -1.2866832,4.1775838 3.0617053,0.21974226"
|
||||
id="path892" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M 1.3053582,4.1775838 5.6537466,0.21974226"
|
||||
id="path894" />
|
||||
</g>
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow2Mend"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow2Mend"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="scale(-0.6)"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="path875" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow2Sstart"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow2Sstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.3,0,0,0.3,-0.69,0)"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="path878" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Sstart"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Sstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.2,0,0,0.2,1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path860" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Mstart"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Mstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.4,0,0,0.4,4,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path854" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Lstart"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path848" />
|
||||
</marker>
|
||||
<style
|
||||
id="style115770">.cls-1{fill:#f29100;}.cls-2{fill:#b9b9b9;}</style>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Sstart-8"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Sstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.2,0,0,0.2,1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path860-9" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Send-0"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Send"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path863-8" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Sstart-9"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Sstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.2,0,0,0.2,1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path860-5" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Send-7"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Send"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path863-9" />
|
||||
</marker>
|
||||
</defs>
|
||||
<title
|
||||
id="title115774">teardrop_track</title>
|
||||
<path
|
||||
style="fill:none;stroke:#0000ea;stroke-width:0.845128;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Sstart);marker-end:url(#Arrow1Send)"
|
||||
d="M 24,28 V 44"
|
||||
id="path2066" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:28.4253px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ea;fill-opacity:1;stroke:#0000d8;stroke-width:0.436788;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="2.8553352"
|
||||
y="48.111053"
|
||||
id="text2758"
|
||||
transform="scale(1.0400962,0.96144954)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan2756"
|
||||
x="2.8553352"
|
||||
y="48.111053"
|
||||
style="font-size:28.4253px;fill:#0000ea;fill-opacity:1;stroke:#0000d8;stroke-width:0.436788;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">d</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#0000e6;stroke-width:0.944882;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 151,25.983933 H 88 v 0"
|
||||
id="path842-2" />
|
||||
<path
|
||||
style="fill:#0000ea;fill-opacity:1;stroke:#0000ea;stroke-width:0.944882;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 151,45.983933 H 88 v 0"
|
||||
id="path842-2-5" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:18.1976px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ef;fill-opacity:1;stroke:#0000d8;stroke-width:0.37284;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="158.60057"
|
||||
y="40.147049"
|
||||
id="text2804"
|
||||
transform="scale(0.96465404,1.0366411)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan2802"
|
||||
x="158.60057"
|
||||
y="40.147049"
|
||||
style="font-size:18.1976px;fill:#0000ef;fill-opacity:1;stroke:#0000d8;stroke-width:0.37284;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Height</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:17.9082px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#a10000;fill-opacity:1;stroke:#a10000;stroke-width:0.366909;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="69.486862"
|
||||
y="78.590096"
|
||||
id="text2808"
|
||||
transform="scale(1.0924868,0.91534287)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan2806"
|
||||
x="69.486862"
|
||||
y="78.590096"
|
||||
style="font-size:17.9082px;fill:#a10000;fill-opacity:1;stroke:#a10000;stroke-width:0.366909;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Lenght</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#9e0000;stroke-width:0.673085;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 88,37.104743 v 19.87919 0"
|
||||
id="path2810" />
|
||||
<path
|
||||
style="fill:none;stroke:#a10000;stroke-width:0.675133;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 123,37.892708 V 56.983933"
|
||||
id="path2812" />
|
||||
<path
|
||||
style="fill:none;stroke:#0000ea;stroke-width:0.890843;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Sstart-8);marker-end:url(#Arrow1Send-0)"
|
||||
d="M 148,28 V 44"
|
||||
id="path2066-3" />
|
||||
<path
|
||||
style="fill:#0000cb;fill-opacity:1;stroke:#0000ea;stroke-width:0.944882;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 30.896762,26 h -8.948381 v 0"
|
||||
id="path842" />
|
||||
<path
|
||||
style="fill:none;stroke:#0000ea;stroke-width:0.944882;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 30.948381,46 H 22"
|
||||
id="path844" />
|
||||
<path
|
||||
style="fill:none;stroke:#a10000;stroke-width:20;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 88,36 H 36"
|
||||
id="path1052" />
|
||||
<path
|
||||
style="fill:#84bb00;fill-opacity:1;stroke:#a10000;stroke-width:9.578;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 96,35.983933 h 46"
|
||||
id="path2800" />
|
||||
<path
|
||||
style="opacity:1;fill:#84bb00;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 88,25.983933 123,31 v 10 l -35,4.983933"
|
||||
id="path15"
|
||||
inkscape:transform-center-x="-2.4551088"
|
||||
inkscape:transform-center-y="28.122156"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
</svg>
|
After Width: | Height: | Size: 15 KiB |
|
@ -0,0 +1,418 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
id="Слой_1"
|
||||
data-name="Слой 1"
|
||||
viewBox="0 0 220 88"
|
||||
version="1.1"
|
||||
sodipodi:docname="teardrop_rect_sizes.svg"
|
||||
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
|
||||
width="220"
|
||||
height="88"
|
||||
inkscape:export-filename="E:\kicad-launchpad\teardrop\bitmaps_png\png\teardrop_rect_sizes.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96">
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1540"
|
||||
inkscape:window-height="964"
|
||||
id="namedview30"
|
||||
showgrid="true"
|
||||
inkscape:zoom="25.34527"
|
||||
inkscape:cx="128.57922"
|
||||
inkscape:cy="48.270074"
|
||||
inkscape:window-x="232"
|
||||
inkscape:window-y="134"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="Слой_1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid_kicad"
|
||||
spacingx="0.5"
|
||||
spacingy="0.5"
|
||||
color="#9999ff"
|
||||
opacity="0.13"
|
||||
empspacing="2" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata43">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title>add_via</dc:title>
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#Attribution" />
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs115772">
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Send"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Send"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path863" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="marker2082"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow2Mend"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="scale(-0.6)"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="path2080" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="marker1866"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow2Mstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="scale(0.6)"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="path1864" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Lend"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lend"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(-0.8,0,0,-0.8,-10,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path851" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Tail"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Tail"
|
||||
inkscape:isstock="true">
|
||||
<g
|
||||
transform="scale(-1.2)"
|
||||
id="g896"
|
||||
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1">
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M -3.8048674,-3.9585227 0.54352094,0"
|
||||
id="path884" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M -1.2866832,-3.9585227 3.0617053,0"
|
||||
id="path886" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M 1.3053582,-3.9585227 5.6537466,0"
|
||||
id="path888" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M -3.8048674,4.1775838 0.54352094,0.21974226"
|
||||
id="path890" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M -1.2866832,4.1775838 3.0617053,0.21974226"
|
||||
id="path892" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M 1.3053582,4.1775838 5.6537466,0.21974226"
|
||||
id="path894" />
|
||||
</g>
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow2Mend"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow2Mend"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="scale(-0.6)"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="path875" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow2Sstart"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow2Sstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.3,0,0,0.3,-0.69,0)"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="path878" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Sstart"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Sstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.2,0,0,0.2,1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path860" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Mstart"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Mstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.4,0,0,0.4,4,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path854" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Lstart"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path848" />
|
||||
</marker>
|
||||
<style
|
||||
id="style115770">.cls-1{fill:#f29100;}.cls-2{fill:#b9b9b9;}</style>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Sstart-8"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Sstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.2,0,0,0.2,1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path860-9" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Send-0"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Send"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path863-8" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Sstart-9"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Sstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.2,0,0,0.2,1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path860-5" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Send-7"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Send"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path863-9" />
|
||||
</marker>
|
||||
</defs>
|
||||
<title
|
||||
id="title115774">add_via</title>
|
||||
<path
|
||||
style="fill:#84bb00;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 73,28.091225 120.02042,38.091226 73,48.091225"
|
||||
id="path15" />
|
||||
<path
|
||||
style="fill:none;stroke:#0000ea;stroke-width:0.932996;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Sstart);marker-end:url(#Arrow1Send)"
|
||||
d="M 24,28.5 V 48"
|
||||
id="path2066" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:26.7136px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ea;fill-opacity:1;stroke:#0000d8;stroke-width:0.410486;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="-0.12805457"
|
||||
y="48.483246"
|
||||
id="text2758"
|
||||
transform="scale(1.0422745,0.95944016)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan2756"
|
||||
x="-0.12805457"
|
||||
y="48.483246"
|
||||
style="font-size:26.7136px;fill:#0000ea;fill-opacity:1;stroke:#0000d8;stroke-width:0.410486;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">d</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#0000e6;stroke-width:1.0378;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 149,28.091225 H 73 v 0"
|
||||
id="path842-2" />
|
||||
<path
|
||||
style="fill:#0000ea;fill-opacity:1;stroke:#0000ea;stroke-width:1.0378;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 149,48.091225 H 73 v 0"
|
||||
id="path842-2-5" />
|
||||
<path
|
||||
style="fill:#a10000;fill-opacity:1;stroke:#a10000;stroke-width:7.57556;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 104,38 c 21.90787,0 33.7912,0 37.5,0"
|
||||
id="path2800"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:export-filename="E:\kicad-launchpad\teardrop\bitmaps_png\png\path2800.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:18.7478px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ef;fill-opacity:1;stroke:#0000d8;stroke-width:0.384113;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="142.04674"
|
||||
y="47.33836"
|
||||
id="text2804"
|
||||
transform="scale(1.0683649,0.93600979)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan2802"
|
||||
x="142.04674"
|
||||
y="47.33836"
|
||||
style="font-size:18.7478px;fill:#0000ef;fill-opacity:1;stroke:#0000d8;stroke-width:0.384113;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Height</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:17.2336px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#a10000;fill-opacity:1;stroke:#a10000;stroke-width:0.35309;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="61.532738"
|
||||
y="75.214935"
|
||||
id="text2808"
|
||||
transform="scale(1.0102575,0.98984664)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan2806"
|
||||
x="61.532738"
|
||||
y="75.214935"
|
||||
style="font-size:17.2336px;fill:#a10000;fill-opacity:1;stroke:#a10000;stroke-width:0.35309;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Lenght</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#9e0000;stroke-width:0.673085;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 73,39.212035 v 19.87919 0"
|
||||
id="path2810" />
|
||||
<path
|
||||
style="fill:none;stroke:#a10000;stroke-width:0.675133;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 108,40 V 59.091225"
|
||||
id="path2812" />
|
||||
<path
|
||||
style="fill:none;stroke:#0000ea;stroke-width:0.931666;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Sstart-8);marker-end:url(#Arrow1Send-0)"
|
||||
d="M 147,29.5 V 47"
|
||||
id="path2066-3" />
|
||||
<rect
|
||||
style="fill:#a10000;stroke:#a10000;stroke-width:0.494286;stroke-linecap:round;paint-order:fill markers stroke"
|
||||
id="rect979"
|
||||
width="43"
|
||||
height="22"
|
||||
x="30"
|
||||
y="27.091225" />
|
||||
<path
|
||||
style="fill:#0000cb;fill-opacity:1;stroke:#0000ea;stroke-width:0.944882;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 30,27.091225 h -8.948381 v 0"
|
||||
id="path842" />
|
||||
<path
|
||||
style="fill:none;stroke:#0000ea;stroke-width:0.944882;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 30,49.091225 H 21.051619"
|
||||
id="path844" />
|
||||
<path
|
||||
style="fill:#0000cb;fill-opacity:1;stroke:#0000cb;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 30,27.091225 c 0,-5 0,-5 0,-5 v 0"
|
||||
id="path64" />
|
||||
<path
|
||||
style="fill:#0000cb;fill-opacity:1;stroke:#0000cb;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 73.223192,26.591225 c 0,-5 0,-5 0,-5 v 0"
|
||||
id="path64-3" />
|
||||
<path
|
||||
style="fill:none;stroke:#0000ea;stroke-width:1.0129;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Sstart-9);marker-end:url(#Arrow1Send-7)"
|
||||
d="M 32,23.091225 H 71.5"
|
||||
id="path2066-2" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:11.3472px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ea;fill-opacity:1;stroke:#0000ea;stroke-width:0.303942;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="49.187962"
|
||||
y="20.724293"
|
||||
id="text1299"
|
||||
transform="scale(1.0136068,0.98657586)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan1297"
|
||||
x="49.187962"
|
||||
y="20.724293"
|
||||
style="font-size:11.3472px;stroke-width:0.303942;stroke-miterlimit:4;stroke-dasharray:none">L</tspan></text>
|
||||
</svg>
|
After Width: | Height: | Size: 17 KiB |
|
@ -0,0 +1,374 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
id="Слой_1"
|
||||
data-name="Слой 1"
|
||||
viewBox="0 0 220 88"
|
||||
version="1.1"
|
||||
sodipodi:docname="teardrop_sizes.svg"
|
||||
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
|
||||
width="220"
|
||||
height="88"
|
||||
inkscape:export-filename="E:\kicad-launchpad\teardrop\bitmaps_png\png\teardrop_sizes.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96">
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1540"
|
||||
inkscape:window-height="1040"
|
||||
id="namedview30"
|
||||
showgrid="true"
|
||||
inkscape:zoom="3.1454546"
|
||||
inkscape:cx="114.54299"
|
||||
inkscape:cy="85.991796"
|
||||
inkscape:window-x="306"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="Слой_1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid_kicad"
|
||||
spacingx="0.5"
|
||||
spacingy="0.5"
|
||||
color="#9999ff"
|
||||
opacity="0.13"
|
||||
empspacing="2" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata43">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title>add_arc</dc:title>
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#Attribution" />
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs115772">
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Send"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Send"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path863" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="marker2082"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow2Mend"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="scale(-0.6)"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="path2080" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="marker1866"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow2Mstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="scale(0.6)"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="path1864" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Lend"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lend"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(-0.8,0,0,-0.8,-10,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path851" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Tail"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Tail"
|
||||
inkscape:isstock="true">
|
||||
<g
|
||||
transform="scale(-1.2)"
|
||||
id="g896"
|
||||
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1">
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M -3.8048674,-3.9585227 0.54352094,0"
|
||||
id="path884" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M -1.2866832,-3.9585227 3.0617053,0"
|
||||
id="path886" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M 1.3053582,-3.9585227 5.6537466,0"
|
||||
id="path888" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M -3.8048674,4.1775838 0.54352094,0.21974226"
|
||||
id="path890" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M -1.2866832,4.1775838 3.0617053,0.21974226"
|
||||
id="path892" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M 1.3053582,4.1775838 5.6537466,0.21974226"
|
||||
id="path894" />
|
||||
</g>
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow2Mend"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow2Mend"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="scale(-0.6)"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="path875" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow2Sstart"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow2Sstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.3,0,0,0.3,-0.69,0)"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="path878" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Sstart"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Sstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.2,0,0,0.2,1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path860" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Mstart"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Mstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.4,0,0,0.4,4,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path854" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Lstart"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path848" />
|
||||
</marker>
|
||||
<style
|
||||
id="style115770">.cls-1{fill:#f29100;}.cls-2{fill:#b9b9b9;}</style>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Sstart-8"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Sstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.2,0,0,0.2,1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path860-9" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Send-0"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Send"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path863-8" />
|
||||
</marker>
|
||||
</defs>
|
||||
<title
|
||||
id="title115774">add_via</title>
|
||||
<path
|
||||
style="fill:#a10000;fill-opacity:1;stroke:#a10000;stroke-width:8.66228px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 95,36.673727 h 44"
|
||||
id="path2800" />
|
||||
<path
|
||||
style="fill:#84bb00;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 66,17.5 40,14.834766 V 41 L 66,55.5"
|
||||
id="path15"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
<g
|
||||
id="g13"
|
||||
transform="matrix(3.4281308,0,0,3.4106992,10.488631,-4.4654968)">
|
||||
<circle
|
||||
class="cls-1"
|
||||
cx="12"
|
||||
cy="12"
|
||||
r="7"
|
||||
id="circle115776" />
|
||||
<circle
|
||||
class="cls-2"
|
||||
cx="12"
|
||||
cy="12"
|
||||
id="circle115778"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke-width:1"
|
||||
r="3" />
|
||||
</g>
|
||||
<path
|
||||
style="fill:#0000cb;fill-opacity:1;stroke:#0000ea;stroke-width:0.910071;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 51.233231,12.798833 H 17.380055 v 0"
|
||||
id="path842" />
|
||||
<path
|
||||
style="fill:none;stroke:#0000ea;stroke-width:0.910071;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 51.233231,60.548622 H 17.380055"
|
||||
id="path844" />
|
||||
<path
|
||||
style="fill:none;stroke:#0000ea;stroke-width:0.896951;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Sstart);marker-end:url(#Arrow1Send)"
|
||||
d="M 20.380055,14.298833 V 58.759999"
|
||||
id="path2066" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:24.7884px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ea;fill-opacity:1;stroke:#0000d8;stroke-width:0.380903;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="3.3195524"
|
||||
y="50.654839"
|
||||
id="text2758"
|
||||
transform="scale(1.0520519,0.95052344)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan2756"
|
||||
x="3.3195524"
|
||||
y="50.654839"
|
||||
style="font-size:24.7884px;fill:#0000ea;fill-opacity:1;stroke:#0000d8;stroke-width:0.380903;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">d</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#0000e6;stroke-width:1.02433;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 146.62611,18 C 120.08407,18 93.542037,18 67,18"
|
||||
id="path842-2"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:#0000ea;fill-opacity:1;stroke:#0000ea;stroke-width:1.03271;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 148,56 H 65.659821 v 0"
|
||||
id="path842-2-5" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:18.3391px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ef;fill-opacity:1;stroke:#0000d8;stroke-width:0.375739;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="144.81419"
|
||||
y="44.88063"
|
||||
id="text2804"
|
||||
transform="scale(1.0273491,0.97337897)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan2802"
|
||||
x="144.81419"
|
||||
y="44.88063"
|
||||
style="font-size:18.3391px;fill:#0000ef;fill-opacity:1;stroke:#0000d8;stroke-width:0.375739;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Height</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:18.1335px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#a10000;fill-opacity:1;stroke:#a10000;stroke-width:0.371526;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="55.345146"
|
||||
y="88.484619"
|
||||
id="text2808"
|
||||
transform="scale(1.0779659,0.92767313)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan2806"
|
||||
x="55.345146"
|
||||
y="88.484619"
|
||||
style="font-size:18.1335px;fill:#a10000;fill-opacity:1;stroke:#a10000;stroke-width:0.371526;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Lenght</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#9e0000;stroke-width:0.785628;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 76,36 v 30.677512 0"
|
||||
id="path2810" />
|
||||
<path
|
||||
style="fill:none;stroke:#a10000;stroke-width:0.795237;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 106,36 V 66.003785"
|
||||
id="path2812" />
|
||||
<path
|
||||
style="fill:none;stroke:#0000ea;stroke-width:0.806106;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Sstart-8);marker-end:url(#Arrow1Send-0)"
|
||||
d="M 144,19.089058 V 55"
|
||||
id="path2066-3" />
|
||||
</svg>
|
After Width: | Height: | Size: 14 KiB |
|
@ -0,0 +1,390 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
id="Слой_1"
|
||||
data-name="Слой 1"
|
||||
viewBox="0 0 220 88"
|
||||
version="1.1"
|
||||
sodipodi:docname="teardrop_track_sizes.svg"
|
||||
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
|
||||
width="220"
|
||||
height="88"
|
||||
inkscape:export-filename="E:\kicad-launchpad\teardrop\bitmaps_png\png\teardrop_track_sizes.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96">
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1904"
|
||||
inkscape:window-height="1001"
|
||||
id="namedview30"
|
||||
showgrid="true"
|
||||
inkscape:zoom="2.2402266"
|
||||
inkscape:cx="32.7838"
|
||||
inkscape:cy="102.50924"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:current-layer="Слой_1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid_kicad"
|
||||
spacingx="0.5"
|
||||
spacingy="0.5"
|
||||
color="#9999ff"
|
||||
opacity="0.13"
|
||||
empspacing="2" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata43">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title>teardrop_track</dc:title>
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#Attribution" />
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs115772">
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Send"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Send"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path863" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="marker2082"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow2Mend"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="scale(-0.6)"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="path2080" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="marker1866"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow2Mstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="scale(0.6)"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="path1864" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Lend"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lend"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(-0.8,0,0,-0.8,-10,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path851" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Tail"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Tail"
|
||||
inkscape:isstock="true">
|
||||
<g
|
||||
transform="scale(-1.2)"
|
||||
id="g896"
|
||||
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1">
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M -3.8048674,-3.9585227 0.54352094,0"
|
||||
id="path884" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M -1.2866832,-3.9585227 3.0617053,0"
|
||||
id="path886" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M 1.3053582,-3.9585227 5.6537466,0"
|
||||
id="path888" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M -3.8048674,4.1775838 0.54352094,0.21974226"
|
||||
id="path890" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M -1.2866832,4.1775838 3.0617053,0.21974226"
|
||||
id="path892" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1"
|
||||
d="M 1.3053582,4.1775838 5.6537466,0.21974226"
|
||||
id="path894" />
|
||||
</g>
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow2Mend"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow2Mend"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="scale(-0.6)"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="path875" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow2Sstart"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow2Sstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.3,0,0,0.3,-0.69,0)"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="path878" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Sstart"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Sstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.2,0,0,0.2,1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path860" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Mstart"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Mstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.4,0,0,0.4,4,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path854" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Lstart"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Lstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.8,0,0,0.8,10,0)"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path848" />
|
||||
</marker>
|
||||
<style
|
||||
id="style115770">.cls-1{fill:#f29100;}.cls-2{fill:#b9b9b9;}</style>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Sstart-8"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Sstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.2,0,0,0.2,1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path860-9" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Send-0"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Send"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path863-8" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Sstart-9"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Sstart"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(0.2,0,0,0.2,1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path860-5" />
|
||||
</marker>
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="Arrow1Send-7"
|
||||
refX="0"
|
||||
refY="0"
|
||||
orient="auto"
|
||||
inkscape:stockid="Arrow1Send"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
|
||||
style="fill:#0000ea;fill-opacity:1;fill-rule:evenodd;stroke:#0000ea;stroke-width:1pt;stroke-opacity:1"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
id="path863-9" />
|
||||
</marker>
|
||||
</defs>
|
||||
<title
|
||||
id="title115774">teardrop_track</title>
|
||||
<path
|
||||
style="fill:none;stroke:#0000ea;stroke-width:0.845128;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Sstart);marker-end:url(#Arrow1Send)"
|
||||
d="M 24,28 V 44"
|
||||
id="path2066" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:28.4253px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ea;fill-opacity:1;stroke:#0000d8;stroke-width:0.436788;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="2.8553352"
|
||||
y="48.111053"
|
||||
id="text2758"
|
||||
transform="scale(1.0400962,0.96144954)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan2756"
|
||||
x="2.8553352"
|
||||
y="48.111053"
|
||||
style="font-size:28.4253px;fill:#0000ea;fill-opacity:1;stroke:#0000d8;stroke-width:0.436788;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">d</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#0000e6;stroke-width:0.944882;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 151,25.983933 H 88 v 0"
|
||||
id="path842-2" />
|
||||
<path
|
||||
style="fill:#0000ea;fill-opacity:1;stroke:#0000ea;stroke-width:0.944882;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 151,45.983933 H 88 v 0"
|
||||
id="path842-2-5" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:18.1976px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#0000ef;fill-opacity:1;stroke:#0000d8;stroke-width:0.37284;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="158.60057"
|
||||
y="40.147049"
|
||||
id="text2804"
|
||||
transform="scale(0.96465404,1.0366411)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan2802"
|
||||
x="158.60057"
|
||||
y="40.147049"
|
||||
style="font-size:18.1976px;fill:#0000ef;fill-opacity:1;stroke:#0000d8;stroke-width:0.37284;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Height</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:17.9082px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#a10000;fill-opacity:1;stroke:#a10000;stroke-width:0.366909;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="69.486862"
|
||||
y="78.590096"
|
||||
id="text2808"
|
||||
transform="scale(1.0924868,0.91534287)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan2806"
|
||||
x="69.486862"
|
||||
y="78.590096"
|
||||
style="font-size:17.9082px;fill:#a10000;fill-opacity:1;stroke:#a10000;stroke-width:0.366909;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Lenght</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#9e0000;stroke-width:0.673085;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 88,37.104743 v 19.87919 0"
|
||||
id="path2810" />
|
||||
<path
|
||||
style="fill:none;stroke:#a10000;stroke-width:0.675133;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 123,37.892708 V 56.983933"
|
||||
id="path2812" />
|
||||
<path
|
||||
style="fill:none;stroke:#0000ea;stroke-width:0.890843;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Sstart-8);marker-end:url(#Arrow1Send-0)"
|
||||
d="M 148,28 V 44"
|
||||
id="path2066-3" />
|
||||
<path
|
||||
style="fill:#0000cb;fill-opacity:1;stroke:#0000ea;stroke-width:0.944882;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 30.896762,26 h -8.948381 v 0"
|
||||
id="path842" />
|
||||
<path
|
||||
style="fill:none;stroke:#0000ea;stroke-width:0.944882;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 30.948381,46 H 22"
|
||||
id="path844" />
|
||||
<path
|
||||
style="fill:none;stroke:#a10000;stroke-width:20;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 88,36 H 36"
|
||||
id="path1052" />
|
||||
<path
|
||||
style="fill:#84bb00;fill-opacity:1;stroke:#a10000;stroke-width:9.578;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 96,35.983933 h 46"
|
||||
id="path2800" />
|
||||
<path
|
||||
style="opacity:1;fill:#84bb00;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 88,25.983933 123,31 v 10 l -35,4.983933"
|
||||
id="path15"
|
||||
inkscape:transform-center-x="-2.4551088"
|
||||
inkscape:transform-center-y="28.122156"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
</svg>
|
After Width: | Height: | Size: 15 KiB |
|
@ -1045,6 +1045,9 @@ const std::vector<BITMAP_INFO> g_BitmapInfo = {
|
|||
{ BITMAPS::stroke_dashdotdot, wxT( "stroke_dashdotdot.png" ), -1, wxT( "light" ) },
|
||||
{ BITMAPS::stroke_dot, wxT( "stroke_dot.png" ), -1, wxT( "light" ) },
|
||||
{ BITMAPS::stroke_solid, wxT( "stroke_solid.png" ), -1, wxT( "light" ) },
|
||||
{ BITMAPS::teardrop_sizes, wxT( "teardrop_sizes.png" ), -1, wxT( "light" ) },
|
||||
{ BITMAPS::teardrop_rect_sizes, wxT( "teardrop_rect_sizes.png" ), -1, wxT( "light" ) },
|
||||
{ BITMAPS::teardrop_track_sizes, wxT( "teardrop_track_sizes.png" ), -1, wxT( "light" ) },
|
||||
{ BITMAPS::tune_diff_pair_length_legend, wxT( "tune_diff_pair_length_legend.png" ), -1, wxT( "light" ) },
|
||||
{ BITMAPS::tune_diff_pair_skew_legend, wxT( "tune_diff_pair_skew_legend.png" ), -1, wxT( "light" ) },
|
||||
{ BITMAPS::tune_single_track_length_legend, wxT( "tune_single_track_length_legend.png" ), -1, wxT( "light" ) },
|
||||
|
@ -1080,6 +1083,9 @@ const std::vector<BITMAP_INFO> g_BitmapInfo = {
|
|||
{ BITMAPS::stroke_dashdotdot, wxT( "stroke_dashdotdot_dark.png" ), -1, wxT( "dark" ) },
|
||||
{ BITMAPS::stroke_dot, wxT( "stroke_dot_dark.png" ), -1, wxT( "dark" ) },
|
||||
{ BITMAPS::stroke_solid, wxT( "stroke_solid_dark.png" ), -1, wxT( "dark" ) },
|
||||
{ BITMAPS::teardrop_sizes, wxT( "teardrop_sizes_dark.png" ), -1, wxT( "dark" ) },
|
||||
{ BITMAPS::teardrop_rect_sizes, wxT( "teardrop_rect_sizes_dark.png" ), -1, wxT( "dark" ) },
|
||||
{ BITMAPS::teardrop_track_sizes, wxT( "teardrop_track_sizes_dark.png" ), -1, wxT( "dark" ) },
|
||||
{ BITMAPS::tune_diff_pair_length_legend, wxT( "tune_diff_pair_length_legend_dark.png" ), -1, wxT( "dark" ) },
|
||||
{ BITMAPS::tune_diff_pair_skew_legend, wxT( "tune_diff_pair_skew_legend_dark.png" ), -1, wxT( "dark" ) },
|
||||
{ BITMAPS::tune_single_track_length_legend, wxT( "tune_single_track_length_legend_dark.png" ), -1, wxT( "dark" ) },
|
||||
|
|
|
@ -529,6 +529,9 @@ enum class BITMAPS : unsigned int
|
|||
stroke_solid,
|
||||
swap_layer,
|
||||
switch_corner_rounding_shape,
|
||||
teardrop_sizes,
|
||||
teardrop_rect_sizes,
|
||||
teardrop_track_sizes,
|
||||
text,
|
||||
text_align_left,
|
||||
text_align_center,
|
||||
|
|
|
@ -40,6 +40,8 @@ include_directories(
|
|||
)
|
||||
|
||||
set( PCBNEW_DIALOGS
|
||||
teardrop/dialog_teardrop_base.cpp
|
||||
teardrop/dialog_teardrop.cpp
|
||||
dialogs/dialog_filter_selection.cpp
|
||||
dialogs/dialog_filter_selection_base.cpp
|
||||
dialogs/dialog_board_setup.cpp
|
||||
|
@ -349,6 +351,8 @@ set( PCBNEW_CLASS_SRCS
|
|||
tools/tool_event_utils.cpp
|
||||
tools/zone_create_helper.cpp
|
||||
tools/zone_filler_tool.cpp
|
||||
teardrop/teardrop.cpp
|
||||
teardrop/teardrop_utils.cpp
|
||||
|
||||
footprint_preview_panel.cpp
|
||||
footprint_tree_pane.cpp
|
||||
|
|
|
@ -402,6 +402,13 @@ void PCB_EDIT_FRAME::ReCreateMenuBar()
|
|||
toolsMenu->Add( ACTIONS::showFootprintEditor );
|
||||
toolsMenu->Add( PCB_ACTIONS::updateFootprints );
|
||||
|
||||
|
||||
toolsMenu->AppendSeparator();
|
||||
toolsMenu->Add( _( "Add Teardrops" ), "",
|
||||
ID_RUN_TEARDROP_TOOL, BITMAPS::via );
|
||||
toolsMenu->Add( _( "Remove Teardrops" ), "",
|
||||
ID_REMOVE_TEARDROP_TOOL, BITMAPS::via );
|
||||
|
||||
toolsMenu->AppendSeparator();
|
||||
toolsMenu->Add( PCB_ACTIONS::cleanupTracksAndVias );
|
||||
toolsMenu->Add( PCB_ACTIONS::removeUnusedPads );
|
||||
|
|
|
@ -136,6 +136,9 @@ BEGIN_EVENT_TABLE( PCB_EDIT_FRAME, PCB_BASE_FRAME )
|
|||
EVT_MENU( ID_GEN_EXPORT_FILE_STEP, PCB_EDIT_FRAME::OnExportSTEP )
|
||||
EVT_MENU( ID_GEN_EXPORT_FILE_HYPERLYNX, PCB_EDIT_FRAME::OnExportHyperlynx )
|
||||
|
||||
EVT_MENU( ID_RUN_TEARDROP_TOOL, PCB_EDIT_FRAME::OnRunTeardropTool )
|
||||
EVT_MENU( ID_REMOVE_TEARDROP_TOOL, OnRemoveTeardropTool )
|
||||
|
||||
EVT_MENU( ID_MENU_EXPORT_FOOTPRINTS_TO_LIBRARY, PCB_EDIT_FRAME::Process_Special_Functions )
|
||||
EVT_MENU( ID_MENU_EXPORT_FOOTPRINTS_TO_NEW_LIBRARY, PCB_EDIT_FRAME::Process_Special_Functions )
|
||||
|
||||
|
|
|
@ -114,6 +114,10 @@ enum pcbnew_ids
|
|||
ID_ADD_FOOTPRINT_TO_BOARD,
|
||||
ID_LOAD_FOOTPRINT_FROM_BOARD,
|
||||
|
||||
ID_RUN_TEARDROP_TOOL,
|
||||
ID_REMOVE_TEARDROP_TOOL,
|
||||
ID_PCB_UNUSED1,
|
||||
|
||||
ID_PCBNEW_END_LIST
|
||||
};
|
||||
|
||||
|
|
|
@ -5570,6 +5570,12 @@ ZONE* PCB_PARSER::parseZONE( BOARD_ITEM_CONTAINER* aParent )
|
|||
case T_name:
|
||||
NextTok();
|
||||
zone->SetZoneName( FromUTF8() );
|
||||
|
||||
// TODO: remove this hack and replace it when a suitable token is added
|
||||
// If a zone name is $teardrop$, set its teardrop property flag
|
||||
if( zone->GetZoneName() == "$teardrop$" )
|
||||
zone->SetIsTeardropArea( true );
|
||||
|
||||
NeedRIGHT();
|
||||
break;
|
||||
|
||||
|
|
|
@ -0,0 +1,188 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2021 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
||||
* Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
|
||||
#include <board_design_settings.h>
|
||||
#include <board_commit.h>
|
||||
#include <bitmaps.h>
|
||||
|
||||
#include "teardrop.h"
|
||||
#include "dialog_teardrop_base.h"
|
||||
#include <widgets/unit_binder.h>
|
||||
|
||||
|
||||
class TEARDROP_DIALOG: public TEARDROP_DIALOG_BASE
|
||||
{
|
||||
public:
|
||||
TEARDROP_DIALOG( PCB_EDIT_FRAME* aParent ):
|
||||
TEARDROP_DIALOG_BASE( aParent ),
|
||||
m_frame( aParent ),
|
||||
m_teardropMaxLenSetting( aParent,m_stMaxLen, m_tcTdMaxLen, m_stLenUnit ),
|
||||
m_teardropMaxHeightSetting( aParent, m_stTdMaxSize, m_tcMaxSize, m_stSizeUnit )
|
||||
{
|
||||
// Setup actual bitmaps that cannot be set inside wxFormBuilder:
|
||||
m_bitmapTdCircularInfo->SetBitmap( KiBitmap( BITMAPS::teardrop_sizes ) );
|
||||
m_bitmapTdRectangularInfo->SetBitmap( KiBitmap( BITMAPS::teardrop_rect_sizes ) );
|
||||
m_bitmapTdTrackInfo->SetBitmap( KiBitmap( BITMAPS::teardrop_track_sizes ) );
|
||||
|
||||
m_spTeardropLenPercent->SetValue( m_teardropLenPrm );
|
||||
m_spTeardropSizePercent->SetValue( m_teardropSizePrm );
|
||||
m_cbSmdSimilarPads->SetValue( m_includeNotPTH );
|
||||
m_cbRoundShapesOnly->SetValue( m_roundShapesOnly );
|
||||
m_rbShape->SetSelection( m_curveOption );
|
||||
m_cbOptUseNextTrack->SetValue( m_canUseTwoTracks );
|
||||
m_spPointCount->SetValue( m_curveSegCount );
|
||||
m_cbTrack2Track->SetValue( m_track2Track );
|
||||
m_cbPadVia->SetValue( m_includeViasAndPTH );
|
||||
|
||||
m_teardropMaxLenSetting.SetValue( m_teardropMaxLenPrm );
|
||||
m_teardropMaxHeightSetting.SetValue( m_teardropMaxSizePrm );
|
||||
|
||||
// recalculate sizers, now the bitmap is initialized
|
||||
finishDialogSettings();
|
||||
}
|
||||
|
||||
~TEARDROP_DIALOG()
|
||||
{
|
||||
m_teardropLenPrm = m_spTeardropLenPercent->GetValue();
|
||||
m_teardropSizePrm = m_spTeardropSizePercent->GetValue();
|
||||
m_teardropMaxLenPrm = m_teardropMaxLenSetting.GetValue();
|
||||
m_teardropMaxSizePrm = m_teardropMaxHeightSetting.GetValue();
|
||||
m_roundShapesOnly = m_cbRoundShapesOnly->GetValue();
|
||||
m_includeNotPTH = m_cbSmdSimilarPads->GetValue();
|
||||
m_curveOption = m_rbShape->GetSelection();
|
||||
m_canUseTwoTracks = m_cbOptUseNextTrack->GetValue();
|
||||
m_curveSegCount = m_spPointCount->GetValue();
|
||||
m_track2Track = m_cbTrack2Track->GetValue();
|
||||
m_includeViasAndPTH = m_cbPadVia->GetValue();
|
||||
}
|
||||
|
||||
CURVED_OPTION CurvedShapeOption()
|
||||
{
|
||||
return (CURVED_OPTION) m_rbShape->GetSelection();
|
||||
}
|
||||
|
||||
// Options for curved shapes
|
||||
int GetCurvePointCount() { return m_spPointCount->GetValue(); }
|
||||
double GetTeardropLenPercent() { return m_spTeardropLenPercent->GetValue()/100.0; }
|
||||
double GetTeardropSizePercent() { return m_spTeardropSizePercent->GetValue()/100.0; }
|
||||
int GetTeardropMaxLen() { return m_teardropMaxLenSetting.GetValue(); }
|
||||
int GetTeardropMaxHeight() { return m_teardropMaxHeightSetting.GetValue(); }
|
||||
|
||||
// Optins to filter pads
|
||||
bool TeardropOnPadVia() { return m_cbPadVia->GetValue(); }
|
||||
bool IncludeNotPTH() { return m_cbSmdSimilarPads->GetValue(); }
|
||||
bool RoundShapesOnly() { return m_cbRoundShapesOnly->GetValue(); }
|
||||
|
||||
bool CanUseTwoTracks() { return m_cbOptUseNextTrack->GetValue(); }
|
||||
|
||||
bool TeardropOnTracks() { return m_cbTrack2Track->GetValue(); }
|
||||
|
||||
private:
|
||||
PCB_EDIT_FRAME* m_frame;
|
||||
UNIT_BINDER m_teardropMaxLenSetting;
|
||||
UNIT_BINDER m_teardropMaxHeightSetting;
|
||||
|
||||
// Used to store settings during a session:
|
||||
static double m_teardropLenPrm;
|
||||
static double m_teardropSizePrm;
|
||||
static int m_teardropMaxLenPrm;
|
||||
static int m_teardropMaxSizePrm;
|
||||
static bool m_includeNotPTH;
|
||||
static bool m_roundShapesOnly;
|
||||
static int m_curveOption;
|
||||
static bool m_canUseTwoTracks;
|
||||
static int m_curveSegCount;
|
||||
static bool m_track2Track;
|
||||
static bool m_includeViasAndPTH;
|
||||
|
||||
};
|
||||
|
||||
// Store settings during a session:
|
||||
double TEARDROP_DIALOG::m_teardropLenPrm = 50;
|
||||
double TEARDROP_DIALOG::m_teardropSizePrm = 100;
|
||||
int TEARDROP_DIALOG::m_teardropMaxLenPrm = Millimeter2iu( 1.0 );
|
||||
int TEARDROP_DIALOG::m_teardropMaxSizePrm = Millimeter2iu( 2.0 );
|
||||
bool TEARDROP_DIALOG::m_includeNotPTH = true;
|
||||
bool TEARDROP_DIALOG::m_roundShapesOnly = false;
|
||||
int TEARDROP_DIALOG::m_curveOption = 0;
|
||||
bool TEARDROP_DIALOG::m_canUseTwoTracks = true;
|
||||
int TEARDROP_DIALOG::m_curveSegCount = 5;
|
||||
bool TEARDROP_DIALOG::m_track2Track = true;
|
||||
bool TEARDROP_DIALOG::m_includeViasAndPTH = true;
|
||||
|
||||
|
||||
void PCB_EDIT_FRAME::OnRunTeardropTool( wxCommandEvent& event )
|
||||
{
|
||||
TEARDROP_DIALOG dlg( this );
|
||||
|
||||
if( dlg.ShowModal() != wxID_OK )
|
||||
return;
|
||||
|
||||
wxBusyCursor dummy;
|
||||
|
||||
BOARD_COMMIT committer( this );
|
||||
|
||||
TEARDROP_MANAGER trdm( GetBoard(), this );
|
||||
|
||||
int shape_seg_count;
|
||||
|
||||
if( dlg.CurvedShapeOption() != CURVED_OPTION::OPTION_NONE )
|
||||
shape_seg_count = dlg.GetCurvePointCount();
|
||||
else
|
||||
shape_seg_count = 1;
|
||||
|
||||
trdm.SetTeardropMaxSize( dlg.GetTeardropMaxLen(), dlg.GetTeardropMaxHeight() );
|
||||
trdm.SetTeardropSizeRatio( dlg.GetTeardropLenPercent(), dlg.GetTeardropSizePercent() );
|
||||
trdm.SetTeardropCurvedPrms( dlg.CurvedShapeOption(), shape_seg_count );
|
||||
|
||||
const bool discardTeardropInSameZone = true;
|
||||
trdm.SetTargets( dlg.TeardropOnPadVia(), dlg.RoundShapesOnly(),
|
||||
dlg.IncludeNotPTH(), dlg.TeardropOnTracks() );
|
||||
|
||||
int added_count = trdm.SetTeardrops( &committer,
|
||||
discardTeardropInSameZone,
|
||||
dlg.CanUseTwoTracks() );
|
||||
|
||||
m_infoBar->RemoveAllButtons();
|
||||
m_infoBar->AddCloseButton();
|
||||
m_infoBar->ShowMessageFor( wxString::Format( _( "%d Teardrops created" ),
|
||||
added_count ),
|
||||
1000, wxICON_EXCLAMATION );
|
||||
}
|
||||
|
||||
|
||||
void PCB_EDIT_FRAME::OnRemoveTeardropTool( wxCommandEvent& event )
|
||||
{
|
||||
BOARD_COMMIT committer( this );
|
||||
TEARDROP_MANAGER trdm( GetBoard(), this );
|
||||
|
||||
int count = trdm.RemoveTeardrops( &committer, true );
|
||||
|
||||
m_infoBar->RemoveAllButtons();
|
||||
m_infoBar->AddCloseButton();
|
||||
m_infoBar->ShowMessageFor( wxString::Format( _( "%d Teardrops removed." ), count ),
|
||||
1000, wxICON_EXCLAMATION );
|
||||
}
|
||||
|
|
@ -0,0 +1,196 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version 3.10.0-39-g3487c3cb)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO *NOT* EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "dialog_teardrop_base.h"
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
TEARDROP_DIALOG_BASE::TEARDROP_DIALOG_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style )
|
||||
{
|
||||
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
|
||||
|
||||
wxBoxSizer* bSizerMain;
|
||||
bSizerMain = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
wxBoxSizer* bSizerUpper;
|
||||
bSizerUpper = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
wxBoxSizer* bSizerTop;
|
||||
bSizerTop = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
wxBoxSizer* bSizeScopeSize;
|
||||
bSizeScopeSize = new wxBoxSizer( wxHORIZONTAL );
|
||||
|
||||
wxBoxSizer* bSizerBitmaps;
|
||||
bSizerBitmaps = new wxBoxSizer( wxVERTICAL );
|
||||
|
||||
m_bitmapTdCircularInfo = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
bSizerBitmaps->Add( m_bitmapTdCircularInfo, 0, wxALL, 5 );
|
||||
|
||||
m_bitmapTdRectangularInfo = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
bSizerBitmaps->Add( m_bitmapTdRectangularInfo, 0, wxALL, 5 );
|
||||
|
||||
m_bitmapTdTrackInfo = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
bSizerBitmaps->Add( m_bitmapTdTrackInfo, 0, wxALL, 5 );
|
||||
|
||||
|
||||
bSizeScopeSize->Add( bSizerBitmaps, 0, wxEXPAND, 5 );
|
||||
|
||||
|
||||
bSizeScopeSize->Add( 0, 0, 1, wxEXPAND, 5 );
|
||||
|
||||
wxFlexGridSizer* fgSizerSizes;
|
||||
fgSizerSizes = new wxFlexGridSizer( 0, 3, 0, 0 );
|
||||
fgSizerSizes->SetFlexibleDirection( wxBOTH );
|
||||
fgSizerSizes->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||
|
||||
m_stMaxLen = new wxStaticText( this, wxID_ANY, wxT("Max lenght"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_stMaxLen->Wrap( -1 );
|
||||
fgSizerSizes->Add( m_stMaxLen, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
m_tcTdMaxLen = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizerSizes->Add( m_tcTdMaxLen, 0, wxALL, 5 );
|
||||
|
||||
m_stLenUnit = new wxStaticText( this, wxID_ANY, wxT("mm"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_stLenUnit->Wrap( -1 );
|
||||
fgSizerSizes->Add( m_stLenUnit, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
m_stHsetting = new wxStaticText( this, wxID_ANY, wxT("Best lenght"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_stHsetting->Wrap( -1 );
|
||||
fgSizerSizes->Add( m_stHsetting, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
m_spTeardropLenPercent = new wxSpinCtrlDouble( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 20, 100, 50.000000, 10 );
|
||||
m_spTeardropLenPercent->SetDigits( 0 );
|
||||
fgSizerSizes->Add( m_spTeardropLenPercent, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_stLenPercent = new wxStaticText( this, wxID_ANY, wxT("% of d"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_stLenPercent->Wrap( -1 );
|
||||
fgSizerSizes->Add( m_stLenPercent, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
m_staticline5 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
||||
fgSizerSizes->Add( m_staticline5, 0, wxEXPAND | wxALL, 5 );
|
||||
|
||||
m_staticline6 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
||||
fgSizerSizes->Add( m_staticline6, 0, wxEXPAND | wxALL, 5 );
|
||||
|
||||
m_staticline7 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
||||
fgSizerSizes->Add( m_staticline7, 0, wxEXPAND | wxALL, 5 );
|
||||
|
||||
m_stTdMaxSize = new wxStaticText( this, wxID_ANY, wxT("Max height"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_stTdMaxSize->Wrap( -1 );
|
||||
fgSizerSizes->Add( m_stTdMaxSize, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
m_tcMaxSize = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||
fgSizerSizes->Add( m_tcMaxSize, 0, wxALL, 5 );
|
||||
|
||||
m_stSizeUnit = new wxStaticText( this, wxID_ANY, wxT("mm"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_stSizeUnit->Wrap( -1 );
|
||||
fgSizerSizes->Add( m_stSizeUnit, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
m_stVsetting = new wxStaticText( this, wxID_ANY, wxT("Best height"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_stVsetting->Wrap( -1 );
|
||||
fgSizerSizes->Add( m_stVsetting, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
m_spTeardropSizePercent = new wxSpinCtrlDouble( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 60, 100, 100.000000, 10 );
|
||||
m_spTeardropSizePercent->SetDigits( 0 );
|
||||
fgSizerSizes->Add( m_spTeardropSizePercent, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
m_stTdSizePercent = new wxStaticText( this, wxID_ANY, wxT("% of d"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_stTdSizePercent->Wrap( -1 );
|
||||
fgSizerSizes->Add( m_stTdSizePercent, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
|
||||
bSizeScopeSize->Add( fgSizerSizes, 0, wxEXPAND|wxALL, 5 );
|
||||
|
||||
|
||||
bSizerTop->Add( bSizeScopeSize, 0, wxEXPAND, 5 );
|
||||
|
||||
|
||||
bSizerUpper->Add( bSizerTop, 0, wxEXPAND, 5 );
|
||||
|
||||
wxBoxSizer* bSizerShape;
|
||||
bSizerShape = new wxBoxSizer( wxHORIZONTAL );
|
||||
|
||||
wxStaticBoxSizer* sbSizerScope;
|
||||
sbSizerScope = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("Scope") ), wxVERTICAL );
|
||||
|
||||
m_cbPadVia = new wxCheckBox( sbSizerScope->GetStaticBox(), wxID_ANY, wxT("Vias and PTH pads"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_cbPadVia->SetValue(true);
|
||||
sbSizerScope->Add( m_cbPadVia, 0, wxALL, 5 );
|
||||
|
||||
m_cbRoundShapesOnly = new wxCheckBox( sbSizerScope->GetStaticBox(), wxID_ANY, wxT("Round pads only"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbSizerScope->Add( m_cbRoundShapesOnly, 0, wxALL, 5 );
|
||||
|
||||
m_cbSmdSimilarPads = new wxCheckBox( sbSizerScope->GetStaticBox(), wxID_ANY, wxT("Not Drilled Pads"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_cbSmdSimilarPads->SetValue(true);
|
||||
sbSizerScope->Add( m_cbSmdSimilarPads, 0, wxALL, 5 );
|
||||
|
||||
m_cbTrack2Track = new wxCheckBox( sbSizerScope->GetStaticBox(), wxID_ANY, wxT("Track to track"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
sbSizerScope->Add( m_cbTrack2Track, 0, wxALL, 5 );
|
||||
|
||||
|
||||
bSizerShape->Add( sbSizerScope, 0, 0, 5 );
|
||||
|
||||
|
||||
bSizerShape->Add( 30, 10, 1, wxEXPAND, 5 );
|
||||
|
||||
wxString m_rbShapeChoices[] = { wxT("Straight lines"), wxT("Curved for round pads"), wxT("Curved for all pad shapes") };
|
||||
int m_rbShapeNChoices = sizeof( m_rbShapeChoices ) / sizeof( wxString );
|
||||
m_rbShape = new wxRadioBox( this, wxID_ANY, wxT("Teardrop style"), wxDefaultPosition, wxDefaultSize, m_rbShapeNChoices, m_rbShapeChoices, 1, wxRA_SPECIFY_COLS );
|
||||
m_rbShape->SetSelection( 0 );
|
||||
bSizerShape->Add( m_rbShape, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
|
||||
bSizerShape->Add( 30, 0, 0, 0, 5 );
|
||||
|
||||
m_stPoinCount = new wxStaticText( this, wxID_ANY, wxT("Curve points"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_stPoinCount->Wrap( -1 );
|
||||
bSizerShape->Add( m_stPoinCount, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
m_spPointCount = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 3, 10, 5 );
|
||||
bSizerShape->Add( m_spPointCount, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
|
||||
|
||||
|
||||
bSizerUpper->Add( bSizerShape, 0, wxEXPAND, 5 );
|
||||
|
||||
wxStaticBoxSizer* sbSizerOptions;
|
||||
sbSizerOptions = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("Options") ), wxVERTICAL );
|
||||
|
||||
m_cbOptUseNextTrack = new wxCheckBox( sbSizerOptions->GetStaticBox(), wxID_ANY, wxT("Allows use two tracks"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||
m_cbOptUseNextTrack->SetValue(true);
|
||||
m_cbOptUseNextTrack->SetToolTip( wxT("Allows a teardrop to spread over 2 tracks if the first track segment is too short") );
|
||||
|
||||
sbSizerOptions->Add( m_cbOptUseNextTrack, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
|
||||
|
||||
|
||||
bSizerUpper->Add( sbSizerOptions, 1, wxEXPAND, 5 );
|
||||
|
||||
m_staticline1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
||||
bSizerUpper->Add( m_staticline1, 0, wxEXPAND | wxALL, 5 );
|
||||
|
||||
|
||||
bSizerMain->Add( bSizerUpper, 1, wxEXPAND, 5 );
|
||||
|
||||
m_sdbSizer = new wxStdDialogButtonSizer();
|
||||
m_sdbSizerOK = new wxButton( this, wxID_OK );
|
||||
m_sdbSizer->AddButton( m_sdbSizerOK );
|
||||
m_sdbSizerCancel = new wxButton( this, wxID_CANCEL );
|
||||
m_sdbSizer->AddButton( m_sdbSizerCancel );
|
||||
m_sdbSizer->Realize();
|
||||
|
||||
bSizerMain->Add( m_sdbSizer, 0, wxALIGN_RIGHT|wxALL, 5 );
|
||||
|
||||
|
||||
this->SetSizer( bSizerMain );
|
||||
this->Layout();
|
||||
|
||||
this->Centre( wxBOTH );
|
||||
}
|
||||
|
||||
TEARDROP_DIALOG_BASE::~TEARDROP_DIALOG_BASE()
|
||||
{
|
||||
}
|
|
@ -0,0 +1,82 @@
|
|||
///////////////////////////////////////////////////////////////////////////
|
||||
// C++ code generated with wxFormBuilder (version 3.10.0-39-g3487c3cb)
|
||||
// http://www.wxformbuilder.org/
|
||||
//
|
||||
// PLEASE DO *NOT* EDIT THIS FILE!
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <wx/artprov.h>
|
||||
#include <wx/xrc/xmlres.h>
|
||||
#include "dialog_shim.h"
|
||||
#include <wx/bitmap.h>
|
||||
#include <wx/image.h>
|
||||
#include <wx/icon.h>
|
||||
#include <wx/statbmp.h>
|
||||
#include <wx/gdicmn.h>
|
||||
#include <wx/font.h>
|
||||
#include <wx/colour.h>
|
||||
#include <wx/settings.h>
|
||||
#include <wx/string.h>
|
||||
#include <wx/sizer.h>
|
||||
#include <wx/stattext.h>
|
||||
#include <wx/textctrl.h>
|
||||
#include <wx/spinctrl.h>
|
||||
#include <wx/statline.h>
|
||||
#include <wx/checkbox.h>
|
||||
#include <wx/statbox.h>
|
||||
#include <wx/radiobox.h>
|
||||
#include <wx/button.h>
|
||||
#include <wx/dialog.h>
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/// Class TEARDROP_DIALOG_BASE
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
class TEARDROP_DIALOG_BASE : public DIALOG_SHIM
|
||||
{
|
||||
private:
|
||||
|
||||
protected:
|
||||
wxStaticBitmap* m_bitmapTdCircularInfo;
|
||||
wxStaticBitmap* m_bitmapTdRectangularInfo;
|
||||
wxStaticBitmap* m_bitmapTdTrackInfo;
|
||||
wxStaticText* m_stMaxLen;
|
||||
wxTextCtrl* m_tcTdMaxLen;
|
||||
wxStaticText* m_stLenUnit;
|
||||
wxStaticText* m_stHsetting;
|
||||
wxSpinCtrlDouble* m_spTeardropLenPercent;
|
||||
wxStaticText* m_stLenPercent;
|
||||
wxStaticLine* m_staticline5;
|
||||
wxStaticLine* m_staticline6;
|
||||
wxStaticLine* m_staticline7;
|
||||
wxStaticText* m_stTdMaxSize;
|
||||
wxTextCtrl* m_tcMaxSize;
|
||||
wxStaticText* m_stSizeUnit;
|
||||
wxStaticText* m_stVsetting;
|
||||
wxSpinCtrlDouble* m_spTeardropSizePercent;
|
||||
wxStaticText* m_stTdSizePercent;
|
||||
wxCheckBox* m_cbPadVia;
|
||||
wxCheckBox* m_cbRoundShapesOnly;
|
||||
wxCheckBox* m_cbSmdSimilarPads;
|
||||
wxCheckBox* m_cbTrack2Track;
|
||||
wxRadioBox* m_rbShape;
|
||||
wxStaticText* m_stPoinCount;
|
||||
wxSpinCtrl* m_spPointCount;
|
||||
wxCheckBox* m_cbOptUseNextTrack;
|
||||
wxStaticLine* m_staticline1;
|
||||
wxStdDialogButtonSizer* m_sdbSizer;
|
||||
wxButton* m_sdbSizerOK;
|
||||
wxButton* m_sdbSizerCancel;
|
||||
|
||||
public:
|
||||
|
||||
TEARDROP_DIALOG_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxT("Teardrop Settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 477,427 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
|
||||
|
||||
~TEARDROP_DIALOG_BASE();
|
||||
|
||||
};
|
||||
|
|
@ -0,0 +1,382 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2021 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
||||
* Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
|
||||
#include <confirm.h>
|
||||
|
||||
#include <board_design_settings.h>
|
||||
#include <pcb_track.h>
|
||||
#include <pad.h>
|
||||
#include <zone_filler.h>
|
||||
#include <board_commit.h>
|
||||
|
||||
#include "teardrop.h"
|
||||
#include <geometry/convex_hull.h>
|
||||
#include <geometry/shape_line_chain.h>
|
||||
#include <convert_basic_shapes_to_polygon.h>
|
||||
#include <bezier_curves.h>
|
||||
|
||||
#include <wx/log.h>
|
||||
|
||||
|
||||
void TEARDROP_MANAGER::SetTargets( bool aApplyToPadVias, bool aApplyToRoundShapesOnly,
|
||||
bool aApplyToSurfacePads, bool aApplyToTracks )
|
||||
{
|
||||
m_applyToViaPads = aApplyToPadVias;
|
||||
m_applyToRoundShapesOnly = aApplyToRoundShapesOnly;
|
||||
m_applyToSurfacePads = aApplyToSurfacePads;
|
||||
m_applyToTracks = aApplyToTracks;
|
||||
}
|
||||
|
||||
|
||||
// Build a zone teardrop
|
||||
ZONE* TEARDROP_MANAGER::createTeardrop( TEARDROP_VARIANT aTeardropVariant,
|
||||
std::vector<wxPoint>& aPoints, PCB_TRACK* aTrack)
|
||||
{
|
||||
ZONE* teardrop = new ZONE( m_board );
|
||||
|
||||
// Add zone properties (priority will be fixed later)
|
||||
teardrop->SetIsTeardropArea( true );
|
||||
teardrop->SetLayer( aTrack->GetLayer() );
|
||||
teardrop->SetNetCode( aTrack->GetNetCode() );
|
||||
teardrop->SetLocalClearance( 0 );
|
||||
teardrop->SetMinThickness( Millimeter2iu( 0.0254 ) ); // The minimum zone thickness
|
||||
teardrop->SetPadConnection( ZONE_CONNECTION::FULL );
|
||||
teardrop->SetIsFilled( false );
|
||||
teardrop->SetZoneName( aTeardropVariant == TD_TYPE_PADVIA ?
|
||||
MAGIC_TEARDROP_PADVIA_NAME :
|
||||
MAGIC_TEARDROP_TRACK_NAME );
|
||||
teardrop->SetIslandRemovalMode( ISLAND_REMOVAL_MODE::NEVER );
|
||||
SHAPE_POLY_SET* outline = teardrop->Outline();
|
||||
outline->NewOutline();
|
||||
|
||||
for( wxPoint pt: aPoints )
|
||||
outline->Append(pt.x, pt.y);
|
||||
|
||||
// Can be usefull:
|
||||
teardrop->CalculateFilledArea();
|
||||
|
||||
return teardrop;
|
||||
}
|
||||
|
||||
|
||||
int TEARDROP_MANAGER::SetTeardrops( BOARD_COMMIT* aCommitter,
|
||||
bool aDiscardInSameZone, bool aFollowTracks )
|
||||
{
|
||||
// Init parameters:
|
||||
m_Parameters.m_tolerance = Millimeter2iu( 0.01 );
|
||||
|
||||
int count = 0; // Number of created teardrop
|
||||
|
||||
// Old teardrops must be removed, to ensure a clean teardrop rebuild
|
||||
int removed_cnt = RemoveTeardrops( aCommitter, false );
|
||||
|
||||
// get vias, PAD_ATTRIB_PTH and others if aIncludeNotDrilled == true
|
||||
// (custom pads are not collected)
|
||||
std::vector< VIAPAD > viapad_list;
|
||||
collectVias( viapad_list );
|
||||
collectPadsCandidate( viapad_list, m_applyToRoundShapesOnly, m_applyToSurfacePads );
|
||||
|
||||
TRACK_BUFFER trackLookupList;
|
||||
|
||||
if( aFollowTracks )
|
||||
{
|
||||
// Build the track list (only straight lines)
|
||||
for( PCB_TRACK* track: m_board->Tracks() )
|
||||
{
|
||||
if( track->Type() == PCB_TRACE_T )
|
||||
{
|
||||
int netcode = track->GetNetCode();
|
||||
int layer = track->GetLayer();
|
||||
trackLookupList.AddTrack( track, layer, netcode );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
std::vector< ZONE*> teardrops;
|
||||
collectTeardrops( teardrops );
|
||||
|
||||
for( PCB_TRACK* track : m_board->Tracks() )
|
||||
{
|
||||
if( track->Type() != PCB_TRACE_T )
|
||||
continue;
|
||||
|
||||
// Search for a padvia connected to track, with one end inside and one end outside
|
||||
// if both track ends are inside or outside, one cannot build a teadrop
|
||||
for( VIAPAD& viapad: viapad_list )
|
||||
{
|
||||
bool start_in_pad = viapad.m_Parent->HitTest( track->GetStart() );
|
||||
bool end_in_pad = viapad.m_Parent->HitTest( track->GetEnd() );
|
||||
|
||||
if( end_in_pad == start_in_pad )
|
||||
// the track is inside or outside the via pad. Cannot create a teardrop
|
||||
continue;
|
||||
|
||||
// Ensure a teardrop shape can be built:
|
||||
// The track width must be < teardrop height
|
||||
if( track->GetWidth() >= m_Parameters.m_tdMaxHeight
|
||||
|| track->GetWidth() >= viapad.m_Width * m_Parameters.m_heightRatio )
|
||||
continue;
|
||||
|
||||
// Pad and track must be on the same layer
|
||||
if( !viapad.IsOnLayer( track->GetLayer() ) )
|
||||
continue;
|
||||
|
||||
// Skip case where pad/via and the track is within a copper zone with the same net
|
||||
// (and the pad can be connected by the zone thermal relief )
|
||||
if( aDiscardInSameZone && isViaAndTrackInSameZone( viapad, track ) )
|
||||
continue;
|
||||
|
||||
std::vector<wxPoint> points;
|
||||
bool success = computeTeardropPolygonPoints( points, track, viapad,
|
||||
aFollowTracks, trackLookupList );
|
||||
|
||||
if( success )
|
||||
{
|
||||
ZONE* new_teardrop = createTeardrop( TD_TYPE_PADVIA, points, track );
|
||||
m_board->Add( new_teardrop, ADD_MODE::BULK_INSERT );
|
||||
m_createdTdList.push_back( new_teardrop );
|
||||
|
||||
if( aCommitter )
|
||||
aCommitter->Added( new_teardrop );
|
||||
|
||||
count += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int track2trackCount = 0;
|
||||
|
||||
if( m_applyToTracks )
|
||||
track2trackCount = addTeardropsOnTracks( aCommitter );
|
||||
|
||||
// Now set priority of teardrops now all teardrops are added
|
||||
setTeardropPriorities();
|
||||
|
||||
if( count || removed_cnt || track2trackCount )
|
||||
{
|
||||
ZONE_FILLER filler( m_board, aCommitter );
|
||||
filler.Fill( m_board->Zones() );
|
||||
|
||||
if( aCommitter )
|
||||
aCommitter->Push( _( "Add teardrops" ) );
|
||||
}
|
||||
|
||||
return count + track2trackCount;
|
||||
}
|
||||
|
||||
|
||||
void TEARDROP_MANAGER::setTeardropPriorities()
|
||||
{
|
||||
int priority_base = MAGIC_TEARDROP_ZONE_ID;
|
||||
|
||||
// The sort function to sort by increasing copper layers. Group by layers.
|
||||
// For same layers sort by decreasing areas
|
||||
struct
|
||||
{
|
||||
bool operator()(ZONE* a, ZONE* b) const
|
||||
{
|
||||
if( a->GetLayer() == b->GetLayer() )
|
||||
return a->GetOutlineArea() > b->GetOutlineArea();
|
||||
|
||||
return a->GetLayer() < b->GetLayer();
|
||||
}
|
||||
} compareLess;
|
||||
|
||||
for( ZONE* td: m_createdTdList )
|
||||
td->CalculateOutlineArea();
|
||||
|
||||
std::sort( m_createdTdList.begin(), m_createdTdList.end(), compareLess );
|
||||
|
||||
int curr_layer = -1;
|
||||
|
||||
for( ZONE* td: m_createdTdList )
|
||||
{
|
||||
if( td->GetLayer() != curr_layer )
|
||||
{
|
||||
curr_layer = td->GetLayer();
|
||||
priority_base = MAGIC_TEARDROP_ZONE_ID;
|
||||
}
|
||||
|
||||
td->SetPriority( priority_base++ );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int TEARDROP_MANAGER::addTeardropsOnTracks( BOARD_COMMIT* aCommitter )
|
||||
{
|
||||
TRACK_BUFFER trackLookupList;
|
||||
int count = 0;
|
||||
|
||||
// Build the track list (only straight lines)
|
||||
for( PCB_TRACK* track: m_board->Tracks() )
|
||||
{
|
||||
if( track->Type() == PCB_TRACE_T )
|
||||
{
|
||||
int netcode = track->GetNetCode();
|
||||
int layer = track->GetLayer();
|
||||
trackLookupList.AddTrack( track, layer, netcode );
|
||||
}
|
||||
}
|
||||
|
||||
// get vias and pads (custom pads are not collected). We do not create a track to track
|
||||
// teardrop inside a pad or via area
|
||||
std::vector< VIAPAD > viapad_list;
|
||||
collectVias( viapad_list );
|
||||
collectPadsCandidate( viapad_list, true, true );
|
||||
|
||||
// Explore groups (a group is a set of tracks on the same layer and the same net):
|
||||
for( auto grp : trackLookupList.GetBuffer() )
|
||||
{
|
||||
int layer, netcode;
|
||||
TRACK_BUFFER::GetNetcodeAndLayerFromIndex( grp.first, &layer, &netcode );
|
||||
|
||||
std::vector<PCB_TRACK*>* sublist = grp.second;
|
||||
|
||||
if( sublist->size() <= 1 ) // We need at least 2 track segments
|
||||
continue;
|
||||
|
||||
// The sort function to sort by increasing track widths
|
||||
struct
|
||||
{
|
||||
bool operator()(PCB_TRACK* a, PCB_TRACK* b) const
|
||||
{ return a->GetWidth() < b->GetWidth(); }
|
||||
} compareLess;
|
||||
|
||||
std::sort( sublist->begin(), sublist->end(), compareLess );
|
||||
int min_width = sublist->front()->GetWidth();
|
||||
int max_width = sublist->back()->GetWidth();
|
||||
|
||||
// Skip groups having the same track thickness
|
||||
if( max_width == min_width )
|
||||
continue;
|
||||
|
||||
for( unsigned ii = 0; ii < sublist->size()-1; ii++ )
|
||||
{
|
||||
PCB_TRACK* track = (*sublist)[ii];
|
||||
int track_len = track->GetLength();
|
||||
min_width = track->GetWidth();
|
||||
|
||||
// to avoid creating a teardrop between 2 tracks having similar widths
|
||||
// give a threshold
|
||||
const double th = 1.2;
|
||||
min_width = min_width * th;
|
||||
|
||||
for( unsigned jj = ii+1; jj < sublist->size(); jj++ )
|
||||
{
|
||||
// Seach candidates with thickness > curr thickness
|
||||
PCB_TRACK* candidate = (*sublist)[jj];
|
||||
|
||||
if( min_width >= candidate->GetWidth() )
|
||||
continue;
|
||||
|
||||
// Cannot build a teardrop on a too short track segment.
|
||||
// The min len is > candidate radius
|
||||
if( track_len <= candidate->GetWidth() /2 )
|
||||
continue;
|
||||
|
||||
// Now test end to end connection:
|
||||
EDA_ITEM_FLAGS match_points; // to return the end point EDA_ITEM_FLAGS:
|
||||
// 0, STARTPOINT, ENDPOINT
|
||||
|
||||
wxPoint roundshape_pos = candidate->GetStart();
|
||||
ENDPOINT_T endPointCandidate = ENDPOINT_START;
|
||||
match_points = track->IsPointOnEnds( roundshape_pos, m_Parameters.m_tolerance);
|
||||
|
||||
if( !match_points )
|
||||
{
|
||||
roundshape_pos = candidate->GetEnd();
|
||||
match_points = track->IsPointOnEnds( roundshape_pos, m_Parameters.m_tolerance);
|
||||
endPointCandidate = ENDPOINT_END;
|
||||
}
|
||||
|
||||
// Ensure a pad or via is not on test_pos point before creating a teardrop
|
||||
// at this location
|
||||
for( VIAPAD& viapad : viapad_list )
|
||||
{
|
||||
if( viapad.IsOnLayer( track->GetLayer() )
|
||||
&& viapad.m_Parent->HitTest( roundshape_pos, 0 ) )
|
||||
{
|
||||
match_points = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if( match_points )
|
||||
{
|
||||
VIAPAD viatrack( candidate, endPointCandidate );
|
||||
std::vector<wxPoint> points;
|
||||
bool success = computeTeardropPolygonPoints( points, track, viatrack,
|
||||
false, trackLookupList );
|
||||
|
||||
if( success )
|
||||
{
|
||||
ZONE* new_teardrop = createTeardrop( TD_TYPE_TRACKEND, points, track );
|
||||
m_board->Add( new_teardrop, ADD_MODE::BULK_INSERT );
|
||||
m_createdTdList.push_back( new_teardrop );
|
||||
|
||||
if( aCommitter )
|
||||
aCommitter->Added( new_teardrop );
|
||||
|
||||
count += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
|
||||
int TEARDROP_MANAGER::RemoveTeardrops( BOARD_COMMIT* aCommitter, bool aCommitAfterRemove )
|
||||
{
|
||||
int count = 0;
|
||||
std::vector< ZONE*> teardrops;
|
||||
|
||||
collectTeardrops( teardrops );
|
||||
|
||||
for( ZONE* teardrop : teardrops )
|
||||
{
|
||||
m_board->Remove( teardrop, REMOVE_MODE::BULK );
|
||||
|
||||
if( aCommitter )
|
||||
aCommitter->Removed( teardrop );
|
||||
|
||||
count += 1;
|
||||
}
|
||||
|
||||
if( count )
|
||||
{
|
||||
ZONE_FILLER filler( m_board, aCommitter );
|
||||
filler.Fill( m_board->Zones() );
|
||||
|
||||
if( aCommitter && aCommitAfterRemove )
|
||||
aCommitter->Push( _( "Remove teardrops" ) );
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
|
@ -0,0 +1,414 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2021 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
||||
* Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
|
||||
#include <pcb_edit_frame.h>
|
||||
#include <board.h>
|
||||
#include <footprint.h>
|
||||
#include <pad.h>
|
||||
#include <pcb_track.h>
|
||||
#include <zone.h>
|
||||
|
||||
// TODO: remove MAGIC_TEARDROP_ZONE_ID use to identifay teardrops
|
||||
// Use only MAGIC_TEARDROP_NAME, and later a specific property
|
||||
#define MAGIC_TEARDROP_ZONE_ID 0x4242
|
||||
#define MAGIC_TEARDROP_PADVIA_NAME "$teardrop_padvia$"
|
||||
#define MAGIC_TEARDROP_TRACK_NAME "$teardrop_track$"
|
||||
#define MAGIC_TEARDROP_BASE_NAME "$teardrop_"
|
||||
|
||||
class TRACK_BUFFER;
|
||||
|
||||
/**
|
||||
* Stores info of a pad, via or track end to build a teardrop
|
||||
*/
|
||||
struct VIAPAD
|
||||
{
|
||||
VIAPAD( PCB_VIA* aVia );
|
||||
VIAPAD( PAD* aPad );
|
||||
VIAPAD( PCB_TRACK* aTrack, ENDPOINT_T aEndPoint );
|
||||
|
||||
bool IsOnLayer( PCB_LAYER_ID aLayer ) const
|
||||
{
|
||||
return m_Parent->IsOnLayer( aLayer );
|
||||
}
|
||||
|
||||
wxPoint m_Pos;
|
||||
int m_Width; // The diameter of a round shape, or the min size for others
|
||||
int m_Drill;
|
||||
int m_NetCode;
|
||||
bool m_IsRound; // true for round shapes, false for any other shape
|
||||
bool m_IsPad; // true for pads, false for vias and tracks
|
||||
BOARD_CONNECTED_ITEM* m_Parent;
|
||||
};
|
||||
|
||||
|
||||
enum class CURVED_OPTION
|
||||
{
|
||||
OPTION_NONE, // No curved teardrop shape
|
||||
OPTION_ROUND, // Curved teardrop shape for vias and round pads
|
||||
OPTION_ALL_PADS, // Curved teardrop shape for all pads but custom
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* TEARDROP_PARAMETARS is a helper class to handle parameters needed to build teardrops
|
||||
* for a board
|
||||
* these parameters are sizes and filters
|
||||
*/
|
||||
class TEARDROP_PARAMETERS
|
||||
{
|
||||
friend class TEARDROP_MANAGER;
|
||||
|
||||
public:
|
||||
TEARDROP_PARAMETERS():
|
||||
m_tdMaxLen( Millimeter2iu( 1.0 ) ),
|
||||
m_tdMaxHeight( Millimeter2iu( 2.0 ) ),
|
||||
m_lenghtRatio( 0.5),
|
||||
m_heightRatio( 1.0 ),
|
||||
m_curveSegCount( 0 ),
|
||||
m_tolerance( Millimeter2iu( 0.01 ) ),
|
||||
m_curveOpt( CURVED_OPTION::OPTION_NONE )
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Set max allowed lenght and height for teardrops in IU.
|
||||
* a value <= 0 disable the constraint
|
||||
*/
|
||||
void SetTeardropMaxSize( int aMaxLen, int aMaxHeight )
|
||||
{
|
||||
m_tdMaxLen = aMaxLen;
|
||||
m_tdMaxHeight = aMaxHeight;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set prefered lenght and height ratio for teardrops
|
||||
* the prefered lenght and height are VIAPAD width * aLenghtRatio and
|
||||
* VIAPAD width * aHeightRatio
|
||||
*/
|
||||
void SetTeardropSizeRatio( double aLenghtRatio = 0.5, double aHeightRatio = 1.0 )
|
||||
{
|
||||
m_lenghtRatio = aLenghtRatio;
|
||||
m_heightRatio = aHeightRatio;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the params for teardrop using curved shape
|
||||
* note: if aCurveSegCount is < 3, the shape uses a straight line
|
||||
*/
|
||||
void SetTeardropCurvedPrms( CURVED_OPTION aCurveOpt = CURVED_OPTION::OPTION_NONE,
|
||||
int aCurveSegCount = 5 )
|
||||
{
|
||||
m_curveOpt = aCurveOpt;
|
||||
m_curveSegCount = aCurveSegCount;
|
||||
}
|
||||
|
||||
protected:
|
||||
int m_tdMaxLen; /// max allowed lenght for teardrops in IU. <= 0 to disable
|
||||
int m_tdMaxHeight; /// max allowed height for teardrops in IU. <= 0 to disable
|
||||
double m_lenghtRatio; /// The lenght of a teardrop as ratio between lenght and size of pad/via
|
||||
double m_heightRatio; /// The height of a teardrop as ratio between height and size of pad/via
|
||||
int m_curveSegCount; /// number of segments to build the curved sides of a teardrop area
|
||||
/// must be > 2. for values <= 2 a straight line is used
|
||||
int m_tolerance; /// the max distance between a track end and a padvia position to see
|
||||
/// them connected
|
||||
CURVED_OPTION m_curveOpt;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* TEARDROP_MANAGER manage and build teardrop areas
|
||||
* A teardrop area is a polygonal area (a copper ZONE) having:
|
||||
* 2 points on the track connected to a pad or via
|
||||
* 2 points on the outline of this pad or via
|
||||
* 1 point near the pad/via position (calculated in order to have this pad/via position
|
||||
* inside the area
|
||||
* The 2 sides joining a point on the track to the corresponding point on the pad/via
|
||||
* outline can be a straight line or a curved shape (defined from a Bezier curve)
|
||||
* This curved shape is built by segments (3 to 10) from this Bezier curve
|
||||
* Because one cannot build a suitable shape for a custom pad, custom pads are ignored.
|
||||
* Size of area (height and lenght) are defined from the pad/via size or for pads having
|
||||
* a size X and a size Y, the smallest of X,Y size.
|
||||
*/
|
||||
class TEARDROP_MANAGER
|
||||
{
|
||||
friend class TEARDROP_PARAMETERS;
|
||||
|
||||
public:
|
||||
enum TEARDROP_VARIANT
|
||||
{
|
||||
TD_TYPE_PADVIA, // Specify a teardrop on a pad via
|
||||
TD_TYPE_TRACKEND // specify a teardrop on a rond end of a wide track
|
||||
};
|
||||
|
||||
TEARDROP_MANAGER( BOARD* aBoard, PCB_EDIT_FRAME* aFrame ) :
|
||||
m_applyToViaPads( true ),
|
||||
m_applyToRoundShapesOnly( false ),
|
||||
m_applyToSurfacePads( true ),
|
||||
m_board( aBoard )
|
||||
{}
|
||||
|
||||
/**
|
||||
* Set teardrops on a teardrop free board
|
||||
* @return the number of teardrop created
|
||||
* @param aCommitter is a BOARD_COMMIT reference (can be null)
|
||||
* @param aDiscardInSameZone = to do not create teardrops for pads in a zone of the same net
|
||||
* @param aFollowTracks = true to use a track connected to the initial track connected
|
||||
* to a pad / via if this initial track is too short to build the teardrop
|
||||
*/
|
||||
int SetTeardrops( BOARD_COMMIT* aCommitter,
|
||||
bool aDiscardInSameZone = true,
|
||||
bool aFollowTracks = true );
|
||||
|
||||
|
||||
/**
|
||||
* Remove all teardrops
|
||||
* @return the count of removed teardrops
|
||||
* @param aCommitter is a BOARD_COMMITto handle undo/Redo commands
|
||||
* @param aCommitAfterRemove = true to commit when removed,
|
||||
* false if some other changes must be made and the actual commit postponed
|
||||
* Can be nullptr
|
||||
*/
|
||||
int RemoveTeardrops( BOARD_COMMIT* aCommitter, bool aCommitAfterRemove );
|
||||
|
||||
/**
|
||||
* Set max allowed lenght and height for teardrops in IU.
|
||||
* a value <= 0 disable the constraint
|
||||
*/
|
||||
void SetTeardropMaxSize( int aMaxLen, int aMaxHeight )
|
||||
{
|
||||
m_Parameters.SetTeardropMaxSize( aMaxLen, aMaxHeight );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set prefered lenght and height ratio for teardrops
|
||||
* the prefered lenght and height are VIAPAD width * aLenghtRatio and
|
||||
* VIAPAD width * aHeightRatio
|
||||
*/
|
||||
void SetTeardropSizeRatio( double aLenghtRatio = 0.5, double aHeightRatio = 1.0 )
|
||||
{
|
||||
m_Parameters.SetTeardropSizeRatio( aLenghtRatio, aHeightRatio );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the params for teardrop using curved shape
|
||||
* note: if aSegCount is < 3, the shape uses a straight line
|
||||
*/
|
||||
void SetTeardropCurvedPrms( CURVED_OPTION aCurveOpt = CURVED_OPTION::OPTION_NONE,
|
||||
int aCurveSegCount = 5 )
|
||||
{
|
||||
m_Parameters.SetTeardropCurvedPrms( aCurveOpt, aCurveSegCount );
|
||||
}
|
||||
|
||||
/**
|
||||
* Define the items used to add a teardrop
|
||||
* @param aApplyToPadVias = true to add Td to vias and PTH
|
||||
* @param aApplyToRoundShapesOnly = true to restrict Td on round PTH
|
||||
* @param aApplyToSurfacePads = true to add Td to not drilled pads (like SMD)
|
||||
* @param aApplyToTracks = true to add Td to tracks connected point when having
|
||||
* different sizes
|
||||
*/
|
||||
void SetTargets( bool aApplyToPadVias, bool aApplyToRoundShapesOnly,
|
||||
bool aApplyToSurfacePads, bool aApplyToTracks );
|
||||
|
||||
TEARDROP_PARAMETERS m_Parameters;
|
||||
|
||||
private:
|
||||
/**
|
||||
* Collect and build the list of all vias from the given board
|
||||
*/
|
||||
void collectVias( std::vector< VIAPAD >& aList );
|
||||
|
||||
/**
|
||||
* Build a list of pads candidate for teardrops from the given board
|
||||
* Pads with no net are not candidate (and have no track connected
|
||||
* Custom pads are not candidate because one cannot define a teardrop shape
|
||||
* @param aList is the list of VIAPAD to fill
|
||||
* @param aRoundShapesOnly = true to ignore not round shapes
|
||||
* @param aIncludeNotDrilled = true to include not drilled pads like SMD
|
||||
*/
|
||||
void collectPadsCandidate( std::vector< VIAPAD >& aList,
|
||||
bool aRoundShapesOnly,
|
||||
bool aIncludeNotDrilled );
|
||||
|
||||
/**
|
||||
* Build a list of all teardrops on the current board
|
||||
* @param aList is the list to populate
|
||||
*/
|
||||
void collectTeardrops( std::vector< ZONE* >& aList );
|
||||
|
||||
/**
|
||||
* Add teardrop on tracks of different sizes connected by their end
|
||||
*/
|
||||
int addTeardropsOnTracks( BOARD_COMMIT* aCommitter );
|
||||
|
||||
/**
|
||||
* @return true if the given aVia + aTrack is located inside a zone of the same netname
|
||||
*/
|
||||
bool isViaAndTrackInSameZone( VIAPAD& aVia, PCB_TRACK* aTrack) const;
|
||||
|
||||
/**
|
||||
* Compute the curve part points for teardrops connected to a round shape
|
||||
* The Bezier curve control points are optimized for a round pad/via shape,
|
||||
* and do not give a good curve shape for other pad shapes
|
||||
* use m_m_heightRatio
|
||||
*/
|
||||
void computeCurvedForRoundShape( std::vector<wxPoint>& aPoly,
|
||||
int aTrackHalfWidth,
|
||||
VECTOR2D aTrackDir, VIAPAD& aViaPad,
|
||||
std::vector<wxPoint>& aPts ) const;
|
||||
|
||||
|
||||
/**
|
||||
* Compute the curve part points for teardrops connected to a rectangular/polygonal shape
|
||||
* The Bezier curve control points are not optimized for a special shape,
|
||||
* so use computeCurvedForRoundShape() for round shapes for better result
|
||||
*/
|
||||
void computeCurvedForRectShape( std::vector<wxPoint>& aPoly, int aTdHeight,
|
||||
int aTrackHalfWidth, VIAPAD& aViaPad,
|
||||
std::vector<wxPoint>& aPts ) const;
|
||||
|
||||
/**
|
||||
* Compute all teardrop points of the polygon shape
|
||||
* @return true if the polygonal shape was calculated, false if not buildable
|
||||
* use m_lenghtRatio and m_heightRatio
|
||||
*/
|
||||
bool computeTeardropPolygonPoints( std::vector<wxPoint>& aCorners,
|
||||
PCB_TRACK* aTrack, VIAPAD& aVia,
|
||||
bool aFollowTracks,
|
||||
TRACK_BUFFER& aTrackLookupList) const;
|
||||
/**
|
||||
* Compute the 2 points on pad/via of the teardrop shape
|
||||
* @return false if these 2 points are not found
|
||||
* @param aTrack is the reference track included in teardrop
|
||||
* @param aViaPad is the teardrop anchor
|
||||
* teardrop height = aViaPad size * aHeightRatio
|
||||
* @param aPts is the buffer that contains initial and final teardrop polygonal shape
|
||||
* in aPts:
|
||||
* A and B ( aPts[0] and aPts[1] ) are points on the track
|
||||
* C and E ( aPts[2] and aPts[4] ) are points on the aViaPad
|
||||
* D ( aPts[3] ) is midpoint behind the aViaPad centre
|
||||
* m_heightRatio is the factor to calculate the aViaPad teardrop size
|
||||
*/
|
||||
bool ComputePointsOnPadVia( PCB_TRACK* aTrack, VIAPAD& aViaPad,
|
||||
std::vector<wxPoint>& aPts ) const;
|
||||
|
||||
/**
|
||||
* Find a track connected to the end of another track
|
||||
* @return a reference to the touching track (or nullptr)
|
||||
* @param aMatchType returns the end point id 0, STARTPOINT, ENDPOINT
|
||||
* @param aTrackRef is the reference track
|
||||
* @param aEndpoint is the coordinate to test
|
||||
* @param aTrackLookupList is the buffer of available tracks
|
||||
*/
|
||||
PCB_TRACK* findTouchingTrack( EDA_ITEM_FLAGS& aMatchType, PCB_TRACK* aTrackRef,
|
||||
const wxPoint& aEndPoint,
|
||||
TRACK_BUFFER& aTrackLookupList ) const;
|
||||
|
||||
/**
|
||||
* Creates a teardrop (a ZONE item) from its polygonal shape, track netcode and layer
|
||||
* @param aTeardropVariant = variant of the teardrop( attached to a pad, or a track end )
|
||||
* @param aPoints is the polygonal shape
|
||||
* @param aTrack is the track connected to the starting points of the teardrop
|
||||
* (mainly for net info)
|
||||
*/
|
||||
ZONE* createTeardrop( TEARDROP_VARIANT aTeardropVariant,
|
||||
std::vector<wxPoint>& aPoints, PCB_TRACK* aTrack);
|
||||
|
||||
/**
|
||||
* Set priority of created teardrops. smaller have bigger priority
|
||||
*/
|
||||
void setTeardropPriorities();
|
||||
|
||||
/**
|
||||
* @return true if a point on a track can be found as anchor point of a teardrop
|
||||
* @param aStartPoint is the start point of the track found (always inside the teardrop)
|
||||
* @param aEndPoint is the start point of the track found (always outside the teardrop)
|
||||
* @param aTrack is the track connected to the pad/via used to search a anchor point
|
||||
* this reference can be modified if a connected track to the initial track is selected
|
||||
* @param aViaPad is the via/pad used to build the teardrop
|
||||
* @param aEffectiveTeardropLen is the actual teardrop length, that can be smaller than expected
|
||||
* if the connected track length is too small
|
||||
* @param aFollowTracks = true to use a connected track to aTrack if aTrack is too small
|
||||
* @param aTrackLookupList is the list of tracks to explore if aFollowTracks = true
|
||||
* m_lenghtRatio is the lenght of teardrop (ratio pad/via size/teardrop len)
|
||||
*/
|
||||
bool findAnchorPointsOnTrack( wxPoint& aStartPoint, wxPoint& aEndPoint,
|
||||
PCB_TRACK*& aTrack, VIAPAD& aViaPad,
|
||||
int* aEffectiveTeardropLen,
|
||||
bool aFollowTracks, TRACK_BUFFER& aTrackLookupList ) const;
|
||||
|
||||
private:
|
||||
bool m_applyToViaPads; // true to add a teardrop to vias and PTH pads
|
||||
bool m_applyToRoundShapesOnly; // true to add a teardrop to round pads only
|
||||
bool m_applyToSurfacePads; // true to add a teardrop not drilled pads (like SMD)
|
||||
bool m_applyToTracks; // true to add a teardrop to connected point of 2 tracks
|
||||
// having different width
|
||||
BOARD* m_board;
|
||||
std::vector<ZONE*> m_createdTdList; // list of new created teardrops
|
||||
};
|
||||
|
||||
|
||||
// A class to store tracks grouped by layer and netcode
|
||||
class TRACK_BUFFER
|
||||
{
|
||||
public:
|
||||
TRACK_BUFFER() {}
|
||||
|
||||
/**
|
||||
* Add a track in buffer, in space grouping tracks having the same netcode and the same layer
|
||||
*/
|
||||
void AddTrack( PCB_TRACK* aTrack, int aLayer, int aNetcode );
|
||||
|
||||
/**
|
||||
* @return the buffer that stores tracks having the same layer and the same netcode
|
||||
*/
|
||||
std::vector<PCB_TRACK*>* GetTrackList( int aLayer, int aNetcode )
|
||||
{
|
||||
return m_map_tracks.at( idxFromLayNet( aLayer, aNetcode ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* @return a reference to the internal buffer
|
||||
*/
|
||||
std::map< int, std::vector<PCB_TRACK*>* >& GetBuffer() { return m_map_tracks ; }
|
||||
|
||||
static void GetNetcodeAndLayerFromIndex( int aIdx, int* aLayer, int* aNetcode )
|
||||
{
|
||||
*aLayer = aIdx & 0xFF;
|
||||
*aNetcode = aIdx >> 8;
|
||||
}
|
||||
|
||||
private:
|
||||
// Build an index from the layer id and the netcode, to store a track in buffer
|
||||
int idxFromLayNet( int aLayer, int aNetcode )
|
||||
{
|
||||
return ( aNetcode << 8 ) + ( aLayer & 0xFF );
|
||||
}
|
||||
|
||||
// Track buffer, tracks are grouped by layer+netcode
|
||||
std::map< int, std::vector<PCB_TRACK*>* > m_map_tracks;
|
||||
};
|
|
@ -0,0 +1,739 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2021 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
||||
* Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, you may find one here:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
||||
* or you may write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
|
||||
#include <board_design_settings.h>
|
||||
#include <pcb_track.h>
|
||||
#include <pad.h>
|
||||
#include <zone_filler.h>
|
||||
#include <board_commit.h>
|
||||
|
||||
#include "teardrop.h"
|
||||
#include <geometry/convex_hull.h>
|
||||
#include <geometry/shape_line_chain.h>
|
||||
#include <convert_basic_shapes_to_polygon.h>
|
||||
#include <bezier_curves.h>
|
||||
|
||||
#include <wx/log.h>
|
||||
|
||||
|
||||
void TRACK_BUFFER::AddTrack( PCB_TRACK* aTrack, int aLayer, int aNetcode )
|
||||
{
|
||||
auto item = m_map_tracks.find( idxFromLayNet( aLayer, aNetcode ) );
|
||||
std::vector<PCB_TRACK*>* buffer;
|
||||
|
||||
if( item == m_map_tracks.end() )
|
||||
{
|
||||
buffer = new std::vector<PCB_TRACK*>;
|
||||
m_map_tracks[idxFromLayNet( aLayer, aNetcode )] = buffer;
|
||||
}
|
||||
else
|
||||
buffer = (*item).second;
|
||||
|
||||
buffer->push_back( aTrack );
|
||||
}
|
||||
|
||||
|
||||
VIAPAD::VIAPAD( PCB_VIA* aVia ) :
|
||||
m_Parent( aVia )
|
||||
{
|
||||
m_Pos = aVia->GetPosition();
|
||||
m_Width = aVia->GetWidth();
|
||||
m_Drill = aVia->GetDrillValue();
|
||||
m_NetCode = aVia->GetNetCode();
|
||||
m_IsRound = true;
|
||||
m_IsPad = false;
|
||||
}
|
||||
|
||||
|
||||
VIAPAD::VIAPAD( PAD* aPad ) :
|
||||
m_Parent( aPad )
|
||||
{
|
||||
m_Pos = aPad->GetPosition();
|
||||
m_Width = std::min( aPad->GetSize().x, aPad->GetSize().y );
|
||||
m_Drill = std::min( aPad->GetDrillSizeX(), aPad->GetDrillSizeY() );
|
||||
m_NetCode = aPad->GetNetCode();
|
||||
m_IsRound = aPad->GetShape() == PAD_SHAPE::CIRCLE ||
|
||||
( aPad->GetShape() == PAD_SHAPE::OVAL
|
||||
&& aPad->GetSize().x == aPad->GetSize().y );
|
||||
m_IsPad = true;
|
||||
}
|
||||
|
||||
|
||||
VIAPAD::VIAPAD( PCB_TRACK* aTrack, ENDPOINT_T aEndPoint ) :
|
||||
m_Parent( aTrack )
|
||||
{
|
||||
m_Pos = aEndPoint == ENDPOINT_START ? aTrack->GetStart() : aTrack->GetEnd();
|
||||
m_Width =aTrack->GetWidth();
|
||||
m_Drill = 0;
|
||||
m_NetCode = aTrack->GetNetCode();
|
||||
m_IsRound = true;
|
||||
m_IsPad = false;
|
||||
}
|
||||
|
||||
|
||||
void TEARDROP_MANAGER::collectVias( std::vector< VIAPAD >& aList )
|
||||
{
|
||||
for( PCB_TRACK* item : m_board->Tracks() )
|
||||
{
|
||||
if( item->Type() != PCB_VIA_T )
|
||||
continue;
|
||||
|
||||
aList.emplace_back( static_cast<PCB_VIA*>( item ) );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void TEARDROP_MANAGER::collectPadsCandidate( std::vector< VIAPAD >& aList,
|
||||
bool aRoundShapesOnly,
|
||||
bool aIncludeNotDrilled )
|
||||
{
|
||||
for( FOOTPRINT* fp : m_board->Footprints() )
|
||||
{
|
||||
for( PAD* pad : fp->Pads() )
|
||||
{
|
||||
if( !pad->IsOnCopperLayer() )
|
||||
continue;
|
||||
|
||||
if( pad->GetNetCode() <= 0 ) // Not connected, so a teardrop cannot be attached
|
||||
continue;
|
||||
|
||||
if( pad->GetShape() == PAD_SHAPE::CUSTOM ) // A teardrop shape cannot be built
|
||||
continue;
|
||||
|
||||
if( aRoundShapesOnly )
|
||||
{
|
||||
bool round_shape = pad->GetShape() == PAD_SHAPE::CIRCLE
|
||||
|| ( pad->GetShape() == PAD_SHAPE::OVAL
|
||||
&& pad->GetSize().x == pad->GetSize().y );
|
||||
if( !round_shape )
|
||||
continue;
|
||||
}
|
||||
|
||||
bool has_hole = pad->GetDrillSizeX() > 0 && pad->GetDrillSizeY() > 0;
|
||||
|
||||
if( has_hole || aIncludeNotDrilled )
|
||||
aList.emplace_back( pad );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void TEARDROP_MANAGER::collectTeardrops( std::vector< ZONE* >& aList )
|
||||
{
|
||||
for( ZONE* zone : m_board->Zones() )
|
||||
{
|
||||
if( zone->GetZoneName().StartsWith( MAGIC_TEARDROP_BASE_NAME )
|
||||
|| zone->GetPriority() >= MAGIC_TEARDROP_ZONE_ID )
|
||||
{
|
||||
aList.push_back( zone );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool TEARDROP_MANAGER::isViaAndTrackInSameZone( VIAPAD& aViapad, PCB_TRACK* aTrack ) const
|
||||
{
|
||||
for( ZONE* zone: m_board->Zones() )
|
||||
{
|
||||
// Skip teardrops
|
||||
if( zone->GetZoneName().StartsWith( MAGIC_TEARDROP_BASE_NAME )
|
||||
|| zone->GetPriority() >= MAGIC_TEARDROP_ZONE_ID )
|
||||
continue;
|
||||
|
||||
// Only consider zones on the same layer
|
||||
if( !zone->IsOnLayer( aTrack->GetLayer() ) )
|
||||
continue;
|
||||
|
||||
if( zone->GetNetCode() == aTrack->GetNetCode() )
|
||||
{
|
||||
if( zone->Outline()->Contains( VECTOR2I( aViapad.m_Pos ) ) )
|
||||
{
|
||||
// Ensure the pad (if it is a pad) can be connected by the zone
|
||||
if( aViapad.m_IsPad )
|
||||
{
|
||||
PAD *pad = static_cast< PAD* >( aViapad.m_Parent );
|
||||
|
||||
if( zone->GetPadConnection( pad ) == ZONE_CONNECTION::NONE )
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
PCB_TRACK* TEARDROP_MANAGER::findTouchingTrack( EDA_ITEM_FLAGS& aMatchType, PCB_TRACK* aTrackRef,
|
||||
const wxPoint& aEndPoint,
|
||||
TRACK_BUFFER& aTrackLookupList ) const
|
||||
{
|
||||
EDA_ITEM_FLAGS match = 0; // to return the end point EDA_ITEM_FLAGS:
|
||||
// 0, STARTPOINT, ENDPOINT
|
||||
int matches = 0; // Count of candidates: only 1 is acceptable
|
||||
PCB_TRACK* candidate = nullptr; // a reference to the track connected
|
||||
|
||||
std::vector<PCB_TRACK*>* currlist = aTrackLookupList.GetTrackList( aTrackRef->GetLayer(),
|
||||
aTrackRef->GetNetCode() );
|
||||
|
||||
for( PCB_TRACK* curr_track: *currlist )
|
||||
{
|
||||
if( curr_track == aTrackRef )
|
||||
continue;
|
||||
|
||||
match = curr_track->IsPointOnEnds( aEndPoint, m_Parameters.m_tolerance);
|
||||
|
||||
if( match )
|
||||
{
|
||||
// if faced with a Y junction, stop here
|
||||
matches++;
|
||||
|
||||
if( matches > 1 )
|
||||
{
|
||||
aMatchType = 0;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
aMatchType = match;
|
||||
candidate = curr_track;
|
||||
}
|
||||
}
|
||||
|
||||
return candidate;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @return a vector unit length from aVector
|
||||
*/
|
||||
static VECTOR2D NormalizeVector( wxPoint aVector )
|
||||
{
|
||||
VECTOR2D vect( aVector );
|
||||
double norm = vect.EuclideanNorm();
|
||||
return vect / norm;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Compute the curve part points for teardrops connected to a round shape
|
||||
* The Bezier curve control points are optimized for a round pad/via shape,
|
||||
* and do not give a good curve shape for other pad shapes
|
||||
*/
|
||||
void TEARDROP_MANAGER::computeCurvedForRoundShape( std::vector<wxPoint>& aPoly,
|
||||
int aTrackHalfWidth,
|
||||
VECTOR2D aTrackDir, VIAPAD& aViaPad,
|
||||
std::vector<wxPoint>& pts ) const
|
||||
{
|
||||
// in pts:
|
||||
// A and B are points on the track ( pts[0] and pts[1] )
|
||||
// C and E are points on the aViaPad ( pts[2] and pts[4] )
|
||||
// D is the aViaPad centre ( pts[3] )
|
||||
double Vpercent = m_Parameters.m_heightRatio;
|
||||
int td_height = aViaPad.m_Width * Vpercent;
|
||||
|
||||
// First, calculate a aVpercent equivalent to the td_height clamped by aTdMaxHeight
|
||||
// We cannot use the initial aVpercent because it gives bad shape with points
|
||||
// on aViaPad calculated for a clamped aViaPad size
|
||||
if( m_Parameters.m_tdMaxHeight > 0 && m_Parameters.m_tdMaxHeight < td_height )
|
||||
Vpercent *= (double)m_Parameters.m_tdMaxHeight / td_height;
|
||||
|
||||
int radius = aViaPad.m_Width / 2;
|
||||
double minVpercent = double( aTrackHalfWidth ) / radius;
|
||||
double weaken = (Vpercent - minVpercent) / ( 1 - minVpercent ) / radius;
|
||||
|
||||
double biasBC = 0.5 * SEG( pts[1], pts[2] ).Length();
|
||||
double biasAE = 0.5 * SEG( pts[4], pts[0] ).Length();
|
||||
|
||||
wxPoint vecC = pts[2] - aViaPad.m_Pos;
|
||||
wxPoint tangentC = wxPoint( pts[2].x - vecC.y * biasBC * weaken,
|
||||
pts[2].y + vecC.x * biasBC * weaken );
|
||||
wxPoint vecE = pts[4] - aViaPad.m_Pos;
|
||||
wxPoint tangentE = wxPoint( pts[4].x + vecE.y * biasAE * weaken,
|
||||
pts[4].y - vecE.x * biasAE * weaken );
|
||||
|
||||
wxPoint tangentB = wxPoint( pts[1].x - aTrackDir.x * biasBC, pts[1].y - aTrackDir.y * biasBC );
|
||||
wxPoint tangentA = wxPoint( pts[0].x - aTrackDir.x * biasAE, pts[0].y - aTrackDir.y * biasAE );
|
||||
|
||||
std::vector<wxPoint> curve_pts;
|
||||
curve_pts.reserve( m_Parameters.m_curveSegCount );
|
||||
BEZIER_POLY( pts[1], tangentB, tangentC, pts[2] ).GetPoly( curve_pts, 0,
|
||||
m_Parameters.m_curveSegCount );
|
||||
|
||||
for( wxPoint& corner: curve_pts )
|
||||
aPoly.push_back( corner );
|
||||
|
||||
aPoly.push_back( pts[3] );
|
||||
|
||||
curve_pts.clear();
|
||||
BEZIER_POLY( pts[4], tangentE, tangentA, pts[0] ).GetPoly( curve_pts, 0,
|
||||
m_Parameters.m_curveSegCount );
|
||||
|
||||
for( wxPoint& corner: curve_pts )
|
||||
aPoly.push_back( corner );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Compute the curve part points for teardrops connected to a rectangular/polygonal shape
|
||||
* The Bezier curve control points are not optimized for a special shape
|
||||
*/
|
||||
void TEARDROP_MANAGER::computeCurvedForRectShape( std::vector<wxPoint>& aPoly, int aTdHeight,
|
||||
int aTrackHalfWidth, VIAPAD& aViaPad,
|
||||
std::vector<wxPoint>& aPts ) const
|
||||
{
|
||||
// in aPts:
|
||||
// A and B are points on the track ( pts[0] and pts[1] )
|
||||
// C and E are points on the aViaPad ( pts[2] and pts[4] )
|
||||
// D is the aViaPad centre ( pts[3] )
|
||||
|
||||
// side1 is( aPts[1], aPts[2] ); from track to via
|
||||
VECTOR2I side1( aPts[2] - aPts[1] ); // vector from track to via
|
||||
// side2 is ( aPts[4], aPts[0] ); from via to track
|
||||
VECTOR2I side2( aPts[4] - aPts[0] ); // vector from track to via
|
||||
|
||||
std::vector<wxPoint> curve_pts;
|
||||
curve_pts.reserve( m_Parameters.m_curveSegCount );
|
||||
|
||||
// Note: This side is from track to via
|
||||
wxPoint ctrl1 = ( aPts[1] + aPts[1] + aPts[2] ) / 3;
|
||||
wxPoint ctrl2 = ( aPts[1] + aPts[2] + aPts[2] ) / 3;
|
||||
|
||||
// The control points must be moved toward the polygon inside, in order to give a curved shape
|
||||
// The move vector is perpendicular to the vertex (side 1 or side 2), and its
|
||||
// value is delta, depending on the sizes of via and track
|
||||
int delta = ( aTdHeight / 2 - aTrackHalfWidth );
|
||||
|
||||
delta /= 4; // A scaling factor giving a fine shape, defined from tests.
|
||||
// However for short sides, the value of delta must be reduced, depending
|
||||
// on the side lenght
|
||||
// We use here a max delta value = side_lenght/8, defined from tests
|
||||
|
||||
int side_lenght = side1.EuclideanNorm();
|
||||
int delta_effective = std::min( delta, side_lenght/8 );
|
||||
// The move vector depend on the quadrant: it must be always defined to create a
|
||||
// curve with a direction toward the track
|
||||
double angle1 = side1.Angle();
|
||||
int sign = std::abs( angle1 ) >= 90.0*M_PI/180 ? 1 : -1;
|
||||
VECTOR2I bias( 0, sign * delta_effective );
|
||||
|
||||
bias.Rotate( angle1 );
|
||||
|
||||
ctrl1.x += bias.x;
|
||||
ctrl1.y += bias.y;
|
||||
ctrl2.x += bias.x;
|
||||
ctrl2.y += bias.y;
|
||||
|
||||
BEZIER_POLY( aPts[1], ctrl1, ctrl2, aPts[2] ).GetPoly( curve_pts, 0,
|
||||
m_Parameters.m_curveSegCount );
|
||||
|
||||
for( wxPoint& corner: curve_pts )
|
||||
aPoly.push_back( corner );
|
||||
|
||||
aPoly.push_back( aPts[3] );
|
||||
|
||||
// Note: This side is from via to track
|
||||
curve_pts.clear();
|
||||
ctrl1 = ( aPts[4] + aPts[4] + aPts[0] ) / 3;
|
||||
ctrl2 = ( aPts[4] + aPts[0] + aPts[0] ) / 3;
|
||||
|
||||
side_lenght = side2.EuclideanNorm();
|
||||
delta_effective = std::min( delta, side_lenght/8 );
|
||||
|
||||
double angle2 = side2.Angle();
|
||||
sign = std::abs( angle2 ) <= 90.0*M_PI/180 ? 1 : -1;
|
||||
|
||||
bias = VECTOR2I( 0, sign * delta_effective );
|
||||
|
||||
bias.Rotate( angle2 );
|
||||
|
||||
ctrl1.x += bias.x;
|
||||
ctrl1.y += bias.y;
|
||||
ctrl2.x += bias.x;
|
||||
ctrl2.y += bias.y;
|
||||
|
||||
BEZIER_POLY( aPts[4], ctrl1, ctrl2, aPts[0] ).GetPoly( curve_pts, 0,
|
||||
m_Parameters.m_curveSegCount );
|
||||
|
||||
for( wxPoint& corner: curve_pts )
|
||||
aPoly.push_back( corner );
|
||||
}
|
||||
|
||||
|
||||
bool TEARDROP_MANAGER::ComputePointsOnPadVia( PCB_TRACK* aTrack,
|
||||
VIAPAD& aViaPad,
|
||||
std::vector<wxPoint>& aPts ) const
|
||||
{
|
||||
// Compute the 2 anchor points on pad/via of the teardrop shape
|
||||
|
||||
PAD* pad = dynamic_cast<PAD*>( aViaPad.m_Parent );
|
||||
SHAPE_POLY_SET c_buffer;
|
||||
|
||||
// aHeightRatio is the factor to calculate the aViaPad teardrop prefered height
|
||||
// teardrop height = aViaPad size * aHeightRatio (aHeightRatio <= 1.0)
|
||||
// For rectangular (and similar) shapes, the preferred_height is calculated from the min
|
||||
// dim of the rectangle = aViaPad.m_Width
|
||||
|
||||
int preferred_height = aViaPad.m_Width * m_Parameters.m_heightRatio;
|
||||
|
||||
// force_clip_shape = true to force the via/pad polygon to be clipped to follow
|
||||
// contraints
|
||||
// Clipping is also needed for rectangular shapes, because the teardrop shape is
|
||||
// restricted to a polygonal area smaller than the pad area (the teardrop height
|
||||
// use the smaller value of X and Y sizes).
|
||||
bool force_clip_shape = m_Parameters.m_heightRatio < 1.0;
|
||||
|
||||
// To find the anchor points on via/pad shape, we build the polygonal shape, and clip the polygon
|
||||
// to the max size (preferred_height or m_tdMaxHeight) by a rectangle centered on the
|
||||
// axis of the expected teardrop shape.
|
||||
// (only reduce the size of polygonal shape does not give good anchor points)
|
||||
if( aViaPad.m_IsRound )
|
||||
{
|
||||
TransformCircleToPolygon( c_buffer, aViaPad.m_Pos, aViaPad.m_Width/2 ,
|
||||
ARC_LOW_DEF, ERROR_INSIDE, 16 );
|
||||
}
|
||||
else
|
||||
{
|
||||
wxASSERT( pad );
|
||||
force_clip_shape = true;
|
||||
|
||||
preferred_height = aViaPad.m_Width * m_Parameters.m_heightRatio;
|
||||
pad->TransformShapeWithClearanceToPolygon( c_buffer, aTrack->GetLayer(), 0,
|
||||
ARC_LOW_DEF, ERROR_INSIDE );
|
||||
}
|
||||
|
||||
// Clip the pad/via shape to match the m_tdMaxHeight constraint, and for
|
||||
// not rounded pad, clip the shape at the aViaPad.m_Width, i.e. the value
|
||||
// of the smallest value between size.x and size.y values.
|
||||
if( force_clip_shape || ( m_Parameters.m_tdMaxHeight > 0
|
||||
&& m_Parameters.m_tdMaxHeight < preferred_height ) )
|
||||
{
|
||||
int halfsize = std::min( m_Parameters.m_tdMaxHeight, preferred_height )/2;
|
||||
|
||||
// teardrop_axis is the line from anchor point on the track and the end point
|
||||
// of the teardrop in the pad/via
|
||||
// this is the teardrop_axis of the teardrop shape to build
|
||||
wxPoint ref_on_track = ( aPts[0] + aPts[1] ) / 2;
|
||||
VECTOR2I teardrop_axis( aPts[3] - ref_on_track );
|
||||
|
||||
double orient = teardrop_axis.Angle();
|
||||
teardrop_axis.Rotate( -orient );
|
||||
int len = teardrop_axis.EuclideanNorm();
|
||||
|
||||
// Build the constraint polygon: a rectangle with
|
||||
// lenght = dist between the point on track and the pad/via pos
|
||||
// height = m_tdMaxHeight or aViaPad.m_Width
|
||||
SHAPE_POLY_SET clipping_rect;
|
||||
clipping_rect.NewOutline();
|
||||
|
||||
// Build a horizontal rect: it will be rotated later
|
||||
clipping_rect.Append( 0, - halfsize );
|
||||
clipping_rect.Append( 0, halfsize );
|
||||
clipping_rect.Append( len, halfsize );
|
||||
clipping_rect.Append( len, - halfsize );
|
||||
|
||||
clipping_rect.Rotate( orient );
|
||||
clipping_rect.Move( ref_on_track );
|
||||
|
||||
// Clip the shape to the max allowed teadrop area
|
||||
c_buffer.BooleanIntersection( clipping_rect, SHAPE_POLY_SET::PM_FAST );
|
||||
}
|
||||
|
||||
/* in aPts:
|
||||
* A and B are points on the track ( aPts[0] and aPts[1] )
|
||||
* C and E are points on the aViaPad ( aPts[2] and aPts[4] )
|
||||
* D is midpoint behind the aViaPad centre ( aPts[3] )
|
||||
*/
|
||||
|
||||
SHAPE_LINE_CHAIN& padpoly = c_buffer.Outline(0);
|
||||
std::vector<VECTOR2I> points = padpoly.CPoints();
|
||||
|
||||
std::vector<wxPoint> initialPoints;
|
||||
initialPoints.push_back( aPts[0] );
|
||||
initialPoints.push_back( aPts[1] );
|
||||
|
||||
for( const VECTOR2I& pt: points )
|
||||
initialPoints.emplace_back( pt.x, pt.y );
|
||||
|
||||
std::vector<wxPoint> hull;
|
||||
BuildConvexHull( hull, initialPoints );
|
||||
|
||||
// Search for end points of segments starting at aPts[0] or aPts[1]
|
||||
// In some cases, in convex hull, only one point (aPts[0] or aPts[1]) is still in list
|
||||
wxPoint PointC;
|
||||
wxPoint PointE;
|
||||
int found_start = -1; // 2 points (one start and one end) should be found
|
||||
int found_end = -1;
|
||||
|
||||
wxPoint start = aPts[0];
|
||||
wxPoint pend = aPts[1];
|
||||
|
||||
for( unsigned ii = 0, jj = 0; jj < hull.size(); ii++, jj++ )
|
||||
{
|
||||
unsigned next = ii+ 1;
|
||||
|
||||
if( next >= hull.size() )
|
||||
next = 0;
|
||||
|
||||
int prev = ii -1;
|
||||
|
||||
if( prev < 0 )
|
||||
prev = hull.size()-1;
|
||||
|
||||
if( hull[ii] == start )
|
||||
{
|
||||
// the previous or the next point is candidate:
|
||||
if( hull[next] != pend )
|
||||
PointE = hull[next];
|
||||
else
|
||||
PointE = hull[prev];
|
||||
|
||||
found_start = ii;
|
||||
}
|
||||
|
||||
if( hull[ii] == pend )
|
||||
{
|
||||
if( hull[next] != start )
|
||||
PointC = hull[next];
|
||||
else
|
||||
PointC = hull[prev];
|
||||
|
||||
found_end = ii;
|
||||
}
|
||||
}
|
||||
|
||||
if( found_start < 0 ) // PointE was not initalized, because start point does not exit
|
||||
{
|
||||
int ii = found_end-1;
|
||||
|
||||
if( ii < 0 )
|
||||
ii = hull.size()-1;
|
||||
|
||||
PointE = hull[ii];
|
||||
}
|
||||
|
||||
if( found_end < 0 ) // PointC was not initalized, because pend point does not exit
|
||||
{
|
||||
int ii = found_start-1;
|
||||
|
||||
if( ii < 0 )
|
||||
ii = hull.size()-1;
|
||||
|
||||
PointC = hull[ii];
|
||||
}
|
||||
|
||||
aPts[2] = PointC;
|
||||
aPts[4] = PointE;
|
||||
|
||||
// Now we have to know if the choice aPts[2] = PointC is the best, or if
|
||||
// aPts[2] = PointE is better.
|
||||
// A criteria is to calculate the polygon area in these 2 cases, and choose the case
|
||||
// that gives the bigger area, because the segments starting at PointC and PointE
|
||||
// maximize their distance.
|
||||
SHAPE_LINE_CHAIN dummy1( aPts, true );
|
||||
double area1 = dummy1.Area();
|
||||
|
||||
std::swap( aPts[2], aPts[4] );
|
||||
SHAPE_LINE_CHAIN dummy2( aPts, true );
|
||||
double area2 = dummy2.Area();
|
||||
|
||||
if( area1 > area2 ) // The first choice (without swapping) is the better.
|
||||
std::swap( aPts[2], aPts[4] );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TEARDROP_MANAGER::findAnchorPointsOnTrack( wxPoint& aStartPoint, wxPoint& aEndPoint,
|
||||
PCB_TRACK*& aTrack, VIAPAD& aViaPad,
|
||||
int* aEffectiveTeardropLen,
|
||||
bool aFollowTracks,
|
||||
TRACK_BUFFER& aTrackLookupList ) const
|
||||
{
|
||||
bool found = true;
|
||||
wxPoint start = aTrack->GetStart();
|
||||
wxPoint end = aTrack->GetEnd();
|
||||
int radius = aViaPad.m_Width / 2;
|
||||
// Requested length of the teardrop:
|
||||
int targetLength = aViaPad.m_Width * m_Parameters.m_lenghtRatio;
|
||||
|
||||
if( m_Parameters.m_tdMaxLen > 0 )
|
||||
targetLength = std::min( m_Parameters.m_tdMaxLen, targetLength );
|
||||
|
||||
int actualTdLen; // The actual teardrop lenght, limited by the available track lenght
|
||||
|
||||
// ensure that start is at the via/pad end
|
||||
if( SEG( end, aViaPad.m_Pos ).Length() < radius )
|
||||
{
|
||||
std::swap( start, end );
|
||||
}
|
||||
|
||||
SHAPE_POLY_SET shapebuffer;
|
||||
|
||||
if( aViaPad.m_IsRound )
|
||||
{
|
||||
TransformCircleToPolygon( shapebuffer, aViaPad.m_Pos, radius,
|
||||
ARC_LOW_DEF, ERROR_INSIDE, 16 );
|
||||
}
|
||||
else
|
||||
{
|
||||
PAD* pad = static_cast<PAD*>( aViaPad.m_Parent );
|
||||
pad->TransformShapeWithClearanceToPolygon( shapebuffer, aTrack->GetLayer(), 0,
|
||||
ARC_LOW_DEF, ERROR_INSIDE );
|
||||
}
|
||||
|
||||
SHAPE_LINE_CHAIN& outline = shapebuffer.Outline(0);
|
||||
outline.SetClosed( true );
|
||||
|
||||
// Search the intersection point between the pad/via shape and the current track
|
||||
// This this the starting point to define the teardrop lenght
|
||||
SHAPE_LINE_CHAIN::INTERSECTIONS pts;
|
||||
int pt_count = outline.Intersect( SEG( start, end ), pts );
|
||||
|
||||
// Ensure a intersection point was found, otherwise we cannot built the teardrop
|
||||
// using this track
|
||||
if( pt_count < 1 )
|
||||
return false;
|
||||
|
||||
VECTOR2I intersect = pts[0].p;
|
||||
start.x = intersect.x;
|
||||
start.y = intersect.y;
|
||||
actualTdLen = std::min( targetLength, SEG( start, end ).Length() );
|
||||
|
||||
// If the first track is too short to allow a teardrop having the requested length
|
||||
// explore the connected track(s)
|
||||
if( actualTdLen < targetLength && aFollowTracks )
|
||||
{
|
||||
int consumed = 0;
|
||||
|
||||
while( actualTdLen+consumed < targetLength )
|
||||
{
|
||||
EDA_ITEM_FLAGS matchType;
|
||||
|
||||
PCB_TRACK* connected_track = findTouchingTrack( matchType, aTrack, end, aTrackLookupList );
|
||||
|
||||
if( connected_track == nullptr )
|
||||
break;
|
||||
|
||||
// TODO: stop if angle between old and new segment is > 45 deg to avoid bad shape
|
||||
consumed += actualTdLen;
|
||||
actualTdLen = std::min( targetLength-consumed, int( connected_track->GetLength() ) );
|
||||
aTrack = connected_track;
|
||||
end = connected_track->GetEnd();
|
||||
start = connected_track->GetStart();
|
||||
|
||||
if( matchType != STARTPOINT )
|
||||
std::swap( start, end );
|
||||
|
||||
// If we do not want to explore more than one connected track, stop search here
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
aStartPoint = start;
|
||||
aEndPoint = end;
|
||||
*aEffectiveTeardropLen = actualTdLen;
|
||||
return found;
|
||||
}
|
||||
|
||||
|
||||
bool TEARDROP_MANAGER::computeTeardropPolygonPoints( std::vector<wxPoint>& aCorners,
|
||||
PCB_TRACK* aTrack, VIAPAD& aViaPad,
|
||||
bool aFollowTracks,
|
||||
TRACK_BUFFER& aTrackLookupList ) const
|
||||
{
|
||||
wxPoint start, end; // Start and end points of the track anchor of the teardrop
|
||||
// the start point is inside the teardrop shape
|
||||
// the end point is outside.
|
||||
int track_stub_len; // the dist between the start point and the anchor point
|
||||
// on the track
|
||||
|
||||
// Note: aTrack can be modified if the inital track is too short
|
||||
if( !findAnchorPointsOnTrack( start, end, aTrack, aViaPad, &track_stub_len,
|
||||
aFollowTracks, aTrackLookupList ) )
|
||||
return false;
|
||||
|
||||
VECTOR2D vecT = NormalizeVector(end - start);
|
||||
|
||||
// find the 2 points on the track, sharp end of the teardrop
|
||||
int track_halfwidth = aTrack->GetWidth() / 2;
|
||||
wxPoint pointB = start + wxPoint( vecT.x * track_stub_len + vecT.y * track_halfwidth,
|
||||
vecT.y * track_stub_len - vecT.x * track_halfwidth );
|
||||
wxPoint pointA = start + wxPoint( vecT.x * track_stub_len - vecT.y * track_halfwidth,
|
||||
vecT.y * track_stub_len + vecT.x * track_halfwidth );
|
||||
|
||||
// To build a polygonal valid shape pointA and point B must be outside the pad
|
||||
// It can be inside with some pad shapes having very different X and X sizes
|
||||
if( !aViaPad.m_IsRound )
|
||||
{
|
||||
PAD* pad = static_cast<PAD*>( aViaPad.m_Parent );
|
||||
|
||||
if( pad->HitTest( pointA ) )
|
||||
return false;
|
||||
|
||||
if( pad->HitTest( pointB ) )
|
||||
return false;
|
||||
}
|
||||
|
||||
// Introduce a last point to cover the via centre to ensure it is seen as connected
|
||||
wxPoint pointD = aViaPad.m_Pos;
|
||||
// add a small offset in order to have the aViaPad.m_Pos reference point inside
|
||||
// the teardrop area, just in case...
|
||||
int offset = Millimeter2iu( 0.001 );
|
||||
pointD += wxPoint( int( -vecT.x*offset), int(-vecT.y*offset) );
|
||||
|
||||
wxPoint pointC, pointE; // Point on PADVIA outlines
|
||||
std::vector<wxPoint> pts = {pointA, pointB, pointC, pointD, pointE};
|
||||
|
||||
ComputePointsOnPadVia( aTrack, aViaPad, pts );
|
||||
|
||||
if( m_Parameters.m_curveSegCount <= 2
|
||||
|| m_Parameters.m_curveOpt == CURVED_OPTION::OPTION_NONE )
|
||||
{
|
||||
aCorners = pts;
|
||||
return true;
|
||||
}
|
||||
|
||||
// See if we can use curved teardrop shape
|
||||
if( aViaPad.m_IsRound )
|
||||
computeCurvedForRoundShape( aCorners, track_halfwidth,
|
||||
vecT, aViaPad, pts );
|
||||
else if( m_Parameters.m_curveOpt == CURVED_OPTION::OPTION_ALL_PADS )
|
||||
{
|
||||
int td_height = aViaPad.m_Width * m_Parameters.m_heightRatio;
|
||||
|
||||
if( m_Parameters.m_tdMaxHeight > 0 && m_Parameters.m_tdMaxHeight < td_height )
|
||||
td_height = m_Parameters.m_tdMaxHeight;
|
||||
|
||||
computeCurvedForRectShape( aCorners, td_height, track_halfwidth,
|
||||
aViaPad, pts );
|
||||
}
|
||||
else
|
||||
aCorners = pts;
|
||||
|
||||
return true;
|
||||
}
|