VeroRoute/libraries/gEDA/veroroute_electromechanical/Switch_OffBoard_DPDT.sym000644 001750 001750 00000002456 13515171160 027603 0ustar00alexalex000000 000000 v 20130925 2 T 300 1400 8 10 0 0 0 0 1 numslots=0 P 300 1400 0 1400 1 0 1 { T 150 1450 5 10 1 1 0 0 1 pinnumber=3 T 150 1450 5 10 0 0 0 0 1 pinseq=3 T 150 1450 5 10 0 0 0 0 1 pinlabel=3 T 150 1450 5 10 0 0 0 0 1 pintype=pas } P 600 1600 900 1600 1 0 1 { T 750 1650 5 10 1 1 0 0 1 pinnumber=1 T 750 1650 5 10 0 0 0 0 1 pinseq=1 T 750 1650 5 10 0 0 0 0 1 pinlabel=1 T 750 1650 5 10 0 0 0 0 1 pintype=pas } P 600 1200 900 1200 1 0 1 { T 750 1250 5 10 1 1 0 0 1 pinnumber=5 T 750 1250 5 10 0 0 0 0 1 pinseq=5 T 750 1250 5 10 0 0 0 0 1 pinlabel=5 T 750 1250 5 10 0 0 0 0 1 pintype=pas } P 300 700 0 700 1 0 1 { T 150 750 5 10 1 1 0 0 1 pinnumber=4 T 150 750 5 10 0 0 0 0 1 pinseq=4 T 150 750 5 10 0 0 0 0 1 pinlabel=4 T 150 750 5 10 0 0 0 0 1 pintype=pas } P 600 900 900 900 1 0 1 { T 750 950 5 10 1 1 0 0 1 pinnumber=2 T 750 950 5 10 0 0 0 0 1 pinseq=2 T 750 950 5 10 0 0 0 0 1 pinlabel=2 T 750 950 5 10 0 0 0 0 1 pintype=pas } P 600 500 900 500 1 0 1 { T 750 550 5 10 1 1 0 0 1 pinnumber=6 T 750 550 5 10 0 0 0 0 1 pinseq=6 T 750 550 5 10 0 0 0 0 1 pinlabel=6 T 750 550 5 10 0 0 0 0 1 pintype=pas } L 300 1400 600 1600 3 0 0 0 -1 -1 L 300 700 600 900 3 0 0 0 -1 -1 T 200 0 5 10 1 1 0 0 1 device=Name T 300 200 8 10 1 1 0 0 1 refdes=S? T 895 193 8 10 0 0 0 0 1 footprint=PADS6 T 895 193 8 10 0 0 0 0 1 description=Offboard Switch VeroRoute/libraries/gEDA/veroroute_passive/Capacitor_Ceramic_200mil.sym000644 001750 001750 00000001277 13515171161 026411 0ustar00alexalex000000 000000 v 20130925 2 T 200 700 5 10 0 0 0 0 1 numslots=0 P 200 700 400 700 1 0 0 { T 350 750 5 8 1 1 0 6 1 pinnumber=1 T 350 750 5 8 0 0 0 6 1 pinseq=1 T 350 750 5 8 0 0 0 6 1 pinlabel=1 T 350 750 5 8 0 0 0 6 1 pintype=pas } P 1100 700 900 700 1 0 0 { T 950 750 5 8 1 1 0 0 1 pinnumber=2 T 950 750 5 8 0 0 0 0 1 pinseq=2 T 950 750 5 8 0 0 0 0 1 pinlabel=2 T 950 750 5 8 0 0 0 0 1 pintype=pas } L 600 900 600 500 3 0 0 0 -1 -1 L 900 700 700 700 3 0 0 0 -1 -1 L 600 700 400 700 3 0 0 0 -1 -1 L 700 900 700 500 3 0 0 0 -1 -1 T 500 300 5 10 1 1 0 0 1 device=820p T 500 1000 8 10 1 1 0 0 1 refdes=C? T 0 100 8 10 0 0 0 0 1 footprint=CAP_CERAMIC2 T 0 100 8 10 0 0 0 0 1 description=Ceramic Capacitor (200 mil length) VeroRoute/libraries/gEDA/veroroute_transistor/JFET_Nchannel_J202.sym000644 001750 001750 00000001547 13515171161 025567 0ustar00alexalex000000 000000 v 20130925 2 T 100 500 5 10 0 0 0 0 1 numslots=0 P 100 500 400 500 1 0 0 { T 100 350 5 6 1 1 0 0 1 pinnumber=3 T 100 350 5 6 0 0 0 0 1 pinseq=3 T 100 350 5 6 0 0 0 0 1 pinlabel=3 T 100 350 5 6 0 0 0 0 1 pintype=pas } P 600 1000 600 800 1 0 0 { T 500 850 5 6 1 1 0 0 1 pinnumber=1 T 500 850 5 6 0 0 0 0 1 pinseq=1 T 500 850 5 6 0 0 0 0 1 pinlabel=1 T 500 850 5 6 0 0 0 0 1 pintype=pas } P 600 200 600 0 1 0 1 { T 500 50 5 6 1 1 0 0 1 pinnumber=2 T 500 50 5 6 0 0 0 0 1 pinseq=2 T 500 250 5 6 1 1 0 0 1 pinlabel=S T 500 50 5 6 0 0 0 0 1 pintype=pas } L 400 800 600 800 3 0 0 0 -1 -1 L 400 200 600 200 3 0 0 0 -1 -1 L 400 900 400 100 3 0 0 0 -1 -1 L 300 600 400 500 3 0 0 0 -1 -1 L 400 500 300 400 3 0 0 0 -1 -1 T 700 700 5 10 1 1 0 0 1 device=J202 T 700 400 8 10 1 1 0 0 1 refdes=Q? T 595 95 8 10 0 0 0 0 1 footprint=TO92 T 595 95 8 10 0 0 0 0 1 description=N-Channel JFET VeroRoute/Src/android-sources/res/drawable-xxhdpi/icon.png000644 001750 001750 00000005465 14206323065 024111 0ustar00alexalex000000 000000 ‰PNG  IHDRh$uя pHYsФФ•+ чIDATxœэЯ’з‡чіэ–дjIŒЁjŠ*v*Ф.Ї’G№вяѓYх1ВЪdŸM–yЇтJтФФу25ƒ€a†Œa$ЕњяНїd1РL&ТžЙаЎы~K5ЈчыVї=-~"fрЫЯЇјнƒўe†vљй/Пўэ•›П{}џЏfыїjђЗ\ЯшcКњЙђ qьѕ%щЯёВгї6ѓНкт§OKPМFЩ:ХЋЇЏ‹ˆ@ЄgШяPЕлЦgbЃ§Бжы—Џv.ПлщѕмdіњтвеЮюvЇonAЃЗŠƒsы%[ЉzФ З6AЃ§БЙ­CŒф`EЪnŽфpE†б‚­M BШЩQИ`+…G$WˆЂvЪiЖ?~ц6Тъšg5лWЊ^pIЈkžNдt_еUKK1SCMXM˜]ИF=aЕЯ\ЕSNГ§Б–ЯѕУ­ђсН2Ÿ/ИЩЩчf{Ћмо*ѓL[МЙ:C>F>fНl+чc,мкіЧцІ#›щ­лyt{Фрc+љ‡[Хэ[ѓ­лљ|ж–А”ГM–ˆ˜8:щ0ђ1Ї<пd•ЖtЦ7кaГ‰О}k^•@‘™Kяv+@:QлутіПГ/?Ÿn}›Я&- SSЄЦTРdGЮ.Цœn№ф 3пd5iЇœfћc#Ќ,Эоn Šh>UЛлеГ•ќўГбЫжЗљСшЅL‰ђ1ЋКјPи}Ь7yОЩЯFS­аhЌf‰ Ѓ1yRѓЏљјNqxЪW&ЯЬ|Іг‰в-]ЯъF§Г[&ЛЛxј‹vыiЎ?ігњВрВЈПлmc–qLЊЗ§”рe4дПs /Ь1М0Ч№ТУ s /Ь1М0Ч№ТУ s /Ь1М0ЧАŸ%6 yЏЅo…%yф §нž”хжНB? TлбNtЏМх„,Џ09Єd}yїІ№з0Ч№ТУ s /Ь1М0ЧXоЛФйDэм/гi›пž€d\|Ї3-ig–Д,;їЫ?џё?›_Зѕ}нчЌнˆ?љьМvjвЉоќ:k?љ`зэяє„јk˜cxaŽс…9†ц^˜cxaŽс…9†ц^˜cД9щ`Ь†Ё™•AЭЌz–ЅлЬЪнО1црЗБˆHБ§h>ЫvK")IB@tpНњУшeЋчDД=šbhm2Х3eІŠSmŠэ=ёї/;ћВЊ*­5€ Ђ(zxWmяЭf• DWR"ХHRˆ˜^ыЇТВеѓƒД‘—ШlЪpЅ9гœ)“*ž*3U&5œяЇИ7юЭkqЌA{Ь~šТєЄH$O% $'ХХ‚"‚|~tЛ]ЯЉh#/‘ЁДЩ*ѓ]ЁTц‰6™сТ@1+@WJц…Юѓ№ХG1FkuЅВк(`Z™яBA@Ф‘8л ЎDт'ˆ б žЦ…<АШjУ•тД2{Ѕо-дƒк<5ЈŽўqcBЅBЅЏЬlŒQЊ6І4ЈzЌp LЄХœСU„s’AQЗ:ZЯвх%fйМц§Rяdj\щ=У™Aѕ љ Ц ЊЭS]—Е™ФВшCZŒКŽжГty‰fЛЊє^ЁЗ+НЃјеƒMаЙсZ ’Pьn=K——hИ(ѕNЉw4ч;њ4чЅоˆ:СwыБиQГy‰ Ѕ9е&e(‹} ЅMЊ9eVюжcБ#?щpŒfѓ 2 $ Ню:A" (!’южcБ#›Кђ/\*{§ з?ўA|4PPЗ\4Ј˜•z­“ѕ:СХNpQPзнz,vдl^Ђ ( Ю1”a-мFл­ѓ ‘ 8 ЮuƒKQpNPфn=Лl6/Q i…)Ј[ŠбТ…ъiQ(Юtх•N№V$ЮIJ"wыБиeГy‰DA@=т@ ˆ˜О6™сђ`:h!Є”Ё”ђиt\JЂ#рљtќџGA‚"ЇыiIиiѓ 2q‡ЄƒчУж™2eRУE$быv{=QU•1€"ŠЂ^ЗI ъJq0Hё?УжG=ЇЂМD"Aˆ…}УЕІLqЊhЈФм˜b%яЎ&—Џœбе§4 Œ]I})V$%ш‰gщєЧ1южs*к~F ŽЄ0+†Йt.ў№ц…ѕŸ`ИёљП=оgqєсЛžЄMa€(  шХ?t.Н}хкЕсБ?Нџh:ˆE'hюЛѕЫVЯ‰№“Ч№ТУ s /Ь1М0Ч№ТУ s /Ь1М0Ч8œt$У`эF[Пыy„Еq2l{РcС’єчPиХw:Ÿ|vўM™ДМS –Є?‡Т#ЙДi"ЫР’єЧ_Уу№QS.№›Šl•Уe]’ў +№ЮŸtњMл?˜–МG? –?-vIњsф ›!§†'_М_ИkџАЕ`IњуЏaŽс…9†ц^˜cxaŽс…9†ц^˜cxaŽс…9†ц^˜cxaŽс…9†ці_R]Ш!‚„‚"SCgа)Ћ)LёкJЁіЧцЖ^„#’#ЂpСV ŽHЎE6Yаh>ЁіЧЏУУF˜ЉЁ&Ќ&Ь‹Ў\ЃžАкчзoї}4šOhAЃ§БІ3фcфcж‹~VgШЧœБpkф>МWцѓ7Џ˜OhAЃ§БЙща)g›,13pt%o2фcN7xОЩ*mщˆn4Ÿа‚Fћc#LM‘nS“YNИsКС“/Ь|“еЋЧŒŸŒFѓ -hД?6ТL‰ђ1ЋКјА ћ˜oђ|“Ÿ^ZЁб|B эe^"4ъЇ˜н2йнХУMЫˆO;šЬ'ДЋЇЙўиOыMЊПџЭБ†ђ ­iЈ?~ц^˜cxaŽс…9†ц^˜cxaŽс…9†ц^˜cxaŽс…9†ц^˜cxaŽс…9Ц7АŒДH="IENDЎB`‚VeroRoute/Src/Component.cpp000644 001750 001750 00000055177 14427740731 016161 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #include "Component.h" #include "TemplateManager.h" Component::Component(const TemplateManager& templateMgr, const CompDefiner& definer) // This method is for building a custom component { Clear(); definer.Build(templateMgr, *this); // Use component definer to make the footprint and shapes } void Component::SetDefaultPinFlags() { const int iCustomFlag = GetCustomPads() ? PIN_CUSTOM : 0; switch ( GetType() ) { case COMP::TO92: case COMP::TO18: case COMP::TO39: case COMP::TO220: case COMP::SIP: case COMP::DIP: case COMP::DIP_RECTIFIER: case COMP::STRIP_100: case COMP::BLOCK_100: case COMP::BLOCK_200: return SetPinFlags(static_cast(PIN_LABELS | iCustomFlag)); case COMP::SWITCH_ST: case COMP::SWITCH_DT: case COMP::SWITCH_ST_DIP: case COMP::SWITCH_BUTTON_4PIN: case COMP::RELAY_HK19F: case COMP::RELAY_HJR_4102: case COMP::RELAY_FTR_B3C: case COMP::RELAY_G2R_2: case COMP::RELAY_G2R_2A: case COMP::RELAY_G2RK_2: case COMP::RELAY_G2RK_2A: case COMP::RELAY_G3MB_202P: case COMP::RELAY_JQC_3F_APPROX: case COMP::RELAY_S1A050000: case COMP::RELAY_TRCD: case COMP::FUSE_HOLDER: return SetPinFlags(static_cast(PIN_RECT | iCustomFlag)); case COMP::SOIC8: case COMP::SOIC14: case COMP::SOIC16: case COMP::SOIC14W: case COMP::SOIC16W: case COMP::SOIC20W: case COMP::SOIC24W: case COMP::SOIC28W: return SetPinFlags(static_cast(PIN_LABELS)); case COMP::RELAY_DIP_4PIN: case COMP::RELAY_DIP_8PIN: return SetPinFlags(static_cast(PIN_RECT | PIN_LABELS | iCustomFlag)); case COMP::MARK: case COMP::PAD: case COMP::PAD_FLYINGWIRE: case COMP::WIRE: case COMP::RESISTOR: case COMP::INDUCTOR: case COMP::DIODE: case COMP::LED: case COMP::CAP_CERAMIC: case COMP::CAP_FILM: case COMP::CAP_FILM_WIDE: case COMP::CAP_ELECTRO_200_NP: case COMP::CAP_ELECTRO_200: case COMP::CAP_ELECTRO_250_NP: case COMP::CAP_ELECTRO_250: case COMP::CAP_ELECTRO_300_NP: case COMP::CAP_ELECTRO_300: case COMP::CAP_ELECTRO_400_NP: case COMP::CAP_ELECTRO_400: case COMP::CAP_ELECTRO_500_NP: case COMP::CAP_ELECTRO_500: case COMP::CAP_ELECTRO_600_NP: case COMP::CAP_ELECTRO_600: case COMP::TRIM_VERT: case COMP::TRIM_VERT_OFFSET: case COMP::TRIM_VERT_OFFSET_WIDE: case COMP::TRIM_FLAT: case COMP::TRIM_FLAT_WIDE: case COMP::TRIM_3006P: case COMP::TRIM_3006W: case COMP::TRIM_3006Y: case COMP::TRIM_3329H: case COMP::TRIM_3329P_DK9_RC: case COMP::TRIM_3362F: case COMP::TRIM_3362H: case COMP::TRIM_3362P: case COMP::TRIM_3362R: case COMP::TRIM_3362U: case COMP::TRIM_3362M: case COMP::TRIM_3362S: case COMP::TRIM_3362W: case COMP::TRIM_3362X: case COMP::TRIM_3362Z: case COMP::CRYSTAL: assert( GetPinFlags() == iCustomFlag ); return SetPinFlags(static_cast(iCustomFlag)); case COMP::VERO_NUMBER: case COMP::VERO_LETTER: case COMP::CUSTOM: case COMP::TRACKS: case COMP::INVALID: return; default: assert(0); return; // Unhandled eType } } void Component::SetDefaultShapes(bool bUsePCBshapes) { switch( GetType() ) { case COMP::VERO_NUMBER: case COMP::VERO_LETTER: case COMP::CUSTOM: case COMP::TRACKS: return; default: m_shapes.clear(); } switch( GetType() ) { case COMP::MARK: AddOne( Shape(SHAPE::ELLIPSE, true, false, -0.30, 0.30, -0.30, 0.30) ); AddOne( Shape(SHAPE::LINE, true, false, -0.21, 0.21, -0.21, 0.21) ); AddOne( Shape(SHAPE::LINE, true, false, -0.21, 0.21, 0.21, -0.21) ); break; case COMP::PAD: AddTwo( Shape(bUsePCBshapes ? SHAPE::RECT : SHAPE::ELLIPSE, true, true, -0.45, 0.45, -0.45, 0.45) ); break; case COMP::PAD_FLYINGWIRE: AddTwo( Shape(SHAPE::ROUNDED_RECT, true, true, -0.45, 0.45, -0.45, 0.45) ); break; case COMP::LED: AddTwo( Shape(SHAPE::CHORD, true, true, -0.875, 0.875, -0.875, 0.875, 30, -30) );break; case COMP::CAP_ELECTRO_200_NP: AddTwo( Shape(SHAPE::ELLIPSE, true, true, -1.00, 1.00, -1.00, 1.00) ); break; case COMP::CAP_ELECTRO_250_NP: AddTwo( Shape(SHAPE::ELLIPSE, true, true, -1.25, 1.25, -1.25, 1.25) ); break; case COMP::CAP_ELECTRO_300_NP: AddTwo( Shape(SHAPE::ELLIPSE, true, true, -1.50, 1.50, -1.50, 1.50) ); break; case COMP::CAP_ELECTRO_400_NP: AddTwo( Shape(SHAPE::ELLIPSE, true, true, -2.00, 2.00, -2.00, 2.00) ); break; case COMP::CAP_ELECTRO_500_NP: AddTwo( Shape(SHAPE::ELLIPSE, true, true, -2.50, 2.50, -2.50, 2.50) ); break; case COMP::CAP_ELECTRO_600_NP: AddTwo( Shape(SHAPE::ELLIPSE, true, true, -3.00, 3.00, -3.00, 3.00) ); break; case COMP::CAP_ELECTRO_200: AddTwo( Shape(SHAPE::ELLIPSE, true, true, -1.00, 1.00, -1.00, 1.00) ); AddOne( Shape(SHAPE::LINE, true, false, 0.77, 0.77, -0.64, 0.64) ); break; case COMP::CAP_ELECTRO_250: AddTwo( Shape(SHAPE::ELLIPSE, true, true, -1.25, 1.25, -1.25, 1.25) ); AddOne( Shape(SHAPE::LINE, true, false, 0.96, 0.96, -0.80, 0.80) ); break; case COMP::CAP_ELECTRO_300: AddTwo( Shape(SHAPE::ELLIPSE, true, true, -1.50, 1.50, -1.50, 1.50) ); AddOne( Shape(SHAPE::LINE, true, false, 1.15, 1.15, -0.96, 0.96) ); break; case COMP::CAP_ELECTRO_400: AddTwo( Shape(SHAPE::ELLIPSE, true, true, -2.00, 2.00, -2.00, 2.00) ); AddOne( Shape(SHAPE::LINE, true, false, 1.53, 1.53, -1.29, 1.29) ); break; case COMP::CAP_ELECTRO_500: AddTwo( Shape(SHAPE::ELLIPSE, true, true, -2.50, 2.50, -2.50, 2.50) ); AddOne( Shape(SHAPE::LINE, true, false, 1.92, 1.92, -1.61, 1.61) ); break; case COMP::CAP_ELECTRO_600: AddTwo( Shape(SHAPE::ELLIPSE, true, true, -3.00, 3.00, -3.00, 3.00) ); AddOne( Shape(SHAPE::LINE, true, false, 2.30, 2.30, -1.93, 1.93) ); break; case COMP::TRIM_VERT: AddTwo( Shape(SHAPE::RECT, true, true, -1.50, 1.50, -0.50, 0.50) ); break; case COMP::TRIM_VERT_OFFSET: AddTwo( Shape(SHAPE::RECT, true, true, -1.50, 1.50, -0.75, 0.75) ); break; case COMP::TRIM_VERT_OFFSET_WIDE: AddTwo( Shape(SHAPE::RECT, true, true, -1.50, 1.50, -1.00, 1.00) ); break; case COMP::TRIM_FLAT: AddTwo( Shape(SHAPE::RECT, true, true, -1.50, 1.50, -1.50, 1.50) ); break; case COMP::TRIM_FLAT_WIDE: AddTwo( Shape(SHAPE::RECT, true, true, -1.50, 1.50, -1.50, 1.50) ); break; case COMP::TRIM_3006P: AddTwo( Shape(SHAPE::RECT, true, true, -3.75, 3.75, -0.50, 0.50) ); break; case COMP::TRIM_3006W: AddTwo( Shape(SHAPE::RECT, true, true, -3.75, 3.75, -1.45, 1.45) ); break; case COMP::TRIM_3006Y: AddTwo( Shape(SHAPE::RECT, true, true, -3.75, 3.75, -0.50, 0.50) ); break; case COMP::TRIM_3329H: AddTwo( Shape(SHAPE::ELLIPSE, true, true, -1.25, 1.25, -1.25, 1.25) ); break; case COMP::TRIM_3329P_DK9_RC: AddTwo( Shape(SHAPE::ELLIPSE, true, true, -1.25, 1.25, -1.25, 1.25) ); break; case COMP::TRIM_3362F: AddTwo( Shape(SHAPE::RECT, true, true, -1.38, 1.38, -1.38, 1.38) ); break; case COMP::TRIM_3362H: AddTwo( Shape(SHAPE::RECT, true, true, -1.38, 1.38, -1.38, 1.38, 45) ); break; case COMP::TRIM_3362P: AddTwo( Shape(SHAPE::RECT, true, true, -1.38, 1.38, -1.38, 1.38) ); break; case COMP::TRIM_3362R: AddTwo( Shape(SHAPE::RECT, true, true, -1.38, 1.38, -1.38, 1.38) ); break; case COMP::TRIM_3362U: AddTwo( Shape(SHAPE::RECT, true, true, -1.38, 1.38, -1.38, 1.38) ); break; case COMP::TRIM_3362M: AddTwo( Shape(SHAPE::RECT, true, true, -1.38, 1.38, -0.95, 0.95) ); break; case COMP::TRIM_3362S: AddTwo( Shape(SHAPE::RECT, true, true, -1.38, 1.38, -0.95, 0.95) ); break; case COMP::TRIM_3362W: AddTwo( Shape(SHAPE::RECT, true, true, -1.38, 1.38, -0.95, 0.95) ); break; case COMP::TRIM_3362X: AddTwo( Shape(SHAPE::RECT, true, true, -1.38, 1.38, -0.95, 0.95) ); break; case COMP::TRIM_3362Z: AddTwo( Shape(SHAPE::RECT, true, true, -1.38, 1.38, -0.95, 0.95) ); break; case COMP::CRYSTAL: AddTwo( Shape(SHAPE::ELLIPSE, true, true, -1.00, 1.00, -1.00, 1.00) ); break; case COMP::TO92: AddTwo( Shape(SHAPE::CHORD, true, true, -1.40, 1.40, -0.65, 1.15, -20, 200) );break; case COMP::TO18: AddOne( Shape(SHAPE::ARC, true, false, -0.95, 0.95, -0.95, 0.95, 101, 80) ); AddOne( Shape(SHAPE::LINE, true, false, -0.17, -0.17, -0.94, -1.13) ); AddOne( Shape(SHAPE::LINE, true, false, -0.17, 0.17, -1.13, -1.13) ); AddOne( Shape(SHAPE::LINE, true, false, 0.17, 0.17, -1.13, -0.94) ); // Fill ... AddOne( Shape(SHAPE::ELLIPSE, false, true, -0.95, 0.95, -0.95, 0.95) ); AddOne( Shape(SHAPE::RECT, false, true, -0.17, 0.17, -1.13, -0.90) ); break; case COMP::TO39: AddOne( Shape(SHAPE::ARC, true, false, -1.80, 1.80, -1.80, 1.80, 145, 125) ); AddOne( Shape(SHAPE::LINE, true, false, -1.47, -1.71, -1.03, -1.27) ); AddOne( Shape(SHAPE::LINE, true, false, -1.71, -1.27, -1.27, -1.71) ); AddOne( Shape(SHAPE::LINE, true, false, -1.27, -1.03, -1.71, -1.47) ); // Fill ... AddOne( Shape(SHAPE::ELLIPSE, false, true, -1.80, 1.80, -1.80, 1.80) ); AddOne( Shape(SHAPE::RECT, false, true, -1.68, -1.08, -1.53, -1.10, 0, 0, 45) ); break; case COMP::TO220: AddTwo( Shape(SHAPE::RECT, true, true, -1.56, 1.56, -0.56, 0.56) ); AddOne( Shape(SHAPE::LINE, true, false, -1.56, 1.56, -0.31, -0.31) ); break; case COMP::SWITCH_BUTTON_4PIN: AddTwo( Shape(SHAPE::RECT, true, true, -1.35, 1.35, -1.35, 1.35) ); break; case COMP::RELAY_HK19F: AddTwo( Shape(SHAPE::RECT, true, true, -3.98, 3.98, -1.97, 1.97) ); break; case COMP::RELAY_HJR_4102: AddTwo( Shape(SHAPE::RECT, true, true, -3.09, 3.09, -2.05, 2.05) ); break; case COMP::RELAY_FTR_B3C: AddTwo( Shape(SHAPE::RECT, true, true, -2.35, 2.35, -1.42, 1.42) ); break; case COMP::RELAY_G2R_2: AddTwo( Shape(SHAPE::RECT, true, true, -5.71, 5.71, -2.56, 2.56) ); break; case COMP::RELAY_G2R_2A: AddTwo( Shape(SHAPE::RECT, true, true, -5.71, 5.71, -2.56, 2.56) ); break; case COMP::RELAY_G2RK_2: AddTwo( Shape(SHAPE::RECT, true, true, -5.71, 5.71, -2.56, 2.56) ); break; case COMP::RELAY_G2RK_2A: AddTwo( Shape(SHAPE::RECT, true, true, -5.71, 5.71, -2.56, 2.56) ); break; case COMP::RELAY_G3MB_202P: AddTwo( Shape(SHAPE::RECT, true, true, -4.82, 4.82, -1.08, 1.08) ); break; case COMP::RELAY_JQC_3F_APPROX: AddTwo( Shape(SHAPE::RECT, true, true, -3.74, 3.74, -3.05, 3.05) ); break; case COMP::RELAY_S1A050000: AddTwo( Shape(SHAPE::RECT, true, true, -3.74, 3.74, -1.00, 1.00) ); break; case COMP::RELAY_TRCD: AddTwo( Shape(SHAPE::RECT, true, true, -4.53, 4.53, -3.17, 3.17) ); break; case COMP::FUSE_HOLDER: AddTwo( Shape(SHAPE::RECT, true, true, -4.85, 4.85, -1.35, 1.35) ); break; case COMP::SOIC8: case COMP::SOIC14: case COMP::SOIC16: case COMP::SOIC14W: case COMP::SOIC16W: case COMP::SOIC20W: case COMP::SOIC24W: case COMP::SOIC28W: { double w(0), h(0); switch( GetType() ) { case COMP::SOIC8: w = 1.00; h = 0.38; break; case COMP::SOIC14: w = 1.75; h = 0.38; break; case COMP::SOIC16: w = 2.00; h = 0.38; break; case COMP::SOIC14W: w = 1.75; h = 1.05; break; case COMP::SOIC16W: w = 2.00; h = 1.05; break; case COMP::SOIC20W: w = 2.50; h = 1.05; break; case COMP::SOIC24W: w = 3.00; h = 1.05; break; case COMP::SOIC28W: w = 3.50; h = 1.05; break; default: assert(0); break; } AddOne( Shape(SHAPE::ELLIPSE, true, false, -w+0.1, -w+0.35, h-0.35, h-0.1)); AddTwo( Shape(SHAPE::RECT, true, true, -w, w, -h, h)); break; } // Following handle variable length components case COMP::DIP: case COMP::SIP: case COMP::DIP_RECTIFIER: case COMP::RELAY_DIP_4PIN: case COMP::RELAY_DIP_8PIN: { const bool bInternalPins = ( !bUsePCBshapes || GetRows() < 3 ); // true/false ==> outline has pins on the inside/outside double w(0.35 + 0.5*(GetCols() - 1)), h( (bInternalPins ? 0.35 : -0.5) + 0.5*(GetRows()-1)); AddOne( Shape(SHAPE::LINE, true, false, -w, -w, 0.25, h) ); AddOne( Shape(SHAPE::LINE, true, false, -w, w, h, h) ); AddOne( Shape(SHAPE::LINE, true, false, w, w, h, -h) ); AddOne( Shape(SHAPE::LINE, true, false, w, -w, -h, -h) ); AddOne( Shape(SHAPE::LINE, true, false, -w, -w, -h, -0.25) ); AddOne( Shape(SHAPE::ARC, true, false, -w-0.25, -w+0.25, -0.25, 0.25, -90, 90) ); // Fill ... AddOne( Shape(SHAPE::RECT, false, true, -w, w, -h, h)); break; } case COMP::CAP_CERAMIC: { double w(0.4 + 0.5*(GetCols() - 1)), h(0.4 + 0.5*(GetRows()-1)); AddTwo( Shape(SHAPE::ELLIPSE, true, true, -w, w, -h, h) ); break; } case COMP::CAP_FILM: case COMP::CAP_FILM_WIDE: { double w(0.45 + 0.5*(GetCols() - 1)), h(0.45 + 0.5*(GetRows()-1)); AddTwo( Shape(SHAPE::ROUNDED_RECT, true, true, -w, w, -h, h) ); break; } case COMP::SWITCH_ST: case COMP::SWITCH_DT: { double w(0.7 + 0.5*(GetCols() - 1)), h(0.7 + 0.5*(GetRows()-1)); AddTwo( Shape(SHAPE::ROUNDED_RECT, true, true, -w, w, -h, h) ); break; } case COMP::SWITCH_ST_DIP: { double w(0.35 + 0.5*(GetCols() - 1)), h(0.35 + 0.5*(GetRows()-1)); AddTwo( Shape(SHAPE::RECT, true, true, -w, w, -h, h) ); break; } case COMP::RESISTOR: case COMP::INDUCTOR: { const bool bInternalPins = ( !bUsePCBshapes || GetCols() < 3 ); // true/false ==> outline has pins on the inside/outside if ( bInternalPins ) { double w(-0.32 + 0.5*(GetCols() - 1)), h(0.32 + 0.5*(GetRows()-1)); AddOne( Shape(SHAPE::ARC, true, false, -w - 0.64, -w + 0.16, -h -0.08, -h + 0.72, 53, -53) ); AddOne( Shape(SHAPE::ARC, true, false, w - 0.16, w + 0.64, -h -0.08, -h + 0.72, 233, 127) ); AddOne( Shape(SHAPE::LINE, true, false, -w, w, -h, -h) ); AddOne( Shape(SHAPE::LINE, true, false, -w, w, h, h) ); // Fill ... AddOne( Shape(SHAPE::ELLIPSE, false, true, -w - 0.64, -w + 0.16, -h -0.08, -h + 0.72) ); AddOne( Shape(SHAPE::ELLIPSE, false, true, w - 0.16, w + 0.64, -h -0.08, -h + 0.72) ); AddOne( Shape(SHAPE::RECT, false, true, -w, w, -h, h)); } else { double w(-0.85 + 0.5*(GetCols() - 1)), h(0.34 + 0.5*(GetRows()-1)); AddOne( Shape(SHAPE::ARC, true, false, -w - 0.45, -w + 0.15, -h -0.06, -h + 0.74, 60, -60) ); AddOne( Shape(SHAPE::ARC, true, false, w - 0.15, w + 0.45, -h -0.06, -h + 0.74, 240, 120) ); AddOne( Shape(SHAPE::LINE, true, false, -w, w, -h, -h) ); AddOne( Shape(SHAPE::LINE, true, false, -w, w, h, h) ); // Fill ... AddOne( Shape(SHAPE::ELLIPSE, false, true, -w - 0.45, -w + 0.15, -h -0.06, -h + 0.74) ); AddOne( Shape(SHAPE::ELLIPSE, false, true, w - 0.15, w + 0.45, -h -0.06, -h + 0.74) ); AddOne( Shape(SHAPE::RECT, false, true, -w, w, -h, h)); } break; } case COMP::WIRE: { double w(0.5*(GetCols() - 1)), h(0.1 + 0.5*(GetRows()-1)); AddTwo( Shape(SHAPE::ROUNDED_RECT, true, true, -w, w, -h, h) ); break; } case COMP::DIODE: { const bool bInternalPins = ( !bUsePCBshapes || GetCols() < 3 ); // true/false ==> outline has pins on the inside/outside if ( bInternalPins ) { double w(0.40 + 0.5*(GetCols() - 1)), h(0.40 + 0.5*(GetRows()-1)); AddTwo( Shape(SHAPE::RECT, true, true, -w, w, -h, h) ); AddOne( Shape(SHAPE::LINE, true, false, w - 0.05, w - 0.05, -h, h) ); AddOne( Shape(SHAPE::LINE, true, false, w - 0.75, w - 0.75, -h, h) ); AddOne( Shape(SHAPE::LINE, true, false, w - 0.80, w - 0.80, -h, h) ); } else { double w(-0.5 + 0.5*(GetCols() - 1)), h(0.40 + 0.5*(GetRows()-1)); AddTwo( Shape(SHAPE::RECT, true, true, -w, w, -h, h) ); AddOne( Shape(SHAPE::LINE, true, false, w - 0.06, w - 0.06, -h, h) ); AddOne( Shape(SHAPE::LINE, true, false, w - 0.12, w - 0.12, -h, h) ); AddOne( Shape(SHAPE::LINE, true, false, w - 0.18, w - 0.18, -h, h) ); AddOne( Shape(SHAPE::LINE, true, false, w - 0.24, w - 0.24, -h, h) ); } break; } case COMP::STRIP_100: case COMP::BLOCK_100: case COMP::BLOCK_200: { const int jj = GetRows() / 2; // Middle row const double dx = ( GetType() == COMP::BLOCK_200 ) ? 0.5 : 0; for (int ii = 0; ii < GetCols(); ii++) { if ( !Get(jj,ii)->GetIsPin() ) continue; double w(0.5*GetCols()- ii), h( 0.5 * GetRows() ); AddTwo( Shape(SHAPE::ROUNDED_RECT, true, true, -w-dx, -w+dx+1, -h, h) ); } break; } case COMP::INVALID: break; default: assert(0); // Unhandled eType } std::sort(m_shapes.begin(), m_shapes.end()); // Sort shapes so fills are rendered before lines SetDefaultColor(); } void Component::SetDefaultColor() { switch( GetType() ) { case COMP::VERO_NUMBER: case COMP::VERO_LETTER: case COMP::CUSTOM: case COMP::TRACKS: case COMP::MARK: return; case COMP::PAD: case COMP::PAD_FLYINGWIRE: return SetFillColor(MyRGB(0xFFFFDF)); case COMP::LED: return SetFillColor(MyRGB(0xFF6644)); case COMP::CAP_ELECTRO_200: case COMP::CAP_ELECTRO_200_NP: case COMP::CAP_ELECTRO_250: case COMP::CAP_ELECTRO_250_NP: case COMP::CAP_ELECTRO_300: case COMP::CAP_ELECTRO_300_NP: case COMP::CAP_ELECTRO_400: case COMP::CAP_ELECTRO_400_NP: case COMP::CAP_ELECTRO_500: case COMP::CAP_ELECTRO_500_NP: case COMP::CAP_ELECTRO_600: case COMP::CAP_ELECTRO_600_NP: return SetFillColor(MyRGB(0x8A8AE4)); case COMP::TRIM_VERT: case COMP::TRIM_VERT_OFFSET: case COMP::TRIM_VERT_OFFSET_WIDE: case COMP::TRIM_FLAT: case COMP::TRIM_FLAT_WIDE: case COMP::TRIM_3006P: case COMP::TRIM_3006W: case COMP::TRIM_3006Y: case COMP::TRIM_3329H: case COMP::TRIM_3329P_DK9_RC: case COMP::TRIM_3362F: case COMP::TRIM_3362H: case COMP::TRIM_3362P: case COMP::TRIM_3362R: case COMP::TRIM_3362U: case COMP::TRIM_3362M: case COMP::TRIM_3362S: case COMP::TRIM_3362W: case COMP::TRIM_3362X: case COMP::TRIM_3362Z: return SetFillColor(MyRGB(0x506BFD)); case COMP::CRYSTAL: return SetFillColor(MyRGB(0xC8C8C8)); case COMP::TO92: case COMP::TO18: case COMP::TO39: case COMP::TO220: return SetFillColor(MyRGB(0xA0A0A0)); case COMP::SWITCH_BUTTON_4PIN: return SetFillColor(MyRGB(0x3299CC)); case COMP::RELAY_HK19F: case COMP::RELAY_HJR_4102: case COMP::RELAY_FTR_B3C: case COMP::RELAY_G2R_2: case COMP::RELAY_G2R_2A: case COMP::RELAY_G2RK_2: case COMP::RELAY_G2RK_2A: case COMP::RELAY_G3MB_202P: case COMP::RELAY_JQC_3F_APPROX: case COMP::RELAY_S1A050000: case COMP::RELAY_TRCD: return SetFillColor(MyRGB(0x84C0D0)); case COMP::FUSE_HOLDER: return SetFillColor(MyRGB(0x909090)); case COMP::SOIC8: case COMP::SOIC14: case COMP::SOIC16: case COMP::SOIC14W: case COMP::SOIC16W: case COMP::SOIC20W: case COMP::SOIC24W: case COMP::SOIC28W: case COMP::DIP: case COMP::SIP: case COMP::DIP_RECTIFIER: case COMP::RELAY_DIP_4PIN: case COMP::RELAY_DIP_8PIN: return SetFillColor(MyRGB(0xA0A0A0)); case COMP::CAP_CERAMIC: return SetFillColor(MyRGB(0xFFA050)); case COMP::CAP_FILM: return SetFillColor(MyRGB(0x1EB450)); case COMP::CAP_FILM_WIDE: return SetFillColor(MyRGB(0x1EB450)); case COMP::SWITCH_ST: return SetFillColor(MyRGB(0x3299CC)); case COMP::SWITCH_DT: return SetFillColor(MyRGB(0x3299CC)); case COMP::SWITCH_ST_DIP: return SetFillColor(MyRGB(0x3299CC)); case COMP::RESISTOR: return SetFillColor(MyRGB(0x82CFFD)); case COMP::INDUCTOR: return SetFillColor(MyRGB(0xFFE080)); case COMP::WIRE: return SetFillColor(MyRGB(0xDFFFFF)); case COMP::DIODE: return SetFillColor(MyRGB(0xFF6644)); case COMP::STRIP_100: return SetFillColor(MyRGB(0xFFFFDF)); case COMP::BLOCK_100: return SetFillColor(MyRGB(0xFFFFDF)); case COMP::BLOCK_200: return SetFillColor(MyRGB(0xFFFFDF)); case COMP::INVALID: return; default: assert(0); return; // Unhandled eType } } // Helpers for labels void Component::SetDefaultLabelOffsets() { m_iLabelOffsetCol = 0; switch( GetType() ) { case COMP::LED: m_iLabelOffsetRow = 8; return; case COMP::CRYSTAL: case COMP::CAP_ELECTRO_200: case COMP::CAP_ELECTRO_200_NP: m_iLabelOffsetRow = 10; return; case COMP::CAP_ELECTRO_250: case COMP::CAP_ELECTRO_250_NP: m_iLabelOffsetRow = 11; return; case COMP::TRIM_3329H: m_iLabelOffsetRow = -11; return; case COMP::TRIM_3362H: m_iLabelOffsetRow = -11; return; case COMP::TRIM_3362U: m_iLabelOffsetRow = -11; return; case COMP::TRIM_3362M: m_iLabelOffsetRow = -8; return; case COMP::TRIM_3362S: m_iLabelOffsetRow = 3; return; case COMP::TRIM_3362W: m_iLabelOffsetRow = -3; return; case COMP::TRIM_3362X: m_iLabelOffsetRow = -3; return; case COMP::TRIM_3362Z: m_iLabelOffsetRow = 3; return; case COMP::STRIP_100: m_iLabelOffsetRow = 14; return; case COMP::BLOCK_100: m_iLabelOffsetRow = 30; return; case COMP::BLOCK_200: m_iLabelOffsetRow = 30; return; default: m_iLabelOffsetRow = 0; } } void Component::GetLabelOffsets(int& offsetRow, int& offsetCol) const // w.r.t. screen, not comp rotation { switch( GetDirection() ) { case 'W': offsetRow = m_iLabelOffsetRow; offsetCol = m_iLabelOffsetCol; return; case 'E': offsetRow = -m_iLabelOffsetRow; offsetCol = -m_iLabelOffsetCol; return; case 'N': offsetRow = m_iLabelOffsetCol; offsetCol = -m_iLabelOffsetRow; return; case 'S': offsetRow = -m_iLabelOffsetCol; offsetCol = m_iLabelOffsetRow; return; } } void Component::MoveLabelOffsets(int deltaRow, int deltaCol) // w.r.t. screen, not comp rotation { switch( GetDirection() ) { case 'W': m_iLabelOffsetRow += deltaRow; m_iLabelOffsetCol += deltaCol; return; case 'E': m_iLabelOffsetRow -= deltaRow; m_iLabelOffsetCol -= deltaCol; return; case 'N': m_iLabelOffsetCol += deltaRow; m_iLabelOffsetRow -= deltaCol; return; case 'S': m_iLabelOffsetCol -= deltaRow; m_iLabelOffsetRow += deltaCol; return; } } void Component::HandleLegacyLabelOffsets() // For old VRT files { switch( GetDirection() ) { case 'E': m_iLabelOffsetRow = -m_iLabelOffsetRow; m_iLabelOffsetCol = -m_iLabelOffsetCol; return; case 'N': std::swap(m_iLabelOffsetRow, m_iLabelOffsetCol); m_iLabelOffsetRow = -m_iLabelOffsetRow; return; case 'S': std::swap(m_iLabelOffsetRow, m_iLabelOffsetCol); m_iLabelOffsetCol = -m_iLabelOffsetCol; return; } } VeroRoute/Src/Pin.h000644 001750 001750 00000024304 14425254214 014370 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include "Persist.h" // "Pin" is a base class for "CompElement" and "Element". // A component's spatial layout (or "Footprint") is a two-dimensional array of "CompElement" objects. // The "Board" object used for designing a circuit is a two-dimensional array of "Element" objects. // // There are 4 parts to the description of a "Pin": // // 1) The pin character "m_pinChar" is just a pinIndex in the range 0 to 254. // Places with no pin (e.g. the middle of a resistor) have m_pinChar of 255 and an invalid pinIndex. // // 2) The surface occupancy "m_surface" models the interaction between a component and the board surface. // // SURFACE_FREE ==> the board surface is not occupied. // SURFACE_GAP ==> the gap between IC pins. // SURFACE_WIRE_END ==> a wire (endpoint). // SURFACE_WIRE ==> a wire (not endpoint). // SURFACE_PLUG ==> e.g. resistor/diode/pad etc. Can be placed in a "GAP". // SURFACE_FULL ==> the board surface is fully occupied. Nothing else can be placed there. // SURFACE_NOPAINT ==> If this bit is set, then no paint can be applied. // SURFACE_HOLE ==> SURFACE_FULL + SURFACE_NOPAINT // // 3) The hole occupancy "m_holeUse" models the interaction between a component and the board holes. // // HOLE_FREE ==> the hole is not occupied. // HOLE_WIRE ==> the hole is occupied by one wire. // HOLE_FULL ==> the hole is fully occupied. (By a regular component pin, or by 2 wires). // // 4) SOIC bitfield. We store this info on the base layer of the grid, but it refers to whatever // layer displays the SOIC pattern (i.e. "the SOIC layer"). // // SOIC_FREE ==> No pads and no SOIC pattern. // SOIC_PATTERN ==> No pads but have SOIC pattern (so point is not paintable on the SOIC layer). // SOIC_THL ==> One through-hole component or wire. Regular components/wires use this with their pins. // SOIC_THL_2 ==> Two through-hole components (i.e. wires sharing a hole on the board). // SOIC_PAD ==> SOIC pad and no SOIC pattern. SOIC components use this with their pins. // SOIC_FULL ==> Cannot place any more parts at the location. Q_DECL_CONSTEXPR static const uchar BAD_PINCHAR = 255; Q_DECL_CONSTEXPR static const size_t BAD_PININDEX = static_cast(-1); Q_DECL_CONSTEXPR static const uchar SURFACE_FREE = 0; Q_DECL_CONSTEXPR static const uchar SURFACE_GAP = 1; Q_DECL_CONSTEXPR static const uchar SURFACE_WIRE_END = 2; // Hence: "SURFACE_WIRE_END + SURFACE_WIRE_END == SURFACE_WIRE" Q_DECL_CONSTEXPR static const uchar SURFACE_WIRE = 4; // Hence: "SURFACE_WIRE + SURFACE_WIRE == SURFACE_PLUG" Q_DECL_CONSTEXPR static const uchar SURFACE_PLUG = 8; Q_DECL_CONSTEXPR static const uchar SURFACE_FULL = 9; // Hence: "SURFACE_PLUG + SURFACE_GAP == SURFACE_FULL" Q_DECL_CONSTEXPR static const uchar SURFACE_NOPAINT = 16; // Should only be used as part of SURFACE_HOLE Q_DECL_CONSTEXPR static const uchar SURFACE_HOLE = 25; // Hence: "SURFACE_FULL + SURFACE_NOPAINT = SURFACE_HOLE" Q_DECL_CONSTEXPR static const uchar HOLE_FREE = 0; Q_DECL_CONSTEXPR static const uchar HOLE_WIRE = 1; // Hence: "HOLE_WIRE + HOLE_WIRE == HOLE_FULL" Q_DECL_CONSTEXPR static const uchar HOLE_FULL = 2; Q_DECL_CONSTEXPR static const uchar SOIC_FREE = 0; // Free space Q_DECL_CONSTEXPR static const uchar SOIC_TRACKS_TOP = 1; // Pattern of SOIC tracks on top layer Q_DECL_CONSTEXPR static const uchar SOIC_TRACKS_BOT = 2; // Pattern of SOIC tracks on top layer Q_DECL_CONSTEXPR static const uchar SOIC_THL_COMP = 4; // A through-hole component pin (not a wire) Q_DECL_CONSTEXPR static const uchar SOIC_THL_WIRE = 8; // A wire end Q_DECL_CONSTEXPR static const uchar SOIC_THL_WIRES = 16; // 2 wire-ends sharing a hole Q_DECL_CONSTEXPR static const uchar SOIC_THL = SOIC_THL_COMP | SOIC_THL_WIRE | SOIC_THL_WIRES; Q_DECL_CONSTEXPR static const uchar SOIC_PAD = 32; // An SOIC pad Q_DECL_CONSTEXPR static const uchar SOIC_FULL = SOIC_PAD | SOIC_THL_COMP; // Hence can handle at most (1xSOIC_THL_COMP + 1xSOIC_PAD) not (2xSOIC_PADs). (2xSOIC_THL_COMP is blocked by the SURFACE and HOLE info). Q_DECL_CONSTEXPR static size_t GetPinIndexFromLegacyPinChar(uchar c) // Legacy VRT format had messy mapping of pinChar to pinIndex { return ( c < '1' ) ? BAD_PININDEX // Handles the '.', '-', '+' characters used by GetMakeInstructions() : ( c <= '9' ) ? ( c - '1') // Char '1' to '9' ==> Index 0 to 8 : ( c <= '@' ) ? (61 + c - ':') // Char ':' to '@' ==> Index 61 to 67 : ( c <= 'Z' ) ? (9 + c - 'A') // Char 'A' to 'Z' ==> Index 9 to 34 : ( c <= '`' ) ? (68 + c - '[') // Char '[' to '`' ==> Index 68 to 73 : ( c <= 'z' ) ? (35 + c - 'a') // Char 'a' to 'z' ==> Index 35 to 60 : (74 + c - '{'); // Char '{' to 255 ==> Index 74 to 206 } static uchar GetSurfaceFromLegacySurfaceChar(uchar c) { // The following are the old SURFACE codes before the introduction of SURFACE_WIRE_END and SURFACE_WIRE switch( c ) { case 0: return SURFACE_FREE; case 1: return SURFACE_GAP; case 2: return SURFACE_PLUG; case 3: return SURFACE_FULL; case 4: return SURFACE_NOPAINT; case 7: return SURFACE_HOLE; default: assert(0); return SURFACE_FREE; } } class Pin : public Persist, public Merge { public: Pin(uchar pinChar = BAD_PINCHAR, uchar surface = SURFACE_FREE, uchar holeUse = HOLE_FREE, uchar soicChar = SOIC_FREE) : m_pinChar(pinChar) , m_surface(surface) , m_holeUse(holeUse) , m_soicChar(soicChar) {} Pin(const Pin& o) { *this = o; } virtual ~Pin() {} Pin& operator=(const Pin& o) { m_pinChar = o.m_pinChar; m_surface = o.m_surface; m_holeUse = o.m_holeUse; m_soicChar = o.m_soicChar; return *this; } bool operator==(const Pin& o) const // Compare persisted info { return m_pinChar == o.m_pinChar && m_surface == o.m_surface && m_holeUse == o.m_holeUse && m_soicChar == o.m_soicChar; } bool operator!=(const Pin& o) const { return !(*this == o); } void SetPinIndex(size_t i) { m_pinChar = ( i >= BAD_PINCHAR ) ? BAD_PINCHAR : static_cast (i); } void SetSurface(uchar c) { m_surface = c; } void SetHoleUse(uchar c) { m_holeUse = c; } void SetSoicChar(uchar c) { m_soicChar = c; } void SetOccupancyTH(bool bWire) // Helper for TH components { if ( bWire ) { SetSurface( GetIsPin() ? SURFACE_WIRE_END : SURFACE_WIRE ); // Set surface occupancy for pins/non-pins SetHoleUse( GetIsPin() ? HOLE_WIRE : HOLE_FREE ); // Set hole occupancy for pins/non-pins SetSoicChar( GetIsPin() ? SOIC_THL_WIRE : SOIC_FREE ); // Set SOIC code for pins/non-pins } else { SetHoleUse( GetIsPin() ? HOLE_FULL : HOLE_FREE ); // Set hole occupancy for pins/non-pins SetSoicChar( GetIsPin() ? SOIC_THL_COMP : SOIC_FREE ); // Set SOIC code for pins/non-pins } } void SetOccupancySOIC() // Helper for SOIC components { SetHoleUse(HOLE_FREE); if ( GetIsPin() ) { SetSurface(SURFACE_FREE); SetSoicChar(SOIC_PAD); } } size_t GetPinIndex() const { return ( m_pinChar == BAD_PINCHAR ) ? BAD_PININDEX : m_pinChar; } const uchar& GetSurface() const { return m_surface; } const uchar& GetHoleUse() const { return m_holeUse; } const uchar& GetSoicChar() const { return m_soicChar; } bool GetIsPin() const { return m_pinChar != BAD_PINCHAR; } bool GetIsHole() const { return m_surface == SURFACE_HOLE; } static const std::map& GetMapSurfaceStrings() { static std::map mapSurfaceToStr; // Mapping of SURFACE to strings for Component Editor if ( mapSurfaceToStr.empty() ) { mapSurfaceToStr[SURFACE_FULL] = "Full"; mapSurfaceToStr[SURFACE_FREE] = "Free"; mapSurfaceToStr[SURFACE_HOLE] = "Hole"; } return mapSurfaceToStr; } static const std::list& GetListSurfaceStrings() { static std::list listSurfaceStr; // Use for populating combo boxes in Component Editor if ( listSurfaceStr.empty() ) { listSurfaceStr.push_back("Full"); listSurfaceStr.push_back("Free"); listSurfaceStr.push_back("Hole"); } return listSurfaceStr; } // Merge interface functions virtual void UpdateMergeOffsets(MergeOffsets&) override {} virtual void ApplyMergeOffsets(const MergeOffsets&) override {} void Merge(const Pin& o) { *this = o; } // Persist interface functions virtual void Load(DataStream& inStream) override { inStream.Load(m_pinChar); inStream.Load(m_surface); if ( inStream.GetVersion() < VRT_VERSION_4 ) // Remap m_pinChar if file is older than VRT_VERSION_4 SetPinIndex( GetPinIndexFromLegacyPinChar(m_pinChar) ); if ( inStream.GetVersion() < VRT_VERSION_26 ) // Remap m_surface if file is older than VRT_VERSION_26 SetSurface( GetSurfaceFromLegacySurfaceChar(m_surface) ); m_holeUse = GetIsPin() ? HOLE_FULL : HOLE_FREE; if ( inStream.GetVersion() >= VRT_VERSION_26 ) inStream.Load(m_holeUse); // Added in VRT_VERSION_26 if ( inStream.GetVersion() <= VRT_VERSION_39 ) if ( GetIsPin() && m_holeUse == HOLE_FREE ) m_holeUse = HOLE_FULL; // Bug-fix non-wire hole-use m_soicChar = SOIC_FREE; // Can't set a default for all legacy cases here. Need to handle things in Component::Load() and Board::Load() if ( inStream.GetVersion() >= VRT_VERSION_55 ) inStream.Load(m_soicChar); // Added in VRT_VERSION_55 } virtual void Save(DataStream& outStream) override { outStream.Save(m_pinChar); // New mapping from VRT_VERSION_4 outStream.Save(m_surface); // New mapping from VRT_VERSION_26 outStream.Save(m_holeUse); // Added in VRT_VERSION_26 outStream.Save(m_soicChar); // Added in VRT_VERSION_55 } private: // Data uchar m_pinChar; uchar m_surface; uchar m_holeUse; uchar m_soicChar; }; VeroRoute/libraries/gEDA/veroroute_transistor/NPN_BC548.sym000644 001750 001750 00000001563 13515171161 023772 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=1 T 400 850 5 6 0 0 0 0 1 pinseq=1 T 400 850 5 6 0 0 0 0 1 pinlabel=1 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=3 T 400 50 5 6 0 0 0 0 1` pinseq=3 T 400 50 5 6 0 0 0 0 1 pinlabel=3 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 403,209 L 501,200 L 431,273 L 425,240 z T 600 700 5 10 1 1 0 0 1 device=BC548 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=NPN Transistor VeroRoute/Src/mainwindow_drawing.cpp000644 001750 001750 00000213054 14565710170 020071 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #include "mainwindow.h" #include "padoffsetdialog.h" #include "GPainter.h" #include "SpanningTreeHelper.h" //#define PAINTBOARD_TIMER void MainWindow::PaintViaGrey(const GuiControl& guiCtrl, QPainter& painter, const QPointF& pC) { assert(!m_bWriteGerber); const int width = guiCtrl.GetHalfPixelsFromMIL( guiCtrl.GetVIAPAD_MIL() ) << 1; static QPen pen(QColor(200,200,200,255), 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); pen.setWidth(width); painter.setPen(pen); painter.setBrush(Qt::NoBrush); painter.drawPoint(pC); } void MainWindow::PaintPadGrey(const GuiControl& guiCtrl, QPainter& painter, QPen& pen, const QPointF& pC, int iPadWidthMIL) { assert(!m_bWriteGerber); const int w = ( iPadWidthMIL == 0 ) ? guiCtrl.GetPAD_MIL() : iPadWidthMIL; const int width = guiCtrl.GetHalfPixelsFromMIL( w ) << 1; pen.setWidth(width); painter.setPen(pen); painter.setBrush(Qt::NoBrush); painter.drawPoint(pC); } void MainWindow::PaintSOIC(const GuiControl& guiCtrl, QPainter& painter, const QColor& color, const QPointF& pC, size_t pinIndex, const Component* pComp, bool bIsGnd, bool bGap) { assert(pComp); const int W = guiCtrl.GetGRIDPIXELS(); std::list polygonList; guiCtrl.CalcSOIC(W, pC, pinIndex, pComp, polygonList, false, bIsGnd, bGap); // Populate polygonList if ( m_bWriteGerber ) // Write to Gerber { if ( !bGap ) // Use this as an opportunity to get the solder mask info { std::list solderMask; guiCtrl.CalcSOIC(W, pC, pinIndex, pComp, solderMask, true, bIsGnd, bGap); // Populate polygonList GStream& os = m_gWriter.GetStream(GFILE::GTS); // Top solder mask layer for (auto& polygon : solderMask) { if ( polygon.empty() ) continue; assert(polygon.m_ePadPen == GPEN::NONE && polygon.m_eTrkPen == GPEN::NONE && polygon.m_bClosed); os.AddRegion(polygon); } } for (int k = 0; k < m_board.GetLyrs(); k++) { GStream& os = m_gWriter.GetStream(k == 0 ? GFILE::GBL : GFILE::GTL); // Bottom/Top copper layer for (auto& polygon : polygonList) { if ( polygon.empty() ) continue; assert(polygon.m_ePadPen == GPEN::NONE); const bool bTrk = polygon.m_eTrkPen != GPEN::NONE && !polygon.m_bClosed; const bool bPad = polygon.m_eTrkPen == GPEN::NONE && polygon.m_bClosed; if ( !bTrk && !bPad ) continue; if ( bPad ) os.AddRegion(polygon); else os.AddTrack(polygon, polygon.m_eTrkPen); } } } else // Draw to pixmap { const int gapWidth = bGap ? guiCtrl.GetPixelsFromMIL( guiCtrl.GetGAP_MIL() ) : 0; const int trackWidth = ( guiCtrl.GetHalfPixelsFromMIL( guiCtrl.GetTRACK_IC_MIL() ) + gapWidth ) << 1; // Track width in pixels const int minWidth = ( guiCtrl.GetHalfPixelsFromMIL( guiCtrl.GetMIN_IC_MIL() ) + gapWidth ) << 1; // Thin track width in pixels static QPen pen(Qt::black, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); static QBrush brush(Qt::black, Qt::SolidPattern); pen.setColor(color); brush.setColor(color); painter.setBrush(brush); for (auto& polygon : polygonList) { if ( polygon.empty() ) continue; assert(polygon.m_ePadPen == GPEN::NONE); bool bTrk(false), bMin(false), bPad(false); // Determine track/pad from m_eTrkPen switch(polygon.m_eTrkPen) { case GPEN::MIN_IC: case GPEN::MIN_IC_GAP: bMin = !polygon.m_bClosed; break; case GPEN::TRK_IC: case GPEN::TRK_IC_GAP: bTrk = !polygon.m_bClosed; break; case GPEN::NONE: bPad = polygon.m_bClosed; break; default: break; } if ( !bTrk && !bMin && !bPad ) continue; pen.setWidth(bMin ? minWidth : bTrk ? trackWidth : 0); painter.setPen(pen); if ( bPad ) painter.drawPolygon(polygon); else // bTrk || bMin { auto iterA = polygon.begin(); auto iterB = iterA; iterB++; while( iterB != polygon.end() ) { painter.drawLine(*iterA, *iterB); ++iterA; ++iterB; } } } } } void MainWindow::PaintVia(const GuiControl& guiCtrl, QPainter& painter, const QColor& color, const QPointF& pC, bool bGap) { if ( m_bWriteGerber ) { m_gWriter.GetStream(GFILE::GTL).AddViaPad(pC, bGap ? GPEN::VIA_GAP : GPEN::VIA); // Top copper layer m_gWriter.GetStream(GFILE::GBL).AddViaPad(pC, bGap ? GPEN::VIA_GAP : GPEN::VIA); // Bottom copper layer if ( !bGap ) { m_gWriter.GetStream(GFILE::GTS).AddViaPad(pC, GPEN::VIA_MSK); // Top solder mask layer m_gWriter.GetStream(GFILE::GBS).AddViaPad(pC, GPEN::VIA_MSK); // Bottom solder mask layer m_gWriter.GetStream(GFILE::DRL).AddHole(pC, GPEN::VIA_HLE); // Drill file } } else { const int gapWidth = bGap ? guiCtrl.GetPixelsFromMIL( guiCtrl.GetGAP_MIL() ) : 0; const int padWidth = ( guiCtrl.GetHalfPixelsFromMIL( guiCtrl.GetVIAPAD_MIL() ) + gapWidth ) << 1; static QPen pen(Qt::black, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); pen.setColor(color); pen.setWidth(padWidth); painter.setPen(pen); painter.setBrush(Qt::NoBrush); painter.drawPoint(pC); } } void MainWindow::PaintPad(const GuiControl& guiCtrl, QPainter& painter, const QColor& color, const QPointF& pC, int iPadWidthMIL, int iHoleWidthMIL, bool bGap) { if ( m_bWriteGerber ) { m_gWriter.GetStream(GFILE::GTL).AddPad(pC, bGap ? GPEN::PAD_GAP : GPEN::PAD, iPadWidthMIL); // Top copper layer m_gWriter.GetStream(GFILE::GBL).AddPad(pC, bGap ? GPEN::PAD_GAP : GPEN::PAD, iPadWidthMIL); // Bottom copper layer if ( !bGap ) { m_gWriter.GetStream(GFILE::GTS).AddPad(pC, GPEN::PAD_MSK, iPadWidthMIL); // Top solder mask layer m_gWriter.GetStream(GFILE::GBS).AddPad(pC, GPEN::PAD_MSK, iPadWidthMIL); // Bottom solder mask layer m_gWriter.GetStream(GFILE::DRL).AddHole(pC, GPEN::PAD_HLE, iHoleWidthMIL); // Drill file } } else { const int gapWidth = bGap ? guiCtrl.GetPixelsFromMIL( guiCtrl.GetGAP_MIL() ) : 0; const int w = ( iPadWidthMIL == 0 ) ? guiCtrl.GetPAD_MIL() : iPadWidthMIL; const int padWidth = ( guiCtrl.GetHalfPixelsFromMIL( w ) + gapWidth ) << 1; static QPen pen(Qt::black, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); pen.setColor(color); pen.setWidth(padWidth); painter.setPen(pen); painter.setBrush(Qt::NoBrush); painter.drawPoint(pC); } } void MainWindow::PaintBlob(const GuiControl& guiCtrl, QPainter& painter, const QColor& color, const QPointF& pC, const QPointF& pCoffset, int iPadWidthMIL, int iPerimeterCode, int iTagCode, bool bHavePad, bool bHaveSoic, bool bIsGnd, bool bGap) { std::list polygonList; guiCtrl.CalcBlob(guiCtrl.GetGRIDPIXELS(), pC, pCoffset, iPadWidthMIL, iPerimeterCode, iTagCode, polygonList, bHavePad, bHaveSoic, bIsGnd, bGap); // Populate polygonList if ( m_bWriteGerber ) // Write to Gerber { for (int k = 0; k < m_board.GetLyrs(); k++) { GStream& os = m_gWriter.GetStream(k == 0 ? GFILE::GBL : GFILE::GTL); // Bottom/Top copper layer for (auto& polygon : polygonList) { if ( polygon.empty() ) continue; const bool bPad = polygon.m_ePadPen != GPEN::NONE; const bool bTrk = polygon.m_eTrkPen != GPEN::NONE; if ( !bTrk && !bPad && !polygon.m_bClosed ) continue; const GPEN& ePen = bTrk ? polygon.m_eTrkPen : polygon.m_ePadPen; if ( polygon.m_bClosed ) { if ( bPad || bTrk ) os.AddLoop(polygon, ePen); // Closed polygon outline if ( !bGap ) os.AddRegion(polygon); // Only non-Gap polygon needs filling } else if ( bPad && bTrk ) // Fat tracks with diagonals os.AddVariTrack(polygon, polygon.m_ePadPen, polygon.m_eTrkPen); else if ( bPad || bTrk ) os.AddTrack(polygon, ePen); } } } else // Draw to pixmap { const int gapWidth = bGap ? guiCtrl.GetPixelsFromMIL( guiCtrl.GetGAP_MIL() ) : 0; const int padWidth = ( guiCtrl.GetHalfPixelsFromMIL( guiCtrl.GetPAD_MIL() ) + gapWidth ) << 1; // Pad width in pixels const int trackWidth = ( guiCtrl.GetHalfPixelsFromMIL( bIsGnd ? guiCtrl.GetTAG_MIL() : guiCtrl.GetTRACK_MIL() ) + gapWidth ) << 1; // Track width in pixels static QPen pen(Qt::black, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); static QBrush brush(Qt::black, Qt::SolidPattern); pen.setColor(color); brush.setColor(color); painter.setBrush(brush); for (auto& polygon : polygonList) { if ( polygon.empty() ) continue; const bool bTrk = polygon.m_eTrkPen != GPEN::NONE; const bool bPad = polygon.m_ePadPen != GPEN::NONE; if ( !bTrk && !bPad && !polygon.m_bClosed ) continue; pen.setWidth(bTrk ? trackWidth : bPad ? padWidth : 0); painter.setPen(pen); if ( polygon.m_bClosed ) painter.drawPolygon(polygon); else if ( bPad && bTrk ) // Fat tracks with diagonals { //polygon.Process(); // Not needed since m_bFatEdge already populated size_t i(0); auto iterA = polygon.begin(); auto iterB = iterA; iterB++; while( iterB != polygon.end() ) { pen.setWidth(polygon.m_bFatEdge[i++] ? padWidth : trackWidth); painter.setPen(pen); painter.drawLine(*iterA, *iterB); ++iterA; ++iterB; } } else if ( bPad || bTrk ) { if ( polygon.size() == 1 ) painter.drawPoint( polygon.first() ); else { auto iterA = polygon.begin(); auto iterB = iterA; iterB++; while( iterB != polygon.end() ) { painter.drawLine(*iterA, *iterB); ++iterA; ++iterB; } } } } } } void MainWindow::paintEvent(QPaintEvent*) { if ( !m_bRepaint ) return; if ( m_board.GetCompEdit() ) PaintCompDefiner(); else PaintBoard(); // Tidy up m_label->setPixmap(m_mainPixmap); m_scrollArea->setVisible(true); m_scrollArea->setWidgetResizable(false); m_label->adjustSize(); m_scrollArea->CentreView(); // Centre the scrollbars (if needed) for component editor mode m_bRepaint = false; } void MainWindow::PaintCompDefiner() // The paint method in "component editor mode" { Board& board = m_board; CompDefiner& def = board.GetCompDefiner(); const PinGrid& grid = def.GetGrid(); const int& W = board.GetGRIDPIXELS(); // Square width in pixels const int C = W >> 1; // Half square width in pixels const double dTextScale = W / 24.0; // For scaling text when zooming // Shift comp to near grid centre const int ROWS(def.GetScreenRows()), COLS(def.GetScreenCols()); const Rect rect(def.GetGridRowMin(), def.GetGridRowMax(), def.GetGridColMin(), def.GetGridColMax()); QPainter painter; const int reqW(W * COLS), reqH(W * ROWS); if ( m_mainPixmap.width() != reqW || m_mainPixmap.height() != reqH ) { m_mainPixmap = QPixmap(reqW, reqH); m_mainPixmap.setDevicePixelRatio(1.0); } painter.begin(&m_mainPixmap); // Paint to main pixmap SetQuality(painter); m_XCORRECTION = m_YCORRECTION = 0; painter.fillRect(m_XGRIDOFFSET, m_YGRIDOFFSET, reqW, reqH, Qt::white); m_blackPen.setWidth(0); m_whitePen.setWidth(0); painter.setPen(m_blackPen); painter.setBrush(Qt::NoBrush); int X(0), Y(0), L(0), R(0), T(0), B(0); // Draw rect around whole board area ========================================================= int dummy; GetLRTB(board, 110, 0, 0, L, dummy, T, dummy); // 110% size square GetLRTB(board, 110, ROWS-1, COLS-1, dummy, R, dummy, B); // 110% size square painter.drawRect(L, T, R-L, B-T); // Get footprint bounds ====================================================================== GetLRTB(board, rect, L, R, T, B); L -= C; R += C; T -= C; B += C; const int AXIS_X = ( L + R ) / 2; const int AXIS_Y = ( T + B ) / 2; // Draw shapes =============================================================================== painter.save(); painter.translate(AXIS_X, AXIS_Y); for (const auto& mapObj : def.GetShapes() ) { const Shape& s = mapObj.second; if ( s.GetDrawFill() ) m_varBrush.setColor( s.GetFillColor().GetQColor() ); const bool bCurrentShape = ( mapObj.first == def.GetCurrentShapeId() ); m_blackPen.setWidth( bCurrentShape ? 3 : 2 ); painter.setPen( s.GetDrawLine() ? m_blackPen : Qt::NoPen ); painter.setBrush( s.GetDrawFill() ? m_varBrush : Qt::NoBrush ); painter.save(); painter.translate( s.GetCX() * W, s.GetCY() * W ); painter.rotate( -s.GetA3() ); // A3 > 0 ==> CCW const int DX = static_cast(s.GetDX() * W); const int DY = static_cast(s.GetDY() * W); const int X = static_cast(s.GetDX() * W * 0.5); const int Y = static_cast(s.GetDY() * W * 0.5); const int A = static_cast(s.GetA1() * 16); const int Alen = static_cast(s.GetAlen() * 16); switch( s.GetType() ) { case SHAPE::RECT: painter.drawRect(-X, -Y, DX, DY); break; case SHAPE::ROUNDED_RECT: painter.drawRoundedRect(-X, -Y, DX, DY, 0.35 * W, 0.35 * W); break; case SHAPE::ELLIPSE: painter.drawEllipse(-X, -Y, DX, DY); break; case SHAPE::ARC: painter.drawArc( -X, -Y, DX, DY, A, Alen); break; case SHAPE::CHORD: painter.drawChord(-X, -Y, DX, DY, A, Alen); break; default: assert(SHAPE::LINE == s.GetType() ); painter.drawLine(-X, -Y, X, Y); break; } if ( bCurrentShape ) { // Show the base rect/ellipse for line/arc/chord painter.setPen(m_dotPen); painter.setBrush(Qt::NoBrush); switch( s.GetType() ) { case SHAPE::LINE: painter.drawRect(-X, -Y, DX, DY); break; case SHAPE::ARC: case SHAPE::CHORD: painter.drawEllipse(-X, -Y, DX, DY); break; default: break; } } painter.restore(); } painter.restore(); //============================================================================================ // Draw grid points ========================================================================== if ( board.GetShowGrid() ) for (int j = 0; j < ROWS; j++) for (int i = 0; i < COLS; i++) { GetXY(board, j, i, X, Y); painter.drawPoint(X, Y); } // Draw dashed rect around footprint boundary and along central axes ========================= painter.setPen(m_dashPen); painter.setBrush(Qt::NoBrush); painter.drawRect(L, T, R-L, B-T); painter.setPen(m_dotPen); painter.drawLine(0, AXIS_Y, reqW, AXIS_Y); painter.drawLine(AXIS_X, 0, AXIS_X, reqH); // Draw pins ================================================================================= QFont pinsFont = painter.font(); // Copy of current font pinsFont.setPointSize( m_board.GetTextSizePins() ); painter.setFont(pinsFont); m_varBrush.setColor(QColor(192,192,255,128)); // Light blue for (int iLoop = 0; iLoop < 2; iLoop++) { int iPinId(0); for (int j = 0, jMax = grid.GetRows(); j < jMax; j++) for (int i = 0, iMax = grid.GetCols(); i < iMax; i++, iPinId++) { auto p = grid.Get(0,j,i); // Always layer 0 for component editor GetXY(board, def.GetGridRowMin() + j, def.GetGridColMin() + i, X, Y ); painter.save(); painter.translate(X, Y); if ( iLoop == 0 ) // Shade according to GetSurface() { painter.setPen(Qt::NoPen); painter.setBrush(p->GetSurface() == SURFACE_FREE ? Qt::NoBrush : p->GetSurface() == SURFACE_HOLE ? m_darkBrush : m_varBrush); //TODO Handle SURFACE_GAP, SURFACE PLUG in future painter.drawRect(-C,-C,W,W); } if ( iLoop == 1 ) // Draw pins/labels { if ( iPinId == def.GetCurrentPinId() ) { painter.setPen(m_redPen); painter.drawEllipse(-C,-C,W,W); } if ( p->GetIsPin() ) { painter.setPen(m_blackPen); painter.rotate(270); const size_t pinIndex = p->GetPinIndex(); std::string strPinLabel = ( pinIndex < def.GetNumPins() ) ? def.GetPinLabel(pinIndex) : CompTypes::GetDefaultPinLabel(pinIndex); int iFlag = ( pinIndex < def.GetNumPins() ) ? def.GetPinAlign(pinIndex) : Qt::AlignCenter; if ( iFlag == Qt::AlignLeft || iFlag == Qt::AlignRight ) { const bool bLeft = ( iFlag == Qt::AlignLeft ); painter.translate(bLeft ? -C/2 : C/2, 0); } iFlag |= ( Qt::TextDontClip | Qt::AlignVCenter ); painter.scale(dTextScale, dTextScale); painter.drawText(0,0,0,0, iFlag, strPinLabel.c_str()); } } painter.restore(); } } painter.end(); } void MainWindow::PaintBoard() // The paint method in "circuit layout mode" { #ifdef PAINTBOARD_TIMER const auto start = std::chrono::steady_clock::now(); #endif Board& board = m_board; CompManager& compMgr = board.GetCompMgr(); ColorManager& colorMgr = board.GetColorMgr(); const TRACKMODE& trackMode = board.GetTrackMode(); const COMPSMODE& compMode = board.GetCompMode(); const bool& bVero = board.GetVeroTracks(); const bool bColor = trackMode == TRACKMODE::COLOR; const bool bMono = trackMode == TRACKMODE::MONO; const bool bPCB = trackMode == TRACKMODE::PCB; const bool bMonoPCB = bMono || bPCB; const bool bGroundFill = !bVero && bMonoPCB && board.GetGroundFill(); const bool bForceXthermal = board.GetXthermals(); const bool bDirect = !bVero && !bGroundFill; // true ==> Draw track "blobs" and pads directly (PDF/Gerber) const int& layer = board.GetCurrentLayer(); const int& groundNodeId = board.GetGroundNodeId(layer); const bool bTopLyr = ( layer == LYR_TOP ); const bool bWiresAsTracks = m_bWriteGerber && m_bTwoLayerGerber && board.GetLyrs() == 1; // true ==> Convert wires to tracks on the top layer const int& W = board.GetGRIDPIXELS(); // Square width in pixels const int C = W >> 1; // Half square width in pixels const int iHalfGap = std::max(1, W / 12); // For vero only const int iGap = iHalfGap + iHalfGap; // For vero only const int iWirePenWidth = board.GetHalfPixelsFromMIL( board.GetPAD_MIL() ) / 4; // For wires with no NodeID const int iWireBoxWidth = 3 * iWirePenWidth; // For wires with no NodeID const double dTextScale = ( m_bWritePDF ) ? (48.0 / W) : (W / 24.0); // For scaling text when zooming if ( bVero && trackMode != TRACKMODE::OFF ) board.CalcSolder(); // Calculate positions of solder blobs for stripboard builds int X(0), Y(0), L(0), R(0), T(0), B(0); QPen penGry(QColor(200,200,200,255), 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); QPen penTop(penGry); penTop.setColor( colorMgr.GetPixmapColor(MY_LYR_TOP) ); QPen penBot(penGry); penBot.setColor( colorMgr.GetPixmapColor(MY_LYR_BOT) ); colorMgr.SetSaturation( board.GetSaturation() ); // Must do this BEFORE making pixmaps (if these are reintroduced) colorMgr.SetFillSaturation( board.GetFillSaturation() ); // Must do this BEFORE making pixmaps (if these are reintroduced) board.CalculateColors(); // Work out best way to color things // Pre-process component list for rendering std::vector sortedComps; compMgr.CalculateWireInfo(); // Work out shifts for overlaid wires and flag crossing wires compMgr.GetSortedComps(sortedComps); // Sorted so floating and "plug" components get rendered last // Get bounds to minimise looping int minRow, minCol, maxRow, maxCol; board.GetBounds(minRow, minCol, maxRow, maxCol); int gndL, gndR, gndT, gndB; board.CalcGroundFillBounds(); board.GetGroundFillBounds(gndL, gndR, gndT, gndB); const double dEdge = board.GetEdgeWidth(); const int iEdge = static_cast( dEdge ); const int reqW(gndR - gndL + (iEdge<<1)), reqH(gndB - gndT + (iEdge<<1)); m_XCORRECTION = -gndL; m_YCORRECTION = -gndT; GPainter painter; // Works like QPainter unless you give it a GStream for Gerber QPdfWriter* pdfWriter = nullptr; if ( m_bWritePDF ) { pdfWriter = new QPdfWriter(m_pdfFileName); pdfWriter->setCreator("VeroRoute"); pdfWriter->setPageSize(QPageSize(QPageSize::A4)); pdfWriter->setPageOrientation(QPageLayout::Landscape); pdfWriter->setResolution(1200); painter.begin(pdfWriter); // Paint to PDF file } else if ( m_bWriteGerber ) { assert( bPCB && !board.GetMirrored() ); auto& os = m_gWriter.GetStream(GFILE::GTO); // Top silk layer os.SetPolarity(GPOLARITY::DARK); os.ClearBuffers(); painter.SetGStream(&os); } else { if ( m_mainPixmap.width() != reqW || m_mainPixmap.height() != reqH ) { m_mainPixmap = QPixmap(reqW, reqH); m_mainPixmap.setDevicePixelRatio(1.0); } painter.begin(&m_mainPixmap); // Paint to main pixmap } if ( !m_bWriteGerber ) SetQuality(painter); if ( board.GetFlipH() ) { painter.translate(2*m_XGRIDOFFSET + reqW, 0); painter.scale(-1, 1); // Mirror L-R } if ( board.GetFlipV() ) { painter.translate(0, 2*m_YGRIDOFFSET + reqH); painter.scale(1, -1); // Mirror T-B } const bool bInverseMono(bMono && board.GetInverseMono()); const bool bColoredMono(bMono && board.GetColoredMono()); const QColor backgroundColor = ( bInverseMono ) ? Qt::black : ( m_bWritePDF ) ? Qt::white : GetBackgroundColor(); m_backgroundPen.setColor(backgroundColor); m_backgroundBrush.setColor(backgroundColor); const int dotColorID = bInverseMono ? MY_WHITE : MY_BLACK; const QColor dotColor = ( !m_bWritePDF && dotColorID == MY_WHITE ) ? GetBackgroundColor() : colorMgr.GetPixmapColor(dotColorID); const int groundFillColorId = bPCB ? ( layer == 0 ? MY_LYR_BOT : MY_LYR_TOP ) : ( bInverseMono ? MY_WHITE : MY_BLACK ); const QColor groundFillColor = ( !m_bWritePDF && groundFillColorId == MY_WHITE ) ? GetBackgroundColor() : colorMgr.GetPixmapColor(groundFillColorId); QPen dotPen(m_blackPen); dotPen.setColor(dotColor); QPen wirePen(m_blackPen); wirePen.setColor(bGroundFill ? backgroundColor : groundFillColor); wirePen.setWidth(iWirePenWidth); // Draw board background QPolygonF edge; // The board outline in Gerber QPolygonF gndPoly; // The rectangle for ground fill if ( m_bWriteGerber ) { // Grow board outline to guarantee separation from tracks and ground const double R(reqW - dEdge*2), B(reqH - dEdge*2); const double X = m_XGRIDOFFSET + dEdge; const double Y = m_YGRIDOFFSET + dEdge; gndPoly << QPointF(X, Y); edge << QPointF(X - dEdge, Y - dEdge); gndPoly << QPointF(X + R, Y); edge << QPointF(X + R + dEdge, Y - dEdge); gndPoly << QPointF(X + R, Y + B); edge << QPointF(X + R + dEdge, Y + B + dEdge); gndPoly << QPointF(X, Y + B); edge << QPointF(X - dEdge, Y + B + dEdge); if ( bGroundFill ) { m_gWriter.GetStream(GFILE::GTL).DrawRegion(gndPoly); // Top copper layer m_gWriter.GetStream(GFILE::GBL).DrawRegion(gndPoly); // Bottom copper layer } } else { painter.fillRect(m_XGRIDOFFSET, m_YGRIDOFFSET, reqW, reqH, backgroundColor); if ( bGroundFill ) painter.fillRect(m_XGRIDOFFSET + iEdge, m_YGRIDOFFSET + iEdge, reqW - (iEdge<<1), reqH - (iEdge<<1), groundFillColor); } // Draw rect around whole board area ========================================================= if ( m_bWriteGerber ) { m_gWriter.GetStream(GFILE::GKO).DrawLoop(edge, GPEN::GKO); // Board outline layer } else { const int iPenWidth = ( bPCB ) ? static_cast(W * 0.100) : 0; // Like GPEN::GKO = 10 mil used for Gerber dotPen.setWidth(iPenWidth); m_whitePen.setWidth(iPenWidth); painter.setPen( bPCB ? m_whitePen : dotPen ); painter.setBrush(Qt::NoBrush); painter.drawRect(m_XGRIDOFFSET, m_YGRIDOFFSET, reqW, reqH); } // Draw grid points ========================================================================== if ( !bPCB && board.GetShowGrid() ) { for (int j = 0, jMax = board.GetRows(); j < jMax; j++) for (int i = 0, iMax = board.GetCols(); i < iMax; i++) { const Element* pC = board.Get(layer, j, i); if ( trackMode == TRACKMODE::OFF || ( !pC->GetHasPin() && pC->GetNodeId() == BAD_NODEID ) ) { GetXY(board, j, i, X, Y); painter.drawPoint(X, Y); } } } // Draw tracks =============================================================================== if ( bPCB || trackMode != TRACKMODE::OFF ) // Force tracks in PCB mode { painter.save(); const bool bGreyPads = bPCB && !m_bWriteGerber; const int numLoops = ( bGroundFill ? 2 : 1 ) + ( bGreyPads ? 1 : 0); // bGroundFill ==> 1st pass draws fat tracks in white, 2nd pass draws tracks // bGreyPads ==> A final pass will draw the pads in grey for (int iLoop = 0; iLoop < numLoops; iLoop++) { const bool bLastPass = ( iLoop == numLoops - 1 ); const bool bGap = bGroundFill && iLoop == 0; const bool bDrawGrey = ( bGreyPads && bLastPass ); if ( m_bWriteGerber ) { m_gWriter.GetStream(GFILE::GTS).ClearBuffers(); // Top solder mask layer m_gWriter.GetStream(GFILE::GTL).ClearBuffers(); // Top copper layer m_gWriter.GetStream(GFILE::GTL).SetPolarity(bGap ? GPOLARITY::CLEAR : GPOLARITY::DARK); m_gWriter.GetStream(GFILE::GBS).ClearBuffers(); // Bottom solder mask layer m_gWriter.GetStream(GFILE::GBL).ClearBuffers(); // Bottom copper layer m_gWriter.GetStream(GFILE::GBL).SetPolarity(bGap ? GPOLARITY::CLEAR : GPOLARITY::DARK); m_gWriter.GetStream(GFILE::DRL).ClearBuffers(); // Drill file } for (int j = minRow; j <= maxRow; j++) for (int i = minCol; i <= maxCol; i++) { const Element* pC = board.Get(layer, j, i); const int& nodeId = pC->GetNodeId(); const bool bWire = pC->GetHasWire(); const bool bWireAsVia = bWire && bWiresAsTracks; // true ==> draw small via pad const int iPerimeterCode = board.GetPerimeterCode(pC); // 0 to 255 const bool bVia = pC->GetIsVia() || bWireAsVia; const bool bPad = !bWireAsVia && pC->GetHasPinTH(); // Only want through-hole pads const bool bSoicPad = bTopLyr && pC->GetHasPinSOIC(); size_t iPinIndexSOIC(BAD_PININDEX); const Component* pCompSOIC(nullptr); if ( bSoicPad ) // Work out which slot contains the SOIC component { const int iSOICslot = ( pC->GetSlotCompId(0) != BAD_COMPID && compMgr.GetComponentById(pC->GetSlotCompId(0)).GetIsSOIC() ) ? 0 : 1; int compIdSOIC; pC->GetSlotInfo(iSOICslot, iPinIndexSOIC, compIdSOIC); pCompSOIC = &compMgr.GetComponentById(compIdSOIC); assert( pCompSOIC->GetIsSOIC() ); } assert( !(bVia && bPad) ); // Can't be both a via and a pad const bool bIsGnd = bGroundFill && nodeId == groundNodeId; const int iTagCode = ( bPad && bIsGnd && nodeId != BAD_NODEID ) ? board.GetTagCode(pC, iPerimeterCode) : 0; // Skip places with no NodeID assigned unless they are wire ends, or pins in Mono/PCB mode const bool bPointOK = ( nodeId != BAD_NODEID || bWire || bSoicPad || (bMonoPCB && bPad) ); // Point OK ==> We have some track/pad to draw if ( !bPointOK ) continue; if ( bForceXthermal && !bPad && !bVia && !bSoicPad && bIsGnd ) continue; // Don't render ground tracks if forcing X shaped thermal reliefs bool bCustomSize(false); int iPadWidthMIL(0), iHoleWidthMIL(0); // 0 ==> Not a custom size value uchar layerPref(LAYER_X); int padOffsetX(0), padOffsetY(0); if ( bPad && !bWire ) { if ( !bVero && board.GetPadOffsets(pC, padOffsetX, padOffsetY) ) // Get offsets in mil { padOffsetX = (padOffsetX * W) / 100; // Convert from mil to pixels padOffsetY = (padOffsetY * W) / 100; // Convert from mil to pixels } if ( board.GetLyrs() == 2 && pC->GetPinSupportsLayerPref() ) layerPref = board.GetLayerPref(pC); size_t pinIndex; int compId; board.GetSlotInfoForTH(pC, pinIndex, compId); const Component& comp = compMgr.GetComponentById( compId ); assert( comp.GetType() != COMP::INVALID ); bCustomSize = comp.GetCustomPads(); if ( bCustomSize ) { iPadWidthMIL = comp.GetPadWidth(); iHoleWidthMIL = comp.GetHoleWidth(); } } const bool bPadOffset = ( padOffsetX != 0 || padOffsetY != 0 ); const bool bBlob = ( !bPadOffset || iPerimeterCode != 0 || ( bForceXthermal && bIsGnd ) ); const bool bDrawBlob = bPointOK && bBlob; const bool bDrawPad = bPointOK && bPad; const bool bDrawVia = bPointOK && bVia; QPen& greyPen = ( layerPref == LAYER_X ) ? penGry : ( layerPref == LAYER_T ) ? penTop : penBot; // Use GetPixmapRGB for pixmaps. It can handle MY_GREY, MY_WHITE, MY_BLACK as special cases const int colorId = colorMgr.GetColorId(nodeId); const bool bInvalidColor = colorId == BAD_COLORID || ( bPCB && nodeId != GetCurrentNodeId() ) || ( bMono && nodeId != GetCurrentNodeId() && !bColoredMono ) || ( bMono && nodeId != GetCurrentNodeId() && bColoredMono && bGroundFill && nodeId == groundNodeId ); const int iEffColorId = ( bInvalidColor ) ? groundFillColorId : ( nodeId == GetCurrentNodeId() ) ? MY_GREY : ( colorId % MYNUMCOLORS ); const bool bAllowCustomColor = iEffColorId != MY_GREY && iEffColorId != MY_WHITE && iEffColorId != MY_BLACK && iEffColorId != MY_LYR_BOT && iEffColorId != MY_LYR_TOP; const QColor color = bAllowCustomColor ? colorMgr.GetColorFromNodeId(nodeId) : ( !m_bWritePDF && iEffColorId == MY_WHITE ) ? GetBackgroundColor() : colorMgr.GetPixmapColor(iEffColorId); GetLRTB(board, 100, j, i, L, R, T, B); // 100% size square const int X((L+R)/2), Y((T+B)/2); const QPointF pCentre(X,Y); const QPointF pCentreOff(X+padOffsetX, Y+padOffsetY); // Common special case: Draw blank wire-ends as squares (so we can easily see them) if ( nodeId == BAD_NODEID && bWire ) { painter.setPen(wirePen); painter.setBrush(Qt::NoBrush); painter.drawRect(X-iWireBoxWidth, Y-iWireBoxWidth, iWireBoxWidth*2, iWireBoxWidth*2); if ( !bSoicPad ) continue; // Next grid square } // Note that bVero, bGroundFill, bDirect are mutually exclusive if ( bVero ) // Vero shows squares and strips with holes { if ( bPCB ) continue; // Vero mode not compatible with PCB mode const bool bVertical = board.GetVerticalStrips(); if ( bVertical ) { L += iHalfGap; R -= iHalfGap; } else { T += iHalfGap; B -= iHalfGap; } painter.setBrush(color); painter.setPen(Qt::NoPen); painter.drawRect(L, T, R-L, B-T); m_backgroundPen.setWidth(std::max(1, W/4)); painter.setPen(m_backgroundPen); painter.setBrush(Qt::NoBrush); painter.drawPoint(pCentre); // Emphasize strip breaks painter.setPen(Qt::NoPen); painter.setBrush(m_backgroundBrush); if ( bVertical ) { if ( j > minRow && pC->GetNbr(NBR_T)->IsClash(nodeId) ) painter.drawRect(L, T-iHalfGap, R-L, iGap); if ( j < maxRow && pC->GetNbr(NBR_B)->IsClash(nodeId) ) painter.drawRect(L, B-iHalfGap, R-L, iGap); } else { if ( i > minCol && pC->GetNbr(NBR_L)->IsClash(nodeId) ) painter.drawRect(L-iHalfGap, T, iGap, B-T); if ( i < maxCol && pC->GetNbr(NBR_R)->IsClash(nodeId) ) painter.drawRect(R-iHalfGap, B, iGap, B-T); } } if ( bGroundFill ) // Draw track "blobs" and pads directly (PDF/Gerber) { if ( iLoop == 0 ) { if ( !bIsGnd && bDrawBlob ) // Only the non-ground tracks have a "white" surround PaintBlob(board, painter, backgroundColor, pCentre, pCentreOff, iPadWidthMIL, iPerimeterCode, iTagCode, bPad, bSoicPad, bIsGnd, true); // Draw fat "white" track blob if ( !bIsGnd && bDrawVia ) // Only the non-ground vias have a "white" surround PaintVia(board, painter, backgroundColor, pCentre, true); // Draw fat "white" via if ( bDrawPad ) PaintPad(board, painter, backgroundColor, pCentreOff, iPadWidthMIL, iHoleWidthMIL, true); // Draw fat "white" pad if ( bSoicPad ) PaintSOIC(board, painter, backgroundColor, pCentre, iPinIndexSOIC, pCompSOIC, bIsGnd, true); } else if ( iLoop == 1 ) // Draw track "blobs" and pads directly { if ( bDrawBlob ) PaintBlob(board, painter, color, pCentre, pCentreOff, iPadWidthMIL, iPerimeterCode, iTagCode, bPad, bSoicPad, bIsGnd); // Draw track blob if ( bDrawVia ) PaintVia(board, painter, color, pCentre); // Draw via same color as track if ( bDrawPad ) PaintPad(board, painter, color, pCentreOff, iPadWidthMIL, iHoleWidthMIL); // Draw pad same color as track if ( bSoicPad ) PaintSOIC(board, painter, color, pCentre, iPinIndexSOIC, pCompSOIC, bIsGnd); } else if ( bDrawGrey ) { if ( bDrawVia ) PaintViaGrey(board, painter, pCentre); // Draw grey via if ( bDrawPad ) PaintPadGrey(board, painter, greyPen, pCentreOff, iPadWidthMIL); // Draw "grey" pad } } if ( bDirect ) // Draw track "blobs" and pads directly (PDF/Gerber) { if ( iLoop == 0 ) { if ( bDrawBlob ) PaintBlob(board, painter, color, pCentre, pCentreOff, iPadWidthMIL, iPerimeterCode, iTagCode, bPad, bSoicPad, false); // Draw track blob if ( bDrawVia ) PaintVia(board, painter, color, pCentre); // Draw via same color as track if ( bDrawPad ) PaintPad(board, painter, color, pCentreOff, iPadWidthMIL, iHoleWidthMIL); // Draw pad same color as track if ( bSoicPad ) PaintSOIC(board, painter, color, pCentre, iPinIndexSOIC, pCompSOIC, bIsGnd); } else if ( bDrawGrey ) { if ( bDrawVia ) PaintViaGrey(board, painter, pCentre); // Draw grey via if ( bDrawPad ) PaintPadGrey(board, painter, greyPen, pCentreOff, iPadWidthMIL); // Draw "grey" pad } } } if ( bWiresAsTracks ) { for (const auto& pComp : sortedComps) // Iterate sorted components { const Component& comp = *pComp; if ( comp.GetType() != COMP::WIRE || !comp.GetIsPlaced() ) continue; // Only want placed wires if ( !compMgr.GetWireCanBeTrack(&comp) ) continue; QPolygonF polygon; GetXY(board, comp.GetRow(), comp.GetCol(), X, Y); polygon << QPointF(X, Y); GetXY(board, comp.GetRow() + comp.GetCompRows() - 1, comp.GetCol() + comp.GetCompCols() - 1, X, Y); polygon << QPointF(X, Y); m_gWriter.GetStream(GFILE::GTL).AddTrack(polygon, bGap ? GPEN::TRK_GAP : GPEN::TRK); } } if ( m_bWriteGerber ) { m_gWriter.GetStream(GFILE::GTS).DrawBuffers(); // Top solder mask layer m_gWriter.GetStream(GFILE::GTL).DrawBuffers(); // Top copper layer m_gWriter.GetStream(GFILE::GBS).DrawBuffers(); // Bottom solder mask layer m_gWriter.GetStream(GFILE::GBL).DrawBuffers(); // Bottom copper layer m_gWriter.GetStream(GFILE::DRL).DrawBuffers(); // Drill file } } // Next iLoop painter.restore(); } // Draw target board area ==================================================================== if ( m_board.GetShowTarget() && !bMonoPCB ) { const int targetT = ( board.GetRows() - m_board.GetTargetRows() ) / 2; const int targetB = targetT + m_board.GetTargetRows() - 1; const int targetL = ( board.GetCols() - m_board.GetTargetCols() ) / 2; const int targetR = targetL + m_board.GetTargetCols() - 1; int l(0), r(0), t(0), b(0); GetXY(board, 0, 0, L, T); GetXY(board, board.GetRows()-1, board.GetCols()-1, R, B); GetXY(board, targetT, targetL, l, t); GetXY(board, targetB, targetR, r, b); L -= C; l -= C; T -= C; t -= C; R += C; r += C; B += C; b += C; painter.save(); m_varBrush.setColor( QColor(0,128,128,32) ); // Very transparent light cyan tint painter.setPen(Qt::NoPen); painter.setBrush(m_varBrush); painter.drawRect(L, T, R-L, t-T); painter.drawRect(L, t, l-L, b-t); painter.drawRect(r, t, R-r, b-t); painter.drawRect(L, b, R-L, B-b); painter.restore(); } // Draw hatched lines ======================================================================== if ( !m_bWriteGerber && trackMode != TRACKMODE::OFF && board.GetRoutingEnabled() ) { painter.save(); m_redPen.setWidth(W / 8); m_backgroundPen.setWidth(0); painter.setBrush(Qt::NoBrush); for (int j = minRow; j <= maxRow; j++) for (int i = minCol; i <= maxCol; i++) { const Element* pC = board.Get(layer, j, i); if ( pC->GetNodeId() == BAD_NODEID ) continue; GetLRTB(board, 100, j, i, L, R, T, B); // 100% size square if ( pC->ReadFlagBits(AUTOSET) && !pC->ReadFlagBits(USERSET) ) { painter.setPen(m_backgroundPen); painter.drawLine(L, T, R, B); // Draw "\" (hatched) line painter.drawLine(L+C, T, R, B-C); // Draw "\" (hatched) line painter.drawLine(L, T+C, R-C, B); // Draw "\" (hatched) line painter.drawLine(L, B, R, T); // Draw "/" (hatched) line painter.drawLine(L+C, B, R, T+C); // Draw "/" (hatched) line painter.drawLine(L, B-C, R-C, T); // Draw "/" (hatched) line } } painter.restore(); } #ifdef _GRID_DEBUG if ( m_iGridDebugMode != DEBUGMODE_OFF && m_iGridDebugMode != DEBUGMODE_LAYERINFO ) { painter.save(); painter.setPen(Qt::NoPen); painter.setBrush(m_darkBrush); for (int j = minRow; j <= maxRow; j++) for (int i = minCol; i <= maxCol; i++) { const Element* pC = board.Get(layer, j, i); int iVal; switch( m_iGridDebugMode ) { case DEBUGMODE_SOICINFO: iVal = (int) pC->GetSoicChar(); break; case DEBUGMODE_ROUTEID: iVal = pC->GetRouteId(); break; case DEBUGMODE_NODEID: iVal = pC->GetNodeId(); break; case DEBUGMODE_PININDEX: iVal = pC->GetSlotPinIndex(0); break; } GetLRTB(board, 100, j, i, L, R, T, B); // 100% size square painter.save(); painter.translate((L+R)/2, (T+B)/2); painter.scale(dTextScale, dTextScale); painter.setPen(m_blackPen); painter.drawText(0,0,0,0, Qt::TextDontClip | Qt::AlignVCenter | Qt::AlignHCenter, std::to_string(iVal).c_str()); painter.restore(); } painter.restore(); } #endif // Draw solder =============================================================================== if ( ( bColor || bMono ) && bVero ) { const bool bVertical = board.GetVerticalStrips(); painter.save(); painter.setPen(Qt::NoPen); painter.setBrush(m_darkBrush); for (int j = minRow; j <= maxRow; j++) for (int i = minCol; i <= maxCol; i++) { const Element* pC = board.Get(layer, j, i); if ( !pC->GetSolderR() ) continue; GetLRTB(board, 100, j, i, L, R, T, B); // 100% size square if ( bVertical ) painter.drawEllipse(R-(W/3), (T+B)/2 - (W/6), (2*W)/3, W/3); else painter.drawEllipse((L+R)/2 - (W/6), B-(W/3), W/3, (2*W)/3); } painter.restore(); } // Draw vias ================================================================================= if ( !m_bWriteGerber && !bVero && ( bPCB || trackMode != TRACKMODE::OFF ) ) // Force in PCB mode { painter.save(); m_backgroundPen.setWidth( board.GetPixelsFromMIL( board.GetVIAHOLE_MIL() ) ); painter.setPen(m_backgroundPen); painter.setBrush(Qt::NoBrush); for (int j = minRow; j <= maxRow; j++) for (int i = minCol; i <= maxCol; i++) { const Element* pC = board.Get(layer, j, i); if ( !pC->GetIsVia() ) continue; GetLRTB(board, 100, j, i, L, R, T, B); // 100% size square painter.drawPoint((L+R)/2, (T+B)/2); } painter.restore(); } // Draw Component outlines and pins ========================================================== QPen& penPlaced = ( bMono ) ? m_lightBluePen : ( bPCB ) ? m_whitePen : m_blackPen; // For placed (non-floating) components QPen fillBlackPen = m_blackPen; // Used for lines in the component pixmap fillBlackPen.setWidth(2); if ( compMode != COMPSMODE::OFF || bMonoPCB ) // Mono/PCB modes still need pin holes drawn for placed parts { const bool bFill = !bMonoPCB && board.GetFillSaturation() > 0; // No component fill in Mono/PCB mode for (const auto& pComp : sortedComps) // Iterate sorted components { const Component& comp = *pComp; const COMP& compType = comp.GetType(); const char& compDirection = comp.GetDirection(); const bool bMark = compType == COMP::MARK; const bool bWire = compType == COMP::WIRE; const bool bVeroLabel = compType == COMP::VERO_NUMBER || compType == COMP::VERO_LETTER; const bool bSOIC = comp.GetIsSOIC(); const bool bPlaced = comp.GetIsPlaced(); if ( bPCB && (bMark || bVeroLabel) ) continue; // Don't show markers and vero-lables in PCB mode if ( m_bWriteGerber && !bPlaced ) continue; // Don't write floating components to Gerber if ( bWiresAsTracks && bWire && compMgr.GetWireCanBeTrack(&comp) ) continue; const bool bFound = compMgr.GetFound( comp.GetId() ); const bool bPinLabels = !bMonoPCB && (comp.GetPinFlags() & PIN_LABELS) > 0 && board.GetShowPinLabels() && (!bSOIC || bTopLyr); // Only show SOIC pin labels on top layer const bool bRectPins = !bMonoPCB && (comp.GetPinFlags() & PIN_RECT) > 0; const bool bHighlightComp = board.GetGroupMgr().GetIsUserComp( comp.GetId() ); const bool bCustomSize = comp.GetCustomPads(); const int iPadWidthMIL = bCustomSize ? comp.GetPadWidth() : board.GetPAD_MIL(); const int iHoleWidthMIL = bCustomSize ? comp.GetHoleWidth() : board.GetHOLE_MIL(); const bool blankWire = bWire && comp.GetNodeId(0) == BAD_NODEID; // Begin draw component pins --------------------------------------------------------- if ( !m_bWriteGerber && !blankWire && ( compMode != COMPSMODE::OFF || ( bMonoPCB && bPlaced && !bSOIC ) ) ) // Skip blank wires and SOIC parts { painter.save(); QFont pinsFont = painter.font(); // Copy of current font pinsFont.setPointSize( m_board.GetTextSizePins() ); painter.setFont(pinsFont); if ( bMonoPCB && bPlaced && !bSOIC ) { m_backgroundPen.setWidth( board.GetPixelsFromMIL(iHoleWidthMIL) ); painter.setPen(m_backgroundPen); } else { penPlaced.setWidth(0); // For pin labels m_orangePen.setWidth(0); // For pin labels and pins m_redPen.setWidth(0); // For pin labels and pins m_greyPen.setWidth(0); // For pins painter.setPen(bFound ? m_orangePen : bPlaced ? m_greyPen : m_redPen); } painter.setBrush(Qt::NoBrush); if ( bMark ) // Markers are a special case since they don't actually have a pin !!! { // Only draw markers as holes in ground fill MONO mode and only in places with no track if ( bMono && bGroundFill && board.Get(layer, comp.GetRow(), comp.GetCol())->GetNodeId() == BAD_NODEID ) { GetLRTB(board, 100, comp.GetRow(), comp.GetCol(), L, R, T, B); // 100% size square painter.drawPoint((L+R)/2, (T+B)/2); // A pin is drawn with a circle } } else // Regular components/pads/wires ... { for (int jj = 0, jjMax = comp.GetCompRows(), j = comp.GetRow(); jj < jjMax; jj++, j++) for (int ii = 0, iiMax = comp.GetCompCols(), i = comp.GetCol(); ii < iiMax; ii++, i++) { const size_t iPinIndex = comp.GetCompElement(jj,ii)->GetPinIndex(); if ( iPinIndex == BAD_PININDEX ) continue; int padOffsetX(0), padOffsetY(0); if ( !bWire && !bVero && !bSOIC ) { comp.GetCompPinOffsets(iPinIndex, padOffsetX, padOffsetY); // Get offsets in mil padOffsetX = (padOffsetX * W) / 100; // Convert from mil to pixels padOffsetY = (padOffsetY * W) / 100; // Convert from mil to pixels } if ( !bPlaced ) // If floating component ... { if ( bColor ) // Color pins (if in Color mode) { const int& nodeId = comp.GetNodeId(iPinIndex); const bool bCurrentNodeId = nodeId != BAD_NODEID && nodeId == GetCurrentNodeId(); const QColor color = bCurrentNodeId ? colorMgr.GetPixmapColor(MY_GREY) : colorMgr.GetColorFromNodeId(nodeId); m_varPen.setColor(color); m_varBrush.setColor(color); painter.setBrush( bMonoPCB ? Qt::NoBrush : m_varBrush); // No pin color fill in Mono/PCB mode } if ( bSOIC && bTopLyr ) // Draw tracks of floating IC { int X, Y; GetXY(board, j, i, X, Y); PaintSOIC(board, painter, Qt::red, QPointF(X,Y), iPinIndex, &comp, false, false); } } const int iPinSizeMIL = ( !bColor || bPlaced ) ? iHoleWidthMIL : std::min(3*iHoleWidthMIL/2, iPadWidthMIL); GetLRTB(board, iPinSizeMIL, j, i, L, R, T, B); L += padOffsetX; R += padOffsetX; T += padOffsetY; B += padOffsetY; // Stop pins vanishing if zoomed too far out if ( L == R ) { L--; R++; } if ( T == B ) { T--; B++; } if ( bPinLabels ) // Write pin labels { painter.save(); painter.translate((L+R)/2, (T+B)/2); // Set text orientation switch( compDirection ) { case 'W': case 'E': painter.rotate(270); break; } // Handle L/R pin label alignment int iFlag = comp.GetPinAlign(iPinIndex); if ( iFlag == Qt::AlignLeft || iFlag == Qt::AlignRight ) { const bool bLeft = ( iFlag == Qt::AlignLeft ); switch( compDirection ) { case 'E': case 'S': iFlag = bLeft ? Qt::AlignRight : Qt::AlignLeft; // Swap align L/R painter.translate(bLeft ? C/2 : -C/2, 0); break; default: painter.translate(bLeft ? -C/2 : C/2, 0); } } iFlag |= ( Qt::TextDontClip | Qt::AlignVCenter ); painter.scale(dTextScale, dTextScale); painter.setPen(bFound ? m_orangePen : bPlaced ? penPlaced : m_redPen); painter.drawText(0,0,0,0, iFlag, comp.GetPinLabel(iPinIndex).c_str()); painter.restore(); } else if ( bRectPins ) // Draw switch pins as rectangles { const int d = board.GetHalfPixelsFromMIL( iPinSizeMIL ); switch( compDirection ) { case 'W': case 'E': L -= d; R += d; break; case 'N': case 'S': T -= d; B += d; break; } painter.drawRect(L, T, R-L, B-T); } else // A regular pin is drawn as a circle { if ( bMonoPCB && bPlaced && !bSOIC ) { GetLRTB(board, 100, j, i, L, R, T, B); // 100% size square painter.drawPoint(padOffsetX + (L+R)/2, padOffsetY + (T+B)/2); } else if ( !bSOIC || ( bColor && bPlaced && bTopLyr ) ) // OK to highlight pin location for placed SOICs in color mode painter.drawEllipse(L, T, R-L, B-T); } } } painter.restore(); } // End draw component pins ----------------------------------------------------------- // Begin draw component fill + outline ----------------------------------------------- if ( compMode != COMPSMODE::OFF && !comp.GetShapes().empty() ) { // Set pen width. Selected component shown thicker than normal components if ( bFound ) m_orangePen.setWidth(4);// Make found components stand out else if ( bPlaced ) { if ( bMonoPCB ) // Use floating point pen width to better match Gerber output penPlaced.setWidthF( bHighlightComp ? ( board.GetSilkWidth() * 1.5 ) : ( bMark ? ( board.GetSilkWidth() * 0.5 ) : board.GetSilkWidth() ) ); else penPlaced.setWidth( bHighlightComp ? 3 : bMark ? 1 : 2 ); } else m_redPen.setWidth(4); // Make floating components stand out in red QPen& linePen = bFound ? m_orangePen : bPlaced ? penPlaced : m_redPen; painter.setPen(linePen); painter.setBrush(Qt::NoBrush); GetXY(board, comp, X, Y); // Get footprint centre // Implement wire shift if ( bWire && bPlaced ) { if ( comp.GetCompRows() == 1 ) // Horizontal Y += compMgr.GetWireShift( &comp ) * 0.1 * W; else X += compMgr.GetWireShift( &comp ) * 0.1 * W; } double SL,ST,SR,SB; comp.GetSafeBounds(SL,SR,ST,SB); SL = SL * W - C; SR = SR * W + C; ST = ST * W - C; SB = SB * W + C; const int iReqW = static_cast(SR - SL); const int iReqH = static_cast(SB - ST); const int iSL = static_cast(SL); const int iST = static_cast(ST); GPainter painterTmp; QPixmap tmpPixmap(iReqW, iReqH); tmpPixmap.setDevicePixelRatio(1.0); const QColor maskColor = comp.GetNewColor().GetQColor();// We'll mask out pixels with this color at the end if ( bFill ) { painterTmp.begin(&tmpPixmap); painterTmp.fillRect(0, 0, iReqW, iReqH, maskColor); // This will be turned transparent later painterTmp.setPen(Qt::NoPen); } for (int iLoop = ( bFill ) ? 0 : 1; iLoop < 2; iLoop++) { GPainter* pPainter = ( iLoop == 0 ) ? &painterTmp : &painter; pPainter->save(); // Save (original axes) if ( iLoop == 0 ) pPainter->translate(-SL,-ST); // Shape coordinates are relative to pixmap top left else pPainter->translate(X, Y); // Shape coordinates are relative to footprint centre if ( bFill && iLoop == 1 ) // Draw the pixmap created on the previous pass { painter.setOpacity( /*bWire ? 1.0 :*/ board.GetFillSaturation() * 0.01); painter.drawPixmap(iSL, iST, tmpPixmap); painter.setOpacity(1.0); } switch( compDirection ) // Rotated axes at footprint centre { case 'W': break; case 'E': pPainter->rotate(180); break; case 'N': pPainter->rotate(90); break; case 'S': pPainter->rotate(270); break; } for (size_t i = 0, numShapes = comp.GetNumShapes(); i < numShapes; i++) { const Shape& s = comp.GetShape(i); if ( iLoop == 0 && !s.GetDrawFill() ) continue; if ( iLoop == 1 && (s.GetDrawFill() || !s.GetDrawLine()) ) continue; if ( iLoop == 0 ) // Drawing fill { m_varBrush.setColor( s.GetFillColor().GetQColor() ); pPainter->setBrush(m_varBrush); pPainter->setPen( s.GetDrawLine() ? fillBlackPen : Qt::NoPen ); } else if ( bColor && !bFill && bWire ) // If Fill slider if fully left in Color mode, draw wire in color { const int nodeId = comp.GetNodeId(0); if ( nodeId != BAD_NODEID ) { const QColor color = ( nodeId == GetCurrentNodeId() ) ? colorMgr.GetPixmapColor(MY_GREY) : colorMgr.GetColorFromNodeId(nodeId); m_varBrush.setColor( color ); pPainter->setBrush(m_varBrush); pPainter->setPen( s.GetDrawLine() ? fillBlackPen : Qt::NoPen ); } } pPainter->save(); pPainter->translate( s.GetCX() * W, s.GetCY() * W ); // Translate to shape centre pPainter->rotate( -s.GetA3() ); // A3 > 0 ==> CCW // Rotate about shape centre const int DX = static_cast(s.GetDX() * W); const int DY = static_cast(s.GetDY() * W); const int X = static_cast(s.GetDX() * W * 0.5); const int Y = static_cast(s.GetDY() * W * 0.5); const int A = static_cast(s.GetA1() * 16); const int Alen = static_cast(s.GetAlen() * 16); switch( s.GetType() ) { case SHAPE::RECT: pPainter->drawRect(-X, -Y, DX, DY); break; case SHAPE::ROUNDED_RECT: pPainter->drawRoundedRect(-X, -Y, DX, DY, 0.35 * W, 0.35 * W); break; case SHAPE::ELLIPSE: pPainter->drawEllipse(-X, -Y, DX, DY); break; case SHAPE::ARC: pPainter->drawArc( -X, -Y, DX, DY, A, Alen); break; case SHAPE::CHORD: pPainter->drawChord(-X, -Y, DX, DY, A, Alen); break; default: assert( SHAPE::LINE == s.GetType() ); pPainter->drawLine(-X, -Y, X, Y); break; } pPainter->restore(); } pPainter->restore(); // Restore (original axes) if ( iLoop == 0 ) // Finish off making the pixmap { painterTmp.end(); // Turn the "mask" pixels transparent tmpPixmap.setMask( tmpPixmap.createMaskFromColor(maskColor, Qt::MaskInColor) ); } } } } } // Draw air wires ============================================================================ if ( !m_bWriteGerber && trackMode != TRACKMODE::OFF && GetCurrentNodeId() != BAD_NODEID ) { painter.save(); m_redPen.setWidth( static_cast(0.175 * W) ); m_redPen.setCapStyle(Qt::SquareCap); m_redPen.setStyle(Qt::DotLine); painter.setPen(m_redPen); painter.setBrush(Qt::NoBrush); int padOffsetX(0), padOffsetY(0); // For handling offset pads std::list spanTreePoints; for (int jj = minRow; jj <= maxRow; jj++) for (int ii = minCol; ii <= maxCol; ii++) { Element* pD = board.Get(0, jj, ii); // Layer 0 only const bool bPin = pD->GetHasPin() && !pD->GetHasWire(); if ( !bPin ) continue; // We may just have an SOIC pad on layer 1, but pD is on layer 0, so ... if ( !pD->GetHasPinTH() ) pD = pD->GetNbr(NBR_X); if ( pD == nullptr || pD->GetNodeId() != GetCurrentNodeId() ) continue; GetXY(board, jj, ii, X, Y); // Handle offset pads if ( !bVero && board.GetPadOffsets(pD, padOffsetX, padOffsetY) ) // Get offsets in mil { X += (padOffsetX * W) / 100; // Convert from mil to pixels Y += (padOffsetY * W) / 100; // Convert from mil to pixels } spanTreePoints.push_back( SpanningTreeHelper::AIRWIRE_POINT(QPointF(X, Y), pD->GetRouteId()) ); } std::list< SpanningTreeHelper::AIRWIRE_LINE > spanTreeLines; SpanningTreeHelper::BuildAirWires(spanTreePoints, spanTreeLines); // Build air-wires for (const auto& o : spanTreeLines) painter.drawLine(o.first.first, o.second.first); m_redPen.setCapStyle(Qt::RoundCap); m_redPen.setStyle(Qt::SolidLine); painter.restore(); } // Draw flying wires ========================================================================= if ( !m_bWriteGerber && !bMonoPCB && compMode != COMPSMODE::OFF && board.GetShowFlyWires() ) { painter.save(); QPen blackPen = m_blackPen; // Used for lines in the component pixmap blackPen.setWidth(2); m_varPen.setWidth(static_cast(0.175 * W)); m_varPen.setCapStyle(Qt::SquareCap); m_varPen.setStyle(Qt::DotLine); painter.setBrush(Qt::NoBrush); const int dH = static_cast(0.1*W); // Param for wire rounded rect const double dW(0.35*W); // Param for wire rounded rect int padOffsetX(0), padOffsetY(0); // For handling offset pads std::set visitedNodeIds; for (int j = minRow; j <= maxRow; j++) for (int i = minCol; i <= maxCol; i++) { Element* pC = board.Get(0, j, i); // Layer 0 only if ( !board.GetAllowFlyWire(pC) ) continue; const int& nodeId = pC->GetNodeId(); if ( visitedNodeIds.find(nodeId) != visitedNodeIds.end() ) continue; visitedNodeIds.insert(nodeId); const bool bCurrentNodeId = nodeId == GetCurrentNodeId(); const QColor color = bCurrentNodeId ? colorMgr.GetPixmapColor(MY_GREY) : colorMgr.GetColorFromNodeId(nodeId); m_varPen.setColor(color); std::list spanTreePoints; GetXY(board, j, i, X, Y); // Handle offset pads if ( !bVero && board.GetPadOffsets(pC, padOffsetX, padOffsetY) ) // Get offsets in mil { X += (padOffsetX * W) / 100; // Convert from mil to pixels Y += (padOffsetY * W) / 100; // Convert from mil to pixels } spanTreePoints.push_back( QPointF(X, Y) ); for (int jj = j; jj <= maxRow; jj++) for (int ii = (jj == j) ? (i+1) : minCol; ii <= maxCol; ii++) { Element* pD = board.Get(0, jj, ii); // Layer 0 only if ( pD->GetNodeId() != nodeId || !board.GetAllowFlyWire(pD) ) continue; GetXY(board, jj, ii, X, Y); // Handle offset pads if ( !bVero && board.GetPadOffsets(pD, padOffsetX, padOffsetY) ) // Get offsets in mil { X += (padOffsetX * W) / 100; // Convert from mil to pixels Y += (padOffsetY * W) / 100; // Convert from mil to pixels } spanTreePoints.push_back( QPointF(X, Y) ); } std::list< SpanningTreeHelper::LINE > spanTreeLines; SpanningTreeHelper::Build(spanTreePoints, spanTreeLines, true); // true ==> daisy chain for (const auto& o : spanTreeLines) { const QPointF vec = ( o.second - o.first ); const QPointF mid = ( o.second + o.first ) * 0.5; const int dL = static_cast(PolygonHelper::Length(vec) * 0.5); painter.save(); painter.translate(mid.x(), mid.y()); painter.rotate(atan2(vec.y(), vec.x()) * DEGREES_PER_RADIAN); painter.setPen(m_varPen); painter.drawLine(-dL, 0, dL, 0); painter.setPen(fillBlackPen); painter.drawRoundedRect(-dL, -dH, dL+dL, dH+dH, dW, dW); painter.restore(); } } m_varPen.setCapStyle(Qt::RoundCap); painter.restore(); } // Draw component text ======================================================================= if ( compMode != COMPSMODE::OFF ) { for (const auto& pComp : sortedComps) // Iterate sorted components { const Component& comp = *pComp; const COMP& compType = comp.GetType(); const char& compDirection = comp.GetDirection(); const bool bMark = compType == COMP::MARK; const bool bWire = compType == COMP::WIRE; const bool bVeroLabel = compType == COMP::VERO_NUMBER || compType == COMP::VERO_LETTER; if ( bMark || bWire || bVeroLabel ) continue; const bool bPlaced = comp.GetIsPlaced(); if ( m_bWriteGerber && !bPlaced ) continue; // Don't write floating components to Gerber const bool bFound = compMgr.GetFound( comp.GetId() ); painter.save(); double dCopyTextScale = dTextScale; if ( bMonoPCB ) { dCopyTextScale *= m_board.GetTextSizeComp() * (20.0 / 243 ); // Scale to make the Gerber font size similar to regular component font size } else { QFont compFont = painter.font(); // Copy of current font compFont.setPointSize( m_board.GetTextSizeComp() ); painter.setFont(compFont); } // Use floating point pen width to better match Gerber output. // Scale the pen width down to compensate for painter.scale() scaling things up in the loop below. const double dPenWidth = ( bMonoPCB ) ? board.GetSilkWidth() / dCopyTextScale : 0; m_orangePen.setWidthF(dPenWidth); // Use colored text for found components m_redPen.setWidthF(dPenWidth); // Use red text for floating components penPlaced.setWidthF(dPenWidth); // Use this for placed components GetXY(board, comp, X, Y); // Get footprint centre int offsetRow(0), offsetCol(0); comp.GetLabelOffsets(offsetRow, offsetCol); X += W * 0.0625 * offsetCol; // Offset for text is 1/16 of a grid square Y += W * 0.0625 * offsetRow; // Offset for text is 1/16 of a grid square painter.translate(X, Y); if ( compDirection == 'N' || compDirection == 'S' ) painter.rotate(270); const std::string& myStr = ( compMode == COMPSMODE::NAME ) ? comp.GetNameStr() : ( compMode == COMPSMODE::VALUE ) ? comp.GetValueStr() : ""; painter.scale(dCopyTextScale, dCopyTextScale); painter.setPen(bFound ? m_orangePen : bPlaced ? penPlaced : m_redPen); painter.drawText(0,0,0,0, Qt::AlignCenter | Qt::TextDontClip, myStr.c_str(), bMonoPCB); painter.restore(); } } // Draw the User-defined "trax" component ==================================================== if ( !m_bWriteGerber && ( compMode != COMPSMODE::OFF || trackMode != TRACKMODE::OFF ) ) { Component& trax = compMgr.GetTrax(); if ( trax.GetSize() > 0 ) { if ( trax.GetIsPlaced() ) m_varBrush.setColor( QColor(128,128,128,128) ); // light grey else m_varBrush.setColor( QColor(192,128,192,128) ); // magenta tint painter.setPen(Qt::NoPen); painter.setBrush(m_varBrush); for (int j = 0, jRow = trax.GetRow(), compRows = trax.GetCompRows(); j < compRows; j++, jRow++) for (int i = 0, iCol = trax.GetCol(), compCols = trax.GetCompCols(); i < compCols; i++, iCol++) if ( trax.GetCompElement(j, i)->ReadFlagBits(RECTSET) ) { GetLRTB(board, 100, jRow, iCol, L, R, T, B); // 100% size square painter.drawRect(L,T,R-L,B-T); } } } // Draw vero labels ========================================================================== if ( !bPCB ) { painter.save(); QFont labelsFont = painter.font(); // Copy of current font labelsFont.setPointSize( m_board.GetTextSizeComp() ); painter.setFont(labelsFont); painter.setBrush(Qt::NoBrush); penPlaced.setWidth(0); m_redPen.setWidth(0); for (const auto& pComp : sortedComps) // Iterate sorted components { const Component& comp = *pComp; const COMP& compType = comp.GetType(); const bool bVeroNumber = compType == COMP::VERO_NUMBER; const bool bVeroLetter = compType == COMP::VERO_LETTER; if ( !(bVeroNumber || bVeroLetter) ) continue; const char& compDirection = comp.GetDirection(); const bool bPlaced = comp.GetIsPlaced(); // Only unplaced when a label is created by copying another ("V" key) int index(0), length(comp.GetSize()); for (int jj = 0, jjMax = comp.GetCompRows(), j = comp.GetRow(); jj < jjMax; jj++, j++) for (int ii = 0, iiMax = comp.GetCompCols(), i = comp.GetCol(); ii < iiMax; ii++, i++, index++) { GetLRTB(board, 100, j, i, L, R, T, B); painter.save(); painter.translate((L+R)/2, (T+B)/2); // Set text orientation, and forward/reverse number order int iNumber = index + 1; // Increasing numbers by default switch( compDirection ) { case 'W': painter.rotate(270); break; case 'E': painter.rotate(270); iNumber = 1 + length - iNumber; break; // Reverse number order case 'S': iNumber = 1 + length - iNumber; break; // Reverse number order } std::string label(""); if ( bVeroNumber ) // Numbers go: 1,2,3 etc label = std::to_string(iNumber); else // Letters go: A,B,...,Y,Z,AA,AB,...,AY,AZ,BA,BB, ... etc { if ( iNumber > 26 ) label += ( char('A') + static_cast((iNumber-1)/26 - 1) ); label += ( char('A') + (iNumber-1)%26 ); } // We always want the vero labels to appear non-mirrored if ( board.GetFlipH() ) painter.scale(-1, 1); // Mirror L-R if ( board.GetFlipV() ) painter.scale(1, -1); // Mirror T-B painter.scale(dTextScale, dTextScale); painter.setPen(bPlaced ? penPlaced : m_redPen); painter.drawText(0,0,0,0, Qt::TextDontClip | Qt::AlignVCenter | Qt::AlignHCenter, label.c_str()); painter.restore(); } } painter.restore(); } // Draw User-defined labels ================================================================== if ( !bPCB && board.GetShowText() ) { QFont font = painter.font(); // Copy of current font TextManager& textMgr = m_board.GetTextMgr(); for (const auto& mapObj : textMgr.GetMapIdToText()) { const TextRect& rect = mapObj.second; if ( !rect.GetIsValid() ) continue; GetXY(board, rect.m_rowMin, rect.m_colMin, L, T); GetXY(board, rect.m_rowMax, rect.m_colMax, R, B); L -= C; T -= C; R += C; B += C; const int textW = static_cast((R-L)/dTextScale); const int textH = static_cast((B-T)/dTextScale); painter.save(); font.setBold( rect.GetStyle() & TEXT_BOLD ); font.setItalic( rect.GetStyle() & TEXT_ITALIC ); font.setUnderline( rect.GetStyle() & TEXT_UNDERLINE ); font.setPointSize( rect.GetSize() ); painter.setFont(font); m_varPen.setColor(!bMono ? rect.GetQColor() : ( bGroundFill == bInverseMono ) ? Qt::black : Qt::white); painter.setPen(m_varPen); painter.setBrush(Qt::NoBrush); painter.translate((bMono && layer == 0) ? R : L, T); // Mirror all text boxes in Mono mode for bottom layer painter.scale((bMono && layer == 0) ? -dTextScale : dTextScale, dTextScale); // Mirror all text boxes in Mono mode for bottom layer painter.drawText(0, 0, textW, textH, Qt::TextWordWrap | rect.GetFlagsH() | rect.GetFlagsV(), QString::fromStdString(rect.GetStr())); painter.restore(); if ( mapObj.first == GetCurrentTextId() ) { painter.setPen(m_dotPen); painter.drawRect(L, T, R-L, B-T); painter.drawRect(R-C, B-C, C, C); } } } // Draw a cross on the pad being used for pad offset ========================================= if ( !m_bWriteGerber && !bVero && m_padOffsetDlg->isVisible() ) { const Element* pC = m_board.Get(layer, m_gridRow, m_gridCol); int padOffsetX(0), padOffsetY(0); if ( board.GetPadOffsets(pC, padOffsetX, padOffsetY) ) // Get offsets in mil { GetXY(board, m_gridRow, m_gridCol, X, Y); X += (padOffsetX * W) / 100; // Convert from mil to pixels Y += (padOffsetY * W) / 100; // Convert from mil to pixels painter.save(); painter.setBrush(Qt::NoBrush); m_yellowPen.setWidth(2); painter.setPen(m_yellowPen); painter.drawLine(X-C, Y, X+C, Y); painter.drawLine(X, Y-C, X, Y+C); painter.restore(); } } // Draw places of min track separation ======================================================= if ( !m_bWriteGerber && !bVero && trackMode != TRACKMODE::OFF && m_board.GetShowCloseTracks() ) { painter.save(); painter.setBrush(Qt::NoBrush); for (int lyr = 0; lyr < m_board.GetLyrs(); lyr++) { m_orangePen.setWidth(lyr == layer ? 3 : 1); // Current layer shown fatter painter.setPen(m_orangePen); for (const auto& o : m_board.GetWarnPoints(lyr)) { GetXY(board, o.y(), o.x(), X, Y); if ( lyr == layer ) painter.drawRect(X-C/3, Y-C/3, W/3, W/3); else painter.drawRect(X-C/6, Y-C/6, W/6, W/6); } } painter.restore(); } if ( !m_bWriteGerber && m_bRuler ) { QPointF A,B; GetRulerExact(board, m_rulerA, A); GetRulerExact(board, m_rulerB, B); int XA, YA, XB, YB; GetXY(board, A.ry(), A.rx(), XA, YA); GetXY(board, B.ry(), B.rx(), XB, YB); painter.save(); m_rulerPen.setWidth(C); painter.setPen(m_rulerPen); painter.setBrush(Qt::NoBrush); painter.drawLine(XA,YA,XB,YB); painter.restore(); } if ( m_bWriteGerber ) m_gWriter.GetStream(GFILE::GTO).DrawBuffers(); // Top silk layer #ifdef _GRID_DEBUG if ( m_iGridDebugMode == DEBUGMODE_LAYERINFO ) { GetLRTB(board, 100, 0, 0, L, R, T, B); // 100% size square painter.save(); painter.translate((L+R)/2, (T+B)/2); painter.scale(dTextScale, dTextScale); painter.setPen(m_blackPen); std::string txt("nodeId // nodeId Srf Soic Hole // Comp1 Pin1 OrigId // Comp2 Pin2 OrigId"); painter.drawText(0,0,0,0, Qt::TextDontClip | Qt::AlignVCenter | Qt::AlignLeft, txt.c_str()); painter.restore(); for (int iLyr = 0; iLyr < board.GetLyrs(); iLyr++) { const Element* pC = m_board.Get(iLyr, m_gridRow, m_gridCol); std::string txt; if ( layer == iLyr ) txt = "*"; else txt = " "; const int iNodeId = pC->GetNodeId(); txt += std::to_string(iNodeId) + " // "; const int iNodeIdRaw = pC->GetNodeIdRaw(); txt += std::to_string(iNodeIdRaw) + " "; const int iSurface = (int)pC->GetSurfaceRaw(); txt += std::to_string(iSurface) + " "; const int iSoic = (int)pC->GetSoicCharRaw(); txt += std::to_string(iSoic) + " "; const int iHole = (int)pC->GetHoleUseRaw(); txt += std::to_string(iHole) + " // "; const int iCompId = pC->GetCompIdRaw(); txt += std::to_string(iCompId) + " "; const int iPinIndex = pC->GetPinIndexRaw(); txt += std::to_string(iPinIndex) + " "; if ( iCompId != BAD_COMPID ) txt += std::to_string( compMgr.GetComponentById(iCompId).GetOrigId(iLyr, iPinIndex) ) + " // "; else txt += "NA // "; const int iCompId2 = pC->GetCompId2Raw(); txt += std::to_string(iCompId2) + " "; const int iPinIndex2 = pC->GetPinIndex2Raw(); txt += std::to_string(iPinIndex2) + " "; if ( iCompId2 != BAD_COMPID ) txt += std::to_string( compMgr.GetComponentById(iCompId2).GetOrigId(iLyr, iPinIndex2) ) + " // "; else txt += "NA // "; GetLRTB(board, 100, 2 - iLyr, 0, L, R, T, B); // 100% size square painter.save(); painter.translate((L+R)/2, (T+B)/2); painter.scale(dTextScale, dTextScale); painter.setPen(m_blackPen); painter.drawText(0,0,0,0, Qt::TextDontClip | Qt::AlignVCenter | Qt::AlignLeft, txt.c_str()); painter.restore(); } } #endif painter.end(); delete pdfWriter; #ifdef PAINTBOARD_TIMER const auto elapsed = std::chrono::steady_clock::now() - start; const auto duration_ms = std::chrono::duration_cast(elapsed).count(); std::cout << "Time : " << duration_ms << std::endl; #endif } void MainWindow::GetFirstRowCol(int& iRow, int& iCol) const { const int& W = m_board.GetGRIDPIXELS(); // Square width in pixels iRow = 1 + m_scrollArea->verticalScrollBar()->value() / W; // The first fully visible row iCol = 1 + m_scrollArea->horizontalScrollBar()->value() / W; // The first fully visible col } void MainWindow::GetXY(const GuiControl& guiCtrl, double row, double col, int& X, int& Y) const { // For rendering. // Takes a point in the Board and returns coordinates in the drawn image. const int& W = guiCtrl.GetGRIDPIXELS(); // Square width in pixels const int C = W >> 1; // Half square width in pixels const int iEdge = static_cast( guiCtrl.GetEdgeWidth() ); X = m_XGRIDOFFSET + m_XCORRECTION + C + static_cast(col * W) + iEdge; Y = m_YGRIDOFFSET + m_YCORRECTION + C + static_cast(row * W) + iEdge; } void MainWindow::GetLRTB(const GuiControl& guiCtrl, double percent, double row, double col, int& L, int& R, int& T, int& B) const { // For rendering. // Takes a point in the Board and returns bounding box coordinates in the drawn image. // Setting percent to 100 will make the bounding box the same size as the grid square. const int& W = guiCtrl.GetGRIDPIXELS(); // Square width in pixels int X(0), Y(0); GetXY(guiCtrl, row, col, X, Y); const int S = static_cast( round(W * 0.005 * percent) ); L = X - S; T = Y - S; R = X + S; B = Y + S; } void MainWindow::GetLRTB(const GuiControl& guiCtrl, const Component& comp, int& L, int& R, int& T, int& B) const { // For rendering. // Takes a component in the Board and returns bounding box coordinates in the drawn image. GetXY(guiCtrl, comp.GetRow(), comp.GetCol(), L, T); GetXY(guiCtrl, comp.GetLastRow(), comp.GetLastCol(), R, B); } void MainWindow::GetLRTB(const GuiControl& guiCtrl, const Rect& rect, int& L, int& R, int& T, int& B) const { // For rendering. // Takes a Rect returns bounding box coordinates in the drawn image. GetXY(guiCtrl, rect.m_rowMin, rect.m_colMin, L, T); GetXY(guiCtrl, rect.m_rowMax, rect.m_colMax, R, B); } void MainWindow::GetXY(const GuiControl& guiCtrl, const Component& comp, int& X, int& Y) const { // For rendering. // Takes a component in the Board and returns the footprint centre in the drawn image. int L, R, T, B; GetLRTB(guiCtrl, comp, L, R, T, B); X = ( L + R ) / 2; Y = ( T + B ) / 2; if ( !guiCtrl.GetVeroTracks() ) // Offset the footprint if all pin offsets are equal { const int& W = guiCtrl.GetGRIDPIXELS(); // Square width in pixels int padOffsetX, padOffsetY; comp.GetCompShapeOffsets(padOffsetX, padOffsetY); // Get offsets in mil X += (padOffsetX * W) / 100; // Convert from mil to pixels Y += (padOffsetY * W) / 100; // Convert from mil to pixels } } void MainWindow::GetRulerExact(Board& board, const QPoint& p, QPointF& pOut) const { pOut = p; if ( !board.GetVeroTracks() ) { const Element* pC = board.Get(0, p.y(), p.x()); int padOffsetX(0), padOffsetY(0); if ( board.GetPadOffsets(pC, padOffsetX, padOffsetY) ) // Get offsets in mil pOut += QPointF(0.01 * padOffsetX, 0.01 * padOffsetY); } } VeroRoute/Src/images/diagsmin.png000644 001750 001750 00000000514 13661712157 017242 0ustar00alexalex000000 000000 ‰PNG  IHDR szzєbKGDW6ЯXMюЇ pHYsФФ•+tIMEу:XM2йIDATXУеV1Т0 ЬEќ)[WXљBgžУЬКТЪ–WСRSлБнK•*e№}Жзу§•:уђ8!)#ЇСРМLюTтЯџэќмЇ-ж^еˆЅŠЅG~P}іаAМ1lБєšl­тy™ШФкuœЕ=зм3 h@˜‰АЌ“H5ІиЛч&,A`”њYSPk§~ННІZ‰[QJaUb-ёкbs9FS“%ь9яУЯБдд˜ššЬ™ф=„#’˜pЗХ\cj`С8„ј[o#œexF6˜жIENDЎB`‚VeroRoute/Src/mainwindow.h000644 001750 001750 00000064714 14565665144 016044 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include "HistoryManager.h" #include "GWriter.h" #include "myscrollarea.h" #ifdef _GRID_DEBUG enum DEBUGMODE { DEBUGMODE_OFF = 0 , DEBUGMODE_SOICINFO, DEBUGMODE_ROUTEID, DEBUGMODE_NODEID, DEBUGMODE_PININDEX, DEBUGMODE_LAYERINFO, DEBUGMODE_END }; #endif namespace Ui { class MainWindow; } class ControlDialog; class TemplatesDialog; class RenderingDialog; class WireDialog; class HotkeysDialog; class InfoDialog; class CompDialog; class TextDialog; class BomDialog; class AliasDialog; class PinDialog; class PadOffsetDialog; class FindDialog; const size_t MAX_RECENT_FILES = 10; #ifdef VEROROUTE_ANDROID #define ANDROID_VSCROLL_WIDTH QString("QScrollBar:vertical { width: 20px; }") #define ANDROID_HSCROLL_HEIGHT QString("QScrollBar:horizontal { height: 20px; }") #endif class MainWindow : public QMainWindow { friend class ControlDialog; friend class TemplatesDialog; friend class RenderingDialog; friend class WireDialog; friend class HotkeysDialog; friend class InfoDialog; friend class CompDialog; friend class TextDialog; friend class BomDialog; friend class AliasDialog; friend class PinDialog; friend class PadOffsetDialog; friend class FindDialog; friend class MyScrollArea; Q_OBJECT public: enum class MOUSE_MODE { SELECT = 0, // Select objects (parts, text boxes, etc) PAINT_PINS = 1, // Paint component pins (and the board) ERASE_PINS = 2, // Erase component pins (and the board) PAINT_GRID = 3, // Paint grid points only (not component pins) ERASE_GRID = 4, // Erase grid points only (not component pins) PAINT_FLOOD = 5, // Flood-fill all connected tracks & pins DEFINE_RECT = 6, // Define grey rectangle areas RESIZE_TEXT = 7, // Resize text rectangle SMART_PAN = 8, // Move whole layout and resize/crop grid EDIT_LAYER_PREF = 9 // Edit pin layer preferences }; explicit MainWindow(const QString& localDataPathStr, const QString& tutorialsPathStr, QWidget* parent = nullptr); ~MainWindow(); void ResetView(MOUSE_MODE eMouseMode = MOUSE_MODE::SELECT, bool bTutorial = false); void CheckFolders(); void CheckHistory(); // Helper for mouse void GetPixMapXY(const QPoint& currentPoint, int& pixmapX, int& pixmapY) const; bool GetRowCol(const QPoint& currentPoint, int& row, int& col, double& deltaRow, double& deltaCol) const; bool GetRowCol(const QPoint& currentPoint, int rows, int cols, int& row, int& col, double& deltaRow, double& deltaCol) const; bool HaveZeroDeltaRowCol(int& deltaRow, int& deltaCol); // Helpers for rendering void GetFirstRowCol(int& iRow, int& iCol) const; void GetXY(const GuiControl& guiCtrl, double row, double col, int& X, int& Y) const; void GetLRTB(const GuiControl& guiCtrl, double percent, double row, double col, int& L, int& R, int& T, int& B) const; void GetLRTB(const GuiControl& guiCtrl, const Component& comp, int& L, int& R, int& T, int& B) const; void GetLRTB(const GuiControl& guiCtrl, const Rect& rect, int& L, int& R, int& T, int& B) const; void GetXY(const GuiControl& guiCtrl, const Component& comp, int& X, int& Y) const; void GetRulerExact(Board& board, const QPoint& p, QPointF& pOut) const; const bool& GetCtrlKeyDown() const { return m_bCtrlKeyDown; } const bool& GetShiftKeyDown() const { return m_bShiftKeyDown; } bool GetPaintAction() const { return m_eMouseMode >= MOUSE_MODE::PAINT_PINS && m_eMouseMode <= MOUSE_MODE::PAINT_FLOOD; } bool GetPaintPins() const { return m_eMouseMode == MOUSE_MODE::PAINT_PINS; } bool GetErasePins() const { return m_eMouseMode == MOUSE_MODE::ERASE_PINS; } bool GetPaintBoard() const { return m_eMouseMode == MOUSE_MODE::PAINT_GRID; } bool GetEraseBoard() const { return m_eMouseMode == MOUSE_MODE::ERASE_GRID; } bool GetPaintFlood() const { return m_eMouseMode == MOUSE_MODE::PAINT_FLOOD; } bool GetEditLayerPref() const { return m_eMouseMode == MOUSE_MODE::EDIT_LAYER_PREF; } bool GetDefiningRect() const { return m_eMouseMode == MOUSE_MODE::DEFINE_RECT; } bool GetResizingText() const { return m_eMouseMode == MOUSE_MODE::RESIZE_TEXT; } bool GetSmartPan() const { return m_eMouseMode == MOUSE_MODE::SMART_PAN || GetCtrlKeyDown(); } void SetCtrlKeyDown(bool b) { m_bCtrlKeyDown = b; } void SetShiftKeyDown(bool b) { m_bShiftKeyDown = b; } void SetPaintPins(bool b); void SetErasePins(bool b); void SetPaintBoard(bool b); void SetEraseBoard(bool b); void SetPaintFlood(bool b); void SetEditLayerPref(bool b); void SetDefiningRect(bool b); void SetResizingText(bool b); void SetSmartPan(bool b); const QString& GetFileName() const { return m_fileName; } bool GetHaveFloatingPinTH(int& iFloatingNodeId); void MousePressEvent(const QPoint& pos, bool bLeftClick = true, bool bRightClick = true); void MouseDoubleClickEvent(const QPoint& pos); void MouseMoveEvent(const QPoint& pos); void MouseReleaseEvent(const QPoint& pos); protected: void paintEvent(QPaintEvent* event); void wheelEvent(QWheelEvent* event); void closeEvent(QCloseEvent* event); void keyPressEvent(QKeyEvent* event); void keyReleaseEvent(QKeyEvent* event); #ifndef VEROROUTE_ANDROID void commonKeyPressEvent(QKeyEvent* event); // So child dialogs can relay Ctrl and Shift to the main window void commonKeyReleaseEvent(QKeyEvent* event); // So child dialogs can relay Ctrl and Shift to the main window void specialKeyPressEvent(QKeyEvent* event); // So child dialogs can do Ctrl+Q etc #endif void dragEnterEvent(QDragEnterEvent *e); void dropEvent(QDropEvent *e); bool eventFilter(QObject* object, QEvent* event); // Used with installEventFilter to intercept the Android "back" button public slots: void Startup(); // File menu items void New(); void Open(); void OpenRecent(); void Merge(); void Save(); void SaveAs(); void ReImport(); void Import(bool bTango); void ImportTango() { Import(true); } // true ==> Tango void ImportOrcad() { Import(false); } // false ==> Orcad void WritePDF(); void WritePNG(); void WriteGerber(bool bTwoLayerGerber, bool bMetric); void WriteGerber1in() { WriteGerber(false, false); } void WriteGerber1mm() { WriteGerber(false, true); } void WriteGerber2in() { WriteGerber(true, false); } void WriteGerber2mm() { WriteGerber(true, true); } void ClearRecentFiles(); void Quit(); // View menu items void ZoomIn(); void ZoomOut(); void Crop(); void ToggleGrid(); void ToggleText(); void ToggleFlipH(); void ToggleFlipV(); void TogglePinLabels(); void ToggleFlyWires(); void ToggleInverseMono(); void ToggleColoredMono(); void ToggleRuler(); // Toolbar items void VeroV(); void VeroH(); void Fat(); void Thin(); void Curved(); void ToggleDiagsMin(); void ToggleDiagsMax(); void ToggleFill(); void ToggleSelectArea(); void TogglePaintGrid(); void ToggleEraseGrid(); void TogglePaintPins(); void ToggleErasePins(); void TogglePaintFlood(); void ToggleEditLayerPrefs(); void ResetMouseMode(); // Edit menu items void Undo(); void Redo(); void SmartPanOn(); void Copy(); void Group(); void Ungroup(); void SelectAll(); void SelectAllInRects(); void Delete(); // Add menu items void AddMarker() { AddPart(COMP::MARK); } void AddPad() { AddPart(COMP::PAD); } void AddPadFlyWire() { AddPart(COMP::PAD_FLYINGWIRE); } void AddWire() { AddPart(COMP::WIRE); } void AddResistor() { AddPart(COMP::RESISTOR); } void AddInductor() { AddPart(COMP::INDUCTOR); } void AddCrystal() { AddPart(COMP::CRYSTAL); } void AddDiode() { AddPart(COMP::DIODE); } void AddLED() { AddPart(COMP::LED); } void AddCapCeramic() { AddPart(COMP::CAP_CERAMIC); } void AddCapFilm() { AddPart(COMP::CAP_FILM); } void AddCapFilmWide() { AddPart(COMP::CAP_FILM_WIDE); } void AddCapElectro200NP() { AddPart(COMP::CAP_ELECTRO_200_NP); } void AddCapElectro250NP() { AddPart(COMP::CAP_ELECTRO_250_NP); } void AddCapElectro300NP() { AddPart(COMP::CAP_ELECTRO_300_NP); } void AddCapElectro400NP() { AddPart(COMP::CAP_ELECTRO_400_NP); } void AddCapElectro500NP() { AddPart(COMP::CAP_ELECTRO_500_NP); } void AddCapElectro600NP() { AddPart(COMP::CAP_ELECTRO_600_NP); } void AddCapElectro200() { AddPart(COMP::CAP_ELECTRO_200); } void AddCapElectro250() { AddPart(COMP::CAP_ELECTRO_250); } void AddCapElectro300() { AddPart(COMP::CAP_ELECTRO_300); } void AddCapElectro400() { AddPart(COMP::CAP_ELECTRO_400); } void AddCapElectro500() { AddPart(COMP::CAP_ELECTRO_500); } void AddCapElectro600() { AddPart(COMP::CAP_ELECTRO_600); } void AddTO92() { AddPart(COMP::TO92); } void AddTO18() { AddPart(COMP::TO18); } void AddTO39() { AddPart(COMP::TO39); } void AddTO220() { AddPart(COMP::TO220); } void AddTrimVert() { AddPart(COMP::TRIM_VERT); } void AddTrimVertOffset() { AddPart(COMP::TRIM_VERT_OFFSET); } void AddTrimVertOffsetWide(){ AddPart(COMP::TRIM_VERT_OFFSET_WIDE); } void AddTrimFlat() { AddPart(COMP::TRIM_FLAT); } void AddTrimFlatWide() { AddPart(COMP::TRIM_FLAT_WIDE); } void AddSIP() { AddPart(COMP::SIP); } void AddDIP() { AddPart(COMP::DIP); } void AddSOIC8() { AddPart(COMP::SOIC8); } void AddSOIC14() { AddPart(COMP::SOIC14); } void AddSOIC16() { AddPart(COMP::SOIC16); } void AddSOIC14W() { AddPart(COMP::SOIC14W); } void AddSOIC16W() { AddPart(COMP::SOIC16W); } void AddSOIC20W() { AddPart(COMP::SOIC20W); } void AddSOIC24W() { AddPart(COMP::SOIC24W); } void AddSOIC28W() { AddPart(COMP::SOIC28W); } void AddStrip100() { AddPart(COMP::STRIP_100); } void AddBlock100() { AddPart(COMP::BLOCK_100); } void AddBlock200() { AddPart(COMP::BLOCK_200); } void AddSwitchST() { AddPart(COMP::SWITCH_ST); } void AddSwitchDT() { AddPart(COMP::SWITCH_DT); } void AddSwitchST_DIP() { AddPart(COMP::SWITCH_ST_DIP); } void AddVeroNumbers() { AddPart(COMP::VERO_NUMBER); } void AddVeroLetters() { AddPart(COMP::VERO_LETTER); } void AddTextBox() { SetCurrentTextId(BAD_TEXTID); int iRow, iCol; GetFirstRowCol(iRow, iCol); m_board.AddTextBox(iRow, iCol); UpdateHistory("add text"); ShowTextDialog(); UpdateControls(); RepaintSkipRouting(); } // Windows menu items + Other dialogs void ToggleControlDialog(); void ToggleCompDialog(); void ToggleTemplatesDialog(); void ToggleRenderingDialog(); void ToggleInfoDialog(); void TogglePinDialog(); void ShowControlDialog(); void ShowCompDialog(); void HideCompDialog(); void ShowTemplatesDialog(); void HideTemplatesDialog(); void ShowRenderingDialog(); void HideRenderingDialog(); void ShowInfoDialog(); void HideInfoDialog(); void ShowPinDialog(); void HidePinDialog(); void ShowBomDialog(); void HideBomDialog(); void ShowAliasDialog(); void ShowAliasDialog_NoFile(); void HideAliasDialog(); void ShowWireDialog(); void HideWireDialog(); void ShowFindDialog(); void HideFindDialog(); void ShowTextDialog(); void ShowAbout(); void ShowSupport(); void ShowHotkeysDialog(); void ShowPadOffsetDialog(); // Triggered by clicking on a pin for 1000ms void HidePadOffsetDialog(bool bForce = false); // Layers menu items void AddLayer(); void RemoveLayer(); void SwitchLayer(); void ToggleVias(); void ResetLayerPrefs(); void AutosetLayerPrefs(); // Help menu items void LoadFirstTutorial(); void LoadPrevTutorial(); void LoadNextTutorial(); void LoadTutorial(); // Helper // Check version against Sourceforge void UpdateCheck(); void HandleNetworkReply(QNetworkReply* reply); // Helpers for child dialogs void ShowDlg(QWidget* p); void HideDlg(QWidget* p); void HideAllDockedDlgs(); void HideAllNonDockedDlgs(); // View controls void TrackSliderChanged(int i); // Actually a helper for the following 3 checkboxes void CheckBoxMonoChanged(bool b); void CheckBoxColorChanged(bool b); void CheckBoxPcbChanged(bool b); void SaturationSliderChanged(int i); void CompSliderChanged(int i); // Actually a helper for the following 3 checkboxes void CheckBoxLineChanged(bool b); void CheckBoxNameChanged(bool b); void CheckBoxValueChanged(bool b); void FillSliderChanged(int i); void MarginChanged(int i); void SetShowGrid(bool b); void SetShowText(bool b); void SetFlipH(bool b); void SetFlipV(bool b); void SetShowPinLabels(bool b); void SetShowFlyWires(bool b); void SetInverseMono(bool b); void SetColoredMono(bool b); void SetFill(bool b); // Part controls void SetCompName(const QString& str); void SetCompValue(const QString& str); void SetCompType(const QString& str); void SetCompCustomFlag(bool b); void SetCompPadWidth(int i); void SetCompHoleWidth(int i); void CompRotateCCW() { CompRotate(false); } void CompRotateCW() { CompRotate(true); } void CompGrow() { CompStretch(true); } void CompShrink() { CompStretch(false); } void CompGrow2() { CompStretchWidth(true); } void CompShrink2() { CompStretchWidth(false); } void CompTextCentre() { CompTextMove(0, 0); } void CompTextL() { CompTextMove(0, -1); } void CompTextR() { CompTextMove(0, 1); } void CompTextT() { CompTextMove(-1, 0); } void CompTextB() { CompTextMove( 1, 0); } // Pin Shift void PadCentre() { PadMove(0, 0); } void PadMoveL() { PadMove(0, -1); } void PadMoveR() { PadMove(0, 1); } void PadMoveT() { PadMove(-1, 0); } void PadMoveB() { PadMove( 1, 0); } // Bad Nodes lists void SetNodeId(QListWidgetItem* p); void ListNodes(bool bRebuild = true); // Routing controls void EnableRouting(bool b); void EnableFastRouting(bool b); void Paste(); void Tidy(); void WipeTracks(); // Node color void AutoColor(bool b); void SelectNodeColor(); // Track controls void SetTracksVeroV(bool b); void SetTracksVeroH(bool b); void SetTracksFat(bool b); void SetTracksThin(bool b); void SetTracksCurved(bool b); void SetDiagonalsOff(bool b); void SetDiagonalsMin(bool b); void SetDiagonalsMax(bool b); // Rendering options void SetBrightness(int i); void SetTrackWidth(int i); void SetTagWidth(int i); void SetHoleWidth(int i); void SetPadWidth(int i); void SetGapWidth(int i); void SetMaskWidth(int i); void SetSilkWidth(int i); void SetEdgeWidth(int i); void SetFillWidth(int i); void SetViaPadWidth(int i); void SetViaHoleWidth(int i); void SetTextSizeComp(int i); void SetTextSizePins(int i); void SetTargetRows(int i); void SetTargetCols(int i); void SetShowTarget(bool b); void SetXthermals(bool b); void SetShowCloseTracks(bool b); void SetAntialiasOff(bool b); void SetAntialiasOn(bool b); // Find parts by name/value void ClearFind(); void Find(bool bUseName, bool bExact, const QString& str); size_t GetNumFound(); // Wire options void SetWireShare(bool b); void SetWireCross(bool b); // For text box dialog void SizeChanged(int i); void ToggleBold(); void ToggleItalic(); void ToggleUnderline(); void AlignL(); void AlignC(); void AlignR(); void AlignJ(); void AlignTop(); void AlignMid(); void AlignBot(); void SetText(const QString&); void ChooseTextColor(); // For component editor dialog CompDefiner& GetCompDefiner() { return m_board.GetCompDefiner(); } // For template dialog TemplateManager& GetTemplateManager() { return m_templateMgr; } // Info dialog void SetInfoStr(const QString& str) { m_board.SetInfoStr(str.toStdString()); } void OpenVrt(const QString& fileName, bool bMerge, bool bCrashRecovery = false); // Helper for opening a vrt using Open(), Merge(), dropEvent(), or the command line // Component editor void DefinerSetValueStr(const QString& str); void DefinerSetPrefixStr(const QString& str); void DefinerSetTypeStr(const QString& str); void DefinerSetImportStr(const QString& str); void DefinerWidthChanged(int i); void DefinerHeightChanged(int i); void DefinerPadWidthChanged(int i); void DefinerHoleWidthChanged(int i); void DefinerSetPinShapeType(const QString& str); void DefinerToggledPinLabels(bool b); void DefinerToggledCustomFlag(bool b); void DefinerToggleShapeLine(bool b); void DefinerToggleShapeFill(bool b); void DefinerSetPinNumber(int i); void DefinerIncPinNumber(bool b); void DefinerSetSurface(const QString& str); void DefinerSetShapeType(const QString& str); void DefinerSetCX(double d); void DefinerSetCY(double d); void DefinerSetDX(double d); void DefinerSetDY(double d); void DefinerSetA1(double d); void DefinerSetA2(double d); void DefinerSetA3(double d); void DefinerBuild(); void DefinerToggleEditor(); void DefinerAddLine(); void DefinerAddRect(); void DefinerAddRoundedRect(); void DefinerAddEllipse(); void DefinerAddArc(); void DefinerAddChord(); void DefinerChooseColor(); void DefinerRaise(); void DefinerLower(); // GUI update void UpdateControls(); private: // GUI update void UpdateRecentFiles(const QString* pFileName, bool bAdd); void UpdateWindowTitle(); void UpdateRulerInfo(); void UpdateCompDialog(); void EnableCompDialogControls(); void UpdateBOM(); void UpdateAliasDialog(); void UpdateTemplatesDialog(); void UpdateTextDialog(bool bFull = false); void PaintViaGrey(const GuiControl& guiCtrl, QPainter& painter, const QPointF& pC); void PaintPadGrey(const GuiControl& guiCtrl, QPainter& painter, QPen& pen, const QPointF& pC, int iPadWidthMIL = 0); void PaintSOIC(const GuiControl& guiCtrl, QPainter& painter, const QColor& color, const QPointF& pC, size_t pinIndex, const Component* pComp, bool bIsGnd, bool bGap = false); void PaintVia(const GuiControl& guiCtrl, QPainter& painter, const QColor& color, const QPointF& pC, bool bGap = false); // Helper void PaintPad(const GuiControl& guiCtrl, QPainter& painter, const QColor& color, const QPointF& pC, int iPadWidthMIL = 0, int iHoleWidth_MIL = 0, bool bGap = false); // Helper void PaintBlob(const GuiControl& guiCtrl, QPainter& painter, const QColor& color, const QPointF& pC, const QPointF& pCoffset, int iPadWidthMIL, int iPerimeterCode, int iTagCode, bool bHavePad, bool bHaveSoic, bool bIsGnd, bool bGap = false); // Helper void PaintBoard(); void PaintCompDefiner(); void HandleRouting(bool bSingleRoute = false); void RepaintWithListNodes(bool bNow = false); void RepaintWithRouting(bool bNow = false); void RepaintSkipRouting(bool bNow = false); void ShowCurrentRectSize(); // Show current rect size in status bar int GetCurrentLayer() const { return m_board.GetCurrentLayer(); } int GetCurrentNodeId() const { return m_board.GetCurrentNodeId(); } int GetCurrentCompId() const { return m_board.GetCurrentCompId(); } int GetCurrentTextId() const { return m_board.GetCurrentTextId(); } int GetCurrentPinId() const { return m_board.GetCurrentPinId(); } int GetCurrentShapeId() const { return m_board.GetCurrentShapeId(); } bool AllowCurrentCompId() const { return GetCurrentCompId() != BAD_COMPID; } bool AllowCurrentTextId() const { return GetCurrentTextId() != BAD_TEXTID && m_board.GetTrackMode() != TRACKMODE::PCB; } // Helper to disable text box operations in PCB mode void SetCurrentNodeId(int i) { m_board.SetCurrentNodeId(i); ListNodes(false); } void SetCurrentCompId(int i) { m_board.SetCurrentCompId(i); UpdateControls(); } void SetCurrentTextId(int i) { m_board.SetCurrentTextId(i); UpdateControls(); } void SetCurrentPinId(int i) { m_board.SetCurrentPinId(i); UpdateCompDialog(); } void SetCurrentShapeId(int i) { m_board.SetCurrentShapeId(i); UpdateCompDialog(); UpdateControls(); } TextRect& GetCurrentTextRect() { return m_board.GetTextMgr().GetTextRectById( GetCurrentTextId() ); } // Helpers for slots void ZoomHelper(int delta); void AddPart(COMP eType) { if ( m_board.GetCompEdit() ) return; // Do nothing in component editor mode ResetMouseMode(); int iRow, iCol; GetFirstRowCol(iRow, iCol); const int compId = m_board.CreateComponent(iRow, iCol, eType); if ( compId == BAD_COMPID ) return; // Reached component limit GroupManager& groupMgr = m_board.GetGroupMgr(); groupMgr.ResetUserGroup( compId ); // Reset the user group with the current comp (and its siblings) SetCurrentCompId(compId); UpdateHistory("add part"); UpdateControls(); UpdateBOM(); RepaintSkipRouting(); if ( CompTypes::GetIsSOIC(eType) && m_board.GetLyrs() == 1 && m_board.GetCompMgr().GetNumSOIC() == 1 ) // If it's the only SOIC on a 1-layer board QMessageBox::information(this, tr("Information"), tr("SOICs can only be placed on a 2-layer board. Add a second layer by doing 'Layers -> Add Top Layer'.")); } void AddFromTemplate(bool bGeneric, const Component& compTemp) { if ( m_board.GetCompEdit() ) return; // Do nothing in component editor mode if ( bGeneric ) return AddPart( compTemp.GetType() ); ResetMouseMode(); int iRow, iCol; GetFirstRowCol(iRow, iCol); const int compId = m_board.CreateComponent(iRow, iCol, compTemp.GetType(), &compTemp); if ( compId == BAD_COMPID ) return; // Reached component limit GroupManager& groupMgr = m_board.GetGroupMgr(); groupMgr.ResetUserGroup( compId ); // Reset the user group with the current comp (and its siblings) SetCurrentCompId(compId); UpdateHistory("add part"); UpdateControls(); UpdateBOM(); RepaintSkipRouting(); } void CompRotate(bool bCW); void CompStretch(bool bGrow); void CompStretchWidth(bool bGrow); void CompTextMove(int deltaRow, int deltaCol); void PadMove(int deltaRowMil, int deltaColMil); void UpdatePadInfo(); // Helpers void SetQuality(QPainter& p); void ResetRuler(); bool CanModifyRuler() const; public: bool CanZoomIn() const; bool CanZoomOut() const; private: bool GetIsModified() const; bool GetMatchesVrtFile(const std::string& fileName) const; void ResetHistory(const std::string& str); void UpdateHistory(const std::string& str, int objId = -1); void UpdateUndoRedoControls(); void SetMouseActionString(const std::string& str, int objId = -1); // Helper to auto-append suffix when writing a file QString GetSaveFileName(const QString& caption, const QString& nameFilter, const QString& defaultSuffix); QColor GetBackgroundColor() const; // For screen only. PDF is always white. // Pens QPen m_rulerPen; QPen m_backgroundPen; QPen m_greyPen; QPen m_blackPen; QPen m_whitePen; QPen m_redPen; QPen m_orangePen; QPen m_yellowPen; QPen m_lightBluePen; QPen m_varPen; QPen m_dotPen; QPen m_dashPen; QBrush m_backgroundBrush; QBrush m_darkBrush; QBrush m_varBrush; QNetworkAccessManager m_networkMgr; // For checking version against Sourceforge QAction* m_recentFileAction[MAX_RECENT_FILES]; QAction* m_separator = nullptr; // At the end of the recent files list Ui::MainWindow* ui = nullptr; MyScrollArea* m_scrollArea = nullptr; // The mainwindow contains a scrollable area ... QLabel* m_label = nullptr; // ... for a QLabel widget that ... QPixmap m_mainPixmap; // ... contains a pixmap image of the whole board QLabel* m_labelInfo = nullptr; // For permanent status bar text QLabel* m_labelStatus = nullptr; // For permanent status bar text #ifdef VEROROUTE_DEBUG QLabel* m_labelDebug = nullptr; // For permanent status bar text #endif ControlDialog* m_controlDlg = nullptr; QDockWidget* m_dockControlDlg = nullptr; CompDialog* m_compDlg = nullptr; QDockWidget* m_dockCompDlg = nullptr; TemplatesDialog* m_templatesDlg = nullptr; QDockWidget* m_dockTemplatesDlg = nullptr; RenderingDialog* m_renderingDlg = nullptr; QDockWidget* m_dockRenderingDlg = nullptr; InfoDialog* m_infoDlg = nullptr; QDockWidget* m_dockInfoDlg = nullptr; PinDialog* m_pinDlg = nullptr; QDockWidget* m_dockPinDlg = nullptr; WireDialog* m_wireDlg = nullptr; HotkeysDialog* m_hotkeysDlg = nullptr; TextDialog* m_textDlg = nullptr; BomDialog* m_bomDlg = nullptr; AliasDialog* m_aliasDlg = nullptr; PadOffsetDialog* m_padOffsetDlg = nullptr; FindDialog* m_findDlg = nullptr; Board m_board; // *** The main object *** HistoryManager m_historyMgr; // Class to manage undo/redo TemplateManager m_templateMgr; // For component templates GWriter m_gWriter; // Writes Gerber files QString m_fileName; // The loaded/saved .vrt file QString m_pdfFileName; // The saved PDF file QString m_gerberFileName; // The saved Gerber file int m_mouseObjId = -1; // For the undo/redo history std::string m_mouseActionString;// For the undo/redo history std::string m_localDataPathStr; // The path to the "history" and "templates" folders std::string m_tutorialsPathStr; // The path to the "tutorials" folder and "veroroute.png" QPoint m_mousePos; QPoint m_clickedPos; bool m_bRepaint = false; // Flag to make paintEvent() do something useful bool m_bMouseClick = false; // Flag of click beginning bool m_bLeftClick = false; bool m_bRightClick = false; bool m_bCtrlKeyDown = false; bool m_bShiftKeyDown = false; MOUSE_MODE m_eMouseMode = MOUSE_MODE::SELECT; bool m_bWritePDF = false; // true ==> draw to PDF file instead of screen bool m_bWriteGerber = false; // true ==> draw to Gerber file instead of screen bool m_bTwoLayerGerber = false; // true ==> 2-layer Gerber output instead of 1-layer bool m_bHistoryDir = false; // true ==> have "history" folder bool m_bTemplatesDir = false; // true ==> have "templates" folder bool m_bAliasesDir = false; // true ==> have "aliases" folder bool m_bRuler = false; bool m_bModifyRulerA = false; bool m_bUpdatingControls = false; bool m_bReRoute = false; bool m_bReListNodes = false; int m_XGRIDOFFSET = 0; // So we can centre when writing to PDF int m_YGRIDOFFSET = 0; // So we can centre when writing to PDF int m_XCORRECTION = 0; // So we can fully render pads larger than 100 mil diameter int m_YCORRECTION = 0; // So we can fully render pads larger than 100 mil diameter int m_gridRow = 0; // Board row corresponding to mouse position int m_gridCol = 0; // Board col correspondong to mouse position QPoint m_rulerA; QPoint m_rulerB; int m_iTutorialNumber = -1; // Tutorial file number 0,1,2,... (or -1 if not in tutorial mode) #ifdef _GRID_DEBUG int m_iGridDebugMode = DEBUGMODE_OFF; #endif }; VeroRoute/libraries/gEDA/veroroute_spin/Spin_FV1.sym000644 001750 001750 00000012434 13515171161 022657 0ustar00alexalex000000 000000 v 20130925 2 T 300 0 8 10 0 0 0 0 1 numslots=0 B 300 0 1400 5600 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 P 0 5400 300 5400 1 0 0 { T 205 5445 5 10 1 1 0 6 1 pinnumber=1 T 200 5400 5 10 0 1 0 0 1 pinseq=1 T 355 5395 5 10 1 1 0 0 1 pinlabel=LIN T 200 5400 5 10 0 1 0 0 1 pintype=pas } P 0 5000 300 5000 1 0 0 { T 205 5045 5 10 1 1 0 6 1 pinnumber=2 T 200 5000 5 10 0 1 0 0 1 pinseq=2 T 355 4945 5 10 1 1 0 0 1 pinlabel=RIN T 200 5000 5 10 0 1 0 0 1 pintype=pas } P 0 4600 300 4600 1 0 0 { T 205 4645 5 10 1 1 0 6 1 pinnumber=3 T 200 4600 5 10 0 1 0 0 1 pinseq=3 T 355 4545 5 10 1 1 0 0 1 pinlabel=MID T 200 4600 5 10 0 1 0 0 1 pintype=pas } P 0 4200 300 4200 1 0 0 { T 205 4245 5 10 1 1 0 6 1 pinnumber=4 T 200 4200 5 10 0 1 0 0 1 pinseq=4 T 355 4145 5 10 1 1 0 0 1 pinlabel=GND T 200 4200 5 10 0 1 0 0 1 pintype=pas } P 0 3800 300 3800 1 0 0 { T 205 3845 5 10 1 1 0 6 1 pinnumber=5 T 200 3800 5 10 0 1 0 0 1 pinseq=5 T 355 3745 5 10 1 1 0 0 1 pinlabel=CLIP T 200 3800 5 10 0 1 0 0 1 pintype=pas } P 0 3400 300 3400 1 0 0 { T 205 3445 5 10 1 1 0 6 1 pinnumber=6 T 200 3400 5 10 0 1 0 0 1 pinseq=6 T 355 3345 5 10 1 1 0 0 1 pinlabel=AVD T 200 3400 5 10 0 1 0 0 1 pintype=pas } P 0 3000 300 3000 1 0 0 { T 205 3045 5 10 1 1 0 6 1 pinnumber=7 T 200 3000 5 10 0 1 0 0 1 pinseq=7 T 355 2945 5 10 1 1 0 0 1 pinlabel=GND T 200 3000 5 10 0 1 0 0 1 pintype=pas } P 0 2600 300 2600 1 0 0 { T 205 2645 5 10 1 1 0 6 1 pinnumber=8 T 200 2600 5 10 0 1 0 0 1 pinseq=8 T 355 2545 5 10 1 1 0 0 1 pinlabel=DVD T 200 2600 5 10 0 1 0 0 1 pintype=pas } P 0 2200 300 2200 1 0 0 { T 205 2245 5 10 1 1 0 6 1 pinnumber=9 T 200 2200 5 10 0 1 180 6 1 pinseq=9 T 355 2195 5 10 1 1 0 0 1 pinlabel=X2 T 200 2200 5 10 0 1 180 6 1 pintype=pas } P 0 1800 300 1800 1 0 0 { T 205 1845 5 10 1 1 0 6 1 pinnumber=10 T 200 1800 5 10 0 1 180 6 1 pinseq=10 T 355 1795 5 10 1 1 0 0 1 pinlabel=X1 T 200 1800 5 10 0 1 180 6 1 pintype=pas } P 0 1400 300 1400 1 0 0 { T 205 1445 5 10 1 1 0 6 1 pinnumber=11 T 200 1400 5 10 0 1 180 6 1 pinseq=11 T 355 1395 5 10 1 1 0 0 1 pinlabel=GND T 200 1400 5 10 0 1 180 6 1 pintype=pas } P 0 1000 300 1000 1 0 0 { T 205 1045 5 10 1 1 0 6 1 pinnumber=12 T 200 1000 5 10 0 1 180 6 1 pinseq=12 T 355 995 5 10 1 1 0 0 1 pinlabel=T1 T 200 1000 5 10 0 1 180 6 1 pintype=pas } P 0 600 300 600 1 0 0 { T 205 645 5 10 1 1 0 6 1 pinnumber=13 T 200 600 5 10 0 1 180 6 1 pinseq=13 T 355 595 5 10 1 1 0 0 1 pinlabel=T0 T 200 600 5 10 0 1 180 6 1 pintype=pas } P 0 200 300 200 1 0 0 { T 205 245 5 10 1 1 0 6 1 pinnumber=14 T 200 200 5 10 0 1 180 6 1 pinseq=14 T 355 195 5 10 1 1 0 0 1 pinlabel=SCL T 200 200 5 10 0 1 180 6 1 pintype=pas } P 2000 200 1700 200 1 0 0 { T 1795 245 5 10 1 1 0 0 1 pinnumber=15 T 1800 200 5 10 0 1 0 6 1 pinseq=15 T 1645 195 5 10 1 1 0 6 1 pinlabel=SDA T 1800 200 5 10 0 1 0 6 1 pintype=pas } P 2000 600 1700 600 1 0 0 { T 1795 645 5 10 1 1 0 0 1 pinnumber=16 T 1800 600 5 10 0 1 0 6 1 pinseq=16 T 1645 595 5 10 1 1 0 6 1 pinlabel=S0 T 1800 600 5 10 0 1 0 6 1 pintype=pas } P 2000 1000 1700 1000 1 0 0 { T 1795 1045 5 10 1 1 0 0 1 pinnumber=17 T 1800 1000 5 10 0 1 0 6 1 pinseq=17 T 1645 995 5 10 1 1 0 6 1 pinlabel=S1 T 1800 1000 5 10 0 1 0 6 1 pintype=pas } P 2000 1400 1700 1400 1 0 0 { T 1795 1445 5 10 1 1 0 0 1 pinnumber=18 T 1800 1400 5 10 0 1 0 6 1 pinseq=18 T 1645 1395 5 10 1 1 0 6 1 pinlabel=S2 T 1800 1400 5 10 0 2 0 6 1 pintype=pas } P 2000 1800 1700 1800 1 0 0 { T 1795 1845 5 10 1 1 0 0 1 pinnumber=19 T 1800 1800 5 10 0 1 0 6 1 pinseq=19 T 1645 1795 5 10 1 1 0 6 1 pinlabel=GND T 1800 1800 5 10 0 1 0 6 1 pintype=pas } P 2000 2200 1700 2200 1 0 0 { T 1795 2245 5 10 1 1 0 0 1 pinnumber=20 T 1800 2200 5 10 0 1 0 6 1 pinseq=20 T 1645 2195 5 10 1 1 0 6 1 pinlabel=POT0 T 1800 2200 5 10 0 1 0 6 1 pintype=pas } P 2000 2600 1700 2600 1 0 0 { T 1795 2645 5 10 1 1 0 0 1 pinnumber=21 T 1800 2600 5 10 0 1 0 6 1 pinseq=21 T 1645 2595 5 10 1 1 0 6 1 pinlabel=POT1 T 1800 2600 5 10 0 1 0 6 1 pintype=pas } P 2000 3000 1700 3000 1 0 0 { T 1795 3045 5 10 1 1 0 0 1 pinnumber=22 T 1800 3000 5 10 0 1 0 6 1 pinseq=22 T 1645 2995 5 10 1 1 0 6 1 pinlabel=POT2 T 1800 3000 5 10 0 1 0 6 1 pintype=pas } P 2000 3400 1700 3400 1 0 0 { T 1795 3445 5 10 1 1 0 0 1 pinnumber=23 T 1800 3400 5 10 0 1 0 6 1 pinseq=23 T 1645 3395 5 10 1 1 0 6 1 pinlabel=DVD T 1800 3400 5 10 0 1 0 6 1 pintype=pas } P 2000 3800 1700 3800 1 0 0 { T 1795 3845 5 10 1 1 0 0 1 pinnumber=24 T 1800 3800 5 10 0 1 0 6 1 pinseq=24 T 1645 3795 5 10 1 1 0 6 1 pinlabel=GND T 1800 3800 5 10 0 1 0 6 1 pintype=pas } P 2000 4200 1700 4200 1 0 0 { T 1795 4245 5 10 1 1 0 0 1 pinnumber=25 T 1800 4200 5 10 0 1 0 6 1 pinseq=25 T 1645 4195 5 10 1 1 0 6 1 pinlabel=REFN T 1800 4200 5 10 0 1 0 6 1 pintype=pas } P 2000 4600 1700 4600 1 0 0 { T 1795 4645 5 10 1 1 0 0 1 pinnumber=26 T 1800 4600 5 10 0 1 0 6 1 pinseq=26 T 1645 4595 5 10 1 1 0 6 1 pinlabel=REFP T 1800 4600 5 10 0 1 0 6 1 pintype=pas } P 2000 5000 1700 5000 1 0 0 { T 1795 5045 5 10 1 1 0 0 1 pinnumber=27 T 1800 5000 5 10 0 1 0 6 1 pinseq=27 T 1645 4995 5 10 1 1 0 6 1 pinlabel=ROUT T 1800 5000 5 10 0 1 0 6 1 pintype=pas } P 2000 5400 1700 5400 1 0 0 { T 1795 5445 5 10 1 1 0 0 1 pinnumber=28 T 1800 5400 5 10 0 1 0 6 1 pinseq=28 T 1645 5395 5 10 1 1 0 6 1 pinlabel=LOUT T 1800 5400 5 10 0 1 0 6 1 pintype=pas } T 1400 5755 5 10 1 1 0 0 1 device=FV-1 T 200 5755 8 10 1 1 0 0 1 refdes=U? T 1600 2055 8 10 0 1 0 0 1 footprint=DIP28 T 1900 1845 8 10 0 1 0 0 1 description=Digital Reverb IC VeroRoute/Src/textdialog.ui000644 001750 001750 00000024525 14210701425 016172 0ustar00alexalex000000 000000 TextDialog 0 0 460 120 460 120 460 120 Text Label Editor 10 50 441 61 0 0 Qt::StrongFocus 44 10 51 27 Font size 5 50 9 240 10 31 27 Qt::TabFocus Align left :/images/left.png:/images/left.png 12 12 true 270 10 31 27 Qt::TabFocus Align horizontal centre :/images/center.png:/images/center.png 12 12 true 300 10 31 27 Qt::TabFocus Align right :/images/right.png:/images/right.png 12 12 true 330 10 31 27 Qt::TabFocus Align justified :/images/justify.png:/images/justify.png 12 12 true true 10 10 31 27 Size 100 10 31 27 Qt::TabFocus Bold :/images/bold.png:/images/bold.png 12 12 true 130 10 31 27 Qt::TabFocus Italic :/images/italic.png:/images/italic.png 12 12 true 160 10 31 27 Qt::TabFocus Underline :/images/underline.png:/images/underline.png 14 14 true 197 10 37 27 Qt::TabFocus RGB 360 10 31 27 Qt::TabFocus Align top :/images/top.png:/images/top.png 12 12 true true 390 10 31 27 Qt::TabFocus Align vertical centre :/images/mid.png:/images/mid.png 12 12 true false 420 10 31 27 Qt::TabFocus Align bottom :/images/bot.png:/images/bot.png 12 12 true false plainTextEdit pushButtonB pushButtonI pushButtonU pushButtonRGB pushButtonL pushButtonC pushButtonR pushButtonJ pushButtonTop pushButtonMid pushButtonBot spinBox VeroRoute/OpenSSL.txt000644 001750 001750 00000002355 13626302046 014767 0ustar00alexalex000000 000000 Getting "Help->Check for new version" to work on Windows. ========================================================= When VeroRoute checks for a new version, all it does is look at the page https://sourceforge.net/projects/veroroute/files/ and searches that page for text with the Version number. That page has a secure "https" address. The Qt library that handles https relies on the OpenSSL DLLs, and these are typically not included on MS Windows. The missing DLLs on MS Windows are called libeay32.dll and ssleay32.dll and they need to be placed in the folder containing VeroRoute. The DLLs support strong encryption and there are restrictions on importing/exporting them in some countries. Therefore I have not provided them with the release. You will have to download them yourself. They are available in many places, for example from here... https://indy.fulgan.com/SSL/ I tried version 1.0.2n of the DLLs and they worked fine. Note that you must use the appropriate DLLs for the version of VeroRoute that you have. Use the win32 DLLs for the 32-bit version of VeroRoute (even if you are on a 64-bit system) and the win64 version for the 64-bit version of VeroRoute. Note that the 64-bit DLLs still have the "32" in the filename, not "64". VeroRoute/libraries/gEDA/veroroute_passive/Capacitor_Film_300.sym000644 001750 001750 00000001270 13515171161 025225 0ustar00alexalex000000 000000 v 20130925 2 T 200 700 5 10 0 0 0 0 1 numslots=0 P 200 700 400 700 1 0 0 { T 350 750 5 8 1 1 0 6 1 pinnumber=1 T 350 750 5 8 0 0 0 6 1 pinseq=1 T 350 750 5 8 0 0 0 6 1 pinlabel=1 T 350 750 5 8 0 0 0 6 1 pintype=pas } P 1100 700 900 700 1 0 0 { T 950 750 5 8 1 1 0 0 1 pinnumber=2 T 950 750 5 8 0 0 0 0 1 pinseq=2 T 950 750 5 8 0 0 0 0 1 pinlabel=2 T 950 750 5 8 0 0 0 0 1 pintype=pas } L 600 900 600 500 3 0 0 0 -1 -1 L 900 700 700 700 3 0 0 0 -1 -1 L 600 700 400 700 3 0 0 0 -1 -1 L 700 900 700 500 3 0 0 0 -1 -1 T 500 300 5 10 1 1 0 0 1 device=82n T 500 1000 8 10 1 1 0 0 1 refdes=C? T 0 100 8 10 0 0 0 0 1 footprint=CAP_FILM3 T 0 100 8 10 0 0 0 0 1 description=Film Capacitor (300 mil length) VeroRoute/examples/tinycad_netlist.net000644 001750 001750 00000010705 13642231004 020455 0ustar00alexalex000000 000000 [ R1 RESISTOR3 2M2 ] [ R2 RESISTOR3 5k6 ] [ R4 RESISTOR3 4k7 ] [ R7 RESISTOR3 100k ] [ C1 CAP_FILM 100n ] [ IC1 DIP8 TL072 ] [ R9 RESISTOR3 10k ] [ R10 RESISTOR3 10k ] [ C6 CAP_FILM 47n ] [ RT2 TRIM_VERT 10k-B ] [ Color PADS3 10k-B ] [ R11 RESISTOR3 470R ] [ C11 CAP_FILM 100n ] [ R13 RESISTOR3 1M ] [ R14 RESISTOR3 470k ] [ Q1 TO92 2N5088 ] [ R15 RESISTOR3 10k ] [ R16 RESISTOR3 4k7 ] [ C12 CAP_FILM 100n ] [ Out PAD Out ] [ In PAD In ] [ IC3 DIP8 TL062 ] [ R17 RESISTOR3 18k ] [ R18 RESISTOR3 10k ] [ R19 RESISTOR3 5k6 ] [ R22 RESISTOR3 10k ] [ R21 RESISTOR3 27k ] [ R24 RESISTOR3 39k ] [ Range PADS3 100k-B ] [ R25 RESISTOR3 3k3 ] [ R27 RESISTOR3 2k7 ] [ Q2 TO92 2N5087 ] [ R26 RESISTOR3 22k ] [ R28 RESISTOR3 10k ] [ IC5 DIP14 CD4013 ] [ R12 RESISTOR3 470R ] [ IC2 DIP16 SAD1024 ] [ R29 RESISTOR3 220R ] [ G_In PAD Gnd ] [ G_Out PAD Gnd ] [ C13 CAP_ELECTRO_200 10u ] [ R23 RESISTOR3 33k ] [ R30 RESISTOR3 220k ] [ R6 RESISTOR3 6k8 ] [ C18 CAP_ELECTRO_250 220u ] [ R3 RESISTOR3 100k ] [ R5 RESISTOR3 470R ] [ R8 RESISTOR3 13k ] [ R20 RESISTOR3 39k ] [ R31 RESISTOR3 47R ] [ 18V PAD 18V ] [ Gnd PAD Gnd ] [ C2 CAP_FILM 2n7 ] [ C3 CAP_FILM 47n ] [ C4 CAP_FILM 1n ] [ C5 CAP_FILM 47n ] [ C8 CAP_FILM 4n7 ] [ C7 CAP_FILM 3n3 ] [ C9 CAP_FILM 47n ] [ C10 CAP_FILM 47n ] [ C16 CAP_CERAMIC 470p ] [ C17 CAP_CERAMIC 100n ] [ C14 CAP_ELECTRO_200 10u ] [ C15 CAP_ELECTRO_200 10u ] [ C19 CAP_ELECTRO_250 100u ] [ C20 CAP_ELECTRO_250 100u ] [ U1 TO92 78L12 ] [ D3 DIODE3 1N4001 ] [ D1 DIODE3 1N4001 ] [ D2 DIODE3 1N4148 ] [ IC4 DIP8 LM311 ] [ SW PADS3 SW ] [ RT4 TRIM_VERT 10k-B ] [ Rate PADS3 1M-C ] [ RT3 TRIM_VERT 20k-B ] [ RT1 TRIM_VERT 1k-B ] ( TCPOWERBAR G_In-1 R1-2 IC5-10 IC5-11 G_Out-1 R16-2 R14-2 Color-1 R26-1 R19-2 IC2-1 IC2-4 IC2-13 IC2-15 IC1-4 R11-2 IC5-7 IC5-9 IC5-8 R12-2 IC3-4 IC2-10 IC2-14 IC2-16 C13-2 IC5-4 IC5-6 RT3-3 C7-2 R9-2 C16-1 C2-1 C20-2 C19-2 C18-2 Gnd-1 IC4-4 IC4-1 C17-1 U1-2 ) ( Clock2 IC5-5 IC5-2 IC2-8 ) ( Clock1 IC5-1 IC2-3 ) ( Vcc IC2-9 IC2-7 R15-1 R13-1 IC1-8 IC5-14 RT3-1 IC2-11 IC2-12 IC4-6 IC4-8 IC4-5 R28-2 R27-2 D1-1 D3-1 R31-1 U1-1 C19-1 ) ( Vcc_LFO R31-2 C20-1 R17-1 IC3-8 R24-1 ) ( N000000 R2-2 C1-1 ) ( N000001 R7-1 R3-1 RT3-2 C13-1 ) ( N000002 C1-2 In-1 R1-1 ) ( N000003 IC1-5 R2-1 C2-2 R3-2 ) ( N000004 IC1-6 C3-1 IC1-7 R4-1 ) ( N000005 C6-2 RT1-2 R9-1 C7-1 ) ( N000006 RT2-2 R10-1 C6-1 RT2-1 ) ( N000007 Color-2 C8-2 ) ( N000008 C11-2 C5-2 C10-1 R10-2 ) ( N000009 R13-2 Q1-2 R14-1 C11-1 ) ( N000010 Q1-3 R15-2 C12-2 ) ( N000011 Q1-1 R16-1 ) ( N000012 C12-1 Out-1 ) ( N000013 IC3-2 IC3-5 R17-2 R18-1 ) ( N000014 IC3-6 C14-1 R22-1 R23-1 ) ( N000015 R21-1 C15-1 IC3-7 SW-3 ) ( N000016 R21-2 IC3-3 R20-1 ) ( N000017 Range-1 R18-2 R19-1 ) ( N000018 Range-2 R30-1 ) ( N000019 R25-1 Q2-2 R26-2 ) ( N000020 Q2-1 RT4-3 ) ( N000021 IC2-5 RT1-3 ) ( N000022 R29-2 D2-2 R28-1 ) ( N000023 R30-2 IC4-2 C17-2 ) ( N000024 R6-2 C4-2 R8-2 IC2-2 IC1-1 ) ( N000025 IC5-3 R29-1 IC4-7 ) ( N000026 R8-1 C5-1 ) ( N000027 R20-2 IC3-1 Rate-2 ) ( N000028 C3-2 R4-2 R5-2 ) ( N000029 C4-1 R5-1 R6-1 IC1-2 ) ( N000030 C8-1 R7-2 IC1-3 ) ( N000031 C9-1 RT2-3 Color-3 ) ( N000032 C9-2 R11-1 ) ( N000033 C10-2 R12-1 ) ( N000034 C14-2 C15-2 ) ( N000035 D3-2 18V-1 C18-1 U1-3 ) ( N000036 D1-2 R25-2 ) ( N000037 IC4-3 Q2-3 C16-2 D2-1 ) ( N000038 SW-2 Range-3 ) ( N000039 SW-1 R24-2 ) ( N000040 RT4-2 R27-1 RT4-1 ) ( N000041 RT1-1 IC2-6 ) ( N000042 R23-2 Rate-3 R22-2 ) VeroRoute/Src/wiredialog.cpp000644 001750 001750 00000003776 14217145476 016345 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #include "wiredialog.h" #include "ui_wiredialog.h" #include "mainwindow.h" WireDialog::WireDialog(MainWindow* parent) : QDialog(parent) , ui(new Ui_WireDialog) , m_pMainWindow(parent) { ui->setupUi(this); QObject::connect(ui->checkBox_share, SIGNAL(toggled(bool)), m_pMainWindow, SLOT(SetWireShare(bool))); QObject::connect(ui->checkBox_cross, SIGNAL(toggled(bool)), m_pMainWindow, SLOT(SetWireCross(bool))); QObject::connect(this, SIGNAL(rejected()), m_pMainWindow, SLOT(UpdateControls())); // Close using X button } WireDialog::~WireDialog() { delete ui; } void WireDialog::UpdateControls() { Board& board = m_pMainWindow->m_board; ui->checkBox_share->setChecked( board.GetWireShare() ); ui->checkBox_cross->setChecked( board.GetWireCross() ); } void WireDialog::keyPressEvent(QKeyEvent* event) { #ifndef VEROROUTE_ANDROID m_pMainWindow->specialKeyPressEvent(event); #endif QDialog::keyPressEvent(event); event->accept(); } void WireDialog::keyReleaseEvent(QKeyEvent* event) { #ifdef VEROROUTE_ANDROID if ( event->key() == Qt::Key_Back ) { QTimer::singleShot(0, m_pMainWindow, SLOT(HideWireDialog())); return event->accept(); } #else m_pMainWindow->commonKeyReleaseEvent(event); #endif QDialog::keyReleaseEvent(event); event->accept(); } VeroRoute/libraries/gEDA/veroroute_transistor/NPN_BC549.sym000644 001750 001750 00000001563 13515171161 023773 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=1 T 400 850 5 6 0 0 0 0 1 pinseq=1 T 400 850 5 6 0 0 0 0 1 pinlabel=1 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=3 T 400 50 5 6 0 0 0 0 1` pinseq=3 T 400 50 5 6 0 0 0 0 1 pinlabel=3 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 403,209 L 501,200 L 431,273 L 425,240 z T 600 700 5 10 1 1 0 0 1 device=BC549 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=NPN Transistor VeroRoute/Src/images/bold.png000644 001750 001750 00000001517 13661712157 016373 0ustar00alexalex000000 000000 ‰PNG  IHDR йsВgAMAБ ќa cHRMz&€„њ€шu0ъ`:˜pœКQ<bKGDЊ#2 pHYsФФ•+tIMEу' )PОIDATHЧ••OHQЧ?ГЛэъ:Лn†і‡%ЄPи‹Ац­( ‚"ˆш"ъR]‚Кxъ.tВ‚H‚ВCЇ:чХH Ѓ‹n‡жUЗ5ЕнщАЂПп{Џі7—љЮїћ>ѓ›їоЬxРЧVZ€4Qк‰С#ƒG;V)2Ч Џ˜ТЊ{MГ\ƒ= KYКЙLV8/xF2irœф"-Т{Ь ўи\UwV^–IхŽтЈ3*rЧp“Ь( ~9""5 n*мTњК иP]V‡o)u4 З_…ъВ›*sЬRJœџ ы a OpPЈЉ0@`N“нŽ†ЊЦ№ #~‹іюUыќPyƒЬn;?к1<кMQЈ<ЇtrˆоКZф.їљхžыšКgžМc€ŒШв, ЕФ{JјЄH“Sлjƒ' ЋьVЅдŒ Ї•A&”Л@Џ №џ Јз5jТџFЇh РˆJL˜vRйŸ‘Ј‘гIяНР(ѓR(sU\5ЇTO#€Л JХ"N€ЏдЂŽщ/@д иЏдДјџ8%Ю+МiчˆPcцvюSћрЉ5МCМвŸi3W`в˜вѓ|ю'д ˆвC?ЧИФЕ&яxЭ<1Кшх,ћ„3Юm–vЂуMќZy@Пl-$XaU*ЌSЂЪ2›”љЭЩэosѓLѓХ|юПuNл :Щ%tEXtdate:create2019-04-04T21:39:06+02:00yё8%tEXtdate:modify2019-04-04T21:39:06+02:00РI„tEXtSoftwarewww.inkscape.org›ю<IENDЎB`‚VeroRoute/libraries/gEDA/veroroute_passive/Capacitor_Electrolytic_600mil.sym000644 001750 001750 00000001420 13515171161 027502 0ustar00alexalex000000 000000 v 20130925 2 T 200 700 5 10 0 0 0 0 1 numslots=0 P 200 700 400 700 1 0 0 { T 350 750 5 8 1 1 0 6 1 pinnumber=1 T 350 750 5 8 0 0 0 6 1 pinseq=1 T 350 750 5 8 0 0 0 6 1 pinlabel=1 T 350 750 5 8 0 0 0 6 1 pintype=pas } P 1100 700 900 700 1 0 0 { T 950 750 5 8 1 1 0 0 1 pinnumber=2 T 950 750 5 8 0 0 0 0 1 pinseq=2 T 950 750 5 8 0 0 0 0 1 pinlabel=2 T 950 750 5 8 0 0 0 0 1 pintype=pas } L 600 900 600 500 3 0 0 0 -1 -1 L 900 700 700 700 3 0 0 0 -1 -1 L 600 700 400 700 3 0 0 0 -1 -1 A 1400 700 700 165 30 3 0 0 0 -1 -1 L 489 900 489 800 3 0 0 0 -1 -1 L 540 849 440 849 3 0 0 0 -1 -1 T 500 300 5 10 1 1 0 0 1 device=6u8 T 500 1000 8 10 1 1 0 0 1 refdes=C? T 500 700 8 10 0 0 0 0 1 footprint=CAP_ELECTRO_600 T 500 700 8 10 0 0 0 0 1 description=Electrolytic Capacitor (600 mil diameter) VeroRoute/libraries/gEDA/veroroute_transistor/MOSFET_Nchannel_BS170.sym000644 001750 001750 00000002006 13515171161 026142 0ustar00alexalex000000 000000 v 20130925 2 T 0 200 5 10 0 0 0 0 1 numslots=0 P 0 200 200 200 1 0 0 { T 0 300 5 10 1 1 0 0 1 pinnumber=2 T 0 300 5 10 0 0 0 0 1 pinseq=2 T 0 300 5 10 0 0 0 0 1 pinlabel=2 T 0 300 5 10 0 0 0 0 1 pintype=pas } P 500 600 500 800 1 0 1 { T 300 700 5 10 1 1 0 0 1 pinnumber=1 T 300 700 5 10 0 0 0 0 1 pinseq=1 T 300 700 5 10 0 0 0 0 1 pinlabel=1 T 300 700 5 10 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 300 0 5 10 1 1 0 0 1 pinnumber=3 T 300 0 5 10 0 0 0 0 1 pinseq=3 T 300 0 5 10 0 0 0 0 1 pinlabel=3 T 300 0 5 10 0 0 0 0 1 pintype=pas } L 250 600 500 600 3 0 0 0 -1 -1 L 250 200 500 200 3 0 0 0 -1 -1 L 250 400 350 450 3 0 0 0 -1 -1 L 250 400 350 350 3 0 0 0 -1 -1 L 250 675 250 525 3 0 0 0 -1 -1 L 250 475 250 325 3 0 0 0 -1 -1 L 250 275 250 125 3 0 0 0 -1 -1 L 200 600 200 200 3 0 0 0 -1 -1 L 250 400 400 400 3 0 0 0 -1 -1 L 400 400 400 200 3 0 0 0 -1 -1 T 600 200 5 10 1 1 0 0 1 device=BS170 T 600 500 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=N-Channel MOSFET VeroRoute/Src/images/italic.png000644 001750 001750 00000001311 13661712157 016710 0ustar00alexalex000000 000000 ‰PNG  IHDR йsВgAMAБ ќa cHRMz&€„њ€шu0ъ`:˜pœКQ<bKGDЊ#2 pHYs з зB(›xtIMEу( kdЅo—IDATHЧ••AKA€ПM—ДЌЈEьd–DEEЇŽб/щ§–§ б-ЂРƒQb DбХH’ЪP m­Cotwpо–o™їЭЬ›й№ŽqјрЧѓiг KmєТ!ЭQGђ7Їь%B€Т&FSœАCЋ—фПшЧщ5‰tUІ•E дMAVЮSъ.–^А-ЈN‰'Х ы‚xфЫD`3Ы„рхюF:A˜-БкmŠна иєЦЏ&‚СEžpM,2*јŠŠW3С0‚\Ўy1Ќ zцОsъ61цчМ Ј8Ќ)?ьU3С+‚Z\ёn"АpX\ BЫD0L’ЈрKj>#ѕDY"ЈTрУL0NZа+З|šlтЄчЉzmbУ #‚ЯќћїФ™чЎЫЙ™Рb‚yСeJ~Kш-"СЄр ~LSd)zи,(Чм˜њ™e‹„ђ­IPw•ўпƒ ‘fŸ=eуžO,\]% E–:mŸ НЦ1го‰ПˆN€%дt0ь%tEXtdate:create2019-04-04T21:40:12+02:00”Vыќ%tEXtdate:modify2019-04-04T21:40:12+02:00х S@tEXtSoftwarewww.inkscape.org›ю<IENDЎB`‚VeroRoute/Src/aliasdialog.h000644 001750 001750 00000003541 14411563310 016106 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include class MainWindow; class Ui_AliasDialog; class QTableWidgetItem; #include class AliasDialog : public QDialog { Q_OBJECT public: explicit AliasDialog(MainWindow* parent = nullptr); ~AliasDialog(); void Configure(const std::string& filename, bool bTango); void Update(); bool Import(bool& bPartTypeOK); const std::string& GetFilename() const { return m_filename; } const std::string& GetErrorStr() const { return m_errorStr; } protected: void keyPressEvent(QKeyEvent* event); void keyReleaseEvent(QKeyEvent* event); public slots: void DeleteRow(); // For alias table void DeleteAllRows(); // For alias table void CellPressed(int row, int col); // For alias table void CellChanged(int row, int col); // For alias table void CellChangedTop(int row, int col); // For valid import strings table private: Ui_AliasDialog* ui; MainWindow* m_pMainWindow; QStringList m_tableHeader; QStringList m_tableHeader_2; std::string m_filename; std::string m_errorStr; bool m_bTango = false; int m_iRow; bool m_bUpdating = false; }; VeroRoute/Src/images/erasepins.png000644 001750 001750 00000001362 14214154142 017427 0ustar00alexalex000000 000000 ‰PNG  IHDR szzєsRGBЎЮщgAMAБ ќa pHYsУУЧoЈd‡IDATXGЭ–?AЦ ЭбP@ +:c‚W@Д“’@ГЦрŸъh(.Б0Б бJуа>‚vh,.jCBq4Kюšѕ}fg6ГЫюВГЫхќ%›™чyпyw€`dГйпtЗфUЉTЦЇыF12™ЬКнn›уёиšЯч–d8Z†aHCg|v Оw-\Ђыт]ЁPИRE§€Б\.gbО§Zt |98Е.?Ÿ:&вќ ED‹>_.—wJЅ’ђЇ^ЏГѕz}Bf_Q7ђ–@Аё№>cX~aЉ№Шt@ІА]т§PдШqбg№  ­5xd: SЭf‹„fСљјч/іtt•ЂЖ‘ЅЉКЯ` §~џ„О–зЂЛ‡ŸИ8AFэž&‹Х‚•Ыe4БŽ‹ qНC" •тыЙ*јW€HŽ…WќiкУ?TбЂЋЧh4bTCбu‹ ТЂщэvћf0ьD_ ˜ЭfябоWЂќОчщtš;tЉL&жh4аL9т@I§ЁшЏг4_дjЕk>‘VЋ…Ќѕ nšт@ХЃеjѕ!ŸЯяY(иbБxНйl>‘8џ=а):/вшбЂчHkЗлхћ+(Œu:]ЕZнйg4мГŸ ёЈбƒ  NH*0ч|Цз‚‚Ѕ&wіђэwžњGOpГГ@шˆƒH“М@МлМЧлУЏ*7f@—РFЂŠЕb# §x№MKhMі‹Ш |<ЌбФH""UЏ’TD~бЯH"ЎФ]WЁcГ'L‡“кOLXњіH\ДўˆVМУLтїВndG37ЅG1p+т мšјcџ[т•` ЖKпIENDЎB`‚VeroRoute/Src/finddialog.cpp000644 001750 001750 00000005104 14215061472 016271 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #include "finddialog.h" #include "ui_finddialog.h" #include "mainwindow.h" FindDialog::FindDialog(MainWindow* parent) : QDialog(parent) , ui(new Ui_FindDialog) , m_pMainWindow(parent) { ui->setupUi(this); ui->radioName->setChecked(true); QObject::connect(ui->radioName, SIGNAL(toggled(bool)), this, SLOT(ToggleName(bool))); QObject::connect(ui->checkExact, SIGNAL(toggled(bool)), this, SLOT(ToggleExact(bool))); QObject::connect(ui->nameEdit, SIGNAL(textChanged(QString)), this, SLOT(TextChanged(QString))); } FindDialog::~FindDialog() { delete ui; } void FindDialog::ToggleName(bool b) { m_bName = b; if ( m_bCanFind ) m_pMainWindow->Find(m_bName, m_bExact, m_str); } void FindDialog::ToggleExact(bool b) { m_bExact = b; if ( m_bCanFind ) m_pMainWindow->Find(m_bName, m_bExact, m_str); } void FindDialog::TextChanged(const QString& str) { m_str = str; if ( m_bCanFind ) m_pMainWindow->Find(m_bName, m_bExact, m_str); } void FindDialog::showEvent(QShowEvent* event) { m_bCanFind = true; if ( m_pMainWindow->GetNumFound() == 0 ) ui->nameEdit->setText(QString("")); TextChanged(m_str); QDialog::showEvent(event); } void FindDialog::hideEvent(QHideEvent* event) { m_bCanFind = false; QDialog::hideEvent(event); } void FindDialog::closeEvent(QCloseEvent* event) { m_bCanFind = false; QDialog::closeEvent(event); } void FindDialog::keyPressEvent(QKeyEvent* event) { #ifndef VEROROUTE_ANDROID m_pMainWindow->specialKeyPressEvent(event); #endif QDialog::keyPressEvent(event); event->accept(); } void FindDialog::keyReleaseEvent(QKeyEvent* event) { #ifdef VEROROUTE_ANDROID if ( event->key() == Qt::Key_Back ) { QTimer::singleShot(0, m_pMainWindow, SLOT(HideFindDialog())); return event->accept(); } #else m_pMainWindow->commonKeyReleaseEvent(event); #endif QDialog::keyReleaseEvent(event); event->accept(); } VeroRoute/libraries/gEDA/veroroute_transistor/JFET_Nchannel_2N5486.sym000644 001750 001750 00000001551 13515171161 025753 0ustar00alexalex000000 000000 v 20130925 2 T 100 500 5 10 0 0 0 0 1 numslots=0 P 100 500 400 500 1 0 0 { T 100 350 5 6 1 1 0 0 1 pinnumber=3 T 100 350 5 6 0 0 0 0 1 pinseq=3 T 100 350 5 6 0 0 0 0 1 pinlabel=3 T 100 350 5 6 0 0 0 0 1 pintype=pas } P 600 1000 600 800 1 0 0 { T 500 850 5 6 1 1 0 0 1 pinnumber=1 T 500 850 5 6 0 0 0 0 1 pinseq=1 T 500 850 5 6 0 0 0 0 1 pinlabel=1 T 500 850 5 6 0 0 0 0 1 pintype=pas } P 600 200 600 0 1 0 1 { T 500 50 5 6 1 1 0 0 1 pinnumber=2 T 500 50 5 6 0 0 0 0 1 pinseq=2 T 500 250 5 6 1 1 0 0 1 pinlabel=S T 500 50 5 6 0 0 0 0 1 pintype=pas } L 400 800 600 800 3 0 0 0 -1 -1 L 400 200 600 200 3 0 0 0 -1 -1 L 400 900 400 100 3 0 0 0 -1 -1 L 300 600 400 500 3 0 0 0 -1 -1 L 400 500 300 400 3 0 0 0 -1 -1 T 700 700 5 10 1 1 0 0 1 device=2N5486 T 700 400 8 10 1 1 0 0 1 refdes=Q? T 595 95 8 10 0 0 0 0 1 footprint=TO92 T 595 95 8 10 0 0 0 0 1 description=N-Channel JFET VeroRoute/tutorials/tutorial_6.vrt000644 001750 001750 00000102421 14433261350 017610 0ustar00alexalex000000 000000 9њTUTORIAL 6  ADDING / REMOVING PARTS 6.1 MOVING A PART IN THE LAYOUT To move a part in the layout, click on it to select it, and then drag it while holding down the mouse button. Then release the mouse button. You can also move the part by clicking on it and using the arrow keys on the keyboard. 6.2 DELETING A PART FROM THE LAYOUT To delete a part from the layout, click on it to select it, then use the Edit -> Delete Selected Part  menu item, or the toolbar button. You can also delete the selected part using the DELETE or BACKSPACE key on the keyboard. 6.3 ADDING A PART TO THE LAYOUT To add a new part to the layout, use the Add  menu option. The part will be placed in the top-left corner of the layout window, and the grid will be automatically enlarged if needed. You can also add parts to the layout by opening the Parts Library  and double-clicking on any listed part, which will place the part in the top-left corner of the layout window. As you move, rotate, and resize parts, you will notice that they are sometimes drawn in a red outline rather than black. Red parts are called "floating" parts. This is explained in the next tutorial. 6.4 COPYING PARTS WITHIN A LAYOUT The quickest way to add new parts to a layout is to copy existing ones in the layout. To copy a part, first select it, then use the Edit -> Copy Selected Part  menu item or toolbar button. You can also use the "V" key on the keyboard. The copy of the selected part will have new "Name" and "Value" labels, and its pins will not have netlist IDs assigned to them. The copy of the selected part will be placed directly over the part that was copied rather than in the top-left corner of the window. A set of multi-selected or grouped parts can also be copied. 6.5 MARKERS These are legacy components which simply act as markers. They allow you to make holes in a ground-plane when in Mono  mode without placing a pad there. 6.6 TEXT BOXES You can add text to a layout using the "Add -> Text Box" menu item. This menu item is only enabled if the option to show text ("View -> Text Boxes") is enabled. Text boxes are not displayed in PCB mode. If you are in "Mono" mode, then the text will be mirrored since the main purpose of "Mono" mode is to produce an output for the "toner-transfer" method of PCB creation. 6.7 VERO NUMBERS & LETTERS Some veroboards have rows and columns labelled with numbers (1,2,3,...) and letters (A,B,C,...). The Add  menu has two options for adding such labels to your layout. What actually happens is that VeroRoute creates a fake resizeable part with no pins (a "vero-label") that can be placed anywhere on the layout. Vero-labels can be moved, resized, rotated, and grouped like other parts. Unlike real parts, vero-labels are displayed even if part outlines have been switched off, but they cannot be manipulated while part outlines are switched off. Vero-labels are only hidden in PCB mode.џџџџџџџџџџџZ..2d џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџ  џџџџџџ џџџџџџџџџ  џџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ  џџџџџџ џџџџџџџџџ  џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџ џџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџ џџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџ џџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџ џџџџџџџџџ џџџџџџ џџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџ џџџџџ џџџџџ џџџџџ џџџџџ џџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџ џџџџџџџџџ џџџџџџ џџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџ џџџџџ џџџџџ џџџџџ џџџџџ џџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџ џџџџџџџџџ џџџџџџ џџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ  џџџџџџџШ Wire1 Wire1WireWire WF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџєC147pCCeramicCAP_CERAMICWF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ P       џџџџџџџџџџџџџџ       @IC1JRC4588DICDIPDIPEF(1234567891011121314Р ЬЬЬЬЬЭ@ ЬЬЬЬЬЭП§™™™™™š?§™™™™™š@V€   Р ЬЬЬЬЬЭР ЬЬЬЬЬЭП§™™™™™šПа@V€   Р ЬЬЬЬЬЭР ЬЬЬЬЬЭ?а?§™™™™™š@V€   Р ЬЬЬЬЬЭ@ ЬЬЬЬЬЭ?§™™™™™š?§™™™™™š@V€   @ ЬЬЬЬЬЭР ЬЬЬЬЬЭП§™™™™™šП§™™™™™š@V€   @ ЬЬЬЬЬЭ@ ЬЬЬЬЬЭ?§™™™™™šП§™™™™™š@V€   Р ЬЬЬЬЬЭРЬЬЬЬЬЭПа?аРV€@V€    џ  X C256nCFilmCAP_FILM WF(12Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџџD1 1N4001D Diode DIODEEF(12Пўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfD?ё™™™™™™?ё™™™™™™Пй™™™™™š?й™™™™™š@V€џfD?ђffffff?ђffffffПй™™™™™š?й™™™™™š@V€џfD?§™™™™™™?§™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfDџ  џ џ џ џ  џ  xRT4 10k-BRTFlatTRIM_FLATWF(123Пј?јПј?ј@V€Pk§Пј?јПј?ј@V€Pk§џџџ џџџџ џ џ џџ  џ  џ џџ џ џ џџџџ џџђ C6470uC(Electrolytic 400 milCAP_ELECTRO_400WF(12Р@Р@@V€ŠŠф?јzсGЎ{?јzсGЎ{ПєЃз =pЄ?єЃз =pЄ@V€ŠŠфР@Р@@V€ŠŠфџџ,R14k7RResistorRESISTOR WF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   LQ1 2N3904QTO92TO92 WF(123Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   dPad11PadPadPADEF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџMarker1Marker1 Marker MarkerWF(ПЪсGЎzс?ЪсGЎzсПЪсGЎzс?ЪсGЎzс@V€џПЪсGЎzс?ЪсGЎzс?ЪсGЎzсПЪсGЎzс@V€џПг333333?г333333Пг333333?г333333@V€џ џ  џ  џ џ џ џ џ  џ  џ  џ џ џ џ џ  џ  џ  4SW23PDTSWDouble ThrowSWITCH_DTWF( 123456789Р™™™™™š@™™™™™šР™™™™™š@™™™™™š@V€2™ЬР™™™™™š@™™™™™šР™™™™™š@™™™™™š@V€2™ЬB@џџџўINVALID TracksWF(џџџ€џџџ€џџџ€џџџ€џџџџџџџџF#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Р@Р@@V€џVeroRoute/Src/compdialog.cpp000644 001750 001750 00000027055 14417013515 016317 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #include "compdialog.h" #include "ui_compdialog.h" #include "mainwindow.h" CompDialog::CompDialog(QWidget* parent) : QWidget(parent) , ui(new Ui_CompDialog) , m_pMainWindow(nullptr) { ui->setupUi( reinterpret_cast(this) ); QFont font = ui->pushButtonU->font(); font.setFamily(QString("Arial Unicode MS")); font.setPointSize(12); ui->pushButtonU->setFont(font); ui->pushButtonD->setFont(font); // Unicode triangles ... ui->pushButtonU->setText(QChar(0x25b3)); ui->pushButtonD->setText(QChar(0x25bd)); ui->spinBox_Width->installEventFilter( this ); // Prevent accidental wheel behaviour from wiping the footprint ui->spinBox_Height->installEventFilter( this ); // Prevent accidental wheel behaviour from wiping the footprint ui->comboBox_Shape->blockSignals(true); // Block signals while populating box ui->comboBox_Shape->clear(); for (const auto& str : Shape::GetListShapeStrings()) ui->comboBox_Shape->addItem(QString::fromStdString( str )); ui->comboBox_Shape->blockSignals(false); // We're done populating, so unblock signals ui->comboBox_Surface->blockSignals(true); // Block signals while populating box for (const auto& str : Pin::GetListSurfaceStrings()) ui->comboBox_Surface->addItem(QString::fromStdString( str )); ui->comboBox_Surface->blockSignals(false); // We're done populating, so unblock signals ui->comboBox_PinShape->blockSignals(true); // Block signals while populating box ui->comboBox_PinShape->clear(); ui->comboBox_PinShape->addItem(QString("Circle")); ui->comboBox_PinShape->addItem(QString("Rectangle")); ui->comboBox_PinShape->blockSignals(false); // We're done populating, so unblock signals #ifdef Q_OS_ANDROID QFont tmp = ui->comboBox_PinShape->font(); tmp.setPointSize(12); ui->comboBox_PinShape->setFont(tmp); ui->comboBox_Surface->setFont(tmp); ui->comboBox_Shape->setFont(tmp); #endif } void CompDialog::SetMainWindow(MainWindow* p) { m_pMainWindow = p; QObject::connect(ui->lineEdit_Value, SIGNAL(textChanged(QString)), m_pMainWindow, SLOT(DefinerSetValueStr(QString))); QObject::connect(ui->lineEdit_Prefix, SIGNAL(textChanged(QString)), m_pMainWindow, SLOT(DefinerSetPrefixStr(QString))); QObject::connect(ui->lineEdit_Type, SIGNAL(textChanged(QString)), m_pMainWindow, SLOT(DefinerSetTypeStr(QString))); QObject::connect(ui->lineEdit_Import, SIGNAL(textChanged(QString)), m_pMainWindow, SLOT(DefinerSetImportStr(QString))); QObject::connect(ui->spinBox_Width, SIGNAL(valueChanged(int)), m_pMainWindow, SLOT(DefinerWidthChanged(int))); QObject::connect(ui->spinBox_Height, SIGNAL(valueChanged(int)), m_pMainWindow, SLOT(DefinerHeightChanged(int))); QObject::connect(ui->comboBox_PinShape, SIGNAL(currentTextChanged(QString)), m_pMainWindow, SLOT(DefinerSetPinShapeType(QString))); QObject::connect(ui->checkBox_PinLabels,SIGNAL(toggled(bool)), m_pMainWindow, SLOT(DefinerToggledPinLabels(bool))); QObject::connect(ui->custom, SIGNAL(toggled(bool)), m_pMainWindow, SLOT(DefinerToggledCustomFlag(bool))); QObject::connect(ui->padWidth, SIGNAL(valueChanged(int)), m_pMainWindow, SLOT(DefinerPadWidthChanged(int))); QObject::connect(ui->holeWidth, SIGNAL(valueChanged(int)), m_pMainWindow, SLOT(DefinerHoleWidthChanged(int))); QObject::connect(ui->spinBox_PinNumber, SIGNAL(valueChanged(int)), m_pMainWindow, SLOT(DefinerSetPinNumber(int))); QObject::connect(ui->comboBox_Surface, SIGNAL(currentTextChanged(QString)), m_pMainWindow, SLOT(DefinerSetSurface(QString))); QObject::connect(ui->pushButtonRGB, SIGNAL(clicked()), m_pMainWindow, SLOT(DefinerChooseColor())); QObject::connect(ui->pushButtonU, SIGNAL(clicked()), m_pMainWindow, SLOT(DefinerRaise())); QObject::connect(ui->pushButtonD, SIGNAL(clicked()), m_pMainWindow, SLOT(DefinerLower())); QObject::connect(ui->comboBox_Shape, SIGNAL(currentTextChanged(QString)), m_pMainWindow, SLOT(DefinerSetShapeType(QString))); QObject::connect(ui->checkBox_Line, SIGNAL(toggled(bool)), m_pMainWindow, SLOT(DefinerToggleShapeLine(bool))); QObject::connect(ui->checkBox_Fill, SIGNAL(toggled(bool)), m_pMainWindow, SLOT(DefinerToggleShapeFill(bool))); QObject::connect(ui->doubleSpinBox_CX, SIGNAL(valueChanged(double)), m_pMainWindow, SLOT(DefinerSetCX(double))); QObject::connect(ui->doubleSpinBox_CY, SIGNAL(valueChanged(double)), m_pMainWindow, SLOT(DefinerSetCY(double))); QObject::connect(ui->doubleSpinBox_DX, SIGNAL(valueChanged(double)), m_pMainWindow, SLOT(DefinerSetDX(double))); QObject::connect(ui->doubleSpinBox_DY, SIGNAL(valueChanged(double)), m_pMainWindow, SLOT(DefinerSetDY(double))); QObject::connect(ui->doubleSpinBox_A1, SIGNAL(valueChanged(double)), m_pMainWindow, SLOT(DefinerSetA1(double))); QObject::connect(ui->doubleSpinBox_A2, SIGNAL(valueChanged(double)), m_pMainWindow, SLOT(DefinerSetA2(double))); QObject::connect(ui->doubleSpinBox_A3, SIGNAL(valueChanged(double)), m_pMainWindow, SLOT(DefinerSetA3(double))); QObject::connect(ui->pushButton_Build, SIGNAL(clicked()), m_pMainWindow, SLOT(DefinerBuild())); } bool CompDialog::eventFilter(QObject* object, QEvent* event) { if ( event->type() == QEvent::Wheel && qobject_cast( object ) ) { event->ignore(); return true; } return QWidget::eventFilter(object, event); } CompDialog::~CompDialog() { delete ui; } void CompDialog::Update() { m_bUpdatingControls = true; CompDefiner& def = m_pMainWindow->GetCompDefiner(); const bool bValidPinId = BAD_ID != def.GetCurrentPinId(); const bool bValidShapeId = BAD_ID != def.GetCurrentShapeId(); ui->lineEdit_Value->setText( def.GetValueStr().c_str() ); ui->lineEdit_Prefix->setText( def.GetPrefixStr().c_str() ); ui->lineEdit_Type->setText( def.GetTypeStr().c_str() ); ui->lineEdit_Import->setText( def.GetImportStr().c_str() ); ui->lineEdit_Value->show(); ui->lineEdit_Prefix->show(); ui->lineEdit_Type->show(); ui->lineEdit_Import->show(); ui->spinBox_Width->setValue( def.GetGridCols() ); ui->spinBox_Height->setValue( def.GetGridRows() ); ui->comboBox_PinShape->setCurrentIndex( ( (def.GetPinFlags() & PIN_RECT) > 0 ) ? 1 : 0 ); ui->checkBox_PinLabels->setChecked( def.GetPinFlags() & PIN_LABELS ); ui->custom->setChecked( def.GetPinFlags() & PIN_CUSTOM ); ui->padWidth->setValue( def.GetPadWidth() ); ui->holeWidth->setValue( def.GetHoleWidth() ); if ( bValidPinId ) { const Pin& pin = def.GetCurrentPin(); ui->spinBox_PinNumber->setValue( static_cast(pin.GetPinIndex() + 1) ); ui->comboBox_Surface->setCurrentIndex( pin.GetSurface() == SURFACE_FULL ? 0 : pin.GetSurface() == SURFACE_FREE ? 1 : 2 ); // Set to match order in which combo was populated } MyRGB rgb; if ( bValidShapeId ) { const Shape& s = def.GetCurrentShape(); ui->comboBox_Shape->setCurrentIndex( static_cast( s.GetType() ) ); // Works because SHAPE enum (0,1,2,...) matches how combo was populated ui->checkBox_Line->setChecked( s.GetDrawLine() ); ui->checkBox_Fill->setChecked( s.GetDrawFill() ); ui->doubleSpinBox_CX->setValue( s.GetCX() ); ui->doubleSpinBox_CY->setValue( -s.GetCY() ); // Control assumes CY goes up ui->doubleSpinBox_DX->setValue( s.GetDX() ); ui->doubleSpinBox_DY->setValue( s.GetDY() ); ui->doubleSpinBox_A1->setValue( s.GetA1() ); ui->doubleSpinBox_A2->setValue( s.GetA2() ); ui->doubleSpinBox_A3->setValue( s.GetA3() ); rgb = s.GetFillColor(); } ui->pushButtonRGB->setStyleSheet("border:2px solid " + rgb.GetQColor().name()); EnableControls(); m_bUpdatingControls = false; } void CompDialog::EnableControls() // Enable/disable controls { CompDefiner& def = m_pMainWindow->GetCompDefiner(); const bool bValidPinId = BAD_ID != def.GetCurrentPinId(); const bool bValidShapeId = BAD_ID != def.GetCurrentShapeId(); const bool bValidDefinition = def.GetIsValid(m_pMainWindow->GetTemplateManager()); const bool bCustom = def.GetPinFlags() & PIN_CUSTOM; if ( bCustom ) { ui->padWidth->show(); ui->holeWidth->show(); ui->label_pad->show(); ui->label_hole->show(); } else { ui->padWidth->hide(); ui->holeWidth->hide(); ui->label_pad->hide(); ui->label_hole->hide(); } bool bAngle(false); // true ==> show angle controls bool bFill(false); // true ==> allow fill option on shapr if ( bValidShapeId ) { const SHAPE& eType = def.GetCurrentShape().GetType(); bAngle = eType == SHAPE::ARC || eType == SHAPE::CHORD; bFill = eType != SHAPE::LINE && eType != SHAPE::ARC; } ui->label_Type->setText( StringHelper::IsEmptyStr( def.GetTypeStr() ) ? "Type *" : "Type"); ui->label_Value->setText( StringHelper::IsEmptyStr( def.GetValueStr() ) ? "Value *" : "Value"); ui->label_PinNumber->setEnabled( bValidPinId ); ui->spinBox_PinNumber->setEnabled( bValidPinId ); ui->comboBox_Surface->setEnabled( bValidPinId && !def.GetCurrentPin().GetIsPin() ); ui->label_CX->setEnabled( bValidShapeId ); ui->label_CY->setEnabled( bValidShapeId ); ui->label_DX->setEnabled( bValidShapeId ); ui->label_DY->setEnabled( bValidShapeId ); ui->label_A1->setEnabled( bAngle ); ui->label_A2->setEnabled( bAngle ); ui->label_A3->setEnabled( bValidShapeId ); ui->label_Shape->setEnabled( bValidShapeId ); ui->comboBox_Shape->setEnabled( bValidShapeId ); ui->checkBox_Line->setEnabled( bFill && ui->checkBox_Fill->isChecked() ); ui->checkBox_Fill->setEnabled( bFill && ui->checkBox_Line->isChecked() ); ui->pushButtonRGB->setEnabled( bFill && ui->checkBox_Fill->isChecked() ); ui->pushButtonU->setEnabled( def.GetCanRaise() ); ui->pushButtonD->setEnabled( def.GetCanLower() ); ui->doubleSpinBox_CX->setEnabled( bValidShapeId ); ui->doubleSpinBox_CY->setEnabled( bValidShapeId ); ui->doubleSpinBox_DX->setEnabled( bValidShapeId ); ui->doubleSpinBox_DY->setEnabled( bValidShapeId ); ui->doubleSpinBox_A1->setEnabled( bAngle ); ui->doubleSpinBox_A2->setEnabled( bAngle ); ui->doubleSpinBox_A3->setEnabled( bValidShapeId ); ui->pushButton_Build->setEnabled( bValidDefinition ); } void CompDialog::wheelEvent(QWheelEvent* event) { QWidget::wheelEvent(event); event->accept(); } void CompDialog::mousePressEvent(QMouseEvent* event) { QWidget::mousePressEvent(event); event->accept(); } void CompDialog::mouseDoubleClickEvent(QMouseEvent* event) { QWidget::mouseDoubleClickEvent(event); event->accept(); } void CompDialog::mouseMoveEvent(QMouseEvent* event) { QWidget::mouseMoveEvent(event); event->accept(); } void CompDialog::mouseReleaseEvent(QMouseEvent* event) { QWidget::mouseReleaseEvent(event); event->accept(); } void CompDialog::keyPressEvent(QKeyEvent* event) { #ifndef VEROROUTE_ANDROID m_pMainWindow->specialKeyPressEvent(event); #endif QWidget::keyPressEvent(event); event->accept(); } void CompDialog::keyReleaseEvent(QKeyEvent* event) { #ifdef VEROROUTE_ANDROID if ( event->key() == Qt::Key_Back ) return m_pMainWindow->keyReleaseEvent(event); // Try Undo operation #else m_pMainWindow->commonKeyReleaseEvent(event); #endif QWidget::keyReleaseEvent(event); event->accept(); } VeroRoute/Src/infodialog.ui000644 001750 001750 00000004514 14217106711 016141 0ustar00alexalex000000 000000 InfoDialog 0 0 310 630 310 630 310 16777215 Info 0 0 311 593 311 563 311 16777215 Qt::ClickFocus false 10 598 91 27 Qt::TabFocus Previous 210 598 91 27 Qt::TabFocus Next 110 598 91 27 Qt::TabFocus Reload next prev reload VeroRoute/Src/renderingdialog.h000644 001750 001750 00000002271 14211100004 016752 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include class MainWindow; class Ui_RenderingDialog; class RenderingDialog : public QWidget { Q_OBJECT public: explicit RenderingDialog(QWidget* parent = nullptr); ~RenderingDialog(); void SetMainWindow(MainWindow* p); void UpdateControls(); protected: void keyPressEvent(QKeyEvent* event); void keyReleaseEvent(QKeyEvent* event); private: Ui_RenderingDialog* ui; MainWindow* m_pMainWindow; }; VeroRoute/Src/ConnectionMatrix.h000644 001750 001750 00000005710 14403140012 017110 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include "Common.h" // Keeps track of connectivity between a set of points (e.g. target pins in the routing algorithm) // Quicker to use struct than a std::pair struct CONNECTION { CONNECTION(size_t a, size_t b) : first(a), second(b) {} size_t first = 0; size_t second = 0; }; class ConnectionMatrix { public: ConnectionMatrix() {} ~ConnectionMatrix() { DeAllocate(); } void Allocate(size_t N) { m_N = N; const size_t N2 = m_N * m_N; m_p = new bool[N2]; m_pp = new bool*[m_N]; memset(m_p, 0, N2 * sizeof(bool)); for (size_t i = 0; i < m_N; i++) m_pp[i] = m_p + i * m_N; for (size_t i = 0; i < m_N; i++) m_pp[i][i] = true; // Each point is connected to itself m_cost = static_cast(N2 - m_N); // Cost = number of false values in the connection matrix } void DeAllocate() { if ( m_pp ) delete[] m_pp; if ( m_p ) delete[] m_p; m_pp = nullptr; m_p = nullptr; } void Connect(size_t j, size_t k) { // Make j-k connection and enforce transitivity std::list list; // Helper for updating the connection matrix list.push_back( CONNECTION(j,k) ); while ( !list.empty() ) { auto iter = list.begin(); // Read info from first list entry ... const auto a = iter->first; const auto b = iter->second; list.erase( iter ); // ... then remove the list entry if ( !m_pp[a][b] ) // If no a-b connection ... { m_pp[a][b] = m_pp[b][a] = true; // Make a-b connection ... m_cost -= 2; // Update cost for (size_t c = 0; c < m_N; c++) // Update 1st-order transitive relations { if ( m_pp[a][c] ) { if ( !m_pp[b][c] ) list.push_back( CONNECTION(b,c) ); // a-c connection ==> b-c connection } else { if ( m_pp[b][c] ) list.push_back( CONNECTION(a,c) ); // b-c connection ==> a-c connection } } } } } const bool& GetAreConnected(size_t j, size_t k) const { return m_pp[j][k]; } const unsigned int& GetCost() const { return m_cost; } private: size_t m_N = 0; // Number of points in the set bool* m_p = nullptr; // bool** m_pp = nullptr; // m_pp[j][k] is true if points j and k are connected unsigned int m_cost = UINT_MAX; // Zero ==> all points are connected }; VeroRoute/Src/templatesdialog.h000644 001750 001750 00000003607 14416063607 017027 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include class MainWindow; class Ui_TemplatesDialog; class Board; class Component; class TemplatesDialog : public QWidget { Q_OBJECT public: explicit TemplatesDialog(QWidget* parent = nullptr); ~TemplatesDialog(); void SetMainWindow(MainWindow* p); void Update(); const Component* GetCurrentUserComp() const; protected: void keyPressEvent(QKeyEvent* event); void keyReleaseEvent(QKeyEvent* event); public slots: void GenericChanged(); void GenericDoubleClicked(int row, int); void UserChanged(); void UserDoubleClicked(int row, int); void AddTemplates(); void DeleteTemplate(); void LoadFromVrt(); void SaveToVrt(); private: void GenericClicked(int row); void UserClicked(int row); void Load(const QString& fileName, bool bInfoMsg); void Save(const QString& fileName); void LoadFromUserVrt(bool bInfoMsg); void SaveToUserVrt(); QString GetUserFilename() const; void AddTemplatesFromBoard(Board& board, bool bAllComps, bool bInfoMsg); private: Ui_TemplatesDialog* ui; MainWindow* m_pMainWindow; QStringList m_tableHeaderL; QStringList m_tableHeaderR; int m_iRowL; int m_iRowR; }; VeroRoute/Src/Element.h000644 001750 001750 00000052356 14425253234 015244 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include "Pin.h" #include "TrackElement.h" // The board is basically a Grid of "Element" objects. // "Element" derives from "Pin" and therefore has a description // of the surface at a location, and the pin index there (if any). // Each Element in the grid is "glued" to (i.e. has pointers to) it's neighbours. // There are always 8 "same-layer" neighbours. // For 2-layer boards, there is an additional "other layer" neighbour. // Wires (jumpers) "glue" remote elements together within layer 0 (i.e. the base layer). // This makes all the routing/connectivity code tidy because // each Element knows what it can be connected to without having // to go through the parent Grid object. Q_DECL_CONSTEXPR static const int TRAX_COMPID = -2; // The component manager member m_trax has this ID Q_DECL_CONSTEXPR static const int BAD_COMPID = -1; // Invalid component ID Q_DECL_CONSTEXPR static const unsigned int BAD_ROUTEID = UINT_MAX; // Invalid route (i.e. track section) ID Q_DECL_CONSTEXPR static const unsigned int BAD_MH = UINT_MAX; // "Infinite" MH distance class Element; // Quicker to use struct than a std::pair struct ElementInt { ElementInt(const Element* p, unsigned int i) : first(p), second(i) {} const Element* first; unsigned int second; }; // Quicker to use a list than an unordered_map since list is typically small typedef std::list WIRELIST; // Helper for chains of wires class Element : public Pin, public TrackElement { public: // Debug methods that avoid tunneling through layers size_t GetPinIndexRaw() const { return Pin::GetPinIndex(); } size_t GetPinIndex2Raw() const { return ( m_pinChar2 == BAD_PINCHAR ) ? BAD_PININDEX : m_pinChar2; } int GetCompIdRaw() const { return m_compId; } int GetCompId2Raw() const { return m_compId2; } uchar GetSurfaceRaw() const { return Pin::GetSurface(); } uchar GetHoleUseRaw() const { return Pin::GetHoleUse(); } uchar GetSoicCharRaw() const { return Pin::GetSoicChar(); } int GetNodeIdRaw() const { return TrackElement::GetNodeId(); } void SetSurface(uchar c) { return GetBase()->Pin::SetSurface(c); } void SetHoleUse(uchar c) { return GetBase()->Pin::SetHoleUse(c); } void SetSoicChar(uchar c) { return GetBase()->Pin::SetSoicChar(c); } void SetOccupancyTH(bool bWire) { return GetBase()->Pin::SetOccupancyTH(bWire); } const uchar& GetSurface() const { return GetBaseConst()->Pin::GetSurface(); } const uchar& GetHoleUse() const { return GetBaseConst()->Pin::GetHoleUse(); } bool GetIsHole() const { return GetBaseConst()->Pin::GetIsHole(); } uchar GetSoicChar() const { return GetBaseConst()->Pin::GetSoicChar(); } bool GetIsBotLyr() const { const Element* const p = GetNbr(NBR_X); return p == nullptr || p > this; } bool GetIsTopLyr() const { const Element* const p = GetNbr(NBR_X); return p != nullptr && p < this; } bool GetSoicProtected() const { return GetSoicChar() & ( GetIsTopLyr() ? SOIC_TRACKS_TOP : SOIC_TRACKS_BOT ); } const int& GetNodeId() const { auto pBase = GetBaseConst(); return ( pBase != this && GetHasPinTH() ) ? pBase->TrackElement::GetNodeId() : TrackElement::GetNodeId(); } void SetNodeId(int i) // Only called via the parent board method Board::SetNodeId() { TrackElement::SetNodeId(i); // Update usage flags for connections emanating from "this" element. for (int iNbr = 0; iNbr < NUM_NBRS; iNbr++) if ( GetNbr(iNbr) ) UpdateUsed(iNbr); // Update usage flags for diagonals that cut across the LT,RT,LB,RB diagonals. // Call these LTX,RTX,LBX,RBX respectively. // The point of doing this is that if "this" element has a diagonal connection that // we've just cleared, then previously blocked diagonals may now be usable. GetNbr(NBR_L)->UpdateUsed(NBR_RT); GetNbr(NBR_R)->UpdateUsed(NBR_LT); // LTX, RTX GetNbr(NBR_L)->UpdateUsed(NBR_RB); GetNbr(NBR_R)->UpdateUsed(NBR_LB); // LBX, RBX auto pBase = GetBase(); if ( pBase != this && GetHasPinTH() ) pBase->SetNodeId(i); } Element() : Pin(), TrackElement() { ZeroConnectionPointers(); } Element(const Element& o) : Pin(o), TrackElement(o) { *this = o; } // This is never used virtual ~Element() override {} void ZeroConnectionPointers() { memset(m_pNbr, 0, NUM_NBRS * sizeof(Element*)); memset(m_pW, 0, 2 * sizeof(Element*)); } Element& operator=(const Element& o) { Pin::operator=(o); // Call operator= in base class TrackElement::operator=(o); // Call operator= in base class m_bIsMark = o.m_bIsMark; m_compId = o.m_compId; m_compId2 = o.m_compId2; m_pinChar2 = o.m_pinChar2; m_bSolderR = o.m_bSolderR; m_bIsVia = o.m_bIsVia; // m_iRoutable = o.m_iRoutable; // This should only be set by the Board::Glue() method m_MH = o.m_MH; m_maxMH = o.m_maxMH; m_routeId = o.m_routeId; // Zero the connection pointers m_pNbr[] and m_pW[]. // These should only be set by Board::GlueNbrs() and Board::GlueWires(). // m_pW can also be modified by the methods Board::PutDown() and Board::TakeOff(). ZeroConnectionPointers(); return *this; } bool operator==(const Element& o) const // Compare persisted info only { return Pin::operator==(o) && TrackElement::operator==(o) && m_bIsMark == o.m_bIsMark && m_compId == o.m_compId && m_compId2 == o.m_compId2 && m_pinChar2 == o.m_pinChar2; } bool operator!=(const Element& o) const { return !(*this == o); } void SetIsMark(bool b) { GetBase()->m_bIsMark = b; } void SetSolderR(bool b) { GetBase()->m_bSolderR = b; } void SetIsVia(bool b) { GetBase()->m_bIsVia = b; } void SetRoutable(int i) { m_iRoutable = i; } void SetRouteId(unsigned int i) { m_routeId = i; } void ResetMH() { m_routeId = BAD_ROUTEID; // Wipe RouteId m_MH = BAD_MH; // Set "infinite" MH distance. m_maxMH = 0; // Zero max MH parameter } void UpdateMH(unsigned int iRouteID, unsigned int iMH, unsigned int& iMaxMH) { assert( m_MH == BAD_MH ); // Should only ever write the MH once iMaxMH = std::max(iMaxMH, iMH); // Update iMaxMH for output before storing it m_routeId = iRouteID; m_MH = iMH; m_maxMH = iMaxMH; } void SetNbr(int iNbr, Element* p) { m_pNbr[iNbr] = p; } void ClearWires() { SetW(0, nullptr); SetW(1, nullptr); } bool GetHasWire() const { return GetW(0) != nullptr || GetW(1) != nullptr; } int GetNumWires() const { int nCount(0); for (int iSlot = 0; iSlot < 2; iSlot++) if ( GetW(iSlot) != nullptr ) nCount++; return nCount; } int GetNumUsedSlots() const { int nCount(0); for (int iSlot = 0; iSlot < 2; iSlot++) if ( GetSlotCompId(iSlot) != BAD_COMPID ) nCount++; return nCount; } int GetFirstUsedSlot() const { for (int iSlot = 0; iSlot < 2; iSlot++) if ( GetSlotCompId(iSlot) != BAD_COMPID ) return iSlot; assert(0); return -1; } int GetFreeSlot() const { for (int iSlot = 0; iSlot < 2; iSlot++) if ( GetSlotCompId(iSlot) == BAD_COMPID ) return iSlot; assert(0); return -1; } int GetSlotFromCompId(int compId) const { assert( GetCompId() != GetCompId2() || GetCompId() == BAD_COMPID ); for (int iSlot = 0; iSlot < 2; iSlot++) if ( GetSlotCompId(iSlot) == compId ) return iSlot; return -1; } void SetSlotInfo(int iSlot, size_t pinIndex, int compId) { SetSlotPinIndex(iSlot, pinIndex); SetSlotCompId(iSlot, compId); } void SetSlotPinIndex(int iSlot, size_t pinIndex) { switch( iSlot ) { case 0: return SetPinIndex(pinIndex); case 1: return SetPinIndex2(pinIndex); default: assert(0); } } void SetSlotCompId(int iSlot, int compId) { switch( iSlot ) { case 0: return SetCompId(compId); case 1: return SetCompId2(compId); default: assert(0); } } void GetSlotInfo(int iSlot, size_t& pinIndex, int& compId) const { switch( iSlot ) { case 0: pinIndex = GetPinIndex(); compId = GetCompId(); return; case 1: pinIndex = GetPinIndex2(); compId = GetCompId2(); return; default: pinIndex = BAD_PININDEX; compId = BAD_COMPID; assert(0); } } size_t GetSlotPinIndex(int iSlot) const { switch( iSlot ) { case 0: return GetPinIndex(); case 1: return GetPinIndex2(); default: assert(0); return BAD_PININDEX; } } int GetSlotCompId(int iSlot) const { switch( iSlot ) { case 0: return GetCompId(); case 1: return GetCompId2(); default: assert(0); return BAD_COMPID; } } bool GetWireExists(const Element* p) const { return p != nullptr && ( GetW(0) == p || GetW(1) == p ); } bool GetCompExists(int compId) const { return compId != BAD_COMPID && ( GetCompId() == compId || GetCompId2() == compId ); } void SetW(int iSlot, Element* p) { assert( !GetWireExists(p) ); // No duplicates allowed assert( iSlot == 0 || iSlot == 1 ); GetBase()->m_pW[iSlot] = p; } void SetMH(unsigned int iMH) { m_MH = iMH; } const bool& GetIsMark() const { return GetBaseConst()->m_bIsMark; } int GetNumCompIds() const { int i(0); if ( GetCompId() != BAD_COMPID ) i++; if ( GetCompId2() != BAD_COMPID ) i++; return i; } bool GetHasComp() const { return GetCompId() != BAD_COMPID || GetCompId2() != BAD_COMPID; } bool GetHasPinLegacy() const { return GetIsPin() || GetIsPin2(); } // Only kept for legacy purposes (e.g. old VRTs don't have SOIC codes) bool GetHasPin() const { return GetSoicChar() & (SOIC_PAD|SOIC_THL); } // true ==> Have TH pin/SOIC pad on either layer bool GetHasPinTH() const { return GetSoicChar() & SOIC_THL; } // true ==> Have TH pin on either layer bool GetHasPinSOIC() const { return GetSoicChar() & SOIC_PAD; } // true ==> Have SOIC pad on either layer bool GetLyrHasPin() const { return GetHasPinTH() || ( GetHasPinSOIC() && GetIsTopLyr() ); } const bool& GetSolderR() const { return GetBaseConst()->m_bSolderR; } const bool& GetIsVia() const { return GetBaseConst()->m_bIsVia; } const int& GetRoutable() const { return m_iRoutable; } const unsigned int& GetRouteId() const { return m_routeId; } const unsigned int& GetMH() const { return m_MH; } const unsigned int& GetMaxMH() const { return m_maxMH; } Element* GetNbr(int iNbr) const { return m_pNbr[iNbr]; } Element* GetW(int iSlot) const { return GetBaseConst()->m_pW[iSlot]; } bool GetPinSupportsOffsetPads() const { return GetHasPinTH() && !GetHasWire(); } bool GetPinSupportsLayerPref() const { return GetHasPinTH() && !GetHasWire(); } // Helpers bool HaveNoBlankPins(int iNbr) const { const Element* pLyr = this; const Element* pNbr = pLyr->GetNbr(iNbr); return ( !pLyr->GetLyrHasPin() || pLyr->GetNodeId() != BAD_NODEID || pLyr->GetHasWire() ) && // Only allow routing FROM blank pins if they are on wires ( !pNbr->GetLyrHasPin() || pNbr->GetNodeId() != BAD_NODEID || pNbr->GetHasWire() ); // Only allow routing TO blank pins if they are on wires } void GetWireList(WIRELIST& wireList) const { wireList.clear(); return UpdateWireList(wireList, 0); } // Connectivity helpers void UpdateUsed(int iNbr) { const bool bUsed = GetNodeId() != BAD_NODEID && GetNodeId() == GetNbr(iNbr)->GetNodeId() && !IsBlocked(iNbr, GetNodeId()); SetUsed(iNbr, bUsed); m_pNbr[iNbr]->SetUsed(Opposite(iNbr), bUsed); // Keep consistent with nbr } void ToggleUsed(int iNbr) { ToggleCodeBit(iNbr, m_iCode); ToggleCodeBit(Opposite(iNbr), m_pNbr[iNbr]->m_iCode); // Keep consistent with nbr // Toggles are only done by the user so set the flag accordingly Element* pNbr = GetNbr(iNbr); WipeFlagBits(AUTOSET|VEROSET); MarkFlagBits(USERSET); pNbr->WipeFlagBits(AUTOSET|VEROSET); pNbr->MarkFlagBits(USERSET); // Handle wire ends Element* pW = GetW(0); if ( pW ) { pW->WipeFlagBits(AUTOSET|VEROSET); pW->MarkFlagBits(USERSET); } pW = GetW(1); if ( pW ) { pW->WipeFlagBits(AUTOSET|VEROSET); pW->MarkFlagBits(USERSET); } pW = pNbr->GetW(0); if ( pW ) { pW->WipeFlagBits(AUTOSET|VEROSET); pW->MarkFlagBits(USERSET); } pW = pNbr->GetW(1); if ( pW ) { pW->WipeFlagBits(AUTOSET|VEROSET); pW->MarkFlagBits(USERSET); } } bool CanSwapDiagLinks() { // Take "this" to be the bottom right element in group of 4 squares // "LT" is the diagonal from "this" to m_pLT // "LTX" is the diagonal that cuts across it (from m_pL to m_pT) return GetNodeId() == GetNbr(NBR_LT)->GetNodeId() && // LT: "this" and LT must have same nodeId GetNbr(NBR_L)->GetNodeId() == GetNbr(NBR_T)->GetNodeId() && // LTX: L and T must have same nodeId GetNbr(NBR_L)->IsClash( GetNodeId() ); // L and "this" must have clashing nodeIds } bool SwapDiagLinks() { if ( !CanSwapDiagLinks() ) return false; // Swap (by inverting flags) if we have competing diagonals ToggleUsed(NBR_LT); GetNbr(NBR_L)->ToggleUsed(NBR_RT); return true; } bool IsDiagNbr(const Element* p) const { assert( p != nullptr ); // Sanity check for (int iNbr = 1; iNbr < 8; iNbr += 2) if ( GetNbr(iNbr) == p ) return true; return false; } bool IsNbr(const Element* p) const { assert( p != nullptr ); // Sanity check for (int iNbr = 0; iNbr < NUM_NBRS; iNbr++) if ( GetNbr(iNbr) == p ) return true; return false; } bool IsUselessWire(int iNbr, int nodeId) const // Helper: true ==> painting nbr with nodeId is wasteful { const Element* pWA = GetNbr(iNbr); if ( pWA->GetHasWire() ) { const Element* pWB0 = pWA->GetW(0); const Element* pWB1 = pWA->GetW(1); // pWA and pWB are opposite ends of a wire. // If these ends both neighbour a common element with the specified nodeId, // then it is wasteful to paint the wire with that nodeId too, since the // common element already provides a connection. for (int iNbr = 0; iNbr < NUM_NBRS; iNbr++) { const Element* p = pWA->GetNbr(iNbr); if ( p == nullptr || p->GetNodeId() != nodeId ) continue; if ( pWB0 != nullptr && pWB0->IsNbr(p) ) return true; if ( pWB1 != nullptr && pWB1->IsNbr(p) ) return true; } } return false; } bool IsBlocked(int iNbr, int nodeId) const // Helper: true ==> assiging nodeId to "this" blocks the iNbr direction { assert(nodeId != BAD_NODEID); if ( !ReadCodeBit(iNbr, GetRoutable() ) ) return true; // Block toroidal connections at board edges auto pNbr = GetNbr(iNbr); if ( pNbr->IsClash(nodeId) ) return true; // Check if nbr has a clashing nodeId assigned to it if ( pNbr->GetIsHole() ) return true; // Block connections to holes if ( pNbr->GetSoicProtected() ) return true; // Block connections to SOIC area switch( iNbr ) // Block diagonals crossing the SOIC area { case NBR_LT: if ( GetNbr(NBR_L)->GetSoicProtected() || GetNbr(NBR_T)->GetSoicProtected() ) return true; break; case NBR_RT: if ( GetNbr(NBR_R)->GetSoicProtected() || GetNbr(NBR_T)->GetSoicProtected() ) return true; break; case NBR_LB: if ( GetNbr(NBR_L)->GetSoicProtected() || GetNbr(NBR_B)->GetSoicProtected() ) return true; break; case NBR_RB: if ( GetNbr(NBR_R)->GetSoicProtected() || GetNbr(NBR_B)->GetSoicProtected() ) return true; break; } switch( iNbr ) // Then do additional checks for competing diagonals { case NBR_LT: return GetNbr(NBR_L)->IsClash(nodeId) && GetNbr(NBR_L)->GetUsed(NBR_RT); case NBR_RT: return GetNbr(NBR_R)->IsClash(nodeId) && GetNbr(NBR_R)->GetUsed(NBR_LT); case NBR_LB: return GetNbr(NBR_L)->IsClash(nodeId) && GetNbr(NBR_L)->GetUsed(NBR_RB); case NBR_RB: return GetNbr(NBR_R)->IsClash(nodeId) && GetNbr(NBR_R)->GetUsed(NBR_LB); default: return false; } } // Merge interface functions virtual void UpdateMergeOffsets(MergeOffsets& o) override { Pin::UpdateMergeOffsets(o); // Does nothing TrackElement::UpdateMergeOffsets(o); if ( m_compId != BAD_COMPID && m_compId != TRAX_COMPID ) o.deltaCompId = std::max(o.deltaCompId, m_compId + 1); assert( m_compId2 != TRAX_COMPID ); if ( m_compId2 != BAD_COMPID && m_compId2 != TRAX_COMPID ) o.deltaCompId = std::max(o.deltaCompId, m_compId2 + 1); } void FixCorruption() { const bool bOK = GetCompId() == BAD_COMPID && GetCompId2() == BAD_COMPID && GetPinIndex() == BAD_PININDEX && GetPinIndex2() == BAD_PININDEX && GetSurface() == SURFACE_FREE && GetHoleUse() == HOLE_FREE && GetSoicChar() == SOIC_FREE && GetIsMark() == false; if ( !bOK ) { SetCompId(BAD_COMPID); SetCompId2(BAD_COMPID); SetPinIndex(BAD_PININDEX); SetPinIndex2(BAD_PININDEX); SetSurface(SURFACE_FREE); SetHoleUse(HOLE_FREE); SetSoicChar(SOIC_FREE); SetIsMark(false); } } virtual void ApplyMergeOffsets(const MergeOffsets& o) override { Pin::ApplyMergeOffsets(o); // Does nothing TrackElement::ApplyMergeOffsets(o); if ( m_compId != BAD_COMPID && m_compId != TRAX_COMPID) m_compId += o.deltaCompId; assert( m_compId2 != TRAX_COMPID ); if ( m_compId2 != BAD_COMPID && m_compId2 != TRAX_COMPID) m_compId2 += o.deltaCompId; } void Merge(const Element& o) { Pin::Merge(o); TrackElement::Merge(o); m_bIsMark = o.m_bIsMark; m_compId = o.m_compId; m_compId2 = o.m_compId2; m_pinChar2 = o.m_pinChar2; } // Persist interface functions virtual void Load(DataStream& inStream) override { if ( inStream.GetVersion() < VRT_VERSION_25 ) { Pin::Load(inStream); // Load() base class inStream.Load(m_compId); TrackElement::Load(inStream); // Load() base class inStream.Load(m_bIsMark); } else { Pin::Load(inStream); // Load() base class TrackElement::Load(inStream); // Load() base class inStream.Load(m_bIsMark); inStream.Load(m_compId); } m_compId2 = BAD_COMPID; m_pinChar2 = BAD_PINCHAR; if ( inStream.GetVersion() >= VRT_VERSION_27 ) { inStream.Load(m_compId2); // Added in VRT_VERSION_27 inStream.Load(m_pinChar2); // Added in VRT_VERSION_27 } } virtual void Save(DataStream& outStream) override { Pin::Save(outStream); // Save() base class TrackElement::Save(outStream); // Save() base class outStream.Save(m_bIsMark); outStream.Save(m_compId); outStream.Save(m_compId2); // Added in VRT_VERSION_27 outStream.Save(m_pinChar2); // Added in VRT_VERSION_27 } private: Element* GetBase() { Element* p = GetNbr(NBR_X); return p == nullptr || p > this ? this : p; } const Element* GetBaseConst() const { const Element* p = GetNbr(NBR_X); return p == nullptr || p > this ? this : p; } const int& GetCompId() const { return GetBaseConst()->m_compId; } const int& GetCompId2() const { return GetBaseConst()->m_compId2; } const uchar& GetPinChar2() const { return GetBaseConst()->m_pinChar2; } bool GetIsPin() const { return GetBaseConst()->Pin::GetIsPin(); } bool GetIsPin2() const { return GetPinChar2() != BAD_PINCHAR; } size_t GetPinIndex() const { return GetBaseConst()->Pin::GetPinIndex(); } size_t GetPinIndex2() const { return ( GetPinChar2() == BAD_PINCHAR ) ? BAD_PININDEX : GetPinChar2(); } void SetCompId(int i) { GetBase()->m_compId = i; } void SetCompId2(int i) { GetBase()->m_compId2 = i; } void SetPinIndex(size_t i) { return GetBase()->Pin::SetPinIndex(i); } void SetPinIndex2(size_t i) { GetBase()->m_pinChar2 = ( i >= BAD_PINCHAR ) ? BAD_PINCHAR : static_cast (i); } bool WireListHelper(WIRELIST& wireList, const Element* p, unsigned int iStep) const { for (auto& o : wireList) { if ( o.first != p ) continue; if ( iStep < o.second ) { o.second = iStep; return true; } else return false; } wireList.push_back(ElementInt(p, iStep)); return true; } void UpdateWireList(WIRELIST& wireList, unsigned int iStep) const { WireListHelper(wireList, this, iStep); const bool bOK_0 = GetW(0) != nullptr && WireListHelper(wireList, GetW(0), iStep + 1); const bool bOK_1 = GetW(1) != nullptr && WireListHelper(wireList, GetW(1), iStep + 1); if ( bOK_0 ) GetW(0)->UpdateWireList(wireList, iStep + 1); if ( bOK_1 ) GetW(1)->UpdateWireList(wireList, iStep + 1); } private: // Persist info bool m_bIsMark = false; int m_compId = BAD_COMPID; // For elements with a valid pinindex, this is the ID of the parent component int m_compId2 = BAD_COMPID; // Only used when we have 2 wires sharing a hole uchar m_pinChar2 = BAD_PINCHAR; // Only used when we have 2 wires sharing a hole // Working variables. Don't persist. bool m_bSolderR = false; // true ==> have blob of solder to right (for joining vero tracks) bool m_bIsVia = false; // true ==> have a (candidate) via between layers int m_iRoutable = 0; // Set by Board::GlueNbrs(). Code bits used to enable/disable connections to neighbours unsigned int m_routeId = BAD_ROUTEID; // For the routing algorithm. unsigned int m_MH = BAD_MH; // Manhatten distance to another element. For the routing/connectivity algorithm. unsigned int m_maxMH = 0; // For the routing algorithm. // Connection pointers. Set by Board::GlueNbrs() and Board::GlueWires(). Don't persist. Element* m_pNbr[static_cast(NUM_NBRS)]; // 0 to 7 <==> NBR_L to NBR_LB, 8 ==> NBR_X Element* m_pW[2]; // Up to 2 wires per element. These point to the other end of the wire(s). }; VeroRoute/libraries/gEDA/veroroute_bbd/MN3101.sym000644 001750 001750 00000003327 13515171160 021667 0ustar00alexalex000000 000000 v 20130925 2 T 300 400 8 10 0 0 0 0 1 numslots=0 B 300 400 1800 1800 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 P 0 1300 300 1300 1 0 0 { T 205 1345 5 10 1 1 0 6 1 pinnumber=1 T 200 1300 5 10 0 0 0 0 1 pinseq=1 T 355 1245 5 10 1 1 0 0 1 pinlabel=GND T 200 1300 5 10 0 0 0 0 1 pintype=pwr } P 2400 1800 2100 1800 1 0 0 { T 2195 1845 5 10 1 1 0 0 1 pinnumber=5 T 2200 1800 5 10 0 0 180 0 1 pinseq=5 T 2045 1795 5 10 1 1 0 6 1 pinlabel=OX3 T 2200 1800 5 10 0 0 180 0 1 pintype=pas } P 900 2500 900 2200 1 0 0 { T 850 2295 5 10 1 1 90 0 1 pinnumber=3 T 900 2400 5 10 0 0 0 0 1 pinseq=3 T 950 2145 5 10 1 1 90 6 1 pinlabel=VDD T 900 2400 5 10 0 0 0 0 1 pintype=pwr } P 1500 2500 1500 2200 1 0 0 { T 1450 2295 5 10 1 1 90 0 1 pinnumber=8 T 1500 2400 5 10 0 0 0 0 1 pinseq=8 T 1550 2145 5 10 1 1 90 6 1 pinlabel=VGG T 1500 2400 5 10 0 0 0 0 1 pintype=out } P 2400 1300 2100 1300 1 0 0 { T 2195 1345 5 10 1 1 0 0 1 pinnumber=6 T 2500 1300 5 10 0 0 0 0 1 pinseq=6 T 2045 1245 5 10 1 1 0 6 1 pinlabel=OX2 T 2500 1300 5 10 0 0 0 0 1 pintype=pas } P 2400 800 2100 800 1 0 0 { T 2195 845 5 10 1 1 0 0 1 pinnumber=7 T 2500 800 5 10 0 0 0 0 1 pinseq=7 T 2045 745 5 10 1 1 0 6 1 pinlabel=OX1 T 2500 800 5 10 0 0 0 0 1 pintype=pas } P 900 100 900 400 1 0 0 { T 850 305 5 10 1 1 90 6 1 pinnumber=2 T 900 100 5 10 0 0 0 0 1 pinseq=2 T 950 455 5 10 1 1 90 0 1 pinlabel=CP1 T 900 100 5 10 0 0 0 0 1 pintype=out } P 1500 100 1500 400 1 0 0 { T 1450 305 5 10 1 1 90 6 1 pinnumber=4 T 1500 100 5 10 0 0 0 0 1 pinseq=4 T 1550 455 5 10 1 1 90 0 1 pinlabel=CP2 T 1500 100 5 10 0 0 0 0 1 pintype=out } T 1800 2455 5 10 1 1 0 0 1 device=MN3101 T 1800 2655 8 10 1 1 0 0 1 refdes=U? T 1600 2055 8 10 0 1 0 0 1 footprint=DIP8 T 1900 1845 8 10 0 1 0 0 1 description=Driver for MN3000 series BBDs VeroRoute/Src/CompDefiner.cpp000644 001750 001750 00000025777 14432476713 016417 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #include "CompDefiner.h" #include "Component.h" #include "TemplateManager.h" void CompDefiner::Populate(const Component& o) { Clear(); SetPinFlags( o.GetPinFlags() ); SetPadWidth( o.GetPadWidth() ); SetHoleWidth( o.GetHoleWidth() ); SetAllowFlyWire( o.GetAllowFlyWire() ); // Copy strings SetValueStr( o.GetValueStr() ); SetPrefixStr( o.GetPrefixStr() ); SetTypeStr( o.GetFullTypeStr() ); SetImportStr( o.GetFullImportStr() ); SetLabelOffsetRow( o.GetLabelOffsetRow() ); SetLabelOffsetCol( o.GetLabelOffsetCol() ); // Copy footprint to PinInfo map m_grid.Allocate(o.GetLyrs(), o.GetRows(), o.GetCols()); for (int i = 0, iSize = o.GetSize(); i < iSize; i++) { *m_grid.GetAt(i) = *o.GetAtConst(i); // The editor does not yet support SURFACE_GAP/SURFACE_PLUG, so map these to SURFACE_FULL switch( o.GetAtConst(i)->GetSurface() ) { case SURFACE_GAP: case SURFACE_PLUG: m_grid.GetAt(i)->SetSurface(SURFACE_FULL); break; default: break; } // The editor does not yet support HOLE_WIRE, so map this to HOLE_FULL switch( o.GetAtConst(i)->GetHoleUse() ) { case HOLE_WIRE: m_grid.GetAt(i)->SetHoleUse(HOLE_FULL); break; default: break; } } // Copy pin labels AllocatePins( o.GetNumPins() ); for (size_t i = 0, iSize = GetNumPins(); i < iSize; i++) { SetPinLabel(i, o.GetPinLabel(i)); SetPinAlign(i, o.GetPinAlign(i)); } // Copy shapes m_mapShapes.clear(); int iShapeId(0); for (const auto& shape : o.GetShapes()) { AddShape(iShapeId, shape); iShapeId++; } } void CompDefiner::Build(const TemplateManager& templateMgr, Component& comp) const { // Build component from definition comp.SetPinFlags( GetPinFlags() ); comp.SetPadWidth( GetPadWidth() ); comp.SetHoleWidth( GetHoleWidth() ); comp.SetAllowFlyWire( GetAllowFlyWire() ); comp.SetValueStr( GetValueStr() ); comp.SetPrefixStr( GetPrefixStr() ); comp.SetTypeStr( GetTypeStr() ); comp.SetImportStr( GetImportStr() ); comp.SetLabelOffsetRow( GetLabelOffsetRow() ); comp.SetLabelOffsetCol( GetLabelOffsetCol() ); comp.SetType(COMP::CUSTOM); const COMP eType = CompTypes::GetTypeFromImportStr( templateMgr.GetImportStrCut(m_importStr) ); if ( eType != COMP::INVALID && templateMgr.CheckAllowOverWrite(comp) ) // If import string is reserved (e.g. TO92, DIP) and a user-template has that string ... comp.SetType(eType); // ... change type from COMP::CUSTOM to eType assert( m_grid.GetLyrs() == 1 ); comp.Allocate(m_grid.GetLyrs(), m_grid.GetRows(), m_grid.GetCols()); for (int i = 0, iSize = m_grid.GetSize(); i < iSize; i++) comp.GetAt(i)->Pin::operator=( *m_grid.GetAtConst(i) ); // Copy pin labels comp.AllocatePins( GetNumTruePins() ); for (size_t i = 0, iSize = GetNumPins(); i < iSize; i++) { comp.SetPinLabel(i, GetPinLabel(i)); comp.SetPinAlign(i, GetPinAlign(i)); } // Copy shapes assert( comp.GetNumShapes() == 0 ); for (const auto& mapObj : m_mapShapes) comp.AddOne(mapObj.second); #ifdef _TEST_SOIC if ( comp.GetIsSOIC() ) return comp.SetupOccupanciesSOIC(); // Setup hole use, and SOIC info #endif return comp.SetupOccupanciesTH(); // Setup hole use, and SOIC info } void CompDefiner::MoveCurrentShape(double dDown, double dRight) { Shape& s = GetCurrentShape(); double dCentreCol(0), dCentreRow(0); GetGridCentre(dCentreRow, dCentreCol); // Footprint centre w.r.t. screen const double dNewCX = dCentreCol + s.GetCX() + dRight; // New shape centre w.r.t. screen grid const double dNewCY = dCentreRow + s.GetCY() + dDown; // New shape centre w.r.t. screen grid if ( ( dNewCX > -0.5 && dNewCX < GetScreenCols() -0.5 ) && ( dNewCY > -0.5 && dNewCY < GetScreenRows() -0.5 ) ) s.Move(dDown, dRight); } // Helpers int CompDefiner::CopyShape() { assert( GetCurrentShapeId() != BAD_ID ); const Shape& s = GetCurrentShape(); const int iNewShapeId = AddShape( s ); assert( iNewShapeId != BAD_ID ); SetCurrentShapeId( iNewShapeId ); MoveCurrentShape(1.0, 1.0); // Apply offset so not overlaying old shape return GetCurrentShapeId(); } int CompDefiner::DestroyShape() { assert( GetCurrentShapeId() != BAD_ID ); for (auto iter = m_mapShapes.begin(); iter != m_mapShapes.end(); ++iter) if ( iter->first == GetCurrentShapeId() ) { m_mapShapes.erase(iter); break; } SetCurrentShapeId( BAD_ID ); return GetCurrentShapeId(); } int CompDefiner::GetNewShapeId() const { int shapeId(0); while ( shapeId != INT_MAX ) { bool bExists(false); for (auto iter = m_mapShapes.begin(); iter != m_mapShapes.end() && !bExists; ++iter) bExists = ( iter->first == shapeId ); if ( !bExists ) break; shapeId++; } return ( shapeId == INT_MAX ) ? BAD_ID : shapeId; } bool CompDefiner::SetWidth(int i) { assert( i > 0 ); const bool bChanged = m_grid.GetCols() != i; if ( bChanged ) { SetCurrentPinId(BAD_ID); SetCurrentShapeId(BAD_ID); m_grid.Allocate(1, m_grid.GetRows(), i); m_grid.Clear( Pin(BAD_PINCHAR, SURFACE_FULL, HOLE_FREE) ); m_mapShapes.clear(); SetAllowFlyWire(false); AddRect(); // Provide a Rect by default } return bChanged; } bool CompDefiner::SetHeight(int i) { assert( i > 0 ); const bool bChanged = m_grid.GetRows() != i; if ( bChanged ) { SetCurrentPinId(BAD_ID); SetCurrentShapeId(BAD_ID); m_grid.Allocate(1, i, m_grid.GetCols()); m_grid.Clear( Pin(BAD_PINCHAR, SURFACE_FULL, HOLE_FREE) ); m_mapShapes.clear(); SetAllowFlyWire(false); AddRect(); // Provide a Rect by default } return bChanged; } int CompDefiner::GetPinId(int row, int col) const // Pick the most relevant pin at the location { const int iRow = row - GetGridRowMin(); const int iCol = col - GetGridColMin(); const bool bOK = iRow >= 0 && iRow < m_grid.GetRows() && iCol >= 0 && iCol < m_grid.GetCols(); return ( bOK ) ? iCol + iRow * m_grid.GetCols() : BAD_ID; } int CompDefiner::GetShapeId(double dRowIn, double dColIn) const // Pick the most relevant shape at the location { double dCentreRow(0), dCentreCol(0); GetGridCentre(dCentreRow, dCentreCol); // Footprint centre w.r.t. screen const double dRow(dRowIn - dCentreRow); // w.r.t. footprint centre const double dCol(dColIn - dCentreCol); // w.r.t. footprint centre const double epsilon(0.1); int iBestId(BAD_ID); double dMinArea(INT_MAX); for (const auto& mapObj : m_mapShapes) { const Shape& s = mapObj.second; const double DX = s.GetDX(); const double DY = s.GetDY(); const double CX = s.GetCX(); const double CY = s.GetCY(); const double dA3 = s.GetA3() * RADIANS_PER_DEGREE; // Convert to radians const double dCos = cos(dA3); const double dSin = sin(dA3); const double dX = dCol - CX; const double dY = dRow - CY; const double rx = dCos * dX - dSin * dY; // w.r.t. rotated axes at the shape centre const double ry = dSin * dX + dCos * dY; // w.r.t. rotated axes at the shape centre double dArea(INT_MAX); bool bOK(false); switch( s.GetType() ) { case SHAPE::RECT: case SHAPE::ROUNDED_RECT: dArea = fabs(DX*DY); // Area of the rectangle bOK = fabs(2.0*ry) <= ( ( DY <= 0.1 ) ? epsilon : DY ); bOK &= fabs(2.0*rx) <= ( ( DX <= 0.1 ) ? epsilon : DX ); break; case SHAPE::ELLIPSE: case SHAPE::ARC: case SHAPE::CHORD: { dArea = DBL_PI_4*DX*DY; // Area of the ellipse double epsilon(dArea < 0.1 ? 0.1 : 0); bOK = rx*DY*rx*DY + ry*DX*ry*DX <= 0.25*DX*DX*DY*DY + epsilon; break; } default: // SHAPE::LINE { assert(s.GetType() == SHAPE::LINE); // Check for distance within a narrow ellipse with foci at the endpoints // Get true X1,X2,Y1,Y2 locations w.r.t. footprint centre const double x1 = s.GetX1() - CX; const double x2 = s.GetX2() - CX; const double y1 = s.GetY1() - CY; const double y2 = s.GetY2() - CY; const double X1 = CX + dCos * x1 + dSin * y1; // w.r.t. footprint centre const double Y1 = CY - dSin * x1 + dCos * y1; // w.r.t. footprint centre const double X2 = CX + dCos * x2 + dSin * y2; // w.r.t. footprint centre const double Y2 = CY - dSin * x2 + dCos * y2; // w.r.t. footprint centre const double DX = fabs(X2 - X1); const double DY = fabs(Y2 - Y1); const double dx1 = dCol - X1; const double dy1 = dRow - Y1; const double dx2 = dCol - X2; const double dy2 = dRow - Y2; dArea = sqrt(DX*DX + DY*DY); // "Area" for line is actually length bOK = sqrt(dx1*dx1 + dy1*dy1) + sqrt(dx2*dx2 + dy2*dy2) < dArea + epsilon; break; } } if ( !bOK ) continue; if ( iBestId == BAD_ID || dArea <= dMinArea ) { iBestId = mapObj.first; dMinArea = dArea; } } return iBestId; } bool CompDefiner::GetIsValid(const TemplateManager& templateMgr) const { if ( StringHelper::IsEmptyStr(m_typeStr) ) return false; if ( StringHelper::IsEmptyStr(m_valueStr) ) return false; if ( StringHelper::HasSpaces(m_importStr) ) return false; // Import string must not have spaces Component comp; Build(templateMgr, comp); if ( comp.GetType() == COMP::CUSTOM ) { if ( CompTypes::GetTypeFromImportStr( templateMgr.GetImportStrCut(m_importStr) ) != COMP::INVALID ) return false; // Reserved string (e.g. TO92) // Following is copied from Board::Import() method. // List of package identifiers for footprints with variable numbers of pins/lengths. const int NUM_VARIABLE_PIN_PARTS = 13; const std::string strVar[NUM_VARIABLE_PIN_PARTS] = {"SIP", "DIP", "PADS", "SWITCH_ST_DIP", "SWITCH_ST", "SWITCH_DT", "STRIP_100MIL", "BLOCK_100MIL", "BLOCK_200MIL", "RESISTOR", "DIODE", "CAP_CERAMIC", "CAP_FILM"}; for (int i = 0; i < NUM_VARIABLE_PIN_PARTS; i++) { const std::string& strTmp = strVar[i]; // e.g. "SIP", "DIP, etc const auto L = strTmp.length(); if ( m_importStr.length() >= L && m_importStr.substr(0, L) == strTmp ) return false; } } if ( m_grid.GetSize() == 0 ) return false; // Should not be possible bool bOK(false); for (const auto& mapObj : m_mapShapes) if ( mapObj.second.GetDrawLine() && !mapObj.second.GetDrawFill() ) { bOK = true; break; } if ( !bOK ) return false; // Must have a shape with line and no fill (so it can't be faded out) // Pin indexes must be consecutive at start at 0 std::list pinIndexes; for (int i = 0, iSize = m_grid.GetSize(); i < iSize; i++) if ( m_grid.GetAtConst(i)->GetIsPin() ) pinIndexes.push_back( m_grid.GetAtConst(i)->GetPinIndex() ); pinIndexes.sort(); size_t iTest(0); for (const auto& pinIndex : pinIndexes) { if ( pinIndex != iTest ) return false; iTest++; } return true; } VeroRoute/Src/android-sources/res/drawable-hdpi/icon.png000644 001750 001750 00000001365 14206323065 023524 0ustar00alexalex000000 000000 ‰PNG  IHDRHHк$ pHYsФФ•+ЇIDAThэšПoг@ЧпйqъJ­”(!"H]Јњ0!дЅUY:Дb`ATHleщH'~,эРFG†.P‰T-CUuBbE!T UЌDEЋ:ql3Иi­ЈОцЮœ;ю3н)ёѓї›ЛwgПђ<n>-Лћ7Nл;здqn}8mGзЃP_пчHcМ!ё†4ЦТK`>г’ЪмBqr6 >ЌU_=+5.Х=”$ŒЬ'ђг 0жнНЅ–KЕщС›[(о}T№лwB/ŸќЄ42ŸИњ@ѕлХћ* јўДE‡Hn*NЮfƒн‰™ Bz ?­tvЉтщ6ЧpЦ6пTƒн­З5ЯЃЙGхлйЅŠCЄ—c+/J01“EЖжЊ+ЯK4r~,З =!uwo™&СHѕ љкТвoHcМ!Ќ1м>FApЩŽaGLу Ц9Цъб,:ТŽ˜4ЦвoPЏŠžхќ>ДП6œЪттFН^€t:]>ЊЈљ!эКЎ Ћ’ Ћ8ад-ЇlПЗнџk†бl7 ЫЉXЮ/ГљIS.хoыъ•‡ииЙuМ?іgуxр‚ЪЉэ”VsƒSУкXOу„]H\WЌYлЊiужЌэ^Ч CиХƒИЎ˜бЧЛў9”Œ>оы8aз‡Е1MI“ў\‚Iпг8aPз=Ый?ДП4уоу”išJЅ^/™I57ЄъъхЎ—{&qЮ№ІLћ'ЮЙxp4ЦТ;йЧижЂ]ш#Цъ;VDз#ьˆIcМ!ё†4ЦТУ•b9gШJЮX,ч YщСMХXЮВв#lŽсŒХrЮ•\ŽХrЮ•ž“ђ[џœ3є‘Џ-ЁHcМ!ё†4ЦТћ #чцз аЌIENDЎB`‚VeroRoute/libraries/gEDA/veroroute-clib.scm000644 001750 001750 00000001645 13515171161 021124 0ustar00alexalex000000 000000 ; -*-Scheme-*- ;;; ;;; Add component libraries for veroroute ;;; (define geda-sym-path (build-path geda-data-path "sym")) (for-each (lambda (dir) (if (list? dir) (component-library (build-path geda-sym-path (car dir)) (cadr dir)) (component-library (build-path geda-sym-path dir))) ) (reverse '( ; VeroRoute symbols ("veroroute_battery" "VeroRoute Battery") ("veroroute_bbd" "VeroRoute BBD") ("veroroute_connector" "VeroRoute Connector") ("veroroute_diode" "VeroRoute Diode") ("veroroute_electromechanical" "VeroRoute ElectroMechanical") ("veroroute_linear" "VeroRoute Linear") ("veroroute_logic" "VeroRoute Logic") ("veroroute_passive" "VeroRoute Passive") ("veroroute_regulator" "VeroRoute Regulator") ("veroroute_spin" "VeroRoute Spin") ("veroroute_transistor" "VeroRoute Transistor") ))) VeroRoute/libraries/gEDA/veroroute_passive/Capacitor_Electrolytic_200mil.sym000644 001750 001750 00000001417 13515171161 027504 0ustar00alexalex000000 000000 v 20130925 2 T 200 700 5 10 0 0 0 0 1 numslots=0 P 200 700 400 700 1 0 0 { T 350 750 5 8 1 1 0 6 1 pinnumber=1 T 350 750 5 8 0 0 0 6 1 pinseq=1 T 350 750 5 8 0 0 0 6 1 pinlabel=1 T 350 750 5 8 0 0 0 6 1 pintype=pas } P 1100 700 900 700 1 0 0 { T 950 750 5 8 1 1 0 0 1 pinnumber=2 T 950 750 5 8 0 0 0 0 1 pinseq=2 T 950 750 5 8 0 0 0 0 1 pinlabel=2 T 950 750 5 8 0 0 0 0 1 pintype=pas } L 600 900 600 500 3 0 0 0 -1 -1 L 900 700 700 700 3 0 0 0 -1 -1 L 600 700 400 700 3 0 0 0 -1 -1 A 1400 700 700 165 30 3 0 0 0 -1 -1 L 489 900 489 800 3 0 0 0 -1 -1 L 540 849 440 849 3 0 0 0 -1 -1 T 500 300 5 10 1 1 0 0 1 device=1u T 500 1000 8 10 1 1 0 0 1 refdes=C? T 500 700 8 10 0 0 0 0 1 footprint=CAP_ELECTRO_200 T 500 700 8 10 0 0 0 0 1 description=Electrolytic Capacitor (200 mil diameter) VeroRoute/libraries/gEDA/veroroute_linear/Comparator_LM339.sym000644 001750 001750 00000002651 13515171161 024531 0ustar00alexalex000000 000000 v 20130925 2 T 900 1725 5 8 0 0 0 0 1 numslots=4 T 900 1100 5 8 0 0 0 0 1 slot=1 T 900 1600 5 8 0 0 0 0 1 slotdef=1:5,4,3,12,2 T 900 1475 5 8 0 0 0 0 1 slotdef=2:7,6,3,12,1 T 900 1350 5 8 0 0 0 0 1 slotdef=3:9,8,3,12,14 T 900 1225 5 8 0 0 0 0 1 slotdef=4:11,10,3,12,13 P 200 600 0 600 1 0 1 { T 50 625 5 8 1 1 0 0 1 pinnumber=5 T 50 625 5 8 0 0 0 0 1 pinseq=1 T 50 625 5 8 0 0 0 0 1 pinlabel=5 T 50 625 5 8 0 0 0 0 1 pintype=pas } P 200 200 0 200 1 0 1 { T 50 225 5 8 1 1 0 0 1 pinnumber=4 T 50 225 5 8 0 0 0 0 1 pinseq=2 T 50 225 5 8 0 0 0 0 1 pinlabel=4 T 50 225 5 8 0 0 0 0 1 pintype=pas } P 500 600 500 800 1 0 1 { T 550 675 5 8 1 1 0 0 1 pinnumber=3 T 550 675 5 8 0 0 0 0 1 pinseq=3 T 550 675 5 8 0 0 0 0 1 pinlabel=3 T 550 675 5 8 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 525 50 5 8 1 1 0 0 1 pinnumber=12 T 525 50 5 8 0 0 0 0 1 pinseq=4 T 525 50 5 8 0 0 0 0 1 pinlabel=12 T 525 50 5 8 0 0 0 0 1 pintype=pas } P 800 400 1000 400 1 0 1 { T 875 425 5 8 1 1 0 0 1 pinnumber=2 T 875 425 5 8 0 0 0 0 1 pinseq=5 T 875 425 5 8 0 0 0 0 1 pinlabel=2 T 875 425 5 8 0 0 0 0 1 pintype=pas } L 200 800 200 0 3 0 0 0 -1 -1 L 800 400 200 800 3 0 0 0 -1 -1 L 300 650 300 550 3 0 0 0 -1 -1 L 250 600 350 600 3 0 0 0 -1 -1 L 250 200 350 200 3 0 0 0 -1 -1 L 800 400 200 0 3 0 0 0 -1 -1 T 825 150 5 10 1 1 0 0 1 device=LM339 T 800 600 8 10 1 1 0 0 1 refdes=U? T 800 800 8 10 0 0 0 0 1 footprint=DIP14 T 800 800 8 10 0 0 0 0 1 description=Quad Comparator VeroRoute/libraries/gEDA/veroroute_transistor/PNP_2N5086.sym000644 001750 001750 00000001563 13515171161 024051 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=3 T 400 850 5 6 0 0 0 0 1 pinseq=3 T 400 850 5 6 0 0 0 0 1 pinlabel=3 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=1 T 400 50 5 6 0 0 0 0 1 pinseq=1 T 400 50 5 6 0 0 0 0 1 pinlabel=1 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 297,341 L 199,350 L 269,277 L 275,310 z T 600 700 5 10 1 1 0 0 1 device=2N5086 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=PNP Transistor VeroRoute/examples/pcb.vrt000644 001750 001750 00000211770 14002640525 016061 0ustar00alexalex000000 000000 +z18V Electric Mistress with Reworked LFO & VCO This is an improved version of the classic 18V Electro-Harmonix Electric Mistress flanger used by David Gilmour and Andy Summers. I reworked the VCO and LFO so that the circuit has the same sound and control behaviour as the original but without all the problems. In particular it is much less noisy and does not have the volume drop when engaged. The layout also takes up about a quarter of the space. A detailed explanation of the changes can be found at: http://www.diystompboxes.com/smfforum/index.php?topic=119933 џџџџџџџџ\22< џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџаџџџџџџџџџџБџџџџџџџџџџQџџџџџџџџџџБџџџџџџџџџџQџџџџџџџџџџ‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ.џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџ 18џџџџџџ Aџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ P>џџџџџ ‘>џџџџџ 1>џџџџџ a>џџџџџ >џџџџџ  >џџџџџ Р>џџџџџ N>џџџџџџџџџџџџџџџ 4џџџџџ 14џџџџџ 24џџџџџ P4џџџџџ Б4џџџџџ Q4џџџџџ ‘4џџџџџџџџџџџџџџџџ џџџџџџџџџ :џџџџџџ џџџџџџџџџџ 1џџџџџџџџџ A8џџџџџџ FџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџLџџџџџџџџџџџџџџџџџџџџџџџџџџџџџVџџџџџџ“џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ„џџџџџџџџџџPџџџџџџџџџџБџџџџџџџџџџaџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџNџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџ ' :џџџџџџ џџџџџџџџџџџџџџџџџџџFGџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџ@+џџџџџџLџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџHџџџџџџџџџџџџџџџџџџџџŒџџџџџџџџџ@+џџџџџџVџџџџџџџџџџ“џџџџџџџџџџ1џџџџџџџџџџAџџџџџџџџџџdџџџџџџџџџџџџџџџџџџџ#@.џџџџџџџџџџџџџџџџџџџџџџџџџ'b6џџџџџџџџџџџџџџџџDџџџџџџџџџD6џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Ф>џџџџџ +@>џџџџџ >џџџџџ >џџџџџ Р>џџџџџ @>џџџџџ d>џџџџџ >џџџџџџџџџџџџџџџ 4џџџџџ  4џџџџџ -@4џџџџџ @4џџџџџ 4џџџџџ T4џџџџџ ƒ4џџџџџџ#dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ';џџџџџ '5џџџџџ Ф5џџџџџ D5џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ8 џџџџџџEџџџџџџџџџџ+Dџџџџџџџџџ)@ џџџџџџXџџџџџџџџџџ…џџџџџџџџџџDџџџџџџџџџџ4џџџџџџџџџcџџџџџ.3џџџџџ.Aџџџџџ.Bџџџџџџ-DџџџџџџџџџџdџџџџџџџџџџџџџџџџџџџџЬџџџџџџџџџ$@Bџџџџџ #/џџџџџ #/џџџџџ "@/џџџџџџџџџџџџџџџџ Xџџџџџџџџџџ …џџџџџџџџџ7џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџFџџџџџџџџџџ+Dџџџџџџџџџџ)dџџџџџџџџџ  ?џџџџџ )Р?џџџџџ ?џџџџџџџџџџџџџџџџ6џџџџџџџџџџSџџџџџџџџџџБџџџџџџџџџ A@џџџџџџ-DџџџџџџџџџџTџџџџџџџџџ ›@џџџџџ2џџџџџџ$Фџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ"„џџџџџџџџџџџџџџџџџџџ L9џџџџџ  9џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ /`џџџџџџџџџџџџџџџ Dџџџџџџ +Dџџџџџџџџџ )Tџџџџџџ)›џџџџџџџџџџ)џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџNџџџџџџџџџџџџџџџџџџџ @џџџџџџ-ФџџџџџџџџџџLџџџџџџџџџ $@џџџџџ$2џџџџџ $0џџџџџ %@0џџџџџ "0џџџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџџ џџџџџџџџџџBџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ /4џџџџџџ/cџџџџџџџџџYџџџџџџ+Dџџџџџџџџџџ)Lџџџџџџџџџџџџџџџџџџџ@Yџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџd3џџџџџ-Aџџџџџ -@џџџџџџ-џџџџџџџџџџфџџџџџџџџџ ,@џџџџџ,1Cџџџџџџ,Aџџџџџџџџџџ%Dџџџџџџџџџ(џџџџџ1#џџџџџџAџџџџџџџџџџDџџџџџџџџџ@#џџџџџD7џџџџџџџџџџџџџџџџџџџџџџџџџ  џџџџџџ/6џџџџџџџџџ /Cџџџџџџ +dџџџџџџџџџ )џџџџџџџџџџџџџџџџDџџџџџџџџџ @џџџџџџ џџџџџџџџџ „џџџџџџ4џџџџџџџџџџSџџџџџџџџџ @џџџџџџXџџџџџџџџџџ•џџџџџџџџџ @џџџџџCџџџџџџ,Fџџџџџџџџџџ%Dџџџџџџџџџџџџџџџџџџџ@WџџџџџџFџџџџџџџџџWџџџџџDOџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџBџџџџџџџџџџ/&џџџџџџџџџџ+џџџџџџџџџџ+3џџџџџџџџџџ+AџџџџџџџџџdFџџџџџџџџџџџHџџџџџџџџџџџџџџџџџџџџџџџџџџџџџN,џџџџџџџџџџџџџџџџlџџџџџџџџџ!,џџџџџ!-џџџџџџџџџџџџџџџџ,Dџџџџџџџџџ%D-џџџџџџџџџџџџџџџ џџџџџ џџџџџ *@џџџџџ џџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@ џџџџџџDџџџџџџџџџџџџџџџџџџџ/ џџџџџ@]џџџџџџ+fџџџџџџџџџџ4џџџџџџџџџџCџџџџџџџџџџDџџџџџџџџџ@]џџџџџ@џџџџџџDџџџџџџџџџџџџџџџџџџџTџџџџџџ“џџџџџџџџџџ!џџџџџџџџџџџџџџџџџџџџ,Dџџџџџџџџџџ%Dџџџџџџџџџ((џџџџџ(Xџџџџџџџџџџџџџџџџ*„џџџџџџџџџ(€XџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџ Dџџџџџџџџџ џџџџџџџџџџџФџџџџџџџџџџ+Tџџџџџџџџџ+ƒџџџџџџЦџџџџџџџџџ џџџџџ џџџџџ џџџџџDVџџџџџџџџџџџџџџџџLџџџџџџџџџ@VџџџџџџџџџџџџџџџџBџџџџџџџџџ,Kџџџџџ%1џџџџџ*0!џџџџџџ*Qџџџџџџџџџџ*‰џџџџџџџџџџ(Hџџџџџџџџџџџџџџџџџџџ„*џџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџ Dџџџџџџџџџ џџџџџ9џџџџџџEџџџџџџџџџџ+LџџџџџџџџџXџџџџџ …Iџџџџџџ џџџџџџџџџ  @IџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџdџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ *Nџџџџџ @џџџџџ (Dџџџџџ Hџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ <џџџџџџ Фџџџџџџџџџ &<џџџџџ&=џџџџџџFџџџџџџџџџџ+DџџџџџџџџџL=џџџџџ@\џџџџџџџџџџџџџџџџ dџџџџџџџџџџџџџџџџџџџ\џџџџџџџџџџџџџџџџDџџџџџџџџџ  џџџџџ @ џџџџџ T џџџџџџГџџџџџџџџџџAџџџџџџџџџџџџџџџџџџџ* џџџџџџФџџџџџџџџџџ(Dџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ 8џџџџџџ Eџџџџџџџџџ џџџџџџџџџџџФџџџџџџџџџџ+DџџџџџџџџџџџџџџџФџџџџџџџџџџџџџџџџџџџ 4џџџџџџ cџџџџџџџџџџџџџџџџџџџ@џџџџџџDџџџџџџџџџџџџџџџџџџџџ„џџџџџџџџџџLџџџџџџџџџ0@Kџџџџџ1џџџџџ@!џџџџџX%џџџџџџ…џџџџџџџџџџ(Dџџџџџџџџџ@%џџџџџ@*џџџџџџџџџџџџџџџџџџџџџџџџџ @ џџџџџџ Fџџџџџџџџџ  ` џџџџџџџџџџџџџџџџџџџџџ+Dџџџџџџџџџџџџџџ џџџџџ  Pџџџџџ  џџџџџ  џџџџџ џџџџџџDџџџџџџџџџџDџџџџџџџџџhџџџџџџџџџџџџџџџD"џџџџџџ0Dџџџџџџџџџџџџџџџџџџџ„"џџџџџЬJџџџџџџџџџџџџџџџџ(DџџџџџџџџџDJџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџDџџџџџџџџџџ џџџџџџџџџ џџџџџ Zџџџџџџ+Dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Zџџџџџџџџџџџџџџџџ џџџџџџџџџ џџџџџџDџџџџџџџџџџDџџџџџџџџџ4џџџџџџCџџџџџџџџџџDџџџџџџџџџџ0DџџџџџџџџџџHџџџџџџџџџџXџџџџџџџџџџ…џџџџџџџџџџџџџџџџџџџџ(DџџџџџџџџџPџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџ Pџџџџџ [џџџџџџ+dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ @[џџџџџџ HџџџџџџџџџџџџџџџџџџџРџџџџџџDџџџџџџџџџџDџџџџџџџџџ @џџџџџ Hџџџџџ Hџџџџџџ0DџџџџџџџџџџDџџџџџџџџџ  &џџџџџ &џџџџџ 'џџџџџ (D'џџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџ Lџџџџџџџџџџџџџџџџ+Tџџџџџџџџџ+“џџџџџ +џџџџџ  џџџџџ  Dџџџџџ 8џџџџџџeџџџџџџџџџ џџџџџџ Фџџџџџџџџџ  Dџџџџџџџџџџџџџџџџџџџџџџџџџџ0DџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ(DџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџNџџџџџџџџџџџџџџџ   џџџџџџ џџџџџџџџџ +  џџџџџMџџџџџ Dџџџџџџ џџџџџџџџџ  DџџџџџџџџџџџџџџџLџџџџџџџџџџџџџџџEџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџ0Sџџџџџ)џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ(Rџџџџџ Qџџџџџ$џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ\ џ  X C347nCFilmCAP_FILMWF(1 2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџџ,R164k7RResistorRESISTOR WF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R5470RRResistorRESISTORWF(1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R12M2RResistorRESISTOR EF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R131MRResistorRESISTOREF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   LQ1 2N5088QTO92TO92 EF(123Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џџ,R3100kRResistorRESISTOR WF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R14470kRResistorRESISTORWF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R25k6RResistorRESISTOR WF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ, R910kRResistorRESISTOREF()12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  X C41nCFilmCAP_FILMEF(+1 2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџџ, R1010kRResistorRESISTOR EF(/12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  XC11100nCFilmCAP_FILMEF(12Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДP џ  XC1100nCFilmCAP_FILM WF(1 2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДP   А RT3 20k-BRTVerticalTRIM_VERTWF(123Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§    џџџџџџџџ    @IC1 TL072ICDIPDIPWF(+1 2 34 5 6 78П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€   џџ,R7100kRResistorRESISTOR EF(1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  XC12100nCFilmCAP_FILM WF(12Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџџ,R66k8RResistorRESISTORWF( 1+2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R1510kRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R44k7RResistorRESISTOREF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  XC647nCFilmCAP_FILM WF(/1)2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPdOutOutPadPadPAD џџџєNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdInInPadPadPADNF( 1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџџШ[ Wire8 Wire8WireWireWF( 1 2Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџџ,D1 1N4001D Diode DIODE WF(1!2Пўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfD?ё™™™™™™?ё™™™™™™Пй™™™™™š?й™™™™™š@V€џfD?ђffffff?ђffffffПй™™™™™š?й™™™™™š@V€џfD?§™™™™™™?§™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfDџџџШZ Wire7 Wire7WireWireWF( 1 2Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџџџџџџШ+ Wire1 Wire1WireWireWF(12Р @ ПЙ™™™™™š?Й™™™™™š@V€пџџР @ ПЙ™™™™™š?Й™™™™™š@V€пџџџџџШY Wire6 Wire6WireWire WF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџџ,*R2439kRResistorRESISTOR SF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџШX Wire5 Wire5WireWire WF(((1((2Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџџџ,AR29220RRResistorRESISTOR SF(-1.2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   'C1510uC(Electrolytic 200 milCAP_ELECTRO_200EF((12П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџџШV Wire3 Wire3WireWire WF(12Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџџџ,(R2127kRResistorRESISTOR SF((12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џШW Wire4 Wire4WireWire WF(12П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџџџ,"R195k6RResistorRESISTOREF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,-R253k3RResistorRESISTOR EF(%1!2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџџШ\ Wire9 Wire9WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџџ,!R1810kRResistorRESISTOR NF(*12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§    џџџџџџџџ    @IC3 TL062ICDIPDIP EF(1*234*56(78П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€   џџ, R1718kRResistorRESISTOREF(1*2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџџџШ] Wire10 Wire10WireWire WF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџ   &C1410uC(Electrolytic 200 milCAP_ELECTRO_200WF(12П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџџ,%R2210kRResistorRESISTORWF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,#R2039kRResistorRESISTOR EF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  XIC22n7CFilmCAP_FILMWF(1 2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџџ,JR2333kRResistorRESISTORWF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,KR30220kRResistorRESISTOR SF(01,2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dS Range2 Range2PadPadPADNF(01ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпd$SW1SW1PadPadPADNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdRSW3SW3PadPadPADNF((1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdN Color3 Color3PadPadPADNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdO Rate2 Rate2PadPadPAD џџџєNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdP Rate3 Rate3PadPadPADџџџєNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdQSW2/Range3SW2/Range3PadPadPAD$NF( 1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп   HC1310uC(Electrolytic 200 milCAP_ELECTRO_200WF(12П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџџ,R11470RRResistorRESISTORWF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџџџBD2 1N4148D Diode DIODE EF($1.2Р333333@333333Пй™™™™™š?й™™™™™š@V€џfD@ЬЬЬЬЬЬ@ЬЬЬЬЬЬПй™™™™™š?й™™™™™š@V€џfD@333333@333333Пй™™™™™š?й™™™™™š@V€џfD@ЬЬЬЬЬЭ@ЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џfDР333333@333333Пй™™™™™š?й™™™™™š@V€џfD џ  XDC84n7CFilmCAP_FILMWF(1 2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДP џ  XC547nCFilmCAP_FILM WF(12Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPdEG_InGndPadPadPADNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdF G_OutGndPadPadPAD  NF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdGGndGndPadPadPADNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпєCC17100nCCeramicCAP_CERAMIC NF(,12ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ Pџџ,R813kRResistorRESISTOR EF(+12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  XC947nCFilmCAP_FILMEF(12Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPd) Range1 Range1PadPadPADNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdM Color2 Color2PadPadPADNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ6D3 1N4001D Diode DIODEEF(1'2Пўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfD?ё™™™™™™?ё™™™™™™Пй™™™™™š?й™™™™™š@V€џfD?ђffffff?ђffffffПй™™™™™š?й™™™™™š@V€џfD?§™™™™™™?§™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfDє2C16470pCCeramicCAP_CERAMICSF($12ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ Pџџ,.R272k7RResistorRESISTORSF(#12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   А/RT4 10k-BRTVerticalTRIM_VERTWF(#1#2"3Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§   L0Q2 2N5087QTO92TO92EF("1%2$3Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џџ,1R2622kRResistorRESISTOR SF(1%2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   L5U1 78L12QTO92TO92EF(12'3Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   dL Color1 Color1PadPadPAD NF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,3R2810kRResistorRESISTOR NF(.12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§       џџџџџџџџџџџџџџ       @4IC5 CD4013ICDIPDIP WF(12-3456789101121211314Р ЬЬЬЬЬЭ@ ЬЬЬЬЬЭП§™™™™™š?§™™™™™š@V€   Р ЬЬЬЬЬЭР ЬЬЬЬЬЭП§™™™™™šПа@V€   Р ЬЬЬЬЬЭР ЬЬЬЬЬЭ?а?§™™™™™š@V€   Р ЬЬЬЬЬЭ@ ЬЬЬЬЬЭ?§™™™™™š?§™™™™™š@V€   @ ЬЬЬЬЬЭР ЬЬЬЬЬЭП§™™™™™šП§™™™™™š@V€   @ ЬЬЬЬЬЭ@ ЬЬЬЬЬЭ?§™™™™™šП§™™™™™š@V€   Р ЬЬЬЬЬЭРЬЬЬЬЬЭПа?аРV€@V€       џџџџџџџџ    @@IC4 LM311ICDIPDIP SF(1,2$3456-78П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€    џџџџџџџџШ Wire11 Wire11WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџџ,7R3147RRResistorRESISTORSF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d;18V18VPadPadPAD џџџќNF('1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп   А?RT11k-BRTVerticalTRIM_VERTEF(1)23Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§   АRT2 10k-BRTVerticalTRIM_VERTNF(/1/23Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§        џџџџџџџџџџџџџџџџ        @>IC2SAD1024ICDIPDIPWF(1+2345678910111213141516РЬЬЬЬЬЭ@ЬЬЬЬЬЭП§™™™™™š?§™™™™™š@V€   РЬЬЬЬЬЭРЬЬЬЬЬЭП§™™™™™šПа@V€   РЬЬЬЬЬЭРЬЬЬЬЬЭ?а?§™™™™™š@V€   РЬЬЬЬЬЭ@ЬЬЬЬЬЭ?§™™™™™š?§™™™™™š@V€   @ЬЬЬЬЬЭРЬЬЬЬЬЭП§™™™™™šП§™™™™™š@V€   @ЬЬЬЬЬЭ@ЬЬЬЬЬЭ?§™™™™™šП§™™™™™š@V€   РffffffР ЬЬЬЬЬЭПа?аРV€@V€    џ  XC73n3CFilmCAP_FILMWF(1)2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџџ,=R12470RRResistorRESISTORWF(&12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  X<C1047nCFilmCAP_FILMEF(&12Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџ џ   џ џ „:C18220uC(Electrolytic 250 milCAP_ELECTRO_250SF('12Пє?єПє?є@V€ŠŠф?юИQы…И?юИQы…ИПщ™™™™™š?щ™™™™™š@V€ŠŠфПє?єПє?є@V€ŠŠфџ џ   џ џ „9C20100uC(Electrolytic 250 milCAP_ELECTRO_250EF(12Пє?єПє?є@V€ŠŠф?юИQы…И?юИQы…ИПщ™™™™™š?щ™™™™™š@V€ŠŠфПє?єПє?є@V€ŠŠфџ џ   џ џ „8C19100uC(Electrolytic 250 milCAP_ELECTRO_250NF(12Пє?єПє?є@V€ŠŠф?юИQы…И?юИQы…ИПщ™™™™™š?щ™™™™™š@V€ŠŠфПє?єПє?є@V€ŠŠфB@џџџўINVALID TracksWF(џџџ€џџџ€џџџ€џџџ€џџџџџџџџF#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Р@Р@@V€џVeroRoute/libraries/TinyCAD/VeroRoute_BBD.TCLib000644 001750 001750 00000074000 13515171160 021424 0ustar00alexalex000000 000000 SQLite format 3@ ћћ.!%%‚tableSymbolSymbolCREATE TABLE [Symbol] ([SymbolID] INTEGER PRIMARY KEY,[Data] TEXT)ƒ8!†9tableNameNameCREATE TABLE [Name] ([NameID] INTEGER PRIMARY KEY,[Name] TEXT,[SymbolID] INTEGER,[Type] INTEGER,[Reference] TEXT,[ppp] INTEGER,[Description] TEXT,[ShowName] INTEGER,[ShowRef] INTEGER,[DefRotate] INTEGE 8˜0ѓЖw:§О8G )USAD1024 U?Dual 512-Stage BDD; %AMN3209 U?256-Stage BDD= %EMN3207U?1024-Stage BDD; %AMN3206U?128-Stage BDD; %AMN3204U?512-Stage BDD= %EMN3007U?1024-Stage BDD; %AMN3009U?256-Stage BDD; %AMN3006U?128-Stage BDDf %MN3101U?Clock driver for MN3000 series BBDf %MN3102U?Clock driver for MN3200 series BBD гћіёьчтниг0šd -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND CP1 OX3 VGG VDD CP2 OX1 OX2 length='20' number_pos='0' centre_name='0'>CP1 OX3 VGG VDD CP2 OX1 OX2 EE0šd -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND CP1 IN VGG VDD CP2 OUT1 OUT2 DD1šf -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND CP1 IN VGG VDD CP2 OUT1 OUT2 DD1šf -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND CP1 IN VGG VDD CP2 OUT1 OUT2 DD1šf -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND CP1 IN VGG VDD CP2 OUT1 OUT2 DD1šf -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND CP1 IN VGG VDD CP2 OUT1 OUT2 DD1šf -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND CP1 IN VGG VDD CP2 OUT1 OUT2 DD1šf -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND CP1 IN VGG VDD CP2 OUT1 OUT2 DD1 šf -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND IN VBB VDD CP2 OUT OUT* NC NC NC CP1 IN CP2 OUT OUT* ­­–D ­ -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND CP1 . */ #include "CompTypes.h" std::map CompTypes::sm_mapCompTypeToTypeStr; // Mapping of COMP enum to Type strings std::map CompTypes::sm_mapCompTypeToImportStr; // Import mapping of COMP enum to strings std::list CompTypes::sm_listCompTypes; // Ordered by appearance in GUI VeroRoute/Src/images/pineditor.png000644 001750 001750 00000001243 14214056043 017432 0ustar00alexalex000000 000000 ‰PNG  IHDR szzєsRGBЎЮщgAMAБ ќa pHYsУУЧoЈd8IDATXGЭ–MKœ1…3Ђ "b§G …™ХкEў нЛгрвћўŒB72eV2t!Ј]шbzNš›Йя›It>p’›Iо{n’љъ˜JЦР…рТйBSУ”4 ыЌa,L/жхђ5"УсаЦƒЫ•ёјЧ–ЬэBd‘MВ &HœhЎr4€Ййы/™_зэјЫёЛЯа5єТAЭй)еb]v.НФœƒ6ЙpŽ&ВѓщwђGяœН…АЛgг(`цлw5—Б\ N@‘4gЁїђ>tSbюоkl|LЄv5Зnы.Ё;ЎЇƒ‹ИЊ0яC Ќ‘KЪP ˆЌiPaЮ\ўK+vic~Cча)“юЦ|•ykжк]ВЎsЁFІзые˜3Џ}žiф:Ѕц-ОA?+Ь?@ @ЃˆмЇ ХWЈЦќ$цЕ'РoЏћ ѓ.tЫ@б8šцЁ—Ъ;ёъ+˜…y@iGl ЭWэD!ЅWР_Вѓа ƒ Э+`УУŠ36цќ Ў2gl›Ь),@ЯМ{"ДЭuТ)Ф ЊшњЮ@Ў€аМs0љt1Ё&SLP€‡Аs"Ыаф_ЧIш5IЙ\mrsџgи)й?ЏQФ$77СMЦtэиЇ РZЯ™ q‹До‚ЯSd.ЬЈџ|Ю<ѕnЕO%оЬЩg@`DяЬЇ"›LN‚ ьИїhжœe–BH.ŸZ6еXЈоš.ІMЉщ;Ҙ+Wo‹›уиІIENDЎB`‚VeroRoute/libraries/gEDA/veroroute_electromechanical/Switch_DIP_3PST.sym000644 001750 001750 00000002540 13515171160 026525 0ustar00alexalex000000 000000 v 20130925 2 T 300 1000 8 10 0 0 0 0 1 numslots=0 P 600 1500 900 1500 1 0 1 { T 750 1550 5 10 1 1 0 0 1 pinnumber=1 T 750 1550 5 10 0 0 0 0 1 pinseq=1 T 750 1550 5 10 0 0 0 0 1 pinlabel=1 T 750 1550 5 10 0 0 0 0 1 pintype=pas } P 600 1000 900 1000 1 0 1 { T 750 1050 5 10 1 1 0 0 1 pinnumber=2 T 750 1050 5 10 0 0 0 0 1 pinseq=2 T 750 1050 5 10 0 0 0 0 1 pinlabel=2 T 750 1050 5 10 0 0 0 0 1 pintype=pas } P 600 500 900 500 1 0 1 { T 750 550 5 10 1 1 0 0 1 pinnumber=3 T 750 550 5 10 0 0 0 0 1 pinseq=3 T 750 550 5 10 0 0 0 0 1 pinlabel=3 T 750 550 5 10 0 0 0 0 1 pintype=pas } P 300 1500 0 1500 1 0 1 { T 150 1550 5 10 1 1 0 0 1 pinnumber=4 T 150 1550 5 10 0 0 0 0 1 pinseq=4 T 150 1550 5 10 0 0 0 0 1 pinlabel=4 T 150 1550 5 10 0 0 0 0 1 pintype=pas } P 300 1000 0 1000 1 0 1 { T 150 1050 5 10 1 1 0 0 1 pinnumber=5 T 150 1050 5 10 0 0 0 0 1 pinseq=5 T 150 1050 5 10 0 0 0 0 1 pinlabel=5 T 150 1050 5 10 0 0 0 0 1 pintype=pas } P 300 500 0 500 1 0 1 { T 150 550 5 10 1 1 0 0 1 pinnumber=6 T 150 550 5 10 0 0 0 0 1 pinseq=6 T 150 550 5 10 0 0 0 0 1 pinlabel=6 T 150 550 5 10 0 0 0 0 1 pintype=pas } L 300 1500 600 1700 3 0 0 0 -1 -1 L 300 1000 600 1200 3 0 0 0 -1 -1 L 300 500 600 700 3 0 0 0 -1 -1 T 200 0 5 10 1 1 0 0 1 device=Name T 300 200 8 10 1 1 0 0 1 refdes=S? T 495 493 8 10 0 0 0 0 1 footprint=SWITCH_ST_DIP6 T 495 493 8 10 0 0 0 0 1 description=Onboard DIP-Switch VeroRoute/Src/aliasdialog.ui000644 001750 001750 00000005444 14411337463 016310 0ustar00alexalex000000 000000 AliasDialog 0 0 720 510 720 510 720 510 Part Aliases used for Netlist Import 10 10 701 221 0 0 Qt::NoFocus 10 260 701 211 0 0 Qt::NoFocus 10 480 221 26 Re-Import 250 480 221 26 Delete Alias 490 480 221 26 Delete All Aliases 10 232 701 27 Enter a valid Import String for each Alias in the list below Qt::AlignCenter VeroRoute/Src/renderingdialog.cpp000644 001750 001750 00000021774 14560424162 017343 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #include "renderingdialog.h" #include "ui_renderingdialog.h" #include "mainwindow.h" RenderingDialog::RenderingDialog(QWidget* parent) : QWidget(parent) , ui(new Ui_RenderingDialog) , m_pMainWindow(nullptr) { ui->setupUi( reinterpret_cast(this) ); ui->antiAliasOn->setChecked(true); } RenderingDialog::~RenderingDialog() { delete ui; } void RenderingDialog::SetMainWindow(MainWindow* p) { m_pMainWindow = p; QObject::connect(ui->antiAliasOff, SIGNAL(toggled(bool)), m_pMainWindow, SLOT(SetAntialiasOff(bool))); QObject::connect(ui->antiAliasOn, SIGNAL(toggled(bool)), m_pMainWindow, SLOT(SetAntialiasOn(bool))); QObject::connect(ui->spinBox_bright, SIGNAL(valueChanged(int)), m_pMainWindow, SLOT(SetBrightness(int))); QObject::connect(ui->shade, SIGNAL(toggled(bool)), m_pMainWindow, SLOT(SetShowTarget(bool))); QObject::connect(ui->comptext, SIGNAL(valueChanged(int)), m_pMainWindow, SLOT(SetTextSizeComp(int))); QObject::connect(ui->comppins, SIGNAL(valueChanged(int)), m_pMainWindow, SLOT(SetTextSizePins(int))); QObject::connect(ui->spinBox_height, SIGNAL(valueChanged(int)), m_pMainWindow, SLOT(SetTargetRows(int))); QObject::connect(ui->spinBox_width, SIGNAL(valueChanged(int)), m_pMainWindow, SLOT(SetTargetCols(int))); QObject::connect(ui->padWidth, SIGNAL(valueChanged(int)), m_pMainWindow, SLOT(SetPadWidth(int))); QObject::connect(ui->trackWidth, SIGNAL(valueChanged(int)), m_pMainWindow, SLOT(SetTrackWidth(int))); QObject::connect(ui->tagWidth, SIGNAL(valueChanged(int)), m_pMainWindow, SLOT(SetTagWidth(int))); QObject::connect(ui->holeWidth, SIGNAL(valueChanged(int)), m_pMainWindow, SLOT(SetHoleWidth(int))); QObject::connect(ui->gapWidth, SIGNAL(valueChanged(int)), m_pMainWindow, SLOT(SetGapWidth(int))); QObject::connect(ui->maskWidth, SIGNAL(valueChanged(int)), m_pMainWindow, SLOT(SetMaskWidth(int))); QObject::connect(ui->silkWidth, SIGNAL(valueChanged(int)), m_pMainWindow, SLOT(SetSilkWidth(int))); QObject::connect(ui->edgeWidth, SIGNAL(valueChanged(int)), m_pMainWindow, SLOT(SetEdgeWidth(int))); QObject::connect(ui->fillWidth, SIGNAL(valueChanged(int)), m_pMainWindow, SLOT(SetFillWidth(int))); QObject::connect(ui->viapadWidth, SIGNAL(valueChanged(int)), m_pMainWindow, SLOT(SetViaPadWidth(int))); QObject::connect(ui->viaholeWidth, SIGNAL(valueChanged(int)), m_pMainWindow, SLOT(SetViaHoleWidth(int))); QObject::connect(ui->Xthermals, SIGNAL(toggled(bool)), m_pMainWindow, SLOT(SetXthermals(bool))); QObject::connect(ui->closeTracks, SIGNAL(toggled(bool)), m_pMainWindow, SLOT(SetShowCloseTracks(bool))); } void RenderingDialog::UpdateControls() { Board& board = m_pMainWindow->m_board; double minTrk(0), minGnd(0); board.GetSeparations(minTrk, minGnd); // Put be called first since it may clear the warning points const bool bCompEdit = board.GetCompEdit(); const bool bPCB = board.GetTrackMode() == TRACKMODE::PCB; const bool bMonoPCB = board.GetTrackMode() == TRACKMODE::MONO || bPCB; const bool bNoTrackOptions = board.GetTrackMode() == TRACKMODE::OFF; const bool bVero = board.GetVeroTracks(); const bool bVias = board.GetViasEnabled(); const bool bCloseTrackInfo = board.GetHaveWarnPoints(); const bool bGroundFill = !bVero && bMonoPCB && board.GetGroundFill(); const bool bTags = !bCompEdit && !bNoTrackOptions && bGroundFill; const int ii = board.GetBackgroundColor().GetR(); // Before VeroRoute V2.20, "Brightness" was stored as a grey level in the range [200,255]. const int i = 5 * ( ( ii - 155 ) / 5 ); // From VeroRoute V2.20, "Brightness" is a percentage value [0,100] that is stored as a grey level in the range [155,255]. ui->spinBox_bright->setValue( i ); ui->comptext->setValue( board.GetTextSizeComp() ); ui->comppins->setValue( board.GetTextSizePins() ); ui->spinBox_height->setValue( board.GetTargetRows() ); ui->spinBox_width->setValue( board.GetTargetCols() ); ui->shade->setChecked( board.GetShowTarget() ); if ( board.GetRenderQuality() == 0 ) ui->antiAliasOff->setChecked(true); else ui->antiAliasOn->setChecked(true); ui->spinBox_bright->setDisabled(bCompEdit || bPCB ); ui->shade->setDisabled( bCompEdit ); ui->spinBox_height->setDisabled(bCompEdit ); ui->spinBox_width->setDisabled( bCompEdit ); ui->comptext->setDisabled( bCompEdit ); ui->comppins->setDisabled( !bCompEdit && bMonoPCB ); ui->padWidth->setDisabled( bCompEdit || bNoTrackOptions || bVero ); ui->trackWidth->setDisabled( bCompEdit || bNoTrackOptions || bVero ); ui->tagWidth->setDisabled( !bTags ); ui->holeWidth->setDisabled( bCompEdit || bNoTrackOptions || bVero ); ui->viapadWidth->setDisabled( bCompEdit || bNoTrackOptions || bVero || !bVias ); ui->viaholeWidth->setDisabled( bCompEdit || bNoTrackOptions || bVero || !bVias ); ui->gapWidth->setDisabled( bCompEdit || !bGroundFill ); ui->maskWidth->setDisabled( bCompEdit || bVero || !bPCB ); ui->silkWidth->setDisabled( bCompEdit || bVero || !bMonoPCB ); ui->edgeWidth->setDisabled( bCompEdit ); ui->fillWidth->setDisabled( bCompEdit || !bGroundFill ); // ... and corresponding labels ui->label_brightness->setDisabled( bCompEdit || bPCB ); ui->label_height->setDisabled( bCompEdit ); ui->label_width->setDisabled( bCompEdit ); ui->label_comptext->setDisabled( bCompEdit ); ui->label_comppins->setDisabled( !bCompEdit && bMonoPCB ); ui->label_pad->setDisabled( bCompEdit || bNoTrackOptions || bVero ); ui->label_track->setDisabled( bCompEdit || bNoTrackOptions || bVero ); ui->label_tag->setDisabled( !bTags ); ui->label_hole->setDisabled( bCompEdit || bNoTrackOptions || bVero ); ui->label_viapad->setDisabled( bCompEdit || bNoTrackOptions || bVero || !bVias ); ui->label_viahole->setDisabled( bCompEdit || bNoTrackOptions || bVero || !bVias ); ui->label_gap->setDisabled( bCompEdit || !bGroundFill ); ui->label_mask->setDisabled( bCompEdit || bVero || !bPCB ); ui->label_silk->setDisabled( bCompEdit || bVero || !bMonoPCB ); ui->label_edge->setDisabled( bCompEdit ); ui->label_fill->setDisabled( bCompEdit || !bGroundFill ); ui->label_info->setDisabled( bCompEdit || bVero ); ui->label_info_2->setDisabled( bCompEdit || !bGroundFill ); ui->Xthermals->setDisabled( !bTags ); if ( !bTags ) ui->Xthermals->hide(); else ui->Xthermals->show(); ui->closeTracks->setDisabled( bCompEdit || bVero || !bCloseTrackInfo ); if ( bCompEdit || bVero || !bCloseTrackInfo ) ui->closeTracks->hide(); else ui->closeTracks->show(); ui->padWidth->setValue( board.GetPAD_MIL() ); ui->trackWidth->setValue( board.GetTRACK_MIL() ); ui->tagWidth->setValue( board.GetTAG_MIL() ); ui->holeWidth->setValue( board.GetHOLE_MIL() ); ui->gapWidth->setValue( board.GetGAP_MIL() ); ui->maskWidth->setValue( board.GetMASK_MIL() ); ui->silkWidth->setValue( board.GetSILK_MIL() ); ui->edgeWidth->setValue( board.GetEDGE_MIL() ); ui->fillWidth->setValue( board.GetFILL_MIL() ); ui->viapadWidth->setValue( board.GetVIAPAD_MIL() ); ui->viaholeWidth->setValue( board.GetVIAHOLE_MIL() ); ui->Xthermals->setChecked( board.GetXthermals() ); const int minTrkMil = static_cast(minTrk); const int minTrkRem = static_cast(10.0 * (minTrk - minTrkMil)); // 0.1 mil resolution const int minGndMil = static_cast(minGnd); const int minGndRem = static_cast(10.0 * (minGnd - minGndMil)); // 0.1 mil resolution std::string str = "Current min track separation = "; if ( bCompEdit || bVero ) str += "n/a"; else str += std::to_string(minTrkMil) + "." + std::to_string(minTrkRem) + " mil"; ui->label_info->setText( QString::fromStdString(str) ); std::string str2 = "Current min ground-fill width = "; if ( bCompEdit || !bGroundFill ) str2 += "n/a"; else str2 += std::to_string(minGndMil) + "." + std::to_string(minGndRem) + " mil"; ui->label_info_2->setText( QString::fromStdString(str2) ); ui->closeTracks->setChecked( board.GetShowCloseTracks() ); } void RenderingDialog::keyPressEvent(QKeyEvent* event) { #ifndef VEROROUTE_ANDROID m_pMainWindow->specialKeyPressEvent(event); #endif QWidget::keyPressEvent(event); event->accept(); } void RenderingDialog::keyReleaseEvent(QKeyEvent* event) { #ifdef VEROROUTE_ANDROID if ( event->key() == Qt::Key_Back ) return m_pMainWindow->keyReleaseEvent(event); // Try Undo operation #else m_pMainWindow->commonKeyReleaseEvent(event); #endif QWidget::keyReleaseEvent(event); event->accept(); } VeroRoute/Src/textdialog.h000644 001750 001750 00000002330 14026030660 015773 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include class MainWindow; class Ui_TextDialog; class TextRect; class TextDialog : public QDialog { Q_OBJECT public: explicit TextDialog(MainWindow* parent = nullptr); ~TextDialog(); void Clear(); void Update(const TextRect& rect, bool bFull); public slots: void TextChanged(); protected: void keyPressEvent(QKeyEvent* event); void keyReleaseEvent(QKeyEvent* event); private: Ui_TextDialog* ui; MainWindow* m_pMainWindow; }; VeroRoute/libraries/gEDA/veroroute_passive/Capacitor_Electrolytic_NP_600mil.sym000644 001750 001750 00000001341 13515171161 030101 0ustar00alexalex000000 000000 v 20130925 2 T 200 700 5 10 0 0 0 0 1 numslots=0 P 200 700 400 700 1 0 0 { T 350 750 5 8 1 1 0 6 1 pinnumber=1 T 350 750 5 8 0 0 0 6 1 pinseq=1 T 350 750 5 8 0 0 0 6 1 pinlabel=1 T 350 750 5 8 0 0 0 6 1 pintype=pas } P 1100 700 900 700 1 0 0 { T 950 750 5 8 1 1 0 0 1 pinnumber=2 T 950 750 5 8 0 0 0 0 1 pinseq=2 T 950 750 5 8 0 0 0 0 1 pinlabel=2 T 950 750 5 8 0 0 0 0 1 pintype=pas } L 600 900 600 500 3 0 0 0 -1 -1 L 900 700 700 700 3 0 0 0 -1 -1 L 600 700 400 700 3 0 0 0 -1 -1 A 1400 700 700 165 30 3 0 0 0 -1 -1 T 500 300 5 10 1 1 0 0 1 device=6u8 T 500 1000 8 10 1 1 0 0 1 refdes=C? T 500 700 8 10 0 0 0 0 1 footprint=CAP_ELECTRO_600_NP T 500 700 8 10 0 0 0 0 1 description=Non-Polarised Electrolytic Capacitor (600 mil diameter) VeroRoute/Src/images/fat.png000644 001750 001750 00000000500 13661712157 016214 0ustar00alexalex000000 000000 ‰PNG  IHDR szzєbKGD…ЌJ1J pHYsФФ•+tIMEу љ ~ЭIDATXУэ–1ƒ0 EБ/УЪDзо‚ЎœŒ•cА2бЕЇ1RŠ БUџ€Ђz#Šфчиц‘*Œзу§}румPјM:ё_‘<ЬЩБKУTУAЈkб$юŸkЋFНW[ЊDМ[њŒ˜ƒ{Е V%j HDNDУTУЋВЕ`/9ƒrЋaрa)c џХЄ ЖZSУ9Ћ>:/oЌІЦРjjЪ\C‹ЉqYӘ ХLЭ87oAj&мЌІfЛяж­?иƒЎЂ6kuž‡пњIENDЎB`‚VeroRoute/Src/Shape.h000644 001750 001750 00000022211 14377762443 014713 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include "MyRGB.h" // Class to describe a simple shape (e.g. for drawing component outlines) enum class SHAPE { LINE = 0, RECT, ROUNDED_RECT, ELLIPSE, ARC, CHORD }; class Shape : public Persist { public: Shape(SHAPE type = SHAPE::RECT, bool bLine = true, bool bFill = false, double x1 = 0, double x2 = 0, double y1 = 0, double y2 = 0, double a3 = 0) : m_type(type) , m_x1(x1), m_x2(x2) , m_y1(y1), m_y2(y2) , m_a1(0), m_a2(90), m_a3(a3) , m_bDrawLine(bLine) , m_bDrawFill(bFill) , m_lineColor(0x000000) , m_fillColor(0x00FF00) // Green { } Shape(SHAPE type, bool bLine, bool bFill, double x1, double x2, double y1, double y2, double a1, double a2, double a3 = 0) : m_type(type) , m_x1(x1), m_x2(x2) , m_y1(y1), m_y2(y2) , m_a1(a1), m_a2(a2), m_a3(a3) , m_bDrawLine(bLine) , m_bDrawFill(bFill) , m_lineColor(0x000000) , m_fillColor(0x00FF00) // Green { } Shape(const Shape& o) { *this = o; } virtual ~Shape() {} Shape& operator=(const Shape& o) { m_type = o.m_type; m_x1 = o.m_x1; m_x2 = o.m_x2; m_y1 = o.m_y1; m_y2 = o.m_y2; m_a1 = o.m_a1; m_a2 = o.m_a2; m_a3 = o.m_a3; m_bDrawLine = o.m_bDrawLine; m_bDrawFill = o.m_bDrawFill; m_lineColor = o.m_lineColor; m_fillColor = o.m_fillColor; return *this; } bool operator==(const Shape& o) const // Compare persisted info { return m_type == o.m_type && m_x1 - o.m_x1 == 0.0 && m_x2 - o.m_x2 == 0.0 && m_y1 - o.m_y1 == 0.0 && m_y2 - o.m_y2 == 0.0 && m_a1 - o.m_a1 == 0.0 && m_a2 - o.m_a2 == 0.0 && m_a3 - o.m_a3 == 0.0 && m_bDrawLine == o.m_bDrawLine && m_bDrawFill == o.m_bDrawFill && m_lineColor == o.m_lineColor && m_fillColor == o.m_fillColor; } bool operator!=(const Shape& o) const { return !(*this == o); } bool operator<(const Shape& o) const // For determining render order { if ( m_bDrawLine != o.m_bDrawLine ) return !m_bDrawLine; // Prefer no line if ( m_bDrawFill != o.m_bDrawFill ) return m_bDrawFill; // Prefer fill if ( m_lineColor != o.m_lineColor ) return m_lineColor < o.m_lineColor; if ( m_fillColor != o.m_fillColor ) return m_fillColor < o.m_fillColor; if ( m_type != o.m_type ) return static_cast(m_type) < static_cast(o.m_type); if ( m_x1 - o.m_x1 != 0.0 ) return m_x1 < o.m_x1; if ( m_x2 - o.m_x2 != 0.0 ) return m_x2 < o.m_x2; if ( m_y1 - o.m_y1 != 0.0 ) return m_y1 < o.m_y1; if ( m_y2 - o.m_y2 != 0.0 ) return m_y2 < o.m_y2; if ( m_a1 - o.m_a1 != 0.0 ) return m_a1 < o.m_a1; if ( m_a2 - o.m_a2 != 0.0 ) return m_a2 < o.m_a2; return m_a3 < o.m_a3; } void SetType(SHAPE c) { m_type = c; } void SetX1(double d) { m_x1 = d; } void SetX2(double d) { m_x2 = d; } void SetY1(double d) { m_y1 = d; } void SetY2(double d) { m_y2 = d; } void SetA1(double d) { m_a1 = d; } void SetA2(double d) { m_a2 = d; } void SetA3(double d) { m_a3 = d; } void SetDrawLine(bool b) { m_bDrawLine = b; } void SetDrawFill(bool b) { m_bDrawFill = b; } void SetLineColor(const MyRGB& r) { m_lineColor = r; } void SetFillColor(const MyRGB& r) { m_fillColor = r; } void Set(double x1, double x2, double y1, double y2, double a1, double a2, double a3) { m_x1 = x1; m_x2 = x2; m_y1 = y1; m_y2 = y2; m_a1 = a1; m_a2 = a2; m_a3 = a3; } void SetCX(double d) { Move(0, d - GetCX()); } void SetCY(double d) { Move(d - GetCY(), 0); } void SetDX(double d) { Expand( d - GetDX(), 0 ); } void SetDY(double d) { Expand( 0, d - GetDY() ); } void Move(double dDown, double dRight) { m_x1 += dRight; m_x2 += dRight; m_y1 += dDown; m_y2 += dDown; } void Expand(double dx, double dy) { m_x1 -= 0.5 * dx; m_x2 += 0.5 * dx; m_y1 -= 0.5 * dy; m_y2 += 0.5 * dy; } const SHAPE& GetType() const { return m_type; } const double& GetX1() const { return m_x1; } const double& GetX2() const { return m_x2; } const double& GetY1() const { return m_y1; } const double& GetY2() const { return m_y2; } const double& GetA1() const { return m_a1; } const double& GetA2() const { return m_a2; } const double& GetA3() const { return m_a3; } const bool& GetDrawLine() const { return m_bDrawLine; } const bool& GetDrawFill() const { return m_bDrawFill; } const MyRGB& GetLineColor() const { return m_lineColor; } const MyRGB& GetFillColor() const { return m_fillColor; } const double& GetXmin() const { return std::min(m_x1, m_x2); } const double& GetXmax() const { return std::max(m_x1, m_x2); } const double& GetYmin() const { return std::min(m_y1, m_y2); } const double& GetYmax() const { return std::max(m_y1, m_y2); } double GetCX() const { return 0.5 * ( m_x1 + m_x2 ); } double GetCY() const { return 0.5 * ( m_y1 + m_y2 ); } double GetDX() const { return m_x2 - m_x1; } double GetDY() const { return m_y2 - m_y1; } double GetXlen() const { return fabs(GetDX()); } double GetYlen() const { return fabs(GetDY()); } double GetAlen() const { double d = m_a2 - m_a1; while ( d < 0 ) d += 360.0; return d; } void GetSafeBounds(double& L, double& R, double& T, double& B) const // Allows for worst case rotation "A3" { if ( GetA3() == 0.0 ) { L = GetXmin(); R = GetXmax(); T = GetYmin(); B = GetYmax(); } else { // The following could be improved (to a tighter bound) by considering the shape and rotation angle const double DX( GetDX() ), DY( GetDY() ); const double d = sqrt(DX*DX + DY*DY) * 0.5; L = GetCX() - d; R = GetCX() + d; T = GetCY() - d; B = GetCY() + d; } } // Persist interface functions virtual void Load(DataStream& inStream) override { int type(0); inStream.Load(type); m_type = static_cast(type); inStream.Load(m_x1); inStream.Load(m_x2); inStream.Load(m_y1); inStream.Load(m_y2); inStream.Load(m_a1); inStream.Load(m_a2); if ( inStream.GetVersion() >= VRT_VERSION_29 ) { inStream.Load(m_a3); // Added in VRT_VERSION_29 inStream.Load(m_bDrawLine); // Added in VRT_VERSION_29 inStream.Load(m_bDrawFill); // Added in VRT_VERSION_29 m_lineColor.Load(inStream); // Added in VRT_VERSION_29 m_fillColor.Load(inStream); // Added in VRT_VERSION_29 } else { m_a3 = 0; m_bDrawLine = true; m_bDrawFill = false; m_lineColor.SetRGB(0,0,0); m_fillColor.SetRGB(0,255,0); // Green } } virtual void Save(DataStream& outStream) override { outStream.Save(static_cast(m_type)); outStream.Save(m_x1); outStream.Save(m_x2); outStream.Save(m_y1); outStream.Save(m_y2); outStream.Save(m_a1); outStream.Save(m_a2); outStream.Save(m_a3); // Added in VRT_VERSION_29 outStream.Save(m_bDrawLine); // Added in VRT_VERSION_29 outStream.Save(m_bDrawFill); // Added in VRT_VERSION_29 m_lineColor.Save(outStream); // Added in VRT_VERSION_29 m_fillColor.Save(outStream); // Added in VRT_VERSION_29 } static const std::map& GetMapShapeStrings() { static std::map mapShapeToStr; if ( mapShapeToStr.empty() ) { mapShapeToStr[SHAPE::LINE] = "Line"; mapShapeToStr[SHAPE::RECT] = "Rectangle"; mapShapeToStr[SHAPE::ROUNDED_RECT] = "Rounded Rectangle"; mapShapeToStr[SHAPE::ELLIPSE] = "Ellipse"; mapShapeToStr[SHAPE::ARC] = "Arc"; mapShapeToStr[SHAPE::CHORD] = "Chord"; } return mapShapeToStr; } static const std::list& GetListShapeStrings() { static std::list listShapeStr; // Use for populating combo boxes if ( listShapeStr.empty() ) { listShapeStr.push_back("Line"); listShapeStr.push_back("Rectangle"); listShapeStr.push_back("Rounded Rectangle"); listShapeStr.push_back("Ellipse"); listShapeStr.push_back("Arc"); listShapeStr.push_back("Chord"); } return listShapeStr; } private: // Data (x1,y1) and (x2,y2) are either // the start and end points of a line, or the TL and BR corners of a rectangle. // Ellipses fit to the rectangle. // An arc is a CCW part of the ellipse, starting at "a1" and ending at "a2". // Note the angle is w.r.t. a circle rather than an ellipse. // The angle "a3" can be used to provide a final CCW rotation of the shape about its centre. SHAPE m_type; double m_x1, m_x2; // Units of 100 mil w.r.t. footprint centre double m_y1, m_y2; // Units of 100 mil w.r.t. footprint centre double m_a1, m_a2, m_a3; // Angles measured CCW degrees. Zero at 3 o'clock. bool m_bDrawLine; // Draw line (can only be false if m_bFill is true) bool m_bDrawFill; // Fill with color MyRGB m_lineColor; // Line color. Always black MyRGB m_fillColor; // Fill color. }; VeroRoute/libraries/gEDA/veroroute_transistor/PNP_2N3905.sym000644 001750 001750 00000001563 13515171161 024047 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=3 T 400 850 5 6 0 0 0 0 1 pinseq=3 T 400 850 5 6 0 0 0 0 1 pinlabel=3 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=1 T 400 50 5 6 0 0 0 0 1 pinseq=1 T 400 50 5 6 0 0 0 0 1 pinlabel=1 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 297,341 L 199,350 L 269,277 L 275,310 z T 600 700 5 10 1 1 0 0 1 device=2N3905 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=PNP Transistor VeroRoute/Src/000755 001750 001750 00000000000 14565712700 013472 5ustar00alexalex000000 000000 VeroRoute/libraries/gEDA/veroroute_regulator/LM336.sym000644 001750 001750 00000002013 13515171161 023061 0ustar00alexalex000000 000000 v 20130925 2 T 1000 1300 5 10 0 0 0 0 1 numslots=0 P 1000 1300 1000 1125 1 0 0 { T 955 1325 5 8 1 1 180 0 1 pinnumber=1 T 1005 1350 5 8 0 0 0 0 1 pinseq=1 T 1005 1350 5 8 0 0 0 0 1 pinlabel=1 T 1005 1350 5 8 0 0 0 0 1 pintype=pas } P 600 1000 800 1000 1 0 0 { T 705 1045 5 8 1 1 0 6 1 pinnumber=3 T 705 1045 5 8 0 0 0 0 1 pinseq=3 T 705 1045 5 8 0 0 0 0 1 pinlabel=3 T 705 1045 5 8 0 0 0 0 1 pintype=pas } P 1500 1000 1300 1000 1 0 0 { T 1395 1045 5 8 1 1 0 0 1 pinnumber=2 T 1395 1045 5 8 0 0 0 0 1 pinseq=2 T 1395 1045 5 8 0 0 0 0 1 pinlabel=2 T 1395 1045 5 8 0 0 0 0 1 pintype=pas } L 900 1200 900 800 3 0 0 0 -1 -1 L 900 1200 1200 1000 3 0 0 0 -1 -1 L 1200 1000 900 800 3 0 0 0 -1 -1 L 1200 1200 1300 1200 3 0 0 0 -1 -1 L 1300 1000 1200 1000 3 0 0 0 -1 -1 L 900 1000 800 1000 3 0 0 0 -1 -1 L 1200 1200 1200 800 3 0 0 0 -1 -1 L 1100 800 1200 800 3 0 0 0 -1 -1 T 1300 500 5 10 1 1 180 0 1 device=LM336 T 1100 700 8 10 1 1 180 0 1 refdes=D? T 400 400 8 10 0 0 0 0 1 footprint=TO92 T 400 400 8 10 0 0 0 0 1 description=Reference Diode VeroRoute/libraries/gEDA/veroroute_logic/4050.sym000644 001750 001750 00000002607 13515171161 022007 0ustar00alexalex000000 000000 v 20130925 2 T 1700 2700 5 10 0 0 0 0 1 slot=1 T 1700 700 5 10 0 0 0 0 1 numslots=6 T 1700 900 5 10 0 0 0 0 1 slotdef=1:3,2,1,8 T 1700 1100 5 10 0 0 0 0 1 slotdef=2:5,4,1,8 T 1700 1300 5 10 0 0 0 0 1 slotdef=3:7,6,1,8 T 1700 1500 5 10 0 0 0 0 1 slotdef=4:9,10,1,8 T 1700 1700 5 10 0 0 0 0 1 slotdef=5:11,12,1,8 T 1700 1900 5 10 0 0 0 0 1 slotdef=6:14,15,1,8 P 0 500 300 500 1 0 0 { T 200 550 5 8 1 1 0 6 1 pinnumber=3 T 200 450 5 8 0 0 0 0 1 pinseq=1 T 350 500 9 8 0 0 0 0 1 pinlabel=in T 350 500 5 8 0 0 0 0 1 pintype=in } P 900 500 1200 500 1 0 1 { T 1000 550 5 8 1 1 0 0 1 pinnumber=2 T 1000 450 5 8 0 0 0 0 1 pinseq=2 T 850 500 9 8 0 0 0 0 1 pinlabel=out T 850 500 5 8 0 0 0 0 1 pintype=out } P 600 800 600 650 1 0 0 { T 730 775 5 8 1 1 180 0 1 pinnumber=1 T 600 900 5 8 0 0 0 0 1 pinseq=3 T 255 750 9 8 0 0 180 6 1 pinlabel=VDD T 600 900 5 8 0 0 0 0 1 pintype=pwr } P 600 200 600 350 1 0 0 { T 645 350 5 8 1 1 180 6 1 pinnumber=8 T 600 200 5 8 0 0 0 0 1 pinseq=4 T 545 375 9 8 0 0 180 0 1 pinlabel=VSS T 600 200 5 8 0 0 0 0 1 pintype=pwr } L 300 800 300 200 3 0 0 0 -1 -1 L 300 800 900 500 3 0 0 0 -1 -1 L 900 500 300 200 3 0 0 0 -1 -1 L 575 575 625 575 3 0 0 0 -1 -1 L 600 600 600 550 3 0 0 0 -1 -1 L 575 425 625 425 3 0 0 0 -1 -1 T 800 900 9 10 1 1 0 0 1 device=4050 T 1700 500 5 10 0 0 0 0 1 footprint=DIP16 T 300 900 8 10 1 1 0 0 1 refdes=U? T 1700 2300 5 10 0 0 0 0 1 description=Non-Inverting Hex Buffer VeroRoute/libraries/gEDA/veroroute_transistor/PNP_2N5087.sym000644 001750 001750 00000001563 13515171161 024052 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=3 T 400 850 5 6 0 0 0 0 1 pinseq=3 T 400 850 5 6 0 0 0 0 1 pinlabel=3 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=1 T 400 50 5 6 0 0 0 0 1 pinseq=1 T 400 50 5 6 0 0 0 0 1 pinlabel=1 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 297,341 L 199,350 L 269,277 L 275,310 z T 600 700 5 10 1 1 0 0 1 device=2N5087 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=PNP Transistor VeroRoute/Src/GuiControl.h000644 001750 001750 00000077105 14565710516 015745 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include "MyRGB.h" #include "TrackElement.h" // For BAD_NODEID #include "Element.h" // For BAD_COMPID, TRAX_COMPID class QPointF; class Component; struct MyPolygonF; enum class DIAGSMODE { OFF = 0, MIN, MAX }; enum class TRACKMODE { OFF = 0, MONO, COLOR, PCB }; enum class COMPSMODE { OFF = 0, OUTLINE, NAME, VALUE }; enum class HOLETYPE { NPTH = 0, PTH }; // A class to hold the variables set via the GUI Q_DECL_CONSTEXPR static const int BAD_TEXTID = -1; class GuiControl : public Persist, public Merge { public: GuiControl() {} virtual ~GuiControl() {} GuiControl(const GuiControl& o) { *this = o; } GuiControl& operator=(const GuiControl& o) { m_backgroundColor = o.m_backgroundColor; m_currentLayer = o.m_currentLayer; m_currentCompId = o.m_currentCompId; m_currentNodeId = o.m_currentNodeId; m_groundNodeId0 = o.m_groundNodeId0; m_groundNodeId1 = o.m_groundNodeId1; m_currentTextId = o.m_currentTextId; m_diagsMode = o.m_diagsMode; m_iTrackMode = o.m_iTrackMode; m_iCompMode = o.m_iCompMode; m_iHoleType = o.m_iHoleType; m_GRIDPIXELS = o.m_GRIDPIXELS; m_PAD_MIL = o.m_PAD_MIL; m_TRACK_MIL = o.m_TRACK_MIL; m_TAG_MIL = o.m_TAG_MIL; m_HOLE_MIL = o.m_HOLE_MIL; m_GAP_MIL = o.m_GAP_MIL; m_MASK_MIL = o.m_MASK_MIL; m_SILK_MIL = o.m_SILK_MIL; m_EDGE_MIL = o.m_EDGE_MIL; m_FILL_MIL = o.m_FILL_MIL; m_VIAPAD_MIL = o.m_VIAPAD_MIL; m_VIAHOLE_MIL = o.m_VIAHOLE_MIL; m_iRenderQuality = o.m_iRenderQuality; m_iSaturation = o.m_iSaturation; m_iFillSaturation = o.m_iFillSaturation; m_iCropMargin = o.m_iCropMargin; m_iTargetRows = o.m_iTargetRows; m_iTargetCols = o.m_iTargetCols; m_iTextSizeComp = o.m_iTextSizeComp; m_iTextSizePins = o.m_iTextSizePins; m_iRoutingMethod = o.m_iRoutingMethod; m_bShowTarget = o.m_bShowTarget; m_bShowCloseTracks = o.m_bShowCloseTracks; m_bWireShare = o.m_bWireShare; m_bWireCross = o.m_bWireCross; m_bVeroTracks = o.m_bVeroTracks; m_bCurvedTracks = o.m_bCurvedTracks; m_bFatTracks = o.m_bFatTracks; m_bRoutingEnabled = o.m_bRoutingEnabled; m_bViasEnabled = o.m_bViasEnabled; m_bShowGrid = o.m_bShowGrid; m_bShowText = o.m_bShowText; m_bFlipH = o.m_bFlipH; m_bFlipV = o.m_bFlipV; m_bPinLabels = o.m_bPinLabels; m_bFlyWires = o.m_bFlyWires; m_bGroundFill = o.m_bGroundFill; m_bVerticalStrips = o.m_bVerticalStrips; m_bCompEdit = o.m_bCompEdit; m_bXthermals = o.m_bXthermals; m_bInverseMono = o.m_bInverseMono; m_bColoredMono = o.m_bColoredMono; return *this; } bool operator==(const GuiControl& o) const // Compare persisted info { return m_backgroundColor == o.m_backgroundColor && m_currentLayer == o.m_currentLayer && m_currentCompId == o.m_currentCompId && m_currentNodeId == o.m_currentNodeId && m_groundNodeId0 == o.m_groundNodeId0 && m_groundNodeId1 == o.m_groundNodeId1 && m_currentTextId == o.m_currentTextId && m_diagsMode == o.m_diagsMode && m_iTrackMode == o.m_iTrackMode && m_iCompMode == o.m_iCompMode && m_iHoleType == o.m_iHoleType && m_GRIDPIXELS == o.m_GRIDPIXELS && m_PAD_MIL == o.m_PAD_MIL && m_TRACK_MIL == o.m_TRACK_MIL && m_TAG_MIL == o.m_TAG_MIL && m_HOLE_MIL == o.m_HOLE_MIL && m_GAP_MIL == o.m_GAP_MIL && m_MASK_MIL == o.m_MASK_MIL && m_SILK_MIL == o.m_SILK_MIL && m_EDGE_MIL == o.m_EDGE_MIL && m_FILL_MIL == o.m_FILL_MIL && m_VIAPAD_MIL == o.m_VIAPAD_MIL && m_VIAHOLE_MIL == o.m_VIAHOLE_MIL && m_iRenderQuality == o.m_iRenderQuality && m_iSaturation == o.m_iSaturation && m_iFillSaturation == o.m_iFillSaturation && m_iCropMargin == o.m_iCropMargin && m_iTargetRows == o.m_iTargetRows && m_iTargetCols == o.m_iTargetCols && m_iTextSizeComp == o.m_iTextSizeComp && m_iTextSizePins == o.m_iTextSizePins && m_iRoutingMethod == o.m_iRoutingMethod && m_bShowTarget == o.m_bShowTarget && m_bShowCloseTracks == o.m_bShowCloseTracks && m_bWireShare == o.m_bWireShare && m_bWireCross == o.m_bWireCross && m_bVeroTracks == o.m_bVeroTracks && m_bCurvedTracks == o.m_bCurvedTracks && m_bFatTracks == o.m_bFatTracks && m_bRoutingEnabled == o.m_bRoutingEnabled && m_bViasEnabled == o.m_bViasEnabled && m_bShowGrid == o.m_bShowGrid && m_bShowText == o.m_bShowText && m_bFlipH == o.m_bFlipH && m_bFlipV == o.m_bFlipV && m_bPinLabels == o.m_bPinLabels && m_bFlyWires == o.m_bFlyWires && m_bGroundFill == o.m_bGroundFill && m_bVerticalStrips == o.m_bVerticalStrips && m_bCompEdit == o.m_bCompEdit && m_bXthermals == o.m_bXthermals && m_bInverseMono == o.m_bInverseMono && m_bColoredMono == o.m_bColoredMono; } bool operator!=(const GuiControl& o) const { return !(*this == o); } void Clear() { SetCurrentCompId(BAD_COMPID); SetCurrentNodeId(BAD_NODEID); SetGroundNodeId0(BAD_NODEID); SetGroundNodeId1(BAD_NODEID); SetCurrentTextId(BAD_TEXTID); SetTrackMode(TRACKMODE::COLOR); SetCompMode(COMPSMODE::NAME); SetRoutingEnabled(false); SetFlipH(false); SetFlipV(false); SetGroundFill(false); SetCompEdit(false); } // Merge interface functions virtual void UpdateMergeOffsets(MergeOffsets& o) override { if ( m_currentCompId != BAD_COMPID && m_currentCompId != TRAX_COMPID ) o.deltaCompId = std::max(o.deltaCompId, m_currentCompId + 1); if ( m_currentNodeId != BAD_NODEID ) o.deltaNodeId = std::max(o.deltaNodeId, m_currentNodeId + 1); if ( m_groundNodeId0 != BAD_NODEID ) o.deltaNodeId = std::max(o.deltaNodeId, m_groundNodeId0 + 1); if ( m_groundNodeId1 != BAD_NODEID ) o.deltaNodeId = std::max(o.deltaNodeId, m_groundNodeId1 + 1); } virtual void ApplyMergeOffsets(const MergeOffsets& o) override { if ( m_currentCompId != BAD_COMPID && m_currentCompId != TRAX_COMPID) m_currentCompId += o.deltaCompId; if ( m_currentNodeId != BAD_NODEID ) m_currentNodeId += o.deltaNodeId; if ( m_groundNodeId0 != BAD_NODEID ) m_groundNodeId0 += o.deltaNodeId; if ( m_groundNodeId1 != BAD_NODEID ) m_groundNodeId1 += o.deltaNodeId; } void Merge(const GuiControl& o) { m_currentCompId = o.m_currentCompId; m_currentNodeId = o.m_currentNodeId; m_groundNodeId0 = o.m_groundNodeId0; m_groundNodeId1 = o.m_groundNodeId1; } // Persist functions virtual void Load(DataStream& inStream) override { m_backgroundColor = MyRGB(0xFFFFFF); if ( inStream.GetVersion() >= VRT_VERSION_50 ) m_backgroundColor.Load(inStream); // Added in VRT_VERSION_50 m_currentLayer = 0; if ( inStream.GetVersion() >= VRT_VERSION_34 ) inStream.Load(m_currentLayer); // Added in VRT_VERSION_34 inStream.Load(m_currentCompId); inStream.Load(m_currentNodeId); m_groundNodeId0 = BAD_NODEID; if ( inStream.GetVersion() >= VRT_VERSION_3 ) inStream.Load(m_groundNodeId0); // Added in VRT_VERSION_3 m_groundNodeId1 = BAD_NODEID; if ( inStream.GetVersion() >= VRT_VERSION_34 ) inStream.Load(m_groundNodeId1); // Added in VRT_VERSION_34 m_currentTextId = BAD_TEXTID; if ( inStream.GetVersion() >= VRT_VERSION_14 ) inStream.Load(m_currentTextId); // Added in VRT_VERSION_14 int diagMode(0), trackMode(0), compMode(0), holeType(0); inStream.Load(diagMode); inStream.Load(trackMode); inStream.Load(compMode); if ( inStream.GetVersion() >= VRT_VERSION_33 ) inStream.Load(holeType); // Added in VRT_VERSION_33 m_diagsMode = static_cast (diagMode); m_iTrackMode = static_cast (trackMode); m_iCompMode = static_cast (compMode); m_iHoleType = static_cast (holeType); inStream.Load(m_GRIDPIXELS); inStream.Load(m_PAD_MIL); inStream.Load(m_TRACK_MIL); m_TAG_MIL = m_TRACK_MIL; if ( inStream.GetVersion() >= VRT_VERSION_52 ) inStream.Load(m_TAG_MIL); // Added in VRT_VERSION_52 inStream.Load(m_HOLE_MIL); m_GAP_MIL = 10; if ( inStream.GetVersion() >= VRT_VERSION_3 ) inStream.Load(m_GAP_MIL); // Added in VRT_VERSION_3 m_MASK_MIL = 4; m_SILK_MIL = 7; if ( inStream.GetVersion() >= VRT_VERSION_32 ) { inStream.Load(m_MASK_MIL); // Added in VRT_VERSION_32 inStream.Load(m_SILK_MIL); // Added in VRT_VERSION_32 } m_EDGE_MIL = 0; if ( inStream.GetVersion() >= VRT_VERSION_33 ) inStream.Load(m_EDGE_MIL); // Added in VRT_VERSION_33 m_FILL_MIL = 0; if ( inStream.GetVersion() >= VRT_VERSION_58 ) inStream.Load(m_FILL_MIL); // Added in VRT_VERSION_58 m_VIAPAD_MIL = 50; m_VIAHOLE_MIL = 25; if ( inStream.GetVersion() >= VRT_VERSION_35 ) { inStream.Load(m_VIAPAD_MIL); // Added in VRT_VERSION_35 inStream.Load(m_VIAHOLE_MIL); // Added in VRT_VERSION_35 } inStream.Load(m_iRenderQuality); m_iSaturation = 100; if ( inStream.GetVersion() >= VRT_VERSION_6 ) inStream.Load(m_iSaturation); // Added in VRT_VERSION_6 m_iFillSaturation = 0; if ( inStream.GetVersion() >= VRT_VERSION_29 ) inStream.Load(m_iFillSaturation); // Added in VRT_VERSION_29 m_iCropMargin = 0; if ( inStream.GetVersion() >= VRT_VERSION_13 ) inStream.Load(m_iCropMargin); // Added in VRT_VERSION_13 m_iTargetRows = 10; if ( inStream.GetVersion() >= VRT_VERSION_21 ) inStream.Load(m_iTargetRows); // Added in VRT_VERSION_21 m_iTargetCols = 10; if ( inStream.GetVersion() >= VRT_VERSION_21 ) inStream.Load(m_iTargetCols); // Added in VRT_VERSION_21 m_iTextSizeComp = 9; if ( inStream.GetVersion() >= VRT_VERSION_17 ) inStream.Load(m_iTextSizeComp); // Added in VRT_VERSION_17 m_iTextSizePins = 9; if ( inStream.GetVersion() >= VRT_VERSION_17 ) inStream.Load(m_iTextSizePins); // Added in VRT_VERSION_17 m_iRoutingMethod = 0; if ( inStream.GetVersion() >= VRT_VERSION_24 ) inStream.Load(m_iRoutingMethod); // Added in VRT_VERSION_24 m_bShowTarget = false; if ( inStream.GetVersion() >= VRT_VERSION_21 ) inStream.Load(m_bShowTarget); // Added in VRT_VERSION_21 m_bShowCloseTracks = false; if ( inStream.GetVersion() >= VRT_VERSION_44 ) inStream.Load(m_bShowCloseTracks); // Added in VRT_VERSION_44 m_bWireShare = true; if ( inStream.GetVersion() >= VRT_VERSION_28 ) inStream.Load(m_bWireShare); // Added in VRT_VERSION_28 m_bWireCross = false; if ( inStream.GetVersion() >= VRT_VERSION_28 ) inStream.Load(m_bWireCross); // Added in VRT_VERSION_28 inStream.Load(m_bVeroTracks); inStream.Load(m_bCurvedTracks); m_bFatTracks = true; if ( inStream.GetVersion() >= VRT_VERSION_36 ) inStream.Load(m_bFatTracks); // Added in VRT_VERSION_36 inStream.Load(m_bRoutingEnabled); m_bViasEnabled = true; if ( inStream.GetVersion() >= VRT_VERSION_37 ) inStream.Load(m_bViasEnabled); // Added in VRT_VERSION_37 m_bShowGrid = m_iTrackMode != TRACKMODE::OFF; if ( inStream.GetVersion() >= VRT_VERSION_5 ) inStream.Load(m_bShowGrid); // Added in VRT_VERSION_5 m_bShowText = true; if ( inStream.GetVersion() >= VRT_VERSION_14 ) inStream.Load(m_bShowText); // Added in VRT_VERSION_14 inStream.Load(m_bFlipH); m_bFlipV = false; if ( inStream.GetVersion() >= VRT_VERSION_14 ) inStream.Load(m_bFlipV); // Added in VRT_VERSION_14 m_bPinLabels = false; if ( inStream.GetVersion() >= VRT_VERSION_2 ) inStream.Load(m_bPinLabels); // Added in VRT_VERSION_2 m_bFlyWires = true; if ( inStream.GetVersion() >= VRT_VERSION_48 ) inStream.Load(m_bFlyWires); // Added in VRT_VERSION_48 m_bGroundFill = false; if ( inStream.GetVersion() >= VRT_VERSION_3 ) inStream.Load(m_bGroundFill); // Added in VRT_VERSION_3 m_bVerticalStrips = true; if ( inStream.GetVersion() >= VRT_VERSION_12 ) inStream.Load(m_bVerticalStrips); // Added in VRT_VERSION_12 m_bCompEdit = false; if ( inStream.GetVersion() >= VRT_VERSION_19 ) inStream.Load(m_bCompEdit); // Added in VRT_VERSION_19 m_bXthermals = false; if ( inStream.GetVersion() >= VRT_VERSION_53 ) inStream.Load(m_bXthermals); // Added in VRT_VERSION_53 m_bInverseMono = false; if ( inStream.GetVersion() >= VRT_VERSION_57 ) inStream.Load(m_bInverseMono); // Added in VRT_VERSION_57 m_bColoredMono = false; if ( inStream.GetVersion() >= VRT_VERSION_59 ) inStream.Load(m_bColoredMono); // Added in VRT_VERSION_59 } virtual void Save(DataStream& outStream) override { m_backgroundColor.Save(outStream); // Added in VRT_VERSION_50 outStream.Save(m_currentLayer); // Added in VRT_VERSION_34 outStream.Save(m_currentCompId); outStream.Save(m_currentNodeId); outStream.Save(m_groundNodeId0); // Added in VRT_VERSION_3 outStream.Save(m_groundNodeId1); // Added in VRT_VERSION_34 outStream.Save(m_currentTextId); // Added in VRT_VERSION_14 outStream.Save(static_cast(m_diagsMode)); outStream.Save(static_cast(m_iTrackMode)); outStream.Save(static_cast(m_iCompMode)); outStream.Save(static_cast(m_iHoleType)); // Added in VRT_VERSION_33 outStream.Save(m_GRIDPIXELS); outStream.Save(m_PAD_MIL); outStream.Save(m_TRACK_MIL); outStream.Save(m_TAG_MIL); // Added in VRT_VERSION_52 outStream.Save(m_HOLE_MIL); outStream.Save(m_GAP_MIL); // Added in VRT_VERSION_3 outStream.Save(m_MASK_MIL); // Added in VRT_VERSION_32 outStream.Save(m_SILK_MIL); // Added in VRT_VERSION_32 outStream.Save(m_EDGE_MIL); // Added in VRT_VERSION_33 outStream.Save(m_FILL_MIL); // Added in VRT_VERSION_58 outStream.Save(m_VIAPAD_MIL); // Added in VRT_VERSION_35 outStream.Save(m_VIAHOLE_MIL); // Added in VRT_VERSION_35 outStream.Save(m_iRenderQuality); outStream.Save(m_iSaturation); // Added in VRT_VERSION_6 outStream.Save(m_iFillSaturation); // Added in VRT_VERSION_29 outStream.Save(m_iCropMargin); // Added in VRT_VERSION_13 outStream.Save(m_iTargetRows); // Added in VRT_VERSION_21 outStream.Save(m_iTargetCols); // Added in VRT_VERSION_21 outStream.Save(m_iTextSizeComp); // Added in VRT_VERSION_17 outStream.Save(m_iTextSizePins); // Added in VRT_VERSION_17 outStream.Save(m_iRoutingMethod); // Added in VRT_VERSION_24 outStream.Save(m_bShowTarget); // Added in VRT_VERSION_21 outStream.Save(m_bShowCloseTracks); // Added in VRT_VERSION_44 outStream.Save(m_bWireShare); // Added in VRT_VERSION_28 outStream.Save(m_bWireCross); // Added in VRT_VERSION_28 outStream.Save(m_bVeroTracks); outStream.Save(m_bCurvedTracks); outStream.Save(m_bFatTracks); // Added in VRT_VERSION_36 outStream.Save(m_bRoutingEnabled); outStream.Save(m_bViasEnabled); // Added in VRT_VERSION_37 outStream.Save(m_bShowGrid); // Added in VRT_VERSION_5 outStream.Save(m_bShowText); // Added in VRT_VERSION_14 outStream.Save(m_bFlipH); outStream.Save(m_bFlipV); // Added in VRT_VERSION_14 outStream.Save(m_bPinLabels); // Added in VRT_VERSION_2 outStream.Save(m_bFlyWires); // Added in VRT_VERSION_48 outStream.Save(m_bGroundFill); // Added in VRT_VERSION_3 outStream.Save(m_bVerticalStrips); // Added in VRT_VERSION_12 outStream.Save(m_bCompEdit); // Added in VRT_VERSION_19 outStream.Save(m_bXthermals); // Added in VRT_VERSION_53 outStream.Save(m_bInverseMono); // Added in VRT_VERSION_57 outStream.Save(m_bColoredMono); // Added in VRT_VERSION_59 } bool SetBackgroundColor(const MyRGB& o) { const bool bChanged = m_backgroundColor != o; m_backgroundColor = o; return bChanged;} bool SetCurrentLayer(int i) { const bool bChanged = m_currentLayer != i; m_currentLayer = i; return bChanged; } bool SetCurrentNodeId(int i) { const bool bChanged = m_currentNodeId != i; m_currentNodeId = i; return bChanged; } bool SetCurrentCompId(int i) { const bool bChanged = m_currentCompId != i; m_currentCompId = i; return bChanged; } bool SetGroundNodeId0(int i) { const bool bChanged = m_groundNodeId0 != i; m_groundNodeId0 = i; return bChanged; } bool SetGroundNodeId1(int i) { const bool bChanged = m_groundNodeId1 != i; m_groundNodeId1 = i; return bChanged; } bool SetCurrentTextId(int i) { const bool bChanged = m_currentTextId != i; m_currentTextId = i; return bChanged; } bool SetDiagsMode(DIAGSMODE e) { const bool bChanged = m_diagsMode != e; m_diagsMode = e; return bChanged; } bool SetTrackMode(TRACKMODE e) { const bool bChanged = m_iTrackMode != e; m_iTrackMode = e; return bChanged; } bool SetCompMode(COMPSMODE e) { const bool bChanged = m_iCompMode != e; m_iCompMode = e; return bChanged; } bool SetHoleType(HOLETYPE e) { const bool bChanged = m_iHoleType != e; m_iHoleType = e; return bChanged; } bool SetGRIDPIXELS(int i) { const bool bChanged = m_GRIDPIXELS != i; m_GRIDPIXELS = i; return bChanged; } bool SetPAD_MIL(int i) { const bool bChanged = m_PAD_MIL != i; m_PAD_MIL = i; if ( bChanged && GetHOLE_MIL() > i-8 ) SetHOLE_MIL( i-8 ); // 8 ==> minimum annular ring = 4 mil return bChanged; } bool SetTRACK_MIL(int i) { const bool bChanged = m_TRACK_MIL != i; m_TRACK_MIL = i; return bChanged; } bool SetTAG_MIL(int i) { const bool bChanged = m_TAG_MIL != i; m_TAG_MIL = i; return bChanged; } bool SetHOLE_MIL(int i) { const bool bChanged = m_HOLE_MIL != i; m_HOLE_MIL = i; if ( bChanged && GetPAD_MIL() < i+8 ) SetPAD_MIL( i+8 ); // 8 ==> minimum annular ring = 4 mil return bChanged; } bool SetGAP_MIL(int i) { const bool bChanged = m_GAP_MIL != i; m_GAP_MIL = i; return bChanged; } bool SetMASK_MIL(int i) { const bool bChanged = m_MASK_MIL != i; m_MASK_MIL = i; return bChanged; } bool SetSILK_MIL(int i) { const bool bChanged = m_SILK_MIL != i; m_SILK_MIL = i; return bChanged; } bool SetEDGE_MIL(int i) { const bool bChanged = m_EDGE_MIL != i; m_EDGE_MIL = i; return bChanged; } bool SetFILL_MIL(int i) { const bool bChanged = m_FILL_MIL != i; m_FILL_MIL = i; return bChanged; } bool SetVIAPAD_MIL(int i) { const bool bChanged = m_VIAPAD_MIL != i; m_VIAPAD_MIL = i; if ( bChanged && GetVIAHOLE_MIL() > i-8 ) SetVIAHOLE_MIL( i-8 ); // 8 ==> minimum annular ring = 4 mil return bChanged; } bool SetVIAHOLE_MIL(int i) { const bool bChanged = m_VIAHOLE_MIL != i; m_VIAHOLE_MIL = i; if ( bChanged && GetVIAPAD_MIL() < i+8 ) SetVIAPAD_MIL( i+8 ); // 8 ==> minimum annular ring = 4 mil return bChanged; } bool SetRenderQuality(int i) { const bool bChanged = m_iRenderQuality != i; m_iRenderQuality = i; return bChanged; } bool SetSaturation(int i) { const bool bChanged = m_iSaturation != i; m_iSaturation = i; return bChanged; } bool SetFillSaturation(int i) { const bool bChanged = m_iFillSaturation != i; m_iFillSaturation = i; return bChanged; } bool SetCropMargin(int i) { const bool bChanged = m_iCropMargin != i; m_iCropMargin = i; return bChanged; } bool SetTargetRows(int i) { const bool bChanged = m_iTargetRows != i; m_iTargetRows = i; return bChanged; } bool SetTargetCols(int i) { const bool bChanged = m_iTargetCols != i; m_iTargetCols = i; return bChanged; } bool SetTextSizeComp(int i) { const bool bChanged = m_iTextSizeComp != i; m_iTextSizeComp = i; return bChanged; } bool SetTextSizePins(int i) { const bool bChanged = m_iTextSizePins != i; m_iTextSizePins = i; return bChanged; } bool SetRoutingMethod(int i) { const bool bChanged = m_iRoutingMethod != i; m_iRoutingMethod = i; return bChanged; } bool SetShowTarget(bool b) { const bool bChanged = m_bShowTarget != b; m_bShowTarget = b; return bChanged; } bool SetShowCloseTracks(bool b) { const bool bChanged = m_bShowCloseTracks != b; m_bShowCloseTracks= b; return bChanged; } bool SetWireShare(bool b) { const bool bChanged = m_bWireShare != b; m_bWireShare = b; return bChanged; } bool SetWireCross(bool b) { const bool bChanged = m_bWireCross != b; m_bWireCross = b; return bChanged; } bool SetVeroTracks(bool b) { const bool bChanged = m_bVeroTracks != b; m_bVeroTracks = b; return bChanged; } bool SetCurvedTracks(bool b) { const bool bChanged = m_bCurvedTracks != b; m_bCurvedTracks = b; return bChanged; } bool SetFatTracks(bool b) { const bool bChanged = m_bFatTracks != b; m_bFatTracks = b; return bChanged; } bool SetRoutingEnabled(bool b) { const bool bChanged = m_bRoutingEnabled != b; m_bRoutingEnabled = b; return bChanged; } bool SetViasEnabled(bool b) { const bool bChanged = m_bViasEnabled != b; m_bViasEnabled = b; return bChanged; } bool SetShowGrid(bool b) { const bool bChanged = m_bShowGrid != b; m_bShowGrid = b; return bChanged; } bool SetShowText(bool b) { const bool bChanged = m_bShowText != b; m_bShowText = b; return bChanged; } bool SetFlipH(bool b) { const bool bChanged = m_bFlipH != b; m_bFlipH = b; return bChanged; } bool SetFlipV(bool b) { const bool bChanged = m_bFlipV != b; m_bFlipV = b; return bChanged; } bool SetShowPinLabels(bool b) { const bool bChanged = m_bPinLabels != b; m_bPinLabels = b; return bChanged; } bool SetShowFlyWires(bool b) { const bool bChanged = m_bFlyWires != b; m_bFlyWires = b; return bChanged; } bool SetGroundFill(bool b) { const bool bChanged = m_bGroundFill != b; m_bGroundFill = b; return bChanged; } bool SetVerticalStrips(bool b) { const bool bChanged = m_bVerticalStrips != b; m_bVerticalStrips = b; return bChanged; } bool SetCompEdit(bool b) { const bool bChanged = m_bCompEdit != b; m_bCompEdit = b; return bChanged; } bool SetXthermals(bool b) { const bool bChanged = m_bXthermals != b; m_bXthermals = b; return bChanged; } bool SetInverseMono(bool b) { const bool bChanged = m_bInverseMono != b; m_bInverseMono = b; return bChanged; } bool SetColoredMono(bool b) { const bool bChanged = m_bColoredMono != b; m_bColoredMono = b; return bChanged; } const MyRGB& GetBackgroundColor() const { return m_backgroundColor; } const int& GetCurrentLayer() const { return m_currentLayer; } const int& GetCurrentNodeId() const { return m_currentNodeId; } const int& GetCurrentCompId() const { return m_currentCompId; } const int& GetGroundNodeId0() const { return m_groundNodeId0; } const int& GetGroundNodeId1() const { return m_groundNodeId1; } const int& GetCurrentTextId() const { return m_currentTextId; } const DIAGSMODE& GetDiagsMode() const { return m_diagsMode; } const TRACKMODE& GetTrackMode() const { return m_iTrackMode; } const COMPSMODE& GetCompMode() const { return m_iCompMode; } const HOLETYPE& GetHoleType() const { return m_iHoleType; } const int& GetGRIDPIXELS() const { return m_GRIDPIXELS; } const int& GetPAD_MIL() const { return m_PAD_MIL; } const int& GetTRACK_MIL() const { return m_TRACK_MIL; } const int& GetTAG_MIL() const { return m_TAG_MIL; } const int& GetHOLE_MIL() const { return m_HOLE_MIL; } const int& GetGAP_MIL() const { return m_GAP_MIL; } const int& GetMASK_MIL() const { return m_MASK_MIL; } const int& GetSILK_MIL() const { return m_SILK_MIL; } const int& GetEDGE_MIL() const { return m_EDGE_MIL; } const int& GetFILL_MIL() const { return m_FILL_MIL; } const int& GetVIAPAD_MIL() const { return m_VIAPAD_MIL; } const int& GetVIAHOLE_MIL() const { return m_VIAHOLE_MIL; } Q_DECL_CONSTEXPR static inline int GetPAD_IC_MIL() { return 24; } Q_DECL_CONSTEXPR static inline int GetTRACK_IC_MIL() { return 18; } Q_DECL_CONSTEXPR static inline int GetMIN_IC_MIL() { return 14; } const int& GetRenderQuality() const { return m_iRenderQuality; } const int& GetSaturation() const { return m_iSaturation; } const int& GetFillSaturation() const { return m_iFillSaturation; } const int& GetCropMargin() const { return m_iCropMargin; } const int& GetTargetRows() const { return m_iTargetRows; } const int& GetTargetCols() const { return m_iTargetCols; } const int& GetTextSizeComp() const { return m_iTextSizeComp; } const int& GetTextSizePins() const { return m_iTextSizePins; } const int& GetRoutingMethod() const { return m_iRoutingMethod; } const bool& GetShowTarget() const { return m_bShowTarget; } const bool& GetShowCloseTracks() const { return m_bShowCloseTracks; } const bool& GetWireShare() const { return m_bWireShare; } const bool& GetWireCross() const { return m_bWireCross; } const bool& GetVeroTracks() const { return m_bVeroTracks; } const bool& GetCurvedTracks() const { return m_bCurvedTracks; } const bool& GetFatTracks() const { return m_bFatTracks; } const bool& GetRoutingEnabled() const { return m_bRoutingEnabled; } const bool& GetViasEnabled() const { return m_bViasEnabled; } const bool& GetShowGrid() const { return m_bShowGrid; } const bool& GetShowText() const { return m_bShowText; } const bool& GetFlipH() const { return m_bFlipH; } const bool& GetFlipV() const { return m_bFlipV; } const bool& GetShowPinLabels() const { return m_bPinLabels; } const bool& GetShowFlyWires() const { return m_bFlyWires; } const bool& GetGroundFill() const { return m_bGroundFill; } const bool& GetVerticalStrips() const { return m_bVerticalStrips; } const bool& GetCompEdit() const { return m_bCompEdit; } const bool& GetXthermals() const { return m_bXthermals; } const bool& GetInverseMono() const { return m_bInverseMono; } const bool& GetColoredMono() const { return m_bColoredMono; } // Helpers bool SetGroundNodeId() { return ( GetCurrentLayer() == 0 ) ? SetGroundNodeId0( GetCurrentNodeId() ) : SetGroundNodeId1( GetCurrentNodeId() ); } const int& GetGroundNodeId(int lyr) const { return ( lyr == 0 ) ? GetGroundNodeId0() : GetGroundNodeId1(); } bool GetUsePCBshapes() { return GetTrackMode() == TRACKMODE::PCB || GetTrackMode() == TRACKMODE::MONO; } bool GetMirrored() const { return GetFlipH() || GetFlipV(); } bool SetTrackSliderValue(int i) { const bool bChanged = ( GetTrackSliderValue() != i ); SetTrackMode( static_cast(i) ); return bChanged; } bool SetCompSliderValue(int i) { const bool bChanged = ( GetCompSliderValue() != i ); SetCompMode( static_cast(i) ); return bChanged; } int GetTrackSliderValue() const { return static_cast(GetTrackMode()); } int GetCompSliderValue() const { return static_cast(GetCompMode()); } double GetSilkWidth() const { return std::max(1.0, GetGRIDPIXELS() * GetSILK_MIL() * 0.010 ); } // Silk-screen pen width in pixels double GetEdgeWidth() const { return std::max(1.0, GetGRIDPIXELS() * GetEDGE_MIL() * 0.010 ); } // Board edge margin in pixels double GetFillWidth() const { return std::max(1.0, GetGRIDPIXELS() * GetFILL_MIL() * 0.010 ); } // Ground-fill perimeter in pixels int GetHalfPixelsFromMIL(int iMIL) const { return std::max(1, static_cast (GetGRIDPIXELS() * iMIL * 0.005 )); } int GetPixelsFromMIL(int iMIL) const { return std::max(1, static_cast (GetGRIDPIXELS() * iMIL * 0.010 )); } void CalcBlob(qreal W, const QPointF& pC, const QPointF& pCoffset, int iPadWidthMIL, int iPerimeterCode, int iTagCode, std::list& out, bool bHavePad, bool bHaveSoic, bool bIsGnd, bool bGap = false) const; void CalcSOIC(qreal W, const QPointF& pC, size_t pinIndex, const Component* pComp, std::list& out, bool bSolderMask, bool bIsGnd, bool bGap = false) const; void Reset() // For use with File->New() { m_currentLayer = 0; m_currentCompId = BAD_COMPID; m_currentNodeId = BAD_NODEID; m_groundNodeId0 = BAD_NODEID; m_groundNodeId1 = BAD_NODEID; m_currentTextId = BAD_TEXTID; m_diagsMode = DIAGSMODE::MIN; m_iTrackMode = TRACKMODE::COLOR; m_iCompMode = COMPSMODE::NAME; m_iFillSaturation = 0; m_bShowTarget = false; m_bShowCloseTracks = false; m_bVeroTracks = false; m_bCurvedTracks = false; m_bFatTracks = true; m_bRoutingEnabled = false; m_bViasEnabled = true; m_bShowGrid = true; m_bShowText = true; m_bFlipH = false; m_bFlipV = false; m_bPinLabels = true; m_bFlyWires = true; m_bGroundFill = false; m_bCompEdit = false; m_bXthermals = false; m_bInverseMono = false; m_bColoredMono = false; } private: MyRGB m_backgroundColor = MyRGB(0xFFFFFF); int m_currentLayer = 0; // Currently selected layer for display int m_currentCompId = BAD_COMPID; // Currently selected component ID int m_currentNodeId = BAD_NODEID; // Currently selected node ID int m_groundNodeId0 = BAD_NODEID; // The node ID used for ground-fill on layer 0 int m_groundNodeId1 = BAD_NODEID; // The node ID used for ground-fill on layer 1 int m_currentTextId = BAD_TEXTID; // Currently selected text box DIAGSMODE m_diagsMode = DIAGSMODE::MIN; // OFF, MIN, MAX TRACKMODE m_iTrackMode = TRACKMODE::COLOR; // OFF, MONO, COLOR, PCB COMPSMODE m_iCompMode = COMPSMODE::NAME; // OFF, OUTLINE, NAME, VALUE HOLETYPE m_iHoleType = HOLETYPE::NPTH; // NPTH, PTH (Non-Plated Through Hole, Plated Through Hole) int m_GRIDPIXELS = 24; // Default 24 pixels per grid square (i.e. per 100 mil) int m_PAD_MIL = 60; // Range 50 to 98 int m_TRACK_MIL = 24; // Range 12 to 50 int m_TAG_MIL = 12; // Range 12 to 50 (Same range as m_TRACK_MIL for backward compatibility) int m_HOLE_MIL = 34; // Range 20 to 40 int m_GAP_MIL = 10; // Range 5 to 30 int m_MASK_MIL = 4; // Range 0 to 10 int m_SILK_MIL = 7; // Range 1 to 10 int m_EDGE_MIL = 0; // Range 0 to 50 int m_FILL_MIL = 0; // Range 0 to 50 int m_VIAPAD_MIL = 50; // Range 50 to 80 int m_VIAHOLE_MIL = 25; // Range 20 to 40 int m_iRenderQuality = 1; // 0 (Low) to 1 (High) int m_iSaturation = 60; // Track color saturation (20 to 100 percent) int m_iFillSaturation = 0; // Component fill saturation (0 to 100 percent) int m_iCropMargin = 0; // Number of border squares after auto-crop int m_iTargetRows = 10; // Desired board size int m_iTargetCols = 10; // Desired board size int m_iTextSizeComp = 9; // Point size for component text int m_iTextSizePins = 9; // Point size for component pins int m_iRoutingMethod = 0; // Routing method. 0 ==> fast, 1 ==> allow rip-up bool m_bShowTarget = false; // true ==> show target board area bool m_bShowCloseTracks = false; // true ==> show circles near places with smallest track separation bool m_bWireShare = true; // true ==> allow 2 wires per hole bool m_bWireCross = false; // true ==> allow wires to cross/overlay bool m_bVeroTracks = false; bool m_bCurvedTracks = false; bool m_bFatTracks = true; bool m_bRoutingEnabled = false; bool m_bViasEnabled = true; // true ==> allow vias for 2-layer boards bool m_bShowGrid = true; // true ==> show grid dots bool m_bShowText = true; // true ==> show text boxes bool m_bFlipH = false; // true ==> flip L and R (with no manual manipulation) bool m_bFlipV = false; // true ==> flip T and B (with no manual manipulation) bool m_bPinLabels = true; // Show SIP/DIP pins as labels in non-mono mode bool m_bFlyWires = true; // Show flying wires bool m_bGroundFill = false; bool m_bVerticalStrips = true; bool m_bCompEdit = false; // true ==> component editor mode bool m_bXthermals = false; // true ==> force X thermal reliefs and hide tracks in ground-fill bool m_bInverseMono = false; // true ==> white tracks on black background bool m_bColoredMono = false; // true ==> colored tracks in mono mode }; VeroRoute/libraries/gEDA/veroroute_electromechanical/Switch_Onboard_DPST.sym000644 001750 001750 00000001724 13515171160 027521 0ustar00alexalex000000 000000 v 20130925 2 T 300 1000 8 10 0 0 0 0 1 numslots=0 P 300 1000 0 1000 1 0 1 { T 150 1050 5 10 1 1 0 0 1 pinnumber=3 T 150 1050 5 10 0 0 0 0 1 pinseq=3 T 150 1050 5 10 0 0 0 0 1 pinlabel=3 T 150 1050 5 10 0 0 0 0 1 pintype=pas } P 600 1000 900 1000 1 0 1 { T 750 1050 5 10 1 1 0 0 1 pinnumber=1 T 750 1050 5 10 0 0 0 0 1 pinseq=1 T 750 1050 5 10 0 0 0 0 1 pinlabel=1 T 750 1050 5 10 0 0 0 0 1 pintype=pas } P 300 500 0 500 1 0 1 { T 150 550 5 10 1 1 0 0 1 pinnumber=4 T 150 550 5 10 0 0 0 0 1 pinseq=4 T 150 550 5 10 0 0 0 0 1 pinlabel=4 T 150 550 5 10 0 0 0 0 1 pintype=pas } P 600 500 900 500 1 0 1 { T 750 550 5 10 1 1 0 0 1 pinnumber=2 T 750 550 5 10 0 0 0 0 1 pinseq=2 T 750 550 5 10 0 0 0 0 1 pinlabel=2 T 750 550 5 10 0 0 0 0 1 pintype=pas } L 300 1000 600 1200 3 0 0 0 -1 -1 L 300 500 600 700 3 0 0 0 -1 -1 T 200 0 5 10 1 1 0 0 1 device=Name T 300 200 8 10 1 1 0 0 1 refdes=S? T 495 493 8 10 0 0 0 0 1 footprint=SWITCH_ST4 T 495 493 8 10 0 0 0 0 1 description=Onboard Switch VeroRoute/Src/bomdialog.cpp000644 001750 001750 00000017252 14412276215 016137 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #include "bomdialog.h" #include "ui_bomdialog.h" #include "mainwindow.h" #include BomDialog::BomDialog(MainWindow* parent) : QDialog(parent) , ui(new Ui_BomDialog) , m_pMainWindow(parent) { ui->setupUi(this); #ifdef VEROROUTE_ANDROID ui->tableWidget->verticalScrollBar()->setStyleSheet( ANDROID_VSCROLL_WIDTH ); ui->tableWidget->horizontalScrollBar()->setStyleSheet( ANDROID_HSCROLL_HEIGHT ); #endif QObject::connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(WriteToFile())); QObject::connect(this, SIGNAL(rejected()), m_pMainWindow, SLOT(UpdateControls())); // Close using X button } BomDialog::~BomDialog() { delete ui; } struct IsEarlierInBOM { bool operator()(const Component* pA, const Component* pB) const { // First order by type ... if ( pA->GetType() != pB->GetType() ) return static_cast(pA->GetType()) < static_cast(pB->GetType()); // ... then by value string comparison const int i = pA->GetValueStr().compare( pB->GetValueStr() ); if ( i != 0 ) return i < 0; // ... then by name length if ( pA->GetNameStr().length() != pB->GetNameStr().length() ) return pA->GetNameStr().length() < pB->GetNameStr().length(); // ... then by name string comparison return pA->GetNameStr().compare( pB->GetNameStr() ) < 0; } }; void BomDialog::Update() { std::vector pComps; // Make list of pointers to all components for the B.O.M. for (const auto& mapObj : m_pMainWindow->m_board.GetCompMgr().GetMapIdToComp()) { const Component& comp = mapObj.second; switch( comp.GetType() ) { case COMP::VERO_NUMBER: case COMP::VERO_LETTER: case COMP::MARK: case COMP::PAD: case COMP::PAD_FLYINGWIRE: case COMP::WIRE: break; // Not true components for BOM default: pComps.push_back(&comp); } } std::stable_sort(pComps.begin(), pComps.end(), IsEarlierInBOM()); // Sort the list appropriately // Set up the table ui->tableWidget->clear(); ui->tableWidget->setColumnCount(4); ui->tableWidget->setColumnWidth(0,190); ui->tableWidget->setColumnWidth(1,310); ui->tableWidget->setColumnWidth(2,100); ui->tableWidget->setColumnWidth(3,80); // Allow for vertical scroll bar m_tableHeader << "Name" << "Type" << "Value" << "Quantity"; ui->tableWidget->setHorizontalHeaderLabels(m_tableHeader); ui->tableWidget->verticalHeader()->setVisible(false); ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); ui->tableWidget->setSelectionMode(QAbstractItemView::NoSelection); ui->tableWidget->setShowGrid(true); // Populate the table with data int numRows(0); for (int iLoop = 0; iLoop < 2; iLoop++) // First pass only counts number of rows { if ( iLoop == 1 ) // If second pass ... ui->tableWidget->setRowCount(numRows); // ... set row count std::string rowNames(""), rowType(""), rowValue(""); int row(-1), rowQuantity(0); for (const auto& p : pComps) { const bool bLast = ( p == pComps.back() ); auto& strNewValue = p->GetValueStr(); auto strNewType = CompTypes::GetFamilyStr( p->GetType() ); if ( !StringHelper::IsEmptyStr(strNewType) ) strNewType += ": "; strNewType += p->GetFullTypeStr(); const bool bNewRow = ( row == -1) || ( strNewValue != rowValue ) || ( strNewType != rowType ); if ( bNewRow ) { if ( row != -1 && iLoop == 1 ) // If have a previous row ... { // Write previous row to table. Note: No memory leak since setItem() takes ownership. ui->tableWidget->setItem(row, 0, new QTableWidgetItem(QString::fromStdString(rowNames))); ui->tableWidget->setItem(row, 1, new QTableWidgetItem(QString::fromStdString(rowType))); ui->tableWidget->setItem(row, 2, new QTableWidgetItem(QString::fromStdString(rowValue))); ui->tableWidget->setItem(row, 3, new QTableWidgetItem(QString::number(rowQuantity))); } // Initialise data for new row row++; rowQuantity = 1; rowNames = p->GetNameStr(); rowValue = strNewValue; rowType = strNewType; } else { // Update data for row rowQuantity++; rowNames = rowNames + ", " + p->GetNameStr(); } if ( bLast && iLoop == 1 ) // Very last component in the B.O.M. { // Write current row to table. Note: No memory leak since setItem() takes ownership. ui->tableWidget->setItem(row, 0, new QTableWidgetItem(QString::fromStdString(rowNames))); ui->tableWidget->setItem(row, 1, new QTableWidgetItem(QString::fromStdString(rowType))); ui->tableWidget->setItem(row, 2, new QTableWidgetItem(QString::fromStdString(rowValue))); ui->tableWidget->setItem(row, 3, new QTableWidgetItem(QString::number(rowQuantity))); } } numRows = row + 1; } ui->pushButton->setDisabled( pComps.empty() ); } void BomDialog::WriteToFile() { #ifdef VEROROUTE_ANDROID const QString name = m_pMainWindow->GetFileName().isEmpty() ? QString("Circuit.vrt") : m_pMainWindow->GetFileName(); QString defaultName = StringHelper::ReplaceSuffix(name, QString("txt")); // Replace vrt with txt QFile file(defaultName); if ( file.exists() ) defaultName.clear(); else defaultName = StringHelper::GetTidyFileName(defaultName); QMessageBox::information(this, tr("Information"), tr("You must now select or enter a filename ending in .txt")); const QString fileName = m_pMainWindow->GetSaveFileName(defaultName, tr("Text (*.txt);;All Files (*)"), QString("txt")); #else const QString fileName = m_pMainWindow->GetSaveFileName(tr("Choose a TXT file"), tr("Text (*.txt);;All Files (*)"), QString("txt")); #endif if ( !fileName.isEmpty() ) { QFile file; file.setFileName( fileName ) ; QTextStream os; const bool bOK = file.open(QIODevice::WriteOnly); if ( bOK ) { os.setDevice(&file); #if QT_VERSION >= QT_VERSION_CHECK(5,14,0) os << "Name" << "\t" << "Type" << "\t" << "Value" << "\t" << "Quantity" << Qt::endl; #else os << "Name" << "\t" << "Type" << "\t" << "Value" << "\t" << "Quantity" << endl; #endif const int numRows = ui->tableWidget->rowCount(); const int numCols = ui->tableWidget->columnCount(); for (int i = 0; i < numRows; i++) { for(int j = 0; j < numCols; j++) { os << ui->tableWidget->item(i,j)->text(); if ( j != numCols - 1 ) os << "\t"; } #if QT_VERSION >= QT_VERSION_CHECK(5,14,0) os << Qt::endl; #else os << endl; #endif } #if QT_VERSION >= QT_VERSION_CHECK(5,14,0) os << Qt::endl; #else os << endl; #endif file.close(); } else QMessageBox::information(this, tr("Unable to save file"), fileName); } } void BomDialog::keyPressEvent(QKeyEvent* event) { #ifndef VEROROUTE_ANDROID m_pMainWindow->specialKeyPressEvent(event); #endif QDialog::keyPressEvent(event); event->accept(); } void BomDialog::keyReleaseEvent(QKeyEvent* event) { #ifdef VEROROUTE_ANDROID if ( event->key() == Qt::Key_Back ) { QTimer::singleShot(0, m_pMainWindow, SLOT(HideBomDialog())); return event->accept(); } #else m_pMainWindow->commonKeyReleaseEvent(event); #endif QDialog::keyReleaseEvent(event); event->accept(); } VeroRoute/Src/Grid.h000644 001750 001750 00000033361 14420545172 014533 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include "CompElement.h" #include "Element.h" #include "CompTypes.h" // For component length limits // Grid is a templatized 3-dimensional array, with data that can be indexed by layer, row and column Q_DECL_CONSTEXPR static const int LYR_BOT = 0; Q_DECL_CONSTEXPR static const int LYR_TOP = 1; template class Grid : public Persist, public Merge { public: Grid() { Allocate(0, 0, 0); } Grid(const Grid& o) { *this = o; } virtual ~Grid() { DeAllocate(); } Grid& operator=(const Grid& o) { Allocate(o.m_lyrs, o.m_rows, o.m_cols); for (int i = 0, iSize = GetSize(); i < iSize; i++) m_pData[i] = o.m_pData[i]; return *this; } bool operator==(const Grid& o) const // Compare persisted info { bool bOK = m_lyrs == o.m_lyrs && m_rows == o.m_rows && m_cols == o.m_cols; for (int i = 0, iSize = GetSize(); i < iSize && bOK; i++) bOK = ( m_pData[i] == o.m_pData[i] ); return bOK; } bool operator!=(const Grid& o) const { return !(*this == o); } void Clear(const T& val) { for (int i = 0, iSize = GetSize(); i < iSize; i++) m_pData[i] = val; } void Allocate(int lyrs, int rows, int cols) { DeAllocate(); m_lyrs = lyrs; m_rows = rows; m_cols = cols; m_pData = new T[m_lyrs * m_rows * m_cols]; m_ppData = new T*[m_lyrs * m_rows]; m_pppData = new T**[m_lyrs]; for (int i = 0, iSize = m_lyrs * m_rows; i < iSize; i++) m_ppData[i] = m_pData + i * m_cols; for (int i = 0, iSize = m_lyrs; i < iSize; i++) m_pppData[i] = m_ppData + i * m_rows; } void DeAllocate() { if ( m_pppData ) delete[] m_pppData; if ( m_ppData ) delete[] m_ppData; if ( m_pData ) delete[] m_pData; m_pppData = nullptr; m_ppData = nullptr; m_pData = nullptr; m_lyrs = m_rows = m_cols = 0; } const int& GetLyrs() const { return m_lyrs; } const int& GetRows() const { return m_rows; } const int& GetCols() const { return m_cols; } int GetSize() const { return m_lyrs * m_rows * m_cols; } bool GetHaveBotLyr() const { return m_lyrs >= 1; } bool GetHaveTopLyr() const { return m_lyrs == 2; } void GetRowCol(const T* p, int& row, int& col) const { int lyr; // dummy GetLyrRowCol(p, lyr, row, col); } void GetLyrRowCol(const T* p, int& lyr, int& row, int& col) const { const size_t ii = ( p - m_pData ); assert( ii < static_cast ( GetSize() ) ); const int i = static_cast (ii); const int rowLyr = i / m_cols; col = i % m_cols; lyr = rowLyr / m_rows; row = rowLyr % m_rows; } T* GetAt(int i) { return m_pData + i; } T* GetAtConst(int i) const { return m_pData + i; } T* Get(int lyr, int row, int col) const { return m_pppData[lyr][row] + col;} void SetAt(int i, const T& val) { m_pData[i] = val; } void Set(int lyr, int row, int col, const T& o) { m_pppData[lyr][row][col] = o; } void Grow(int incLyrs, int incRows, int incCols) // Grow/shrink the current array { if ( incLyrs == 0 && incRows == 0 && incCols == 0 ) return; Grid tmp(*this); // Make a temporary copy of this grid Allocate(m_lyrs + incLyrs, m_rows + incRows, m_cols + incCols); // Re-allocate this grid to make it larger/smaller // Now copy the tmp data into the new grid for (int lyr = 0, lyrs = std::min(GetLyrs(), tmp.GetLyrs()); lyr < lyrs; lyr++) for (int row = 0, rows = std::min(GetRows(), tmp.GetRows()); row < rows; row++) for (int col = 0, cols = std::min(GetCols(), tmp.GetCols()); col < cols; col++) m_pppData[lyr][row][col] = tmp.m_pppData[lyr][row][col]; } // Merge interface functions virtual void UpdateMergeOffsets(MergeOffsets& o) override { // o.deltaLyr = std::max(o.deltaLyr, GetLyrs() + 1); o.deltaRow = std::max(o.deltaRow, GetRows() + 1); // o.deltaCol = std::max(o.deltaCol, GetCols() + 1); for (int i = 0, iSize = GetSize(); i < iSize; i++) m_pData[i].UpdateMergeOffsets(o); } virtual void ApplyMergeOffsets(const MergeOffsets& o) override { for (int i = 0, iSize = GetSize(); i < iSize; i++) m_pData[i].ApplyMergeOffsets(o); } void Merge(const Grid& src, const MergeOffsets& o) { for (int lyr = 0, lyrs = src.GetLyrs(); lyr < lyrs; lyr++) for (int row = 0, rows = src.GetRows(); row < rows; row++) for (int col = 0, cols = src.GetCols(); col < cols; col++) Get(lyr + o.deltaLyr, row + o.deltaRow, col + o.deltaCol)->Merge(*src.Get(lyr, row, col)); } // Persist interface functions virtual void Load(DataStream& inStream) override { int lyrs(1), rows(1), cols(1); inStream.Load(rows); inStream.Load(cols); if ( inStream.GetVersion() >= VRT_VERSION_34 ) inStream.Load(lyrs); // Added in VRT_VERSION_34 Allocate(lyrs, rows, cols); for (int i = 0, iSize = GetSize(); i < iSize; i++) m_pData[i].Load(inStream); } virtual void Save(DataStream& outStream) override { outStream.Save(m_rows); outStream.Save(m_cols); outStream.Save(m_lyrs); // Added in VRT_VERSION_34 for (int i = 0, iSize = GetSize(); i < iSize; i++) m_pData[i].Save(outStream); } private: int m_lyrs = 0; int m_rows = 0; int m_cols = 0; T* m_pData = nullptr; T** m_ppData = nullptr; T*** m_pppData = nullptr; // So we can access data using [][][] }; // The PinGrid class is used by the component editor class (CompDefiner) typedef Grid PinGrid; typedef Grid TrackElementGrid; // The CompElementGrid class is used for component footprints and "track footprints". // It can handle simple transformations like stretching and rotating. // The internal "direction" of a CompElementGrid is always West ('W') // meaning that Pin 1 is to the West (left) of the centre. // For example, a resistor footprint is always stored as a CompElementGrid with a // single horizontal row, with the first pin on the far left and the second pin on the far right. // If we rotate a component so it points in another direction on screen, then any // methods that access the CompElementGrid information in a spatial way should specify // the component direction so the internal data can be read correctly. class CompElementGrid : public Grid { public: CompElementGrid() : Grid() {} CompElementGrid(const CompElementGrid& o) : Grid(o) { *this = o; } virtual ~CompElementGrid() override {} CompElementGrid& operator=(const CompElementGrid& o) { Grid::operator=(o); return *this; } bool operator==(const CompElementGrid& o) const { return Grid::operator==(o); } bool operator!=(const CompElementGrid& o) const { return Grid::operator!=(o); } const int& GetCols(char direction = 'W') const { switch( direction ) // Component direction: 'W','E','N','S' { case 'N': case 'S': return Grid::GetRows(); default: return Grid::GetCols(); } } const int& GetRows(char direction = 'W') const { switch( direction ) // Component direction: 'W','E','N','S' { case 'N': case 'S': return Grid::GetCols(); default: return Grid::GetRows(); } } CompElement* Get(int row, int col) const { assert( GetLyrs() == 1 ); return Grid::Get(0, row, col); } CompElement* Get(int lyr, int row, int col, char direction = 'W') const { assert( lyr == 0 && GetLyrs() == 1 ); Transform(row, col, direction); // Handle direction transformation return Grid::Get(lyr, row, col); } void SwapEnds() // For Diodes and LEDs (import from KiCAD netlist needs to swap anode and cathode) { const bool bOK = ( GetLyrs() == 1 && GetRows() == 1 && GetCols() > 1 ); assert(bOK); if ( !bOK ) return; // Pins are assumed to be first and last element on the row CompElement a(*GetAt(0)), b(*GetAt(GetCols()-1)); // Read ends *GetAt(0) = b; *GetAt(GetCols()-1) = a; // Swap ends } void StretchSimple(bool bGrow, const CompElement& initVal) // For simple 2-pin components like resistors, wires, diodes, caps { assert( GetLyrs() == 1 ); // Pins are assumed to be first and last element on the row if ( GetRows() == 1 && ( bGrow || GetCols() > 2 ) ) { CompElement a(*GetAt(0)), b(*GetAt(GetCols()-1)); // Read ends Allocate(GetLyrs(), GetRows(), bGrow ? GetCols() + 1 : GetCols() - 1); // Resize Clear(initVal); *GetAt(0) = a; *GetAt(GetCols()-1) = b; // Set ends } } void StretchComplex(COMP eType, bool bGrow) // For ICs and switches { assert( GetLyrs() == 1 ); if ( !bGrow && GetCols() == CompTypes::GetMinLength(eType) ) return; // Don't shrink to less than min allowed length if ( bGrow && GetCols() == CompTypes::GetMaxLength(eType) ) return; // Don't expand to more than max allowed length const int iDelta = CompTypes::GetStretchIncrement(eType); return Allocate(GetLyrs(), GetRows(), bGrow ? GetCols() + iDelta : GetCols() - iDelta); // Resize } void StretchWidthIC(bool bGrow) // For DIPs only { assert( GetLyrs() == 1 ); if ( !bGrow && GetRows() == 2 ) return; // Don't shrink DIP width to less than 2 rows return Allocate(GetLyrs(), bGrow ? GetRows() + 1 : GetRows() - 1, GetCols()); // Resize } virtual void Load(DataStream& inStream) override { if ( inStream.GetVersion() >= VRT_VERSION_11 ) return Grid::Load(inStream); // Handle legacy VRTs where components used a simple PinGrid instead of an CompElementGrid int rows(0), cols(0); inStream.Load(rows); inStream.Load(cols); const int lyrs = ( rows > 0 && cols > 0 ) ? 1 : 0; Allocate(lyrs, rows, cols); CompElement tmp; const int iSize = GetSize(); for (int i = 0; i < iSize; i++) { tmp.Pin::Load(inStream); // Just load the Pin info SetAt(i, tmp); } } private: void Transform(int& row, int& col, char direction) const { assert( GetLyrs() == 1 ); // On input: (row,col) are the "footprint" co-ordinates (as seen on screen). // On output: (row,col) have been set to the corresponding internal values. const int rTmp(row), cTmp(col); switch( direction ) // Component direction: 'W','E','N','S' { case 'W': return; case 'E': row = Grid::GetRows()-1 - rTmp; col = Grid::GetCols()-1 - cTmp; return; case 'N': row = Grid::GetRows()-1 - cTmp; col = rTmp; return; case 'S': row = cTmp; col = Grid::GetCols()-1 - rTmp; return; } } }; // The ElementGrid is used for the board and has a hidden toroidal behaviour. // So things that move too far right can appear on the left. // Similarly for top and bottom. // It's a lazy way of avoiding bounds checking during development. // More importantly, it makes the neighbouring element concept simpler // since every element will always have non-null neighbour pointers. class ElementGrid : public Grid { public: ElementGrid() : Grid() {} ElementGrid(const ElementGrid& o) : Grid(o) { *this = o; } virtual ~ElementGrid() override {} ElementGrid& operator=(const ElementGrid& o) { Grid::operator=(o); return *this; } bool operator==(const ElementGrid& o) const { return Grid::operator==(o); } bool operator!=(const ElementGrid& o) const { return Grid::operator!=(o); } void MakeToroid(int& row, int& col) const // Make co-ordinates wrap around at grid edges { assert( GetRows() > 0 ); if ( GetRows() > 0 ) { while ( row < 0 ) { row += GetRows(); } while ( row >= GetRows() ) { row -= GetRows(); } } assert( GetCols() > 0 ); if ( GetCols() > 0 ) { while ( col < 0 ) { col += GetCols(); } while ( col >= GetCols() ) { col -= GetCols(); } } } void MakeToroid(int& lyr, int& row, int& col) const // Make co-ordinates wrap around at grid edges { assert( GetLyrs() > 0 ); if ( GetLyrs() > 0 ) { while ( lyr < 0 ) { lyr += GetLyrs(); } while ( lyr >= GetLyrs() ) { lyr -= GetLyrs(); } } MakeToroid(row, col); } Element* Get(int lyr, int row, int col) const { MakeToroid(lyr, row, col); // Make co-ordinates wrap around at grid edges return Grid::Get(lyr, row, col); } void Pan(int iDown, int iRight) // Input arguments can be +ve or -ve. { if ( iDown == 0 && iRight == 0 ) return; ElementGrid tmp(*this); // Make a temporary copy of this grid for (int iLyr = 0, lyrs = GetLyrs(); iLyr < lyrs; iLyr++) for (int iRow = 0, rows = GetRows(); iRow < rows; iRow++) for (int iCol = 0, cols = GetCols(); iCol < cols; iCol++) Set(iLyr, iRow, iCol, *(tmp.Get(iLyr, iRow - iDown, iCol - iRight))); // ElementGrid::Get() accounts for toroidal behaviour } bool CopyFrom(const TrackElementGrid& o) { if ( o.GetLyrs() != GetLyrs() || o.GetRows() != GetRows() || o.GetCols() != GetCols() ) return false; for (int i = 0, iSize = GetSize(); i < iSize; i++) GetAt(i)->TrackElement::operator=(*o.GetAtConst(i)); return true; } void CopyTo(TrackElementGrid& o) const { if ( o.GetLyrs() != GetLyrs() || o.GetRows() != GetRows() || o.GetCols() != GetCols() ) o.Allocate(GetLyrs(), GetRows(), GetCols()); for (int i = 0, iSize = GetSize(); i < iSize; i++) o.GetAt(i)->operator=(*GetAtConst(i)); } size_t GetNumNodeIds() const { std::set nodeIds; for (int i = 0, iSize = GetSize(); i < iSize; i++) { const int& iNodeId = GetAtConst(i)->GetNodeId(); if ( iNodeId != BAD_NODEID ) nodeIds.insert(iNodeId); } return nodeIds.size(); } }; VeroRoute/Src/ColorManager.h000644 001750 001750 00000022504 14433252576 016223 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include "AdjInfoManager.h" #include "MyRGB.h" #include "Grid.h" #define MYNUMCOLORS 12 #define MY_GREY (MYNUMCOLORS) #define MY_BLACK (MYNUMCOLORS+1) #define MY_WHITE (MYNUMCOLORS+2) #define NUM_PIXMAP_COLORS (MYNUMCOLORS+3) #define MY_LYR_BOT (MYNUMCOLORS+4) #define MY_LYR_TOP (MYNUMCOLORS+5) // Manager class to handle assignment of colors to nodeIds const int BAD_COLORID = -1; class ColorManager : public Persist, public Merge { public: ColorManager() : m_iSaturation(100), m_iFillSaturation(0), m_bReAssign(true) {} virtual ~ColorManager() {} ColorManager(const ColorManager& o) { *this = o; } // Never called ColorManager& operator=(const ColorManager& o) { m_mapNodeIdToColorId.clear(); m_mapNodeIdToColorId.insert(o.m_mapNodeIdToColorId.begin(), o.m_mapNodeIdToColorId.end()); m_mapNodeIdToCustomColor.clear(); m_mapNodeIdToCustomColor.insert(o.m_mapNodeIdToCustomColor.begin(), o.m_mapNodeIdToCustomColor.end()); m_iSaturation = o.m_iSaturation; m_iFillSaturation = o.m_iFillSaturation; m_bReAssign = o.m_bReAssign; return *this; } bool operator==(const ColorManager& o) const { if ( m_mapNodeIdToCustomColor.size() != o.m_mapNodeIdToCustomColor.size() ) return false; for (const auto& mapObj : m_mapNodeIdToCustomColor) { const auto iter = o.m_mapNodeIdToCustomColor.find( mapObj.first ); if ( iter == o.m_mapNodeIdToCustomColor.end() ) return false; if ( mapObj.second != iter->second ) return false; } return true; } bool operator!=(const ColorManager& o) const { return !(*this == o); } void Clear() { m_mapNodeIdToColorId.clear(); m_mapNodeIdToCustomColor.clear(); ReAssignColors(); } void ReAssignColors() { m_bReAssign = true; } void SetSaturation(int i) { m_iSaturation = i; } void SetFillSaturation(int i) { m_iFillSaturation = i; } void SetNodeColor(int nodeId, const QColor& color) { if ( nodeId != BAD_NODEID ) m_mapNodeIdToCustomColor[nodeId] = MyRGB(color); } bool GetIsFixed(int nodeId) const { return m_mapNodeIdToCustomColor.find(nodeId) != m_mapNodeIdToCustomColor.end(); } void Fix(int nodeId) { if ( nodeId == BAD_NODEID || GetIsFixed(nodeId) ) return; // Already fixed const int colorId = m_mapNodeIdToColorId[nodeId]; const bool bOK = colorId != BAD_COLORID; assert(bOK); if ( bOK ) m_mapNodeIdToCustomColor[nodeId] = GetPixmapRGB(colorId, false); } void Unfix(int nodeId) { auto iter = m_mapNodeIdToCustomColor.find(nodeId); if ( iter != m_mapNodeIdToCustomColor.end() ) m_mapNodeIdToCustomColor.erase(iter); } void CalculateColors(const AdjInfoManager& adjManager, ElementGrid* pBoard) // The coloring algorithm { std::vector nodeIds; adjManager.GetBoardNodeIds(nodeIds); // The set of valid nodeIDs on the board if ( m_bReAssign ) { if ( pBoard->GetNumNodeIds() > MYNUMCOLORS ) m_mapNodeIdToColorId.clear(); // Only wipe if we require more colors m_bReAssign = false; } std::list cnList[MYNUMCOLORS]; // Lists of nodeIds used by colours int iStartColorId(0); for (size_t i = 0, iSize = nodeIds.size(); i < iSize; i++) // Loop nodeIds on board { const int& nodeIdI = nodeIds[i]; const int colorIdI = GetColorId(nodeIdI); if ( colorIdI != BAD_COLORID ) { cnList[colorIdI].push_back(nodeIdI); // Update list continue; // Don't recolor } const AdjInfo* pI = adjManager.GetAdjInfo( nodeIdI ); int bestColorId(0), minCost(INT_MAX); for (int iLoopColor = 0; iLoopColor < MYNUMCOLORS; iLoopColor++) { const int iColorId = ( iStartColorId + iLoopColor ) % MYNUMCOLORS; m_mapNodeIdToColorId[nodeIdI] = iColorId; int cost(0); for (size_t j = 0; j < iSize; j++) // Loop nodeIds on board { if ( j == i ) continue; // Skip self const int& nodeIdJ = nodeIds[j]; if ( !pI->GetHasAdj(nodeIdJ) ) continue; // Skip non-adjacent nodes if ( iColorId == GetColorId(nodeIdJ) ) cost++; } if ( cost < minCost ) { minCost = cost; bestColorId = iColorId; } // Update bestColorId } m_mapNodeIdToColorId[nodeIdI] = bestColorId; cnList[bestColorId].push_back(nodeIdI); // Update list iStartColorId = bestColorId; } // Handle case when we have unused colors while ( true ) { // Find first unused colorId, and the most used colorId (used more than once) int iMostUsedColor(BAD_COLORID), iUnusedColor(BAD_COLORID); size_t nMaxCount(1); for (int i = 0; i < MYNUMCOLORS; i++) { if ( cnList[i].size() > nMaxCount ) { iMostUsedColor = i; nMaxCount = cnList[i].size(); } if ( cnList[i].size() == 0 && iUnusedColor == BAD_COLORID) iUnusedColor = i; } if ( iUnusedColor == BAD_COLORID ) break; // All colors used if ( iMostUsedColor == BAD_COLORID ) break; // No color used more than once // Do the color swap auto iter = cnList[iMostUsedColor].begin(); ++iter; const int iNodeId = *iter; // Pick second lowest nodeId m_mapNodeIdToColorId[iNodeId] = iUnusedColor; // Give it the unused colorId cnList[iMostUsedColor].erase(iter); // Remove nodeId from list of iMostUsedColor cnList[iUnusedColor].push_back(iNodeId); // Add nodeId to list of iUnusedColor } } int GetColorId(int nodeId) const { if ( nodeId == BAD_NODEID ) return BAD_COLORID; const auto iter = m_mapNodeIdToColorId.find(nodeId); return ( iter != m_mapNodeIdToColorId.end() ) ? iter->second : BAD_COLORID; } QColor GetColorFromNodeId(int nodeId, bool bUseSaturation = true) const { // First check if the nodeId is in the custom list const auto iter = m_mapNodeIdToCustomColor.find(nodeId); if ( iter != m_mapNodeIdToCustomColor.end() ) { int R(0), G(0), B(0); const MyRGB& rgb = iter->second; rgb.GetRGB(R, G, B); if ( bUseSaturation ) HandleSaturation(R, G, B); return QColor(R, G, B); } // Use auto-calculated colors return GetPixmapColor(GetColorId(nodeId), bUseSaturation); } MyRGB GetPixmapRGB(int colorId, bool bUseSaturation = true) const { int R(0), G(0), B(0); if ( colorId == BAD_COLORID ) { R = G = B = 255; } else if ( colorId == MY_GREY ) { R = G = B = 96; } else if ( colorId == MY_WHITE ) { R = G = B = 255; } else if ( colorId == MY_LYR_BOT ) { G = 128; } else if ( colorId == MY_LYR_TOP ) { G = 96; B = 192; } else if ( colorId >= 0 && colorId < MYNUMCOLORS ) { const MyRGB& rgb = sm_color[colorId % MYNUMCOLORS]; rgb.GetRGB(R, G, B); if ( bUseSaturation ) HandleSaturation(R, G, B); } else { assert(colorId == MY_BLACK); } MyRGB rgb; rgb.SetRGB(R, G, B); return rgb; } QColor GetPixmapColor(int colorId, bool bUseSaturation = true) const { return GetPixmapRGB(colorId, bUseSaturation).GetQColor(); } void HandleSaturation(int& R, int&G, int& B) const { const int iA = (100 - m_iSaturation) * 255; if ( m_iFillSaturation == 0 ) { R = ( iA + m_iSaturation * R ) / 100; G = ( iA + m_iSaturation * G ) / 100; B = ( iA + m_iSaturation * B ) / 100; } else { R = G = B = iA / 100; } } // Merge interface functions virtual void UpdateMergeOffsets(MergeOffsets& o) override { for (const auto& mapObj : m_mapNodeIdToCustomColor) if ( mapObj.first != BAD_NODEID ) o.deltaNodeId = std::max(o.deltaNodeId, mapObj.first + 1); } virtual void ApplyMergeOffsets(const MergeOffsets& o) override { std::unordered_map tmp; for (const auto& mapObj : m_mapNodeIdToCustomColor) tmp[mapObj.first + o.deltaNodeId] = mapObj.second; m_mapNodeIdToCustomColor.clear(); m_mapNodeIdToCustomColor.insert(tmp.begin(), tmp.end()); } void Merge(const ColorManager& src) { m_mapNodeIdToCustomColor.insert(src.m_mapNodeIdToCustomColor.begin(), src.m_mapNodeIdToCustomColor.end()); } // Persist interface functions virtual void Load(DataStream& inStream) override { m_mapNodeIdToCustomColor.clear(); unsigned int numNodeIds(0); inStream.Load(numNodeIds); for (unsigned int i = 0; i < numNodeIds; i++) { int iNodeId; MyRGB rgb; inStream.Load(iNodeId); rgb.Load(inStream); m_mapNodeIdToCustomColor[iNodeId] = rgb; } } virtual void Save(DataStream& outStream) override { const unsigned int numNodeIds = static_cast( m_mapNodeIdToCustomColor.size() ); outStream.Save(numNodeIds); for (auto& mapObj : m_mapNodeIdToCustomColor) { outStream.Save(mapObj.first); mapObj.second.Save(outStream); } } private: static MyRGB sm_color[MYNUMCOLORS]; // Hard-coded colors std::unordered_map m_mapNodeIdToColorId; std::unordered_map m_mapNodeIdToCustomColor; int m_iSaturation; // 0 to 100. At 0 the colors would all fade to white. int m_iFillSaturation; // 0 to 100. If non-zero then turn colors grey. bool m_bReAssign; }; VeroRoute/Src/GPainter.h000644 001750 001750 00000020527 14431372005 015352 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include "SimplexFont.h" #include "Transform.h" #include "GWriter.h" #include #include // Painter class that supports Gerber export, supporting transformations // with same convention as some QPainter methods struct GPainter : public QPainter { GPainter() : QPainter() {} virtual ~GPainter() {} void SetGStream(GStream* p) { m_pStream = p; } virtual bool begin(QPaintDevice* p) { if ( !m_pStream ) return QPainter::begin(p); return true; } virtual bool end() { if ( !m_pStream ) return QPainter::end(); return true; } virtual void setFont(const QFont& o) { if ( !m_pStream ) return QPainter::setFont(o); } virtual void setPen(const QPen& o) { if ( !m_pStream ) return QPainter::setPen(o); } virtual void setBrush(const QBrush& o) { if ( !m_pStream ) return QPainter::setBrush(o); } virtual void drawText(int x, int y, int w, int h, int flags, const QString& str, bool bPCB = false) { if ( !bPCB ) return QPainter::drawText(x, y, w, h, flags, str); double X(x), Y(y); std::string stdStr = str.toStdString(); const char* sz = stdStr.c_str(); const auto length = strlen(sz); const double dLetterSep(6); // Letter separation (hard-coded) double dStrWidth(0), dLetterWidth(0); for (size_t i = 0; i < length; i++) { const int simplexIndex = Simplex::GetLetterIndex( sz[i] ); if ( simplexIndex == -1 ) continue; // Unsupported character const auto& limits = Simplex::GetXlimits(simplexIndex); dLetterWidth = limits.second - limits.first; // xMax - xMin dStrWidth += dLetterSep + dLetterWidth; } dStrWidth -= dLetterSep; // End correction if ( flags & Qt::AlignCenter ) X -= dStrWidth * 0.5; else assert(0); QPointF L, R; // Ends of a line segment const double dScale(0.5); // Hard-coded scale for (size_t i = 0; i < length; i++) { const int simplexIndex = Simplex::GetLetterIndex( sz[i] ); if ( simplexIndex == -1 ) continue; // Unsupported character const auto& limits = Simplex::GetXlimits(simplexIndex); dLetterWidth = limits.second - limits.first; // xMax - xMin bool bPenUp(true); const int jEnd = 2 + 2 * Simplex::GetLetterData(simplexIndex, 0); for (int j = 2; j < jEnd; j += 2) { const int ix = Simplex::GetLetterData(simplexIndex, j); const int iy = Simplex::GetLetterData(simplexIndex, j+1); const bool bOK = !( ix == -1 && iy == -1 ); // (-1,-1) ==> A pen up command if ( bOK ) { R.setX(dScale*(X + ix - limits.first)); R.setY(dScale*(10 + Y - iy)); if ( !bPenUp ) drawLine(L, R); // Draw L to R L = R; } bPenUp = !bOK; // Update bPenUp } X += dLetterWidth + dLetterSep; } } virtual void scale(qreal sx, qreal sy) { if ( !m_pStream ) return QPainter::scale(sx, sy); m_transforms.push_front( Transform(TRANSFORM::SCALE, sx, sy) ); } virtual void translate(qreal dx, qreal dy) { if ( !m_pStream ) return QPainter::translate(dx, dy); m_transforms.push_front( Transform(TRANSFORM::TRANSLATE, dx, dy) ); } virtual void rotate(qreal a) { if ( !m_pStream ) return QPainter::rotate(a); m_transforms.push_front( Transform(TRANSFORM::ROTATE, a) ); } virtual void save() { if ( !m_pStream ) return QPainter::save(); m_transforms.push_front( Transform(TRANSFORM::NONE) ); // Add save point } virtual void restore() { if ( !m_pStream ) return QPainter::restore(); bool bDone(false); while( !m_transforms.empty() && !bDone ) { bDone = m_transforms.front().GetType() == TRANSFORM::NONE; // Reached save point m_transforms.pop_front(); } } virtual void drawPoint(const QPointF& p) { if ( !m_pStream ) return QPainter::drawPoint(p); m_polygon.clear(); m_polygon << p; AddPad(); } virtual void drawPoint(int x, int y) { if ( !m_pStream ) return QPainter::drawPoint(x, y); m_polygon.clear(); m_polygon << QPointF(x,y); AddPad(); } virtual void drawLine(int x1, int y1, int x2, int y2) { if ( !m_pStream ) return QPainter::drawLine(x1, y1, x2, y2); m_polygon.clear(); m_polygon << QPointF(x1,y1) << QPointF(x2,y2); AddTrack(); } virtual inline void drawLine(const QPointF& p1, const QPointF& p2) { if ( !m_pStream ) return QPainter::drawLine(p1, p2); m_polygon.clear(); m_polygon << p1 << p2; AddTrack(); } virtual void drawRect(int x, int y, int w, int h) { if ( !m_pStream ) return QPainter::drawRect(x, y, w, h); if ( w == 0 && h == 0 ) return; // Behave like QPainter m_polygon.clear(); m_polygon << QPointF(x,y) << QPointF(x+w,y) << QPointF(x+w,y+h) << QPointF(x,y+h) << QPointF(x,y); AddTrack(); } virtual void drawRoundedRect(int x, int y, int w, int h, qreal xRadius, qreal yRadius) { if ( !m_pStream ) return QPainter::drawRoundedRect(x, y, w, h, xRadius, yRadius); if ( w == 0 && h == 0 ) return; // Behave like QPainter xRadius = std::min(xRadius, 0.5 * w); yRadius = std::min(yRadius, 0.5 * h); const auto xDiameter = xRadius + xRadius; const auto yDiameter = yRadius + yRadius; drawArc(static_cast(x+w-xDiameter), static_cast(y), static_cast(xDiameter), static_cast(yDiameter), 0,1440); drawLine(static_cast(x+w-xRadius), static_cast(y), static_cast(x+xRadius), static_cast(y)); drawArc(static_cast(x), static_cast(y), static_cast(xDiameter), static_cast(yDiameter), 1440, 1440); drawLine(static_cast(x), static_cast(y+yRadius), static_cast(x), static_cast(y+h-yRadius)); drawArc(static_cast(x), static_cast(y+h-yDiameter), static_cast(xDiameter), static_cast(yDiameter), 2880,1440); drawLine(static_cast(x+xRadius), static_cast(y+h), static_cast(x+w-xRadius), static_cast(y+h)); drawArc(static_cast(x+w-xDiameter), static_cast(y+h-yDiameter), static_cast(xDiameter), static_cast(yDiameter), 4320,1440); drawLine(static_cast(x+w), static_cast(y+h-yRadius), static_cast(x+w), static_cast(y+yRadius)); } virtual void drawArc(int x, int y, int w, int h, int a, int alen, bool bClose = false) { if ( !m_pStream ) return QPainter::drawArc(x, y, w, h, a, alen); if ( w == 0 && h == 0 ) return; // Behave like QPainter const double rX = 0.5 * w; const double rY = 0.5 * h; const double cX = x + rX; const double cY = y + rY; Q_DECL_CONSTEXPR static const double dFact = RADIANS_PER_DEGREE / 16.0; // To convert from 16ths of a degree to radians const double dA_lo = dFact * a; const double dA_hi = dFact * ( a + alen ); m_polygon.clear(); for (int i = 0; i <= 20; i++) { const double A = dA_lo + ( dA_hi - dA_lo ) * 0.05 * i; // Radians m_polygon << QPointF(cX + rX * cos(A), cY - rY * sin(A)); } if ( bClose ) m_polygon << m_polygon.first(); AddTrack(); } virtual void drawChord(int x, int y, int w, int h, int a, int alen) { if ( !m_pStream ) return QPainter::drawChord(x, y, w, h, a, alen); drawArc(x, y, w, h, a, alen, true); // true ==> close } virtual void drawEllipse(int x, int y, int w, int h) { if ( !m_pStream ) return QPainter::drawEllipse(x, y, w, h); drawArc(x, y, w, h, 0, 5760, true); // true ==> close } private: void AddTrack() { for (auto& o : m_polygon) // Loop polygon points for (const auto& t : m_transforms) t.Do(o); // Apply set of transforms to each if ( m_pStream ) m_pStream->AddTrack(m_polygon, GPEN::SLK); } void AddPad() { for (auto& o : m_polygon) // Loop polygon points for (const auto& t : m_transforms) t.Do(o); // Apply set of transforms to each if ( m_pStream ) m_pStream->AddPad(m_polygon.first(), GPEN::SLK); } GStream* m_pStream = nullptr; QPolygonF m_polygon; // Helper to avoid passing things around std::list m_transforms; }; VeroRoute/Src/images/copy.png000644 001750 001750 00000000651 14214701712 016411 0ustar00alexalex000000 000000 ‰PNG  IHDR szzєbKGDџџџ НЇ“ pHYsУУЧoЈdtIMEц6л|ŸR6IDATXУэWAƒ0'Ят)НЇ_ђюSќзір`­bBRi-3о0Лv‡0P@03Wsм‘лzЇ‰!МхЬtЦ<и$€цy~Лє-$њrќ $O’ˆtIАц1ЬЬЩ с0DHЋхЬдУќJŸ8˜ІЅфЗлl‚_э/юwЂq\Лo’SAЮи€+Ё’JеКD†[BјЖZНD†'SЮ6‰œЫƒ7ŽЫ7MВVХ=” C`7Я8#g…цZктZАќ$‡УKэ8'Vo9g$ZУЃЈД7 5ўwI4Ћ`яT:€=DJГр^JеЙ,%\2„ЬЬXЂвO~БbKnž›-(­Юž7CpгBRRJЈћHќТNhљDиBђщѕЬе‚ˆЧѓњxu&‡=пББwщ5IENDЎB`‚VeroRoute/Src/padoffsetdialog.ui000644 001750 001750 00000007631 14213705412 017163 0ustar00alexalex000000 000000 PadOffsetDialog 0 0 311 27 311 27 311 24 Pad Offset false 250 0 27 27 Qt::TabFocus Move pad up T true 200 10 280 0 27 27 Qt::TabFocus Move pad down B true 200 10 130 0 27 27 Qt::TabFocus Move pad right R true 200 10 170 0 64 27 Qt::TabFocus Centre pad on grid point Centre 100 0 27 27 Qt::TabFocus Move pad left L true 200 10 0 0 101 27 Pad Offset: VeroRoute/libraries/gEDA/veroroute_transistor/NPN_BC635.sym000644 001750 001750 00000001562 13515171161 023766 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=3 T 100 550 5 6 0 0 0 0 1 pinseq=3 T 100 550 5 6 0 0 0 0 1 pinlabel=3 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=2 T 400 850 5 6 0 0 0 0 1 pinseq=2 T 400 850 5 6 0 0 0 0 1 pinlabel=2 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=1 T 400 50 5 6 0 0 0 0 1 pinseq=1 T 400 50 5 6 0 0 0 0 1 pinlabel=1 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 403,209 L 501,200 L 431,273 L 425,240 z T 600 700 5 10 1 1 0 0 1 device=BC635 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=NPN Transistor VeroRoute/libraries/gEDA/veroroute_linear/Generic_SIP10.sym000644 001750 001750 00000003756 13515171161 024032 0ustar00alexalex000000 000000 v 20130925 2 T 300 0 8 10 0 0 0 0 1 numslots=0 B 300 0 1400 4000 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 P 0 3800 300 3800 1 0 0 { T 205 3845 5 10 1 1 0 6 1 pinnumber=1 T 200 3800 5 10 0 1 0 0 1 pinseq=1 T 355 3795 5 10 0 1 0 0 1 pinlabel=1 T 200 3800 5 10 0 1 0 0 1 pintype=pas } P 0 3400 300 3400 1 0 0 { T 205 3445 5 10 1 1 0 6 1 pinnumber=2 T 200 3400 5 10 0 1 0 0 1 pinseq=2 T 355 3345 5 10 0 1 0 0 1 pinlabel=2 T 200 3400 5 10 0 1 0 0 1 pintype=pas } P 0 3000 300 3000 1 0 0 { T 205 3045 5 10 1 1 0 6 1 pinnumber=3 T 200 3000 5 10 0 1 0 0 1 pinseq=3 T 355 2945 5 10 0 1 0 0 1 pinlabel=3 T 200 3000 5 10 0 1 0 0 1 pintype=pas } P 0 2600 300 2600 1 0 0 { T 205 2645 5 10 1 1 0 6 1 pinnumber=4 T 200 2600 5 10 0 1 0 0 1 pinseq=4 T 355 2545 5 10 0 1 0 0 1 pinlabel=4 T 200 2600 5 10 0 1 0 0 1 pintype=pas } P 0 2200 300 2200 1 0 0 { T 205 2245 5 10 1 1 0 6 1 pinnumber=5 T 200 2200 5 10 0 1 0 0 1 pinseq=5 T 355 2145 5 10 0 1 0 0 1 pinlabel=5 T 200 2200 5 10 0 1 0 0 1 pintype=pas } P 0 1800 300 1800 1 0 0 { T 205 1845 5 10 1 1 0 6 1 pinnumber=6 T 200 1800 5 10 0 1 0 0 1 pinseq=6 T 355 1745 5 10 0 1 0 0 1 pinlabel=6 T 200 1800 5 10 0 1 0 0 1 pintype=pas } P 0 1400 300 1400 1 0 0 { T 205 1445 5 10 1 1 0 6 1 pinnumber=7 T 200 1400 5 10 0 1 0 0 1 pinseq=7 T 355 1345 5 10 0 1 0 0 1 pinlabel=7 T 200 1400 5 10 0 1 0 0 1 pintype=pas } P 0 1000 300 1000 1 0 0 { T 205 1045 5 10 1 1 0 6 1 pinnumber=8 T 200 1000 5 10 0 1 0 0 1 pinseq=8 T 355 945 5 10 0 1 0 0 1 pinlabel=8 T 200 1000 5 10 0 1 0 0 1 pintype=pas } P 0 200 300 200 1 0 0 { T 205 245 5 10 1 1 0 6 1 pinnumber=10 T 200 200 5 10 0 1 180 6 1 pinseq=10 T 355 195 5 10 0 1 0 0 1 pinlabel=10 T 200 200 5 10 0 1 180 6 1 pintype=pas } P 0 600 300 600 1 0 0 { T 205 645 5 10 1 1 0 6 1 pinnumber=9 T 200 600 5 10 0 1 180 6 1 pinseq=9 T 355 595 5 10 0 1 0 0 1 pinlabel=9 T 200 600 5 10 0 1 180 6 1 pintype=pas } T 1200 4155 5 10 1 1 0 0 1 device=Name T 300 4155 8 10 1 1 0 0 1 refdes=U? T 1600 2055 8 10 0 1 0 0 1 footprint=SIP10 T 1900 1845 8 10 0 1 0 0 1 description=Generic 10 Pin SIP VeroRoute/libraries/gEDA/veroroute_transistor/JFET_Nchannel_2SK117.sym000644 001750 001750 00000001551 13515171161 025775 0ustar00alexalex000000 000000 v 20130925 2 T 100 500 5 10 0 0 0 0 1 numslots=0 P 100 500 400 500 1 0 0 { T 100 350 5 6 1 1 0 0 1 pinnumber=2 T 100 350 5 6 0 0 0 0 1 pinseq=2 T 100 350 5 6 0 0 0 0 1 pinlabel=2 T 100 350 5 6 0 0 0 0 1 pintype=pas } P 600 1000 600 800 1 0 0 { T 500 850 5 6 1 1 0 0 1 pinnumber=1 T 500 850 5 6 0 0 0 0 1 pinseq=1 T 500 850 5 6 0 0 0 0 1 pinlabel=1 T 500 850 5 6 0 0 0 0 1 pintype=pas } P 600 200 600 0 1 0 1 { T 500 50 5 6 1 1 0 0 1 pinnumber=3 T 500 50 5 6 0 0 0 0 1 pinseq=3 T 500 250 5 6 1 1 0 0 1 pinlabel=S T 500 50 5 6 0 0 0 0 1 pintype=pas } L 400 800 600 800 3 0 0 0 -1 -1 L 400 200 600 200 3 0 0 0 -1 -1 L 400 900 400 100 3 0 0 0 -1 -1 L 300 600 400 500 3 0 0 0 -1 -1 L 400 500 300 400 3 0 0 0 -1 -1 T 700 700 5 10 1 1 0 0 1 device=2SK117 T 700 400 8 10 1 1 0 0 1 refdes=Q? T 595 95 8 10 0 0 0 0 1 footprint=TO92 T 595 95 8 10 0 0 0 0 1 description=N-Channel JFET VeroRoute/libraries/gEDA/veroroute_passive/Resistor_100mil.sym000644 001750 001750 00000001141 13515171161 024660 0ustar00alexalex000000 000000 v 20130925 2 T 0 400 5 10 0 0 0 0 1 numslots=0 P 0 400 150 400 1 0 0 { T 100 450 5 8 0 1 0 0 1 pinnumber=1 T 100 450 5 8 0 0 0 0 1 pinseq=1 T 100 450 5 8 0 0 0 0 1 pinlabel=1 T 100 450 5 8 0 0 0 0 1 pintype=pas } P 900 400 750 400 1 0 0 { T 800 450 5 8 0 1 0 0 1 pinnumber=2 T 800 450 5 8 0 0 0 0 1 pinseq=2 T 800 450 5 8 0 0 0 0 1 pinlabel=2 T 800 450 5 8 0 0 0 0 1 pintype=pas } B 150 300 600 200 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 T 200 50 5 10 1 1 0 0 1 device=100k T 300 600 8 10 1 1 0 0 1 refdes=R? T 100 400 8 10 0 0 0 0 1 footprint=RESISTOR1 T 100 400 8 10 0 0 0 0 1 description=Resistor (100 mil length) VeroRoute/tutorials/tutorial_8.vrt000644 001750 001750 00000106165 14433261374 017631 0ustar00alexalex000000 000000 9 €TUTORIAL 8 - GROUPING AND UNGROUPING PARTS 8.1 MULTI-SELECTING PARTS There are several ways of selecting multiple parts: * You can click on them one at a time while holding down the SHIFT key. * You can use the "Edit -> Select Parts/Tracks by Area" menu item, or click on the equivalent toolbar button. Then click-drag with the left mouse button to draw grey areas in the grid, and then hit the toolbar button again when done. You can also indicate that you are done by double-clicking in one of the drawn grey areas, or clicking anywhere with the right mouse button. Any part whose footprint overlaps the grey area will be selected. * Another way of enabling "Select Parts/Tracks by Area" is to hold down the "R" key (for rectangle) while you click-drag with the left mouse button to draw grey rectangular areas on the grid. Then release the "R" key when done. * You can select all parts using the "Edit -> Select All Parts" menu item. The selected parts can then be collectively moved, rotated, copied, or deleted, but not resized, renamed, or moved relative to each other. 8.2 GROUPING AND UNGROUPING To bind a set of multi-selected parts together into a group, use the Edit -> Group Selected Parts  menu item. You can also use the "G" key on the keyboard. Once bound together, clicking on any part in the group selects all the other parts also. To ungroup parts, click on one of the parts in the group to highlight the group, and then use the Edit -> Ungroup Selected Parts  menu item. You can also use the "U" key on the keyboard. Groups can be grouped together into larger groups of course. Try this out with the parts in the layout. The two clusters of parts on the right have already been grouped. џџџџџџџџџџџZ.. 2d џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ$џџџџџџџџџџџџџџџ$џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ%џџџџџџџџџџџџџџџ%џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ&џџџџџџџџџџџџџџџ&џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ'џџџџџџџџџџџџџџџ'џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєC647nCCeramicCAP_CERAMICNF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PџєC40.1uCCeramicCAP_CERAMIC SF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ, R1012kRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєC8500pCCeramicCAP_CERAMICNF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ, R14470kRResistorRESISTOR SF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєC5500pCCeramicCAP_CERAMICNF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,R710kRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џ$D1 1N4148D Diode DIODEEF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џfD?у333332?у333332Пй™™™™™š?й™™™™™š@V€џfD?фЬЬЬЬЬЬ?фЬЬЬЬЬЬПй™™™™™š?й™™™™™š@V€џfD?ѕ™™™™™™?ѕ™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џfDџєC2500pCCeramicCAP_CERAMICNF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,R61kRResistorRESISTORWF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џ'D4 1N4148D Diode DIODE WF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џfD?у333332?у333332Пй™™™™™š?й™™™™™š@V€џfD?фЬЬЬЬЬЬ?фЬЬЬЬЬЬПй™™™™™š?й™™™™™š@V€џfD?ѕ™™™™™™?ѕ™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џfDџєC30.1uCCeramicCAP_CERAMICWF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,R9470kRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џ%D2 1N4148D Diode DIODEWF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џfD?у333332?у333332Пй™™™™™š?й™™™™™š@V€џfD?фЬЬЬЬЬЬ?фЬЬЬЬЬЬПй™™™™™š?й™™™™™š@V€џfD?ѕ™™™™™™?ѕ™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џfDџџ,R1512kRResistorRESISTOR SF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєC947nCCeramicCAP_CERAMIC NF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџ&D3 1N4148D Diode DIODE EF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џfD?у333332?у333332Пй™™™™™š?й™™™™™š@V€џfD?фЬЬЬЬЬЬ?фЬЬЬЬЬЬПй™™™™™š?й™™™™™š@V€џfD?ѕ™™™™™™?ѕ™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џfDB@џџџўINVALID TracksWF( %$  '&џџџ€џџџ€џџџ€џџџ€џџџџџџџџF#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Р@Р@@V€џVeroRoute/Src/infodialog.cpp000644 001750 001750 00000007511 14220262103 016276 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #include "infodialog.h" #include "ui_infodialog.h" #include "mainwindow.h" InfoDialog::InfoDialog(QWidget* parent) : QWidget(parent) , ui(new Ui_InfoDialog) , m_pMainWindow(nullptr) { ui->setupUi( reinterpret_cast(this) ); #ifdef VEROROUTE_ANDROID ui->textEdit->verticalScrollBar()->setStyleSheet( ANDROID_VSCROLL_WIDTH ); ui->textEdit->horizontalScrollBar()->setStyleSheet( ANDROID_HSCROLL_HEIGHT ); #endif ShowButtons(false); } InfoDialog::~InfoDialog() { delete ui; } void InfoDialog::SetMainWindow(MainWindow* p) { m_pMainWindow = p; QObject::connect(ui->textEdit, SIGNAL(textChanged()), this, SLOT(TextChanged())); QObject::connect(ui->prev, SIGNAL(clicked()), m_pMainWindow, SLOT(LoadPrevTutorial())); QObject::connect(ui->reload, SIGNAL(clicked()), m_pMainWindow, SLOT(LoadTutorial())); QObject::connect(ui->next, SIGNAL(clicked()), m_pMainWindow, SLOT(LoadNextTutorial())); } void InfoDialog::SetReadOnly(bool b) { ui->textEdit->setReadOnly(b); } void InfoDialog::TextChanged() { m_pMainWindow->SetInfoStr( ui->textEdit->toPlainText() ); } void InfoDialog::ShowButtons(bool b) { ui->prev->setVisible(b); ui->reload->setVisible(b); ui->next->setVisible(b); // Set bigger text edit box if we hide the buttons QRect rect = ui->textEdit->geometry(); rect.setHeight(b ? 593 : 632); ui->textEdit->setGeometry(rect); } void InfoDialog::EnablePrev(bool b) { ui->prev->setEnabled(b); } void InfoDialog::EnableNext(bool b) { ui->next->setEnabled(b); } void InfoDialog::Update() { m_initialStr = m_pMainWindow->m_board.GetInfoStr(); ui->textEdit->clear(); QTextCursor textCursor = ui->textEdit->textCursor(); QTextBlockFormat textBlockFormat = textCursor.blockFormat(); //textBlockFormat.setAlignment(Qt::AlignJustify); //TODO See if tutorials can be written so this is useable textCursor.mergeBlockFormat(textBlockFormat); ui->textEdit->setTextCursor(textCursor); ui->textEdit->append( QString::fromStdString(m_initialStr) ); ui->textEdit->verticalScrollBar()->setSliderPosition(0); } bool InfoDialog::GetIsModified() { return m_initialStr != m_pMainWindow->m_board.GetInfoStr();; } void InfoDialog::keyPressEvent(QKeyEvent* event) { // In tutorial mode, forward event to main window (apart from special cases) bool bForwardToMainWindow = ui->textEdit->isReadOnly(); switch( event->key() ) { case Qt::Key_Tab: case Qt::Key_N: case Qt::Key_O: case Qt::Key_M: case Qt::Key_S: case Qt::Key_Q: bForwardToMainWindow = false; } if ( bForwardToMainWindow ) return m_pMainWindow->keyPressEvent(event); #ifndef VEROROUTE_ANDROID m_pMainWindow->specialKeyPressEvent(event); #endif QWidget::keyPressEvent(event); event->accept(); } void InfoDialog::keyReleaseEvent(QKeyEvent* event) { // In tutorial mode, forward event to main window if ( ui->textEdit->isReadOnly() ) return m_pMainWindow->keyReleaseEvent(event); #ifdef VEROROUTE_ANDROID if ( event->key() == Qt::Key_Back ) return m_pMainWindow->keyReleaseEvent(event); // Try Undo operation #else m_pMainWindow->commonKeyReleaseEvent(event); #endif QWidget::keyReleaseEvent(event); event->accept(); } VeroRoute/libraries/gEDA/veroroute_passive/Resistor_200mil.sym000644 001750 001750 00000001141 13515171161 024661 0ustar00alexalex000000 000000 v 20130925 2 T 0 400 5 10 0 0 0 0 1 numslots=0 P 0 400 150 400 1 0 0 { T 100 450 5 8 0 1 0 0 1 pinnumber=1 T 100 450 5 8 0 0 0 0 1 pinseq=1 T 100 450 5 8 0 0 0 0 1 pinlabel=1 T 100 450 5 8 0 0 0 0 1 pintype=pas } P 900 400 750 400 1 0 0 { T 800 450 5 8 0 1 0 0 1 pinnumber=2 T 800 450 5 8 0 0 0 0 1 pinseq=2 T 800 450 5 8 0 0 0 0 1 pinlabel=2 T 800 450 5 8 0 0 0 0 1 pintype=pas } B 150 300 600 200 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 T 200 50 5 10 1 1 0 0 1 device=100k T 300 600 8 10 1 1 0 0 1 refdes=R? T 100 400 8 10 0 0 0 0 1 footprint=RESISTOR2 T 100 400 8 10 0 0 0 0 1 description=Resistor (200 mil length) VeroRoute/tutorials/tutorial_20.vrt000644 001750 001750 00000106414 14433261634 017677 0ustar00alexalex000000 000000 9‚TUTORIAL 20 - EXERCISE: MANIPULATING CURVES Although all you ever do in VeroRoute is paint netlist IDs to the grid, this still allows a variety of different curved tracks to be formed. Manipulating them may take some getting used to. "Diagonals (Min)" track style provides the most flexibility so use that. For the bottom left figure, try and duplicate each of the three track patterns above it by holding down the SPACE bar and left and right clicking with the mouse to paint and erase grid points. Then do the same for the bottom right figure. If you find this tricky, then toggle the track style to "Fat" or "Thin" to help visualise which grid points should be painted and which should be erased.џџџџџџџџџџџX** 2P  џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ !џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ  @џџџџџџџџџџџџџџџ  @џџџџџ џџџџџ џџџџџ  @џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ  @ џџџџџџџџџџџџџџџџџџџџџџџџџ  ˆџџџџџ џџџџџ џџџџџ  џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ  џџџџџџџџџџџџџџџџ Єџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ „џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ   џџџџџџџџџџџџџџџџ ˆџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџ  џџџџџџ џџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџ   џџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџ џџџџџ џџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџ џџџџџ џџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџPџџџџџџџџџџ‘џџџџџџџџџџ1џџџџџџџџџџAџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ @џџџџџџџџџџџџџџџ   џџџџџ џџџџџ џџџџџ  @џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ @ џџџџџџџџџџџџџџџџџџџџџџџџџ Lџџџџџ џџџџџ џџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџ ˆџџџџџџџџџџџџџџџџџџџџ "џџџџџџџџџџџџџџџџџџџџ ФџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ  џџџџџџџџџџџџџџџџџџџџџџџџџџ„џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџ  џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ  џџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџ џџџџџ џџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџ џџџџџ џџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ!џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџhџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџBџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ @џџџџџџџџџџџџџџџ  џџџџџ џџџџџ џџџџџ €џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ @ џџџџџџџџџџџџџџџџдџџџџџџџџџ ƒџџџџџ џџџџџ џџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџвџџџџџџџџџџ‰џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ  џџџџџџиџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ  џџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџ џџџџџ џџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџ џџџџџ џџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ @ џџџџџџџџџџџџџџџ џџџџџ џџџџџ џџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ @ џџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџ џџџџџ џџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ  џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ  џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ  џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ  џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџ џџџџџ џџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџ џџџџџ џџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ   А RT5RT5RTVerticalTRIM_VERTNF(123Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§   А RT6RT6RTVerticalTRIM_VERTNF(123Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§   А RT4RT4RTVerticalTRIM_VERTNF( 1 2 3Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§    џџџџџџџџ    @IC6IC6ICDIPDIPWF(12345678П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€       џџџџџџџџ    @IC4IC4ICDIPDIPWF(1234 567 8П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€       џџџџџџџџ    @IC5IC5ICDIPDIPWF(12345678П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€       џџџџџџџџ    @IC3IC3ICDIPDIPWF(12345678П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€       џџџџџџџџ    @IC7IC7ICDIPDIPWF(12345678П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€      А RT8RT8RTVerticalTRIM_VERTNF(123Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§    џџџџџџџџ    @IC2IC2ICDIPDIPWF(1234 567 8П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€      АRT3RT3RTVerticalTRIM_VERTNF(123Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§   А RT7RT7RTVerticalTRIM_VERTNF(123Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§    џџџџџџџџ    @IC1IC1ICDIPDIPWF(1234 567 8П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€       џџџџџџџџ    @IC8IC8ICDIPDIPWF(12345678П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€      АRT1RT1RTVerticalTRIM_VERTNF( 1 2 3Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§   АRT2RT2RTVerticalTRIM_VERTNF(12 3Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§B@џџџўINVALID TracksWF(џџџ€џџџ€џџџ€џџџ€џџџџџџџџF#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Р@Р@@V€џVeroRoute/Src/TextRect.h000644 001750 001750 00000007222 14377670762 015424 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include "Rect.h" #include "MyRGB.h" // Bitfield for text style Q_DECL_CONSTEXPR static const int TEXT_NORMAL = 0; Q_DECL_CONSTEXPR static const int TEXT_BOLD = 1; Q_DECL_CONSTEXPR static const int TEXT_ITALIC = 2; Q_DECL_CONSTEXPR static const int TEXT_UNDERLINE = 4; class TextRect : public Rect, public MyRGB { public: TextRect() : Rect(), MyRGB() {} TextRect(int rowMin, int rowMax, int colMin, int colMax) : Rect(rowMin, rowMax, colMin, colMax), MyRGB() {} virtual ~TextRect() override {} TextRect(const TextRect& o) : Rect(o), MyRGB(o) { *this = o; } TextRect& operator=(const TextRect& o) { Rect::operator=(o); MyRGB::operator=(o); m_str = o.m_str; m_size = o.m_size; m_style = o.m_style; m_flagsH = o.m_flagsH; m_flagsV = o.m_flagsV; return *this; } bool operator==(const TextRect& o) const { return Rect::operator==(o) && MyRGB::operator==(o) && m_str == o.m_str && m_size == o.m_size && m_style == o.m_style && m_flagsH == o.m_flagsH && m_flagsV == o.m_flagsV; } bool operator!=(const TextRect& o) const { return !(*this == o); } bool SetStr(const std::string& s) { const bool bChanged = (m_str != s); m_str = s; return bChanged; } bool SetSize(int i) { const bool bChanged = (m_size != i); m_size = i; return bChanged; } bool SetStyle(int i) { const bool bChanged = (m_style != i); m_style = i; return bChanged; } bool SetFlagsH(int i) { const bool bChanged = (m_flagsH != i); m_flagsH = i; return bChanged; } bool SetFlagsV(int i) { const bool bChanged = (m_flagsV != i); m_flagsV = i; return bChanged; } const std::string& GetStr() const { return m_str; } const int& GetSize() const { return m_size; } const int& GetStyle() const { return m_style; } const int& GetFlagsH() const { return m_flagsH; } const int& GetFlagsV() const { return m_flagsV; } // Persist interface functions virtual void Load(DataStream& inStream) override { Rect::Load(inStream); inStream.Load(m_str); inStream.Load(m_size); inStream.Load(m_style); inStream.Load(m_flagsH); if ( inStream.GetVersion() >= VRT_VERSION_49 ) inStream.Load(m_flagsV); // Added in VRT_VERSION_49 if ( inStream.GetVersion() >= VRT_VERSION_15 ) MyRGB::Load(inStream); // Added in VRT_VERSION_15 } virtual void Save(DataStream& outStream) override { Rect::Save(outStream); outStream.Save(m_str); outStream.Save(m_size); outStream.Save(m_style); outStream.Save(m_flagsH); outStream.Save(m_flagsV); // Added in VRT_VERSION_49 MyRGB::Save(outStream); // Added in VRT_VERSION_15 } private: std::string m_str; int m_size = 9; // Point size int m_style = TEXT_NORMAL; // Bitfield using TEXT_NORMAL, TEXT_BOLD, TEXT_ITALIC, TEXT_UNDERLINE int m_flagsH = Qt::AlignJustify; // Qt::AlignLeft,Qt::AlignRight,Qt::AlignHCenter,Qt::AlignJustify int m_flagsV = Qt::AlignTop; // Qt::AlignTop,Qt::AlignVCenter,Qt::AlignBottom }; VeroRoute/libraries/gEDA/veroroute_electromechanical/Switch_DIP_DPST.sym000644 001750 001750 00000001734 13515171160 026552 0ustar00alexalex000000 000000 v 20130925 2 T 300 1000 8 10 0 0 0 0 1 numslots=0 P 300 1000 0 1000 1 0 1 { T 150 1050 5 10 1 1 0 0 1 pinnumber=3 T 150 1050 5 10 0 0 0 0 1 pinseq=3 T 150 1050 5 10 0 0 0 0 1 pinlabel=3 T 150 1050 5 10 0 0 0 0 1 pintype=pas } P 600 1000 900 1000 1 0 1 { T 750 1050 5 10 1 1 0 0 1 pinnumber=1 T 750 1050 5 10 0 0 0 0 1 pinseq=1 T 750 1050 5 10 0 0 0 0 1 pinlabel=1 T 750 1050 5 10 0 0 0 0 1 pintype=pas } P 300 500 0 500 1 0 1 { T 150 550 5 10 1 1 0 0 1 pinnumber=4 T 150 550 5 10 0 0 0 0 1 pinseq=4 T 150 550 5 10 0 0 0 0 1 pinlabel=4 T 150 550 5 10 0 0 0 0 1 pintype=pas } P 600 500 900 500 1 0 1 { T 750 550 5 10 1 1 0 0 1 pinnumber=2 T 750 550 5 10 0 0 0 0 1 pinseq=2 T 750 550 5 10 0 0 0 0 1 pinlabel=2 T 750 550 5 10 0 0 0 0 1 pintype=pas } L 300 1000 600 1200 3 0 0 0 -1 -1 L 300 500 600 700 3 0 0 0 -1 -1 T 200 0 5 10 1 1 0 0 1 device=Name T 300 200 8 10 1 1 0 0 1 refdes=S? T 495 493 8 10 0 0 0 0 1 footprint=SWITCH_ST_DIP4 T 495 493 8 10 0 0 0 0 1 description=Onboard DIP-Switch VeroRoute/libraries/gEDA/veroroute_diode/000755 001750 001750 00000000000 14405612071 020646 5ustar00alexalex000000 000000 VeroRoute/Src/images/top.png000644 001750 001750 00000000312 14064443304 016236 0ustar00alexalex000000 000000 ‰PNG  IHDR йsВbKGDџ‡ЬП pHYs з зB(›xtIMEх U­r€[IDATHЧэ’С Р0 ЅPH_…юПiQ(иA„@ёН,Ы&‹УqСDю LЭчЖŠНЅ š'n/СƒЃЅяЏOЇsт8гВ-К‚ђО (Šп№Ћ>;ОшџjIENDЎB`‚VeroRoute/libraries/gEDA/veroroute_linear/Timer_NE555.sym000644 001750 001750 00000003216 13515171161 023472 0ustar00alexalex000000 000000 v 20130925 2 T 800 0 5 10 0 0 0 0 1 numslots=0 P 800 0 800 300 1 0 0 { T 645 200 5 8 1 1 180 6 1 pinnumber=1 T 732 129 5 8 0 0 90 0 1 pinseq=1 T 650 400 9 8 1 1 0 0 1 pinlabel=GND T 650 350 9 8 0 0 0 0 1 pintype=pwr } P 0 800 300 800 1 0 0 { T 96 865 5 8 1 1 0 0 1 pinnumber=2 T 96 865 5 8 0 0 0 0 1 pinseq=2 T 400 750 9 8 1 1 0 0 1 pinlabel=TRIG T 350 750 9 8 0 0 0 0 1 pintype=in } P 1900 1400 2200 1400 1 0 1 { T 1998 1468 5 8 1 1 0 0 1 pinnumber=3 T 1998 1468 5 8 0 0 0 0 1 pinseq=3 T 1500 1350 9 8 1 1 0 0 1 pinlabel=OUT T 1550 1350 9 8 0 0 0 0 1 pintype=out } P 800 2600 800 2900 1 0 1 { T 652 2722 5 8 1 1 0 0 1 pinnumber=4 T 602 2722 5 8 0 0 0 0 1 pinseq=4 T 556 2402 9 8 1 1 0 0 1 pinlabel=RESET T 556 2452 9 8 0 0 0 0 1 pintype=in } P 1400 300 1400 0 1 0 1 { T 1245 200 5 8 1 1 180 6 1 pinnumber=5 T 1466 202 5 8 0 0 270 0 1 pinseq=5 T 1230 398 9 8 1 1 0 0 1 pinlabel=CTRL T 1230 348 9 8 0 0 0 0 1 pintype=out } P 300 1400 0 1400 1 0 1 { T 205 1445 5 8 1 1 0 6 1 pinnumber=6 T 202 1335 5 8 0 0 180 0 1 pinseq=6 T 400 1350 9 8 1 1 0 0 1 pinlabel=THRESH T 350 1350 9 8 0 0 0 0 1 pintype=in } P 300 2000 0 2000 1 0 1 { T 205 2045 5 8 1 1 0 6 1 pinnumber=7 T 202 1930 5 8 0 0 180 0 1 pinseq=7 T 394 1952 9 8 1 1 0 0 1 pinlabel=DISCH T 369 1952 9 8 0 0 0 0 1 pintype=oc } P 1400 2600 1400 2900 1 0 1 { T 1251 2722 5 8 1 1 0 0 1 pinnumber=8 T 1201 2722 5 8 0 0 0 0 1 pinseq=8 T 1240 2402 9 8 1 1 0 0 1 pinlabel=VCC T 1240 2452 9 8 0 0 0 0 1 pintype=pwr } B 300 300 1600 2300 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 T 1700 2700 9 10 1 1 0 0 1 device=NE555 T 1700 2900 8 10 1 1 0 0 1 refdes=U? T 1700 2900 8 10 0 0 0 0 1 footprint=DIP8 T 1700 2900 8 10 0 0 0 0 1 description=555 Timer VeroRoute/libraries/gEDA/veroroute_transistor/PNP_2N3906.sym000644 001750 001750 00000001563 13515171161 024050 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=3 T 400 850 5 6 0 0 0 0 1 pinseq=3 T 400 850 5 6 0 0 0 0 1 pinlabel=3 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=1 T 400 50 5 6 0 0 0 0 1 pinseq=1 T 400 50 5 6 0 0 0 0 1 pinlabel=1 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 297,341 L 199,350 L 269,277 L 275,310 z T 600 700 5 10 1 1 0 0 1 device=2N3906 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=PNP Transistor VeroRoute/libraries/gEDA/veroroute_bbd/MN3102.sym000644 001750 001750 00000003327 13515171160 021670 0ustar00alexalex000000 000000 v 20130925 2 T 300 400 8 10 0 0 0 0 1 numslots=0 B 300 400 1800 1800 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 P 0 1300 300 1300 1 0 0 { T 205 1345 5 10 1 1 0 6 1 pinnumber=3 T 200 1300 5 10 0 0 0 0 1 pinseq=3 T 355 1245 5 10 1 1 0 0 1 pinlabel=GND T 200 1300 5 10 0 0 0 0 1 pintype=pwr } P 2400 1800 2100 1800 1 0 0 { T 2195 1845 5 10 1 1 0 0 1 pinnumber=5 T 2200 1800 5 10 0 0 180 0 1 pinseq=5 T 2045 1795 5 10 1 1 0 6 1 pinlabel=OX3 T 2200 1800 5 10 0 0 180 0 1 pintype=pas } P 900 2500 900 2200 1 0 0 { T 850 2295 5 10 1 1 90 0 1 pinnumber=1 T 900 2400 5 10 0 0 0 0 1 pinseq=1 T 950 2145 5 10 1 1 90 6 1 pinlabel=VDD T 900 2400 5 10 0 0 0 0 1 pintype=pwr } P 1500 2500 1500 2200 1 0 0 { T 1450 2295 5 10 1 1 90 0 1 pinnumber=8 T 1500 2400 5 10 0 0 0 0 1 pinseq=8 T 1550 2145 5 10 1 1 90 6 1 pinlabel=VGG T 1500 2400 5 10 0 0 0 0 1 pintype=out } P 2400 1300 2100 1300 1 0 0 { T 2195 1345 5 10 1 1 0 0 1 pinnumber=6 T 2500 1300 5 10 0 0 0 0 1 pinseq=6 T 2045 1245 5 10 1 1 0 6 1 pinlabel=OX2 T 2500 1300 5 10 0 0 0 0 1 pintype=pas } P 2400 800 2100 800 1 0 0 { T 2195 845 5 10 1 1 0 0 1 pinnumber=7 T 2500 800 5 10 0 0 0 0 1 pinseq=7 T 2045 745 5 10 1 1 0 6 1 pinlabel=OX1 T 2500 800 5 10 0 0 0 0 1 pintype=pas } P 900 100 900 400 1 0 0 { T 850 305 5 10 1 1 90 6 1 pinnumber=2 T 900 100 5 10 0 0 0 0 1 pinseq=2 T 950 455 5 10 1 1 90 0 1 pinlabel=CP1 T 900 100 5 10 0 0 0 0 1 pintype=out } P 1500 100 1500 400 1 0 0 { T 1450 305 5 10 1 1 90 6 1 pinnumber=4 T 1500 100 5 10 0 0 0 0 1 pinseq=4 T 1550 455 5 10 1 1 90 0 1 pinlabel=CP2 T 1500 100 5 10 0 0 0 0 1 pintype=out } T 1800 2455 5 10 1 1 0 0 1 device=MN3102 T 1800 2655 8 10 1 1 0 0 1 refdes=U? T 1600 2055 8 10 0 1 0 0 1 footprint=DIP8 T 1900 1845 8 10 0 1 0 0 1 description=Driver for MN3200 series BBDs VeroRoute/libraries/gEDA/veroroute_passive/Capacitor_Electrolytic_NP_300mil.sym000644 001750 001750 00000001341 13515171161 030076 0ustar00alexalex000000 000000 v 20130925 2 T 200 700 5 10 0 0 0 0 1 numslots=0 P 200 700 400 700 1 0 0 { T 350 750 5 8 1 1 0 6 1 pinnumber=1 T 350 750 5 8 0 0 0 6 1 pinseq=1 T 350 750 5 8 0 0 0 6 1 pinlabel=1 T 350 750 5 8 0 0 0 6 1 pintype=pas } P 1100 700 900 700 1 0 0 { T 950 750 5 8 1 1 0 0 1 pinnumber=2 T 950 750 5 8 0 0 0 0 1 pinseq=2 T 950 750 5 8 0 0 0 0 1 pinlabel=2 T 950 750 5 8 0 0 0 0 1 pintype=pas } L 600 900 600 500 3 0 0 0 -1 -1 L 900 700 700 700 3 0 0 0 -1 -1 L 600 700 400 700 3 0 0 0 -1 -1 A 1400 700 700 165 30 3 0 0 0 -1 -1 T 500 300 5 10 1 1 0 0 1 device=3u3 T 500 1000 8 10 1 1 0 0 1 refdes=C? T 500 700 8 10 0 0 0 0 1 footprint=CAP_ELECTRO_300_NP T 500 700 8 10 0 0 0 0 1 description=Non-Polarised Electrolytic Capacitor (300 mil diameter) VeroRoute/libraries/gEDA/veroroute_regulator/LM337.sym000644 001750 001750 00000001434 13515171161 023070 0ustar00alexalex000000 000000 v 20130925 2 T 1700 800 5 10 0 0 0 0 1 numslots=0 P 1700 800 2000 800 1 0 1 { T 1800 900 5 10 1 1 0 0 1 pinnumber=3 T 1800 900 5 10 0 0 0 0 1 pinseq=3 T 1600 700 9 10 1 1 0 6 1 pinlabel=Out T 1800 900 5 10 0 0 0 0 1 pintype=pas } P 0 800 300 800 1 0 0 { T 200 900 5 10 1 1 0 6 1 pinnumber=2 T 200 900 5 10 0 0 0 0 1 pinseq=2 T 400 700 9 10 1 1 0 0 1 pinlabel=In T 200 900 5 10 0 0 0 0 1 pintype=pas } P 1000 0 1000 300 1 0 0 { T 1100 100 5 10 1 1 0 0 1 pinnumber=1 T 1100 100 5 10 0 0 0 0 1 pinseq=1 T 1100 100 5 10 0 0 0 0 1 pinlabel=1 T 1100 100 5 10 0 0 0 0 1 pintype=pas } B 300 300 1400 1000 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 T 700 1100 5 10 1 1 0 0 1 device=LM337 T 1100 1400 8 10 1 1 0 6 1 refdes=U? T 1800 1400 8 10 0 0 0 6 1 footprint=TO220 T 1800 1400 8 10 0 0 0 6 1 description=Regulator VeroRoute/libraries/gEDA/veroroute_transistor/PNP_TIP42.sym000644 001750 001750 00000001563 13515171161 024051 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=1 T 100 550 5 6 0 0 0 0 1 pinseq=1 T 100 550 5 6 0 0 0 0 1 pinlabel=1 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=2 T 400 850 5 6 0 0 0 0 1 pinseq=2 T 400 850 5 6 0 0 0 0 1 pinlabel=2 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=3 T 400 50 5 6 0 0 0 0 1 pinseq=3 T 400 50 5 6 0 0 0 0 1 pinlabel=3 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 297,341 L 199,350 L 269,277 L 275,310 z T 600 700 5 10 1 1 0 0 1 device=TIP42 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO220 T 600 400 8 10 0 0 0 0 1 description=PNP Transistor VeroRoute/Src/images/layertop.png000644 001750 001750 00000001010 13734471226 017276 0ustar00alexalex000000 000000 ‰PNG  IHDR szzєbKGDљCЛ pHYsФФ•+tIMEф  &>mШ•IDATXУХ—1В‚0Eяћ“WЃ vN:hн‚­.ТEhыhЁcьЈt5Z> јBHLќМJЧIЮIђr:e%цЌЬ\Aћ2у}™qШТіуЎирВНС@Dff8чEи›СчЫі:уј^|ˆщMи…ЋJ’ФдБЋˆѕœС­€џŽгъНС""hХD„ЉЋƒС"ФЬќ5№Ја_Гў7АAD03цмqЮ+RgђuCNˆC•yIнцˆ.2P‡*‡1 Ђ‰XРpЪJЛРjЕмяw?‘_№rЙмn7u IAЄЏМЎыž ”Ф.Я}б{œ)ˆШЌ—”В/rєз=’^MM06сЇук ђ VI)9hBРн№юрЖ|nAL№h5Mƒ4MЃˆшрчѓIАX,ьAд4 |,2ю†‘uB_АѕOЉЏзkѕ]oжо§7ёЎиєРЧУјŽсДJdЌYЧ66А“РTщйоЛОєFПяОoл4Xе 6`иќŠTvIENDЎB`‚VeroRoute/Src/padoffsetdialog.h000644 001750 001750 00000002236 14211014601 016760 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include class MainWindow; class Ui_PadOffsetDialog; class PadOffsetDialog : public QDialog { Q_OBJECT public: explicit PadOffsetDialog(MainWindow* parent = nullptr); ~PadOffsetDialog(); public slots: void OnCloseX(); protected: void keyPressEvent(QKeyEvent* event); void keyReleaseEvent(QKeyEvent* event); private: Ui_PadOffsetDialog* ui; MainWindow* m_pMainWindow; }; VeroRoute/libraries/gEDA/veroroute_linear/Comparator_LM319.sym000644 001750 001750 00000003007 13515171161 024523 0ustar00alexalex000000 000000 v 20130925 2 T 600 2000 8 10 0 0 0 0 1 numslots=2 T 600 2200 8 10 0 0 0 0 1 slot=1 T 600 1600 8 10 0 0 0 0 1 slotdef=1:4,5,11,6,3,12 T 600 1800 8 10 0 0 0 0 1 slotdef=2:9,10,11,6,8,7 P 200 700 0 700 1 0 1 { T 166 750 5 8 1 1 0 6 1 pinnumber=4 T 166 750 5 8 0 0 0 0 1 pinseq=1 T 166 750 5 8 0 0 0 0 1 pinlabel=4 T 166 750 5 8 0 0 0 0 1 pintype=pas } P 200 300 0 300 1 0 1 { T 169 342 5 8 1 1 0 6 1 pinnumber=5 T 169 342 5 8 0 0 0 0 1 pinseq=2 T 169 342 5 8 0 0 0 0 1 pinlabel=5 T 169 342 5 8 0 0 0 0 1 pintype=pas } P 500 800 500 1000 1 0 1 { T 525 825 5 8 1 1 0 0 1 pinnumber=11 T 500 850 5 8 0 0 0 0 1 pinseq=3 T 500 850 5 8 0 0 0 0 1 pinlabel=11 T 500 850 5 8 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 825 77 5 8 1 1 0 0 1 pinnumber=6 T 825 42 5 8 0 0 0 0 1 pinseq=4 T 825 42 5 8 0 0 0 0 1 pinlabel=6 T 825 42 5 8 0 0 0 0 1 pintype=pas } P 800 375 800 0 1 0 1 { T 533 77 5 8 1 1 0 0 1 pinnumber=3 T 508 52 5 8 0 0 0 0 1 pinseq=5 T 508 52 5 8 0 0 0 0 1 pinlabel=3 T 508 52 5 8 0 0 0 0 1 pintype=pas } P 1000 500 1200 500 1 0 1 { T 994 354 5 8 1 1 0 0 1 pinnumber=12 T 994 354 5 8 0 0 0 0 1 pinseq=6 T 994 354 5 8 0 0 0 0 1 pinlabel=12 T 994 354 5 8 0 0 0 0 1 pintype=pas } L 200 975 200 25 3 0 0 0 -1 -1 L 1000 500 200 975 3 0 0 0 -1 -1 L 1000 500 200 25 3 0 0 0 -1 -1 L 300 750 300 650 3 0 0 0 -1 -1 L 250 300 350 300 3 0 0 0 -1 -1 L 250 700 350 700 3 0 0 0 -1 -1 T 925 696 5 10 1 1 0 0 1 device=LM319 T 900 900 8 10 1 1 0 0 1 refdes=U? T 600 2400 8 10 0 0 0 0 1 footprint=DIP14 T 600 2400 8 10 0 0 0 0 1 description=Dual Comparator VeroRoute/Src/FootPrint.cpp000644 001750 001750 00000007107 14427505760 016132 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #include "FootPrint.h" #include "CompManager.h" #include "RectManager.h" void FootPrint::BuildDefault(COMP type) { assert(type != COMP::INVALID); // This method is for building a regular component (not a "tracks" component, or "custom" component) SetType(type); int numRows(0), numCols(0); const std::string pinStr = CompTypes::GetMakeInstructions(m_type, numRows, numCols); const bool bOK = ( pinStr.size() == static_cast(numRows * numCols) ); assert( bOK ); // Check string length OK if ( !bOK ) return; Allocate(1, numRows, numCols); const bool bPlug = CompTypes::IsPlug(m_type); // A "plug" component can plug the gap between rows of IC pins. const char* szpins = pinStr.c_str(); const int iSize = GetSize(); for (int i = 0; i < iSize; i++) { Pin* p = GetAt(i); const char pinChar = szpins[i]; switch( pinChar ) { case '.': p->SetSurface(SURFACE_FREE); break; case '-': p->SetSurface(SURFACE_GAP); break; case '*': p->SetSurface(SURFACE_FULL); p->SetSoicChar(SOIC_TRACKS_TOP); break; default: p->SetSurface(bPlug ? SURFACE_PLUG : SURFACE_FULL); } p->SetPinIndex( GetPinIndexFromLegacyPinChar(static_cast(pinChar)) ); } const bool bIsSOIC = CompTypes::GetIsSOIC(m_type); if ( bIsSOIC ) SetupOccupanciesSOIC(); // Setup hole use, and SOIC info else SetupOccupanciesTH(); // Setup hole use (and for wires setup surface use too), and SOIC info } void FootPrint::BuildTrax(CompManager* pCompMgr, const RectManager& rectMgr, const ElementGrid& o, int nLyr, int nRowMin, int nRowMax, int nColMin, int nColMax) { // This method is for building a "tracks" component SetType(COMP::TRACKS); const int numRows = 1 + nRowMax - nRowMin; const int numCols = 1 + nColMax - nColMin; Allocate(1, numRows, numCols); size_t pinIndex; int compId; int jRow(nRowMin); for (int j = 0; j < numRows; j++, jRow++) { int iCol(nColMin); for (int i = 0; i < numCols; i++, iCol++) { if ( !rectMgr.ContainsPoint(jRow,iCol) ) continue; CompElement* pTarget = Grid::Get(0, j, i); Element* pSource = o.Get(nLyr, jRow, iCol); assert( pSource ); int iNodeId = pSource->GetNodeId(); if ( pSource->GetLyrHasPin() ) // For pins/wires, let the track contain the origId before the part was placed { for (int iSlot = 0; iSlot < 2; iSlot++) { pSource->GetSlotInfo(iSlot, pinIndex, compId); if ( pinIndex == BAD_PININDEX ) continue; const Component& comp = pCompMgr->GetComponentById( compId ); assert( comp.GetType() != COMP::INVALID ); iNodeId = comp.GetOrigId(nLyr, pinIndex); break; } } else if ( !pSource->ReadFlagBits(USERSET) ) // Don't copy auto-routed tracks iNodeId = BAD_NODEID; pTarget->SetNodeId(iNodeId); pTarget->SetCode(pSource->GetCode()); // Note: This is wrong at boundaries pTarget->MarkFlagBits(RECTSET); } } } VeroRoute/veroroute.desktop000644 001750 001750 00000000755 14400337050 016364 0ustar00alexalex000000 000000 [Desktop Entry] Categories=Engineering;Electronics; Comment=Qt based Veroboard/Perfboard/PCB layout and routing application # TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! Keywords=veroboard;stripboard;perfboard;pcb;layout;routing;eda;circuit;electronics; Exec=/usr/bin/veroroute Icon=veroroute Name=VeroRoute Path=/usr/share/veroroute/ StartupNotify=false Terminal=false Type=Application Version=1.0 VeroRoute/libraries/gEDA/veroroute_electromechanical/Switch_Onboard_3PDT.sym000644 001750 001750 00000003552 13515171160 027462 0ustar00alexalex000000 000000 v 20130925 2 T 300 2000 8 10 0 0 0 0 1 numslots=0 P 300 2000 0 2000 1 0 1 { T 150 2050 5 10 1 1 0 0 1 pinnumber=4 T 150 2050 5 10 0 0 0 0 1 pinseq=4 T 150 2050 5 10 0 0 0 0 1 pinlabel=4 T 150 2050 5 10 0 0 0 0 1 pintype=pas } P 600 2200 900 2200 1 0 1 { T 750 2250 5 10 1 1 0 0 1 pinnumber=1 T 750 2250 5 10 0 0 0 0 1 pinseq=1 T 750 2250 5 10 0 0 0 0 1 pinlabel=1 T 750 2250 5 10 0 0 0 0 1 pintype=pas } P 600 1800 900 1800 1 0 1 { T 750 1850 5 10 1 1 0 0 1 pinnumber=7 T 750 1850 5 10 0 0 0 0 1 pinseq=7 T 750 1850 5 10 0 0 0 0 1 pinlabel=7 T 750 1850 5 10 0 0 0 0 1 pintype=pas } P 300 1300 0 1300 1 0 1 { T 150 1350 5 10 1 1 0 0 1 pinnumber=5 T 150 1350 5 10 0 0 0 0 1 pinseq=5 T 150 1350 5 10 0 0 0 0 1 pinlabel=5 T 150 1350 5 10 0 0 0 0 1 pintype=pas } P 600 1500 900 1500 1 0 1 { T 750 1550 5 10 1 1 0 0 1 pinnumber=2 T 750 1550 5 10 0 0 0 0 1 pinseq=2 T 750 1550 5 10 0 0 0 0 1 pinlabel=2 T 750 1550 5 10 0 0 0 0 1 pintype=pas } P 600 1100 900 1100 1 0 1 { T 750 1150 5 10 1 1 0 0 1 pinnumber=8 T 750 1150 5 10 0 0 0 0 1 pinseq=8 T 750 1150 5 10 0 0 0 0 1 pinlabel=8 T 750 1150 5 10 0 0 0 0 1 pintype=pas } P 300 600 0 600 1 0 1 { T 150 650 5 10 1 1 0 0 1 pinnumber=6 T 150 650 5 10 0 0 0 0 1 pinseq=6 T 150 650 5 10 0 0 0 0 1 pinlabel=6 T 150 650 5 10 0 0 0 0 1 pintype=pas } P 600 800 900 800 1 0 1 { T 750 850 5 10 1 1 0 0 1 pinnumber=3 T 750 850 5 10 0 0 0 0 1 pinseq=3 T 750 850 5 10 0 0 0 0 1 pinlabel=3 T 750 850 5 10 0 0 0 0 1 pintype=pas } P 600 400 900 400 1 0 1 { T 750 450 5 10 1 1 0 0 1 pinnumber=9 T 750 450 5 10 0 0 0 0 1 pinseq=9 T 750 450 5 10 0 0 0 0 1 pinlabel=9 T 750 450 5 10 0 0 0 0 1 pintype=pas } L 300 2000 600 2200 3 0 0 0 -1 -1 L 300 1300 600 1500 3 0 0 0 -1 -1 L 300 600 600 800 3 0 0 0 -1 -1 T 200 0 5 10 1 1 0 0 1 device=Name T 295 195 8 10 1 1 0 0 1 refdes=S? T 1295 193 8 10 0 0 0 0 1 footprint=SWITCH_DT9 T 1295 193 8 10 0 0 0 0 1 description=Onboard Switch VeroRoute/libraries/gEDA/veroroute_regulator/000755 001750 001750 00000000000 14405612074 021571 5ustar00alexalex000000 000000 VeroRoute/Src/images/render.png000644 001750 001750 00000001215 14214151131 016705 0ustar00alexalex000000 000000 ‰PNG  IHDR szzєsRGBЎЮщgAMAБ ќa pHYsУУЧoЈd"IDATXGХ–}SТ0 Ц7”уEQ‘?ќўŸЯS<рP8ц|ž,эu%нчя.$Mз$kК<Л=wЊЩYО[&$9†,`qётИЩЊh;ё‡х >ъњŒKдMфЕEВ€дЂІ`‰ЙЦ3`Р АнцBИgшНz*ты-ў‹Z`aG­Zє:5NЇ“ZнHэЙf’Ф‰šZљ„йыMx5ЋеJiёў/„ Z@ќЂrуА^ЏХŽё+АОaXXѓE!}Ифєт(Я"§ј1WџЏпjБXМAёMЩoџŠјЂŸѓЫх’y^}ЂТ?œNHjLЌЙP —Ж@О ёёЧБэЦЁі2ФpI›-I+ГЂKnк’ЫІŽэВѕkaѕ5e[œљЏmЛbйMК&зр‚ЫnвN<][РХ,ккъиg]C‚q–§œHP'І\чIENDЎB`‚VeroRoute/veroroute-uninstall.sh000755 001750 001750 00000004310 14413477161 017342 0ustar00alexalex000000 000000 #!/bin/bash # # To uninstall on Linux, type the following at the command line # sudo ./veroroute-uninstall.sh # rm -f "$pkgdir/usr/bin/veroroute" rm -f "$pkgdir/usr/share/metainfo/veroroute.appdata.xml" if find -- "$pkgdir/usr/share/metainfo/" -prune -type d -empty | grep -q .; then rmdir "$pkgdir/usr/share/metainfo/" fi rm -f "$pkgdir/usr/share/man/man1/veroroute.1" if find -- "$pkgdir/usr/share/man/man1/" -prune -type d -empty | grep -q .; then rmdir "$pkgdir/usr/share/man/man1/" fi if find -- "$pkgdir/usr/share/man/" -prune -type d -empty | grep -q .; then rmdir "$pkgdir/usr/share/man/" fi rm -f "$pkgdir/usr/share/applications/veroroute.desktop" if find -- "$pkgdir/usr/share/applications/" -prune -type d -empty | grep -q .; then rmdir "$pkgdir/usr/share/applications/" fi rm -f "$pkgdir/usr/share/pixmaps/veroroute.png" if find -- "$pkgdir/usr/share/pixmaps/" -prune -type d -empty | grep -q .; then rmdir "$pkgdir/usr/share/pixmaps/" fi rm -f "$pkgdir/usr/share/icons/hicolor/72x72/apps/veroroute.png" if find -- "$pkgdir/usr/share/icons/hicolor/72x72/apps/" -prune -type d -empty | grep -q .; then rmdir "$pkgdir/usr/share/icons/hicolor/72x72/apps/" fi rm -f "$pkgdir/usr/share/veroroute/veroroute.png" rm -rf "$pkgdir/usr/share/veroroute/tutorials" rmdir "$pkgdir/usr/share/veroroute" rm -rf "$pkgdir/usr/share/gEDA/sym/veroroute_battery" rm -rf "$pkgdir/usr/share/gEDA/sym/veroroute_bbd" rm -rf "$pkgdir/usr/share/gEDA/sym/veroroute_connector" rm -rf "$pkgdir/usr/share/gEDA/sym/veroroute_diode" rm -rf "$pkgdir/usr/share/gEDA/sym/veroroute_electromechanical" rm -rf "$pkgdir/usr/share/gEDA/sym/veroroute_linear" rm -rf "$pkgdir/usr/share/gEDA/sym/veroroute_logic" rm -rf "$pkgdir/usr/share/gEDA/sym/veroroute_passive" rm -rf "$pkgdir/usr/share/gEDA/sym/veroroute_regulator" rm -rf "$pkgdir/usr/share/gEDA/sym/veroroute_spin" rm -rf "$pkgdir/usr/share/gEDA/sym/veroroute_transistor" if find -- "$pkgdir/usr/share/gEDA/sym/" -prune -type d -empty | grep -q .; then rmdir "$pkgdir/usr/share/gEDA/sym/" fi rm -f "$pkgdir/usr/share/gEDA/gafrc.d/veroroute-clib.scm" if find -- "$pkgdir/usr/share/gEDA/gafrc.d/" -prune -type d -empty | grep -q .; then rmdir "$pkgdir/usr/share/gEDA/gafrc.d/" fi VeroRoute/Src/images/paintpins.png000644 001750 001750 00000001414 14214153737 017452 0ustar00alexalex000000 000000 ‰PNG  IHDR szzєsRGBЎЮщgAMAБ ќa pHYsУУЧoЈdЁIDATXGЭ•ПKAЧЧхМ "ЇD  —`в(IЫ4kђфGuзЄRRЄ1UBў‚n“оt g“@X#"œбТEƒИGжу6я;;sьэ/wvOЬ†™7;ЛпїоМ™e1%M[Ѓо•­\,ж1Oэ\15mџ~Љdз+wgzкugfx[žœtбQщP•ЏЮРу’‹&Lж'zАtЅPxіmjЊ8бп/ІТЌžœА{[[ЭƒVы=™5o6žЛЅ36СX§ЃХšћ4ёЌzЙPxќKзХСьалзѕ8Kfъ-ё‹Г]oШ И”rўёДьžžВЪњњнn‰ЉX‚тѕЏ>>@Їх…0CD‰'ЈrЯRлpm ЇЕЋ˜9qт"њВ3WАiХw‘єŠ јYhД‡?vG˜j˜‡‡ŒjhU˜нт‚ЄшіЇн~љzoЏ)l%ЬЃ#жpœ7‡Ф}бЧ‰lЙr|lЋnnDd€0;т!UѕAx аeђфцЦ†в>р:ІЎqo†№эћYЉ—ШS`ўnЕоŽYV‘%L]Е,џ_ТœJбёУ}tqns“-loЫєr ЧPдИ~ЩйG4н§#ђ‰ЇФ-0pCRЭ ›сД `ihТ~њъ3O§эяwбyY TФAЊEA О0—W~vœ№snјХ%pHGвŠ dF:єхЦ'%q Д8*z 3№nёŽrFsg 8Hэ€Ќz?yХAъЃyФU€xW‹sЈз„„†пЮMRњB$.FŒ•Ыe1Ъv™IЂ^VЌgdMiOИq€\˜јcџћ)K ˜ЎžIENDЎB`‚VeroRoute/libraries/gEDA/veroroute_electromechanical/Switch_Onboard_SPST.sym000644 001750 001750 00000001117 13515171160 027534 0ustar00alexalex000000 000000 v 20130925 2 T 300 500 8 10 0 0 0 0 1 numslots=0 P 300 500 0 500 1 0 1 { T 150 550 5 10 1 1 0 0 1 pinnumber=2 T 150 550 5 10 0 0 0 0 1 pinseq=2 T 150 550 5 10 0 0 0 0 1 pinlabel=2 T 150 550 5 10 0 0 0 0 1 pintype=pas } P 600 500 900 500 1 0 1 { T 750 550 5 10 1 1 0 0 1 pinnumber=1 T 750 550 5 10 0 0 0 0 1 pinseq=1 T 750 550 5 10 0 0 0 0 1 pinlabel=1 T 750 550 5 10 0 0 0 0 1 pintype=pas } L 300 500 600 700 3 0 0 0 -1 -1 T 200 0 5 10 1 1 0 0 1 device=Name T 300 200 8 10 1 1 0 0 1 refdes=S? T 895 793 8 10 0 0 0 0 1 footprint=SWITCH_ST2 T 895 793 8 10 0 0 0 0 1 description=Onboard Switch VeroRoute/tutorials/tutorial_10.vrt000644 001750 001750 00000035005 14433261414 017667 0ustar00alexalex000000 000000 9 6TUTORIAL 10 - CONNECTIONS BETWEEN ADJACENT POINTS Click on the vertical 12k resistor to select it, then move it down by one grid step. Notice that diagonal connections are automatically made towards the left. That is because we are in a mode with diagonal connections enabled. In this mode, diagonally adjacent grid points with the same netlist ID are considered to be electrically connected, and so track is drawn between those grid points. Now move the resistor one step to the right. The diagonal connections to the left are now broken and new connections are made to the right. Horizontally or vertically adjacent grid points with the same netlist ID are ALWAYS considered to be electrically connected, and so track is drawn between them. You have just seen the basic principle underlying the whole program. Tracks are defined in VeroRoute by the set of netlist IDs "painted" to the grid points. The program creates track segments between adjacent grid points with the same netlist ID. You can think of this as laying down blobs of solder onto perfboard pads, with the program automatically bridging adjacent blobs together where necessary to make a solder track. џџџџџџџџџџџZ.. 2< џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџPџџџџџџџџџџ‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ1џџџџџџџџџџAџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџLџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџFџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџdџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ @џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџdџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџTџџџџџџџџџџ“џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџLџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ1џџџџџџџџџџAџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџFџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџdџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџФџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ   C110uC(Electrolytic 200 milCAP_ELECTRO_200 NF(12П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџџџ,R112kRResistorRESISTOR NF(12ПњсGЎzс?њсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§Р\(ѕТПјQы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?јQы…ИR@\(ѕТПй™™™™™š?й™™™™™™@V€‚Я§ПњсGЎzс?њсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПњсGЎzс?њсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§Р\(ѕТПјQы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?јQы…ИR@\(ѕТПй™™™™™š?й™™™™™™@m @_Р‚Я§B@џџџўINVALID TracksWF(џџџ€џџџ€џџџ€џџџ€џџџџџџџџF#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Р@Р@@V€џVeroRoute/tutorials/tutorial_9.vrt000644 001750 001750 00000071625 14433261403 017625 0ustar00alexalex000000 000000 9оTUTORIAL 9 - PREVENTION OF SHORT-CIRCUITS VeroRoute prevents short-circuits from being made (assuming the netlist has been correctly specified). If you try to place a part in a location that produces a short-circuit then the part will not be placed, and it will be made to float instead. Try the following. Click on the horizontal wire at the left of the grid and drag it right to try and connect the long vertical tracks. The wire will float because those two tracks have different netlist IDs. Note that when one end of the wire first touches a track, the other end of the wire automatically gets the correct netlist ID and becomes colored. Wires in VeroRoute do not have a netlist ID of their own. They only inherit a netlist ID from the grid square on which they are placed. Another important thing to mention is that the color is only a rough guide to the netlist IDs. By default, all colors are dynamically re-assigned and re-used, so if you see two tracks of the same color and find that you cannot connect them with a wire, then it means that the tracks have different netlist IDs. You may wish for a particular netlist ID to always be drawn in a fixed color. To do this, double-click on a track or pin that has that netlist ID. This will show the track in dark grey indicating you have made that the selected net. Then uncheck the "Auto-Color" box in the Control Dialog. To use a color of your choosing, use the "Set Color" button in the Control Dialog. Note that the selected color will still be affected by the settings of the Saturation  and Fill  controls in the dialog. Here is another example to try... Click on the top resistor and rotate it by 180 degrees by using the rotate buttons, or the "Z" or "X" keys. The resistor is made to float because the netlist IDs on its pins no longer match the underlying track. Now try the same thing with the bottom resistor and you will see something different happen. This time, the track seems to get shorter as soon as the resistor is rotated. That is because there was actually no track under the resistor pins in the first place. There seemed to be a continuous piece of track there before because the resistor pins had the same netlist IDs as the adjacent pieces of track and connections were being automatically made. After being rotated by 180 degrees, the resistor can still be placed on the grid because there is no track there. џџџџџџџџџџџZ.. 2<  џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ @џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ DџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ DџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ DџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ DџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ DџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ DџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ DџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,R1220kRResistorRESISTOR WF(1 2ПњсGЎzс?њсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§Р\(ѕТПјQы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?јQы…ИR@\(ѕТПй™™™™™š?й™™™™™™@V€‚Я§ПњсGЎzс?њсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПњсGЎzс?њсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§Р\(ѕТПјQы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?јQы…ИR@\(ѕТПй™™™™™š?й™™™™™™@m @_Р‚Я§џџџШD Wire1 Wire1WireWire WF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџџџ,R2470kRResistorRESISTOR EF( 12ПњсGЎzс?њсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§Р\(ѕТПјQы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?јQы…ИR@\(ѕТПй™™™™™š?й™™™™™™@V€‚Я§ПњсGЎzс?њсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПњсGЎzс?њсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§Р\(ѕТПјQы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?јQы…ИR@\(ѕТПй™™™™™š?й™™™™™™@m @_Р‚Я§B@џџџўINVALID TracksWF(џџџ€џџџ€џџџ€џџџ€џџџџџџџџF#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Р@Р@@V€џVeroRoute/libraries/gEDA/veroroute_transistor/PNP_BC560.sym000644 001750 001750 00000001562 13515171161 023765 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=1 T 400 850 5 6 0 0 0 0 1 pinseq=1 T 400 850 5 6 0 0 0 0 1 pinlabel=1 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=3 T 400 50 5 6 0 0 0 0 1 pinseq=3 T 400 50 5 6 0 0 0 0 1 pinlabel=3 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 297,341 L 199,350 L 269,277 L 275,310 z T 600 700 5 10 1 1 0 0 1 device=BC560 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=PNP Transistor VeroRoute/libraries/gEDA/veroroute_transistor/MOSFET_Nchannel_MTP3055.sym000644 001750 001750 00000002011 13515171161 026357 0ustar00alexalex000000 000000 v 20130925 2 T 0 200 5 10 0 0 0 0 1 numslots=0 P 0 200 200 200 1 0 0 { T 0 300 5 10 1 1 0 0 1 pinnumber=1 T 0 300 5 10 0 0 0 0 1 pinseq=1 T 0 300 5 10 0 0 0 0 1 pinlabel=1 T 0 300 5 10 0 0 0 0 1 pintype=pas } P 500 600 500 800 1 0 1 { T 300 700 5 10 1 1 0 0 1 pinnumber=2 T 300 700 5 10 0 0 0 0 1 pinseq=2 T 300 700 5 10 0 0 0 0 1 pinlabel=2 T 300 700 5 10 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 300 0 5 10 1 1 0 0 1 pinnumber=3 T 300 0 5 10 0 0 0 0 1 pinseq=3 T 300 0 5 10 0 0 0 0 1 pinlabel=3 T 300 0 5 10 0 0 0 0 1 pintype=pas } L 250 600 500 600 3 0 0 0 -1 -1 L 250 200 500 200 3 0 0 0 -1 -1 L 250 400 350 450 3 0 0 0 -1 -1 L 250 400 350 350 3 0 0 0 -1 -1 L 250 675 250 525 3 0 0 0 -1 -1 L 250 475 250 325 3 0 0 0 -1 -1 L 250 275 250 125 3 0 0 0 -1 -1 L 200 600 200 200 3 0 0 0 -1 -1 L 250 400 400 400 3 0 0 0 -1 -1 L 400 400 400 200 3 0 0 0 -1 -1 T 600 200 5 10 1 1 0 0 1 device=MTP3055 T 600 500 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO220 T 600 400 8 10 0 0 0 0 1 description=N-Channel MOSFET VeroRoute/tutorials/tutorial_21.vrt000644 001750 001750 00000272777 14561430064 017715 0ustar00alexalex000000 000000 :LВTUTORIAL 21 - PRODUCING 2-LAYER BOARDS There are 2 ways of producing a 2-layer board in VeroRoute for Gerber export. The first ("poor man's") way is to design the board as a single layer. Such a design will most probably contain wires (jumpers). Exporting the layout as a 2-layer board will simply convert wires to tracks on the top-layer. This approach is not very flexible for several reasons. Firstly, VeroRoute does not allow wires to be placed anywhere. For example it will make wires "float" if they try to cross certain parts. Also, since VeroRoute cannot automatically create wires for you, you have to do more work as a user in order to help the auto-router route the layout for you. The better way to produce a 2-layer board is to create a second board layer in VeroRoute and try not to use any wires in the design at all. 21.1 WORKING WITH 2 LAYERS When you create a new layout, VeroRoute creates a single board layer (i.e. the "bottom" layer) because it is assumed that most users are using the software for stripboard and perfboard layouts. Adding a second layer (i.e. the "top" layer") to either a new or an existing layout is easy. Just use the "Layers -> Add Top Layer" menu item. The top layer can be removed using "Layers -> Remove Top Layer". It is not possible to display and edit both board layers at the same time, so you have to switch between them. The status bar at the bottom of the main window shows which layer is currently being displayed, for example "Layer = Bottom". To switch to the other layer, use the button on the far right of the toolbar, or press the "L" key for "Layer". The button in the toolbar shows which layer you will switch to, using blue to represent the top layer and green for the bottom layer. These colors match the layer colors in PCB mode. Select "PCB" mode in the Control Dialog and see what switching between layers does. 21.2 MANIPULATING PARTS WITH TWO LAYERS VeroRoute considers all through-hole parts as being placed on top of the board, but they can be manipulated regardless of which board layer is displayed. When placing a part, VeroRoute will check for short-circuits on both board layers, and float the part to prevent a short from occurring. So if you find that a part is made to float even though you cannot see a problem with the displayed track pattern, then that will be because there is a mismatch with the other layer. 21.3 SELECTING TRACKS BY AREA The functionality to select tracks by area works as in the single layer case, and will only select tracks on the currently displayed layer. 21.4 CONNECTIONS BETWEEN LAYERS In VeroRoute, a connection between layers can happen in two ways: 1) At the pin of a through-hole part (or wire-end): All through-holes in 2-layer mode are assumed to be plated though-holes (PTH), so the two layers are always connected at these locations. 2) At places with no component pin (or wire-end): Such places are referred to as "vias". They are simply (slightly smaller) plated through-holes. You can enable or disable the use of vias using the option under the Layers menu. When vias are disabled, layers are only joined at the pins of through-hole parts. When vias are enabled, VeroRoute automatically creates vias where they are needed. They are generated based on the track layout and connectivity. You cannot manually add a via, but you can produce a track pattern that will force one to be required as explained below. 21.5 REMOVING UNWANTED VIAS VeroRoute creates a via between layers at any point where the two layers share a netlist ID but do not have a path to a common pin. If you see that a route between two pins changes layer through a via, and you can find a better path between those pins that avoids changing layer, then manually paint in the path and the via will be automatically removed. Reload this tutorial, and then try the following example: EXAMPLE: Look at the top left corner of the layout. There are 2 vias there (i.e. two holes in the track). If you switch between the layers you will see that in one layer those points are connected to pin 1 of IC2, and in the other layer they are connected to pins 4,13,14,15,16 of IC2. So pin 1 is connected to those other pins by using the track with vias. One via would be sufficient of course, and this example is included purely to illustrate how the logic works. Now try the following: In the top layer, manually paint a direct connection between pins 1 and 4 of IC2. The vias will disappear because they are no longer required. In other words, there is no longer a need to make holes in the board there because the points in both layers are now connected through the pin holes of IC2. If you remove the connection that you painted, then the vias will come back. 21.6 PIN LAYER PREFERENCE When two adjacent pads on the board have the same netlist ID, VeroRoute considers the two pads to be electrically connected. For example, look at pins 6 and 7 of IC1. A track section is drawn between those pads on both layers of the board. In some cases you may want a track section to appear on only one of the layers. For example, when doing a ground pour you may want to minimise the number of tracks in the poured area. For all component pins in VeroRoute (except wires and SOICs) you can set the preferred layer to be used for making connections to adjacent pins. To do this, you must be in PCB  mode, so select "PCB" in the Control Dialog for this next part of the tutorial, and display the top layer with blue tracks. Notice the pads are all drawn in grey. The grey color means the component pin has no preference as to which layer is used for connecting to adjacent pins. Now try this. On the "Layers" menu item, select "Edit Pin Layer Preferences", or the equivalent button on the toolbar. This option is only available with 2 layer layouts in PCB mode. Now click with the mouse on pin 7 of IC1. The pad will change in color from grey to blue. This means the pin now prefers to be connected to adjacent pins using the blue layer. So there is no longer a track between pin 6 and pin 7 on the green layer. View the bottom layer with green tracks and you will see the track between pin 6 and pin 7 is no longer there. Now go back to the blue layer and click on pin 7 again and this will change its color from blue to green. The track between pin 6 and pin 7 disappears on the blue layer and appears on the green layer. Finally, go back to the blue layer and click on pin 7 once more and the pad will turn from green to grey, meaning there is no layer preference (the default). So to summarise: While "Edit Pin Layer Preferences" is selected, clicking on a pin in PCB mode changes the preferred layer for the pin, and this preference is represented by the pad color in PCB mode. The pad colors Blue, Green, Grey correspond to "Prefer Blue Layer", "Prefer Green Layer", and "No Preference" respectively. A click on the pin will cycle through the 3 possible colors in order. While displaying the blue layer the order is (Grey -> Blue -> Green -> Grey) and the reverse order is used while displaying the green layer. If two adjacent pads have the same netlist ID, then the pad colors (green/blue/grey) determine which layers will have a track between the pads. Here are the rules: 1) If both pads are grey, then there is no preferred layer, so tracks are drawn on both layers. This is the default in VeroRoute. 2) If one pad is green and the other is blue, then there is disagreement about the preferred layer, so tracks are drawn on both layers. 3) In all other cases, one of the pads will not be grey, and it will determine the layer used. Example 1: If both pads are blue, then both pads prefer blue, so the track will only appear on the blue layer. Example 2: If one pad is green and the other is grey, then one pad prefers green and the other has no preference, so the track will only appear on the green layer. 21.7 APPLYING OFFSETS TO PAD/HOLE LOCATIONS VeroRoute works on a grid of points that are all separated by 100 mil (2.54 mm), and although many through-hole parts have pin separations that are multiples of 100 mil, some do not. VeroRoute allows each pad/hole for a component pin to be offset by up to 50 mil (1.27mm) in the horizontal and vertical directions from its default location (a grid point). This can only be done while the part is placed on the grid. Note that these offsets are ignored when using the Vero  track styles. It is not currently possible to set the pad offsets in the component editor, however if you add a part from your layout to the parts library, then any pad offsets for that part will be copied and stored in the library part. Similarly, if you make a copy of a part, then its pad offsets will also be copied. As an example, let us modify the pad locations for the capacitor C4 near the bottom-left of the current layout. Click on the left pad of C4, hold down the mouse button for 1 second, then release it. This operation of doing a "slow click" on a pin is what launches the pad offset dialog. This will show controls for setting the pad offset near the toolbar. The offset relative to the grid point is shown in the left of the status bar. Try to move the pad as far left and as far down as possible until the offset is (-50, 50) mil. If all the pads on a component are displaced by the same amount then VeroRoute will take that to mean that the entire component has been offset from the grid, and so it will apply the horizontal and vertical offsets to the component outline and text labels also. Try that out now by clicking on the other pad of C4 and moving it as far left and as far down as possible. If you click on another location with no pads, then the pad offset controls will disappear. џџџџџџџџџџџL00" 2< џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ.џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџ 8џџџџџџ џџџџџџџџџџ@џџџџџџџџџџџџџџџџџџџ >џџџџџ >џџџџџ 1>џџџџџ a>џџџџџ >џџџџџ >џџџџџ р>џџџџџ >џџџџџџџџџџџџџџџ 4џџџџџ 14џџџџџ 24џџџџџ а4џџџџџ ‘4џџџџџ 14џџџџџ Q4џџџџџџ‘џџџџџџџџџџ џџџџџџџџџ :џџџџџџ џџџџџџџџџџ 1џџџџџџџџџ A8џџџџџџ џџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџNџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџ '`:џџџџџџ џџџџџџџџџџџџџџџџџџџFGџџџџџџџџџџџџџџџџdџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџPџџџџџџџџџџ‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ1џџџџџџџџџџQџџџџџџџџџџ‘џџџџџџџџџџ1џџџџџџџџџџAџџџџџџџџџџџџџџџџџџџџФџџџџџџџџџ#@.џџџџџџџџџџџџџџџџ'4џџџџџџџџџ'c6џџџџџџџџџџџџџџџџDџџџџџџџџџ@6џџџџџџ4џџџџџџџџџџSџџџџџџџџџ >џџџџџ +>џџџџџ  >џџџџџ >џџџџџ Р>џџџџџ @>џџџџџ  >џџџџџ >џџџџџџџџџџџџџџџ 4џџџџџ 4џџџџџ -@4џџџџџ @4џџџџџ 4џџџџџ X4џџџџџ …4џџџџџџ#dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ';џџџџџ '5џџџџџ Ф5џџџџџ D5џџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџ)@ џџџџџџXџџџџџџџџџџ…џџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџ.3џџџџџ.Aџџџџџ.Bџџџџџџ-DџџџџџџџџџџdџџџџџџџџџџџџџџџџџџџџЬџџџџџџџџџ$@Bџџџџџ #/џџџџџ #/џџџџџ "Р/џџџџџџџџџџџџџџџџ Xџџџџџџџџџџ …џџџџџџџџџ7џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ)dџџџџџџџџџ  ?џџџџџ )Р?џџџџџ ?џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ @@џџџџџџ-DџџџџџџџџџџTџџџџџџџџџ ›@џџџџџ2џџџџџџ$Фџџџџџџџџџџџџџџџџџџџџ"Xџџџџџџџџџџ"…џџџџџџџџџџџџџџџџџџџ L9џџџџџ 09џџџџџџAџџџџџџџџџ /`џџџџџџџџџџџџџџџ џџџџџџ џџџџџџџџџ )Tџџџџџџ)›џџџџџџџџџџ)џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ @џџџџџџ-ФџџџџџџџџџџLџџџџџџџџџ $@џџџџџ$2џџџџџ $0џџџџџ %@0џџџџџ " 0џџџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџџ џџџџџџџџџџFџџџџџџџџџ /џџџџџџ/3џџџџџџџџџџ/aџџџџџџџџџџџџџџџџџџџџ)LџџџџџџџџџџPџџџџџџџџџџ‘џџџџџџџџџџ1џџџџџџџџџџAџџџџџџџџџ@џџџџџ3џџџџџ-Aџџџџџ -@џџџџџџ-џџџџџџџџџџdџџџџџџџџџ ,@џџџџџ,1Cџџџџџџ,Aџџџџџџџџџџ%Dџџџџџџџџџ(џџџџџ#џџџџџџџџџџџџџџџџФџџџџџџџџџ@#џџџџџD7џџџџџ `џџџџџџџџџџџџџџџ /6џџџџџџ /Cџџџџџџџџџ )џџџџџџLџџџџџџџџџџџџџџџџџџџ @џџџџџџ fџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџ €@џџџџџџџџџџџџџџџџџџџџџџџџџ 3@џџџџџACџџџџџџ,Fџџџџџџџџџџ%DџџџџџџџџџџџџџџџџџџџџPџџџџџџџџџџ™џџџџџџџџџџџџџџџџџџџDOџџџџџџDџџџџџџџџџџ4џџџџџџџџџџCџџџџџџџџџџџџџџџџџџџџ/FџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџ`Fџџџџџџџџџџџ4џџџџџџџџџџCџџџџџџџџџџџџџџџџџџџ,џџџџџџџџџџџџџџџџџџџџџџџџџ!,џџџџџ!-џџџџџџFџџџџџџџџџџ,Dџџџџџџџџџ%D-џџџџџџџџџџџџџџџ  џџџџџ џџџџџ *Рџџџџџ џџџџџџDџџџџџџџџџ@ џџџџџџFџџџџџџџџџџџџџџџџџџџ/ џџџџџџџџџџџџџџџџDџџџџџџџџџџ4џџџџџџџџџџCџџџџџџџџџ џџџџџ џџџџџ @џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџФџџџџџџџџџџ,Dџџџџџџџџџџ%Dџџџџџџџџџ((џџџџџџ*аџџџџџџџџџџ*™џџџџџџџџџџ*џџџџџџџџџџџџџџџџџџџџФџџџџџџџџџ Dџџџџџџ Dџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџФџџџџџџџџџ+џџџџџцџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџаџџџџџџџџџџ‘џџџџџџџџџџ1џџџџџџџџџџyџџџџџџџџџџхџџџџџџџџџ,Kџџџџџ%1џџџџџ*8!џџџџџџ*MџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџXџџџџџџџџџ…*џџџџџ Dџџџџџџ Dџџџџџџџџџ џџџџџџџџџџџ9џџџџџџџџџџEџџџџџџџџџXџџџџџџ•џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ9џџџџџџџџџџMџџџџџџџџџ  џџџџџ ` џџџџџ > џџџџџџWџџџџџџџџџџГџџџџџџџџџџAџџџџџџџџџџџџџџџџџџџ *Fџџџџџ @џџџџџ (@џџџџџ Lџџџџџџџџџџџџџџџ <џџџџџџ Фџџџџџџџџџ &<џџџџџ&=џџџџџџџџџџџџџџџџFџџџџџџџџџL=џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџFџџџџџџџџџџџџџџџџџџџџ4џџџџџџџџџџCџџџџџџџџџџNџџџџџџџџџџџџџџџџџџџџFџџџџџџџџџџџџџџџџџџџ* џџџџџџФџџџџџџџџџџ(Dџџџџџџџџџ џџџџџџџџџџџџџџџ 8џџџџџџ Eџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџФџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ РџџџџџџDџџџџџџџџџџPџџџџџџџџџџџџџџџЦџџџџџџџџџџDџџџџџџџџџ0@Kџџџџџ1џџџџџР!џџџџџX%џџџџџџ…џџџџџџџџџџ(Dџџџџџџџџџ@%џџџџџ@*џџџџџ @ џџџџџџ Fџџџџџџџџџ  ` џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџ  аџџџџџ  џџџџџ  џџџџџ џџџџџџDџџџџџџџџџџLџџџџџџџџџxџџџџџџХџџџџџџџџџD"џџџџџџ0DџџџџџџџџџџXџџџџџџџџџ…"џџџџџЬJџџџџџџџџџџџџџџџџ(DџџџџџџџџџDJџџџџџџDџџџџџџџџџDџџџџџџDџџџџџџџџџџ џџџџџџџџџ џџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ Pџџџџџџџџџџ ‘џџџџџџџџџ џџџџџџФџџџџџџџџџџDџџџџџџџџџ<џџџџџџGџџџџџџџџџџDџџџџџџџџџџ0DџџџџџџџџџџLџџџџџџџџџџXџџџџџџџџџџ…џџџџџџџџџџџџџџџџџџџџ(DџџџџџџџџџPџџџџџџDџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџ Pџџџџџџ ‘џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ 1џџџџџџџџџџ Aџџџџџџџџџџ LџџџџџџџџџџPџџџџџџџџџ™џџџџџџџџџџџџџџџџФџџџџџџџџџ @џџџџџ Hџџџџџ Hџџџџџџ0DџџџџџџџџџџDџџџџџџџџџ  &џџџџџ &џџџџџ 'џџџџџ (D'џџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџ Lџџџџџџџџџџџџџџџџџџџџџџџџџ+џџџџџ +џџџџџ  џџџџџ  Dџџџџџ lџџџџџџџџџџџџџџџ џџџџџџ џџџџџџџџџ  Dџџџџџџџџџџџџџџџџџџџџџџџџџџ0DџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ(DџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџNџџџџџџџџџџџџџџџ   џџџџџџ џџџџџџџџџ + џџџџџMџџџџџ Dџџџџџџ џџџџџџџџџ  DџџџџџџџџџџџџџџџLџџџџџџџџџџџџџџџEџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџ0Sџџџџџ)џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ(Rџџџџџ Qџџџџџ$џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџаџџџџџџџџџџБџџџџџџџџџџQџџџџџџџџџџБџџџџџџџџџџQџџџџџџџџџџ‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ1џџџџџџџџџџAџџџџџџџџџџPџџџџџџџџџџ‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ1џџџџџџџџџџAџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџNџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ1џџџџџџџџџџ2џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџFџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџFџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџФџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ' џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџXџџџџџџџџџџ…џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ#џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ'bџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРџџџџџџџџџџ+@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџlџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ-џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ'џџџџџџџџџџ'џџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџ8џџџџџџџџџџEџџџџџџџџџџ+Dџџџџџџџџџџ)џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ4џџџџџџџџџџcџџџџџџџџџџ.џџџџџџџџџџ.џџџџџџџџџџ.џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ$џџџџџџџџџџ#џџџџџџџџџџ#џџџџџџџџџџ"џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџFџџџџџџџџџџ+Dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ)џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ6џџџџџџџџџџSџџџџџџџџџџБџџџџџџџџџџAџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ/@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ+dџџџџџџџџџџ)џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџNџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ$џџџџџџџџџџ$џџџџџџџџџџ$џџџџџџџџџџ%џџџџџџџџџџ"џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ/џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ+џџџџџџџџџџ+3џџџџџџџџџџ+Aџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџdџџџџџџџџџџ-џџџџџџџџџџ-џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,џџџџџџџџџџ,џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ1џџџџџџџџџџAџџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ/џџџџџџџџџџџџџџџџџџџџ)џџџџџџџџџџ+Fџџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџџџџџџџџџџџФџџџџџџџџџџ4џџџџџџџџџџSџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџFџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ+DџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџXџџџџџџџџџџ…џџџџџџџџџџџџџџџџџџџџNџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ!џџџџџџџџџџ!џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ%џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ*џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ/џџџџџџџџџџџџџџџџџџџџ+dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ(џџџџџџџџџџ(џџџџџџџџџџ(1џџџџџџџџџџ(AџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ+Tџџџџџџџџџџ+ƒџџџџџџџџџџ€џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџфџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,џџџџџџџџџџ%џџџџџџџџџџ* џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ(Fџџџџџџџџџџџџџџџџџџџџ€џџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ+LџџџџџџџџџџHџџџџџџџџџџPџџџџџџџџџџ‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ*Bџџџџџџџџџџџџџџџџџџџџ(џџџџџџџџџџHџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ&џџџџџџџџџџ&џџџџџџџџџџџџџџџџџџџџ+DџџџџџџџџџџDџџџџџџџџџџLџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ*џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ+DџџџџџџџџџџџџџџџџџџџџФџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Рџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ0џџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџ@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџџџџџџџџџџџ  џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ+Dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџ+Dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ$џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ @џџџџџџџџџџџџџџџџџџџџ+dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ€џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ @џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ(џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџџ+Tџџџџџџџџџџ+“џџџџџџџџџџ+џџџџџџџџџџ џџџџџџџџџџ @џџџџџџџџџџ(џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџ+ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ0џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ(џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџQ   L0Q2 2N5087QTO92TO92џџџрEF("1%2$3Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   dM Color2 Color2PadPadPADџџџѓEF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп џ  XC12100nCFilmCAP_FILM WF(12Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџџ,R1510kRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R25k6RResistorRESISTOR WF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dP Rate3 Rate3PadPadPADџџџыEF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп   &C1410uC(Electrolytic 200 milCAP_ELECTRO_200 WF(12П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџџ,KR30220kRResistorRESISTOR SF(01,2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   АRT2 10k-BRTVerticalTRIM_VERTџџџёNF(/1/23Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§ џ  XC73n3CFilmCAP_FILMWF(1)2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДP   'C1510uC(Electrolytic 200 milCAP_ELECTRO_200 EF((12П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠф џ  XC947nCFilmCAP_FILMEF(12Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџџ,7R3147RRResistorRESISTORSF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R7100kRResistorRESISTOR EF(1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,#R2039kRResistorRESISTOREF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџџџBD2 1N4148D Diode DIODE EF($1.2Р333333@333333Пй™™™™™š?й™™™™™š@V€џfD@ЬЬЬЬЬЬ@ЬЬЬЬЬЬПй™™™™™š?й™™™™™š@V€џfD@333333@333333Пй™™™™™š?й™™™™™š@V€џfD@ЬЬЬЬЬЭ@ЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џfDР333333@333333Пй™™™™™š?й™™™™™š@V€џfDџџ,.R272k7RResistorRESISTORSF(#12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dS Range2 Range2PadPadPADџџџѓEF(01ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R5470RRResistorRESISTORWF(1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ, R1718kRResistorRESISTOREF(1*2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,D1 1N4001D Diode DIODE WF(1!2Пўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfD?ё™™™™™™?ё™™™™™™Пй™™™™™š?й™™™™™š@V€џfD?ђffffff?ђffffffПй™™™™™š?й™™™™™š@V€џfD?§™™™™™™?§™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfDdQSW2/Range3SW2/Range3PadPadPAD EF( 1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R3100kRResistorRESISTOR WF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  XC1100nCFilmCAP_FILM WF(1 2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџ џ   џ џ „:C18220uC(Electrolytic 250 milCAP_ELECTRO_250 SF('12Пє?єПє?є@V€ŠŠф?юИQы…И?юИQы…ИПщ™™™™™š?щ™™™™™š@V€ŠŠфПє?єПє?є@V€ŠŠфd) Range1 Range1PadPadPADџџџѓџџџљEF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R14470kRResistorRESISTOR WF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§є2C16470pCCeramicCAP_CERAMIC SF($12ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ P   А/RT4 10k-BRTVerticalTRIM_VERTWF(#1#2"3Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§џ џ   џ џ „9C20100uC(Electrolytic 250 milCAP_ELECTRO_250 EF(12Пє?єПє?є@V€ŠŠф?юИQы…И?юИQы…ИПщ™™™™™š?щ™™™™™š@V€ŠŠфПє?єПє?є@V€ŠŠфџџ,R813kRResistorRESISTOR EF(+12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,JR2333kRResistorRESISTORWF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,%R2210kRResistorRESISTORWF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R12M2RResistorRESISTOR EF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dO Rate2 Rate2PadPadPAD џџџщEF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R66k8RResistorRESISTORWF( 1++2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,*R2439kRResistorRESISTOR SF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  X<C1047nCFilmCAP_FILMEF(&12Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџџ,R131MRResistorRESISTOREF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  XC547nCFilmCAP_FILM WF(12Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPdGGndGndPadPadPADџџџюEF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ, R910kRResistorRESISTOREF()12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  XC11100nCFilmCAP_FILM EF(12Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPd;18V18VPadPadPADEF('1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R164k7RResistorRESISTOR EF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§    џџџџџџџџ    @@IC4 LM311ICDIPDIP SF(1,2$3456-78П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€   џџ,3R2810kRResistorRESISTOR NF(.12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dInInPadPadPADџџџѓEF( 1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпєCC17100nCCeramicCAP_CERAMICџџџєNF(,12ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ P   L5U1 78L12QTO92TO92џџџуEF(12'3Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   d$SW1SW1PadPadPADџџџђEF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,(R2127kRResistorRESISTORSF((12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§       џџџџџџџџџџџџџџ       @4IC5 CD4013ICDIPDIP WF(12-3456789101121211314Р ЬЬЬЬЬЭ@ ЬЬЬЬЬЭП§™™™™™š?§™™™™™š@V€   Р ЬЬЬЬЬЭР ЬЬЬЬЬЭП§™™™™™šПа@V€   Р ЬЬЬЬЬЭР ЬЬЬЬЬЭ?а?§™™™™™š@V€   Р ЬЬЬЬЬЭ@ ЬЬЬЬЬЭ?§™™™™™š?§™™™™™š@V€   @ ЬЬЬЬЬЭР ЬЬЬЬЬЭП§™™™™™šП§™™™™™š@V€   @ ЬЬЬЬЬЭ@ ЬЬЬЬЬЭ?§™™™™™šП§™™™™™š@V€   Р ЬЬЬЬЬЭРЬЬЬЬЬЭПа?аРV€@V€           џџџџџџџџџџџџџџџџ        @>IC2SAD1024ICDIPDIPWF(1+2345678910111213141516РЬЬЬЬЬЭ@ЬЬЬЬЬЭП§™™™™™š?§™™™™™š@V€   РЬЬЬЬЬЭРЬЬЬЬЬЭП§™™™™™šПа@V€   РЬЬЬЬЬЭРЬЬЬЬЬЭ?а?§™™™™™š@V€   РЬЬЬЬЬЭ@ЬЬЬЬЬЭ?§™™™™™š?§™™™™™š@V€   @ЬЬЬЬЬЭРЬЬЬЬЬЭП§™™™™™šП§™™™™™š@V€   @ЬЬЬЬЬЭ@ЬЬЬЬЬЭ?§™™™™™šП§™™™™™š@V€   РffffffР ЬЬЬЬЬЭПа?аРV€@V€      LQ1 2N5088QTO92TO92 EF(123Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џџ,-R253k3RResistorRESISTOR EF(%1!2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§    џџџџџџџџ    @IC1 TL072ICDIPDIPWF(+1 2 34 5 6 78П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€   џџ,R44k7RResistorRESISTOREF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dRSW3SW3PadPadPADџџџђEF((1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,AR29220RRResistorRESISTOR SF(-1.2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dL Color1 Color1PadPadPAD џџџѓEF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп    џџџџџџџџ    @IC3 TL062ICDIPDIP EF(1*234*56(78П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€    џ  XDC84n7CFilmCAP_FILMWF(1 2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџ џ   џ џ „8C19100uC(Electrolytic 250 milCAP_ELECTRO_250 NF(12Пє?єПє?є@V€ŠŠф?юИQы…И?юИQы…ИПщ™™™™™š?щ™™™™™š@V€ŠŠфПє?єПє?є@V€ŠŠфџџ,R11470RRResistorRESISTORWF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   HC1310uC(Electrolytic 200 milCAP_ELECTRO_200 WF(12П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџџ, R1010kRResistorRESISTOR EF(/12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ6D3 1N4001D Diode DIODEEF(1'2Пўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfD?ё™™™™™™?ё™™™™™™Пй™™™™™š?й™™™™™š@V€џfD?ђffffff?ђffffffПй™™™™™š?й™™™™™š@V€џfD?§™™™™™™?§™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfDџџ,=R12470RRResistorRESISTORWF(&12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   А?RT11k-BRTVerticalTRIM_VERTџџџђEF(1)23Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§џџ,!R1810kRResistorRESISTOR NF(*12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dFGndGndPadPadPAD EF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп џ  X C347nCFilmCAP_FILMWF(1 2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPdEGndGndPadPadPAD џџџѓEF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп   А RT3 20k-BRTVerticalTRIM_VERT џџџђWF(123Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§dN Color3 Color3PadPadPADџџџѓEF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,1R2622kRResistorRESISTOR SF(1%2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  X C41nCFilmCAP_FILMEF(+1 2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџџ,"R195k6RResistorRESISTOREF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  XC647nCFilmCAP_FILM WF(/1)2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPdOutOutPadPadPAD џџџџџџџяEF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпB@џџџўINVALID TracksWF(џџџ€џџџ€џџџ€џџџ€џџџџџџџџF#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Р@Р@@V€џVeroRoute/libraries/gEDA/veroroute_bbd/MN3006.sym000644 001750 001750 00000003277 13515171160 021677 0ustar00alexalex000000 000000 v 20130925 2 T 300 400 8 10 0 0 0 0 1 numslots=0 B 300 400 1800 1800 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 P 0 1000 300 1000 1 0 0 { T 205 1045 5 10 1 1 0 6 1 pinnumber=1 T 200 1000 5 10 0 0 0 0 1 pinseq=1 T 355 945 5 10 1 1 0 0 1 pinlabel=GND T 200 1000 5 10 0 0 0 0 1 pintype=pwr } P 0 1600 300 1600 1 0 0 { T 205 1645 5 10 1 1 0 6 1 pinnumber=3 T 200 1600 5 10 0 0 0 0 1 pinseq=3 T 355 1545 5 10 1 1 0 0 1 pinlabel=IN T 200 1600 5 10 0 0 0 0 1 pintype=in } P 900 2500 900 2200 1 0 0 { T 850 2295 5 10 1 1 90 0 1 pinnumber=5 T 900 2400 5 10 0 0 0 0 1 pinseq=5 T 950 2145 5 10 1 1 90 6 1 pinlabel=VDD T 900 2400 5 10 0 0 0 0 1 pintype=pwr } P 1500 2500 1500 2200 1 0 0 { T 1450 2295 5 10 1 1 90 0 1 pinnumber=4 T 1500 2400 5 10 0 0 0 0 1 pinseq=4 T 1550 2145 5 10 1 1 90 6 1 pinlabel=VGG T 1500 2400 5 10 0 0 0 0 1 pintype=pas } P 2400 1600 2100 1600 1 0 0 { T 2195 1645 5 10 1 1 0 0 1 pinnumber=8 T 2500 1600 5 10 0 0 0 0 1 pinseq=8 T 2045 1545 5 10 1 1 0 6 1 pinlabel=OUT2 T 2500 1600 5 10 0 0 0 0 1 pintype=out } P 2400 1000 2100 1000 1 0 0 { T 2195 1045 5 10 1 1 0 0 1 pinnumber=7 T 2500 1000 5 10 0 0 0 0 1 pinseq=7 T 2045 945 5 10 1 1 0 6 1 pinlabel=OUT1 T 2500 1000 5 10 0 0 0 0 1 pintype=out } P 900 100 900 400 1 0 0 { T 850 305 5 10 1 1 90 6 1 pinnumber=2 T 900 100 5 10 0 0 0 0 1 pinseq=2 T 950 455 5 10 1 1 90 0 1 pinlabel=CP1 T 900 100 5 10 0 0 0 0 1 pintype=clk } P 1500 100 1500 400 1 0 0 { T 1450 305 5 10 1 1 90 6 1 pinnumber=6 T 1500 100 5 10 0 0 0 0 1 pinseq=6 T 1550 455 5 10 1 1 90 0 1 pinlabel=CP2 T 1500 100 5 10 0 0 0 0 1 pintype=clk } T 1900 2455 5 10 1 1 0 0 1 device=MN3006 T 1900 2655 8 10 1 1 0 0 1 refdes=U? T 1600 2055 8 10 0 1 0 0 1 footprint=DIP8 T 1900 1845 8 10 0 1 0 0 1 description=128-Stage BBD VeroRoute/libraries/gEDA/veroroute_transistor/NPN_2N5088.sym000644 001750 001750 00000001563 13515171161 024051 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=3 T 400 850 5 6 0 0 0 0 1 pinseq=3 T 400 850 5 6 0 0 0 0 1 pinlabel=3 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=1 T 400 50 5 6 0 0 0 0 1 pinseq=1 T 400 50 5 6 0 0 0 0 1 pinlabel=1 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 403,209 L 501,200 L 431,273 L 425,240 z T 600 700 5 10 1 1 0 0 1 device=2N5088 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=NPN Transistor VeroRoute/Src/hotkeysdialog.ui000644 001750 001750 00000001632 14232036534 016674 0ustar00alexalex000000 000000 HotkeysDialog 0 0 680 530 680 530 680 530 Key/Mouse Actions 10 10 661 511 Qt::NoFocus VeroRoute/libraries/gEDA/veroroute_passive/Crystal.sym000644 001750 001750 00000001332 13515171161 023407 0ustar00alexalex000000 000000 v 20130925 2 T 200 700 5 10 0 0 0 0 1 numslots=0 P 200 700 400 700 1 0 0 { T 350 750 5 8 1 1 0 6 1 pinnumber=1 T 350 750 5 8 0 0 0 6 1 pinseq=1 T 350 750 5 8 0 0 0 6 1 pinlabel=1 T 350 750 5 8 0 0 0 6 1 pintype=pas } P 1100 700 900 700 1 0 0 { T 950 750 5 8 1 1 0 0 1 pinnumber=2 T 950 750 5 8 0 0 0 0 1 pinseq=2 T 950 750 5 8 0 0 0 0 1 pinlabel=2 T 950 750 5 8 0 0 0 0 1 pintype=pas } L 500 800 500 600 3 0 0 0 -1 -1 L 900 700 800 700 3 0 0 0 -1 -1 L 500 700 400 700 3 0 0 0 -1 -1 L 800 800 800 600 3 0 0 0 -1 -1 B 600 500 100 400 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 T 300 300 5 10 1 1 0 0 1 device=32768Hz T 500 1000 8 10 1 1 0 0 1 refdes=XT? T 0 100 8 10 0 0 0 0 1 footprint=CRYSTAL T 0 100 8 10 0 0 0 0 1 description=Piezo Crystal VeroRoute/examples/geda_schematic.png000644 001750 001750 00000364003 13515171160 020206 0ustar00alexalex000000 000000 ‰PNG  IHDR@А,cРsBITлсOр IDATxœьн{\“хџЧёkœ*p (Š xФLЭcXš‡4œх!3аЪ0S)ћх12ЯyРRѓˆyЮІyvN-ГT*§–eц№@žp€(‡Б§ўuьО7^ЯGоїюmŸэзЖїЎƒJЏз @Љьф.x,( ŠF€E#Р€Ђ`@бА hXP4,( ŠF€E#Р€Ђ`@бА hXP4,( ŠF€E#Р€Ђ`@бА hXP4,( ŠF€E#Р€Ђ`@бА hXP4,( ŠF€E#Р€Ђ`@бА hXP4,( ŠF€E#Р€Ђ`@бА hXP4,( ŠF€E#Р€Ђ`@бА hXP4,( ŠF€E#Р€Ђ`@бА hXP4,( ŠF€E#Р€Ђ`@бА hXP4,( ŠF€E#Р€Ђ`@бА hXP4,( ŠF€E#Р€Ђ`@бА hXP4,( lBКNуЇбЅ !„0e§ћэр–U%IЊPїЅ!kВ„BRџ\3ВK=Щѓцa`%АРЦЮЌщгyКiаwЇў;ЗВgкМ1[Юч ‘;.ъPР Шхф.‘ƒмЬ*ћфЪYёmf,юQЏœЂyп%ћњ !„pm={mk‘ЎћVођрбб lKЮ™У—ЋЕ (+w`6X`cT*a2Mr—fC€ЖE]­БgтЎИt,6ƒ ”KZ$хџїзqЊѕжаfПћxuмхЌЌ+џlŠ ymСПЙ%V"”<,ХHзiќXлРє§єљџ=Ъ•|z.еrYRЋRЅ€Ўб7zMzГ†Ѓщ:$IОaБiБaО’$брА*Нў‘ОЁФЄы4 Ђ#тЕ!nrW $r€{ЄnжЏ{ЅПcєg[ѓЊ‡oн;=ШM%wQ,ЌШaƒи lC•ЧСIuyџцЌwuЩџ[МgиŒјlЙKВ SжПпnYU’Є u_В6!K!„!ѕЯ5#Лд“<ю„вхжрСТџЩ]ШƒK‰LъzссA>.Ю•лљЄќ~ЖTX†3kњtžnєнЉџЮЦ­ь™6oЬ–ѓyBdФŽ‹:0(ВE9Й 2aЁ"ЉЫ8Љ„ТЮЁДDŒй'WЮŠo3cqzх„Эћ.йзW!„kыйk[‹tнЗђ–XJёЄC€вƒ Ъsц№хj=ЪЪ] Г{c)I’Xm@)WZњї@ёT*a2Mr—‡XŠсЂM Bqы…wк:uЕЦž‰Лтв_o'Бф"(ŒXPЇZo mіыАWЧ]ЮЪКђЯІШзќ›+wU@А >=—ъFЙ,ЉUЉR@зшН&НYУQˆtF’$пАиДи0_I’4КtЙ+-R~7yзыјё–ГЙТЈ?83ДIeI’<ыМєёЖѓ$r<sfЎг4ˆŽˆз†И SNкЉ]cК Л1џ—ллєLМ~vOџє]k"э–ў1ЏEЙK…Еaw `f*;;a4˜ьеŽeOќ_мŠЗzЙИљ=XY\Яf’z”œ;ЛJ’FwNЇёЛЛгЂ!eлАжў’фUЛэpmŠЁˆkЅ AчA C€˜IС ЧŠ5Жь}­їмбЭ\„НкйA%„с?нЄ…N}?[Vю"aУмBДzН>9&Ш=(&YЏзkC\я9Ц”Жoд№—;wdqрУFяKЯП–^Џз_9Ођ&Ёš•"ыЏЉяEЋ>м•’ќлч5З ŸtшК naBРLмƒbт6доЙrV|›‹{д+'„hоwЩООB1љx“НƒскUƒбЩгЏ<Й†mИЯщ"ћШТy9}У†Џ•Е>РйŒп8˜šэ\ГЌ§CЏ ХD€eiцЪ_Ь›…•˜œФ˜№?вЯKа†ИЩqџЦд}п|oжЯџ™Њv™ПsqЯЊМт!Ѓэ‰лЗ'nnэыъkЁЛL‹ ѓНеVХ$k_7ЙЩ›aOЛъйЂџœЯ•Bфœ‹Л,ѕЈPЈџеЕпПZlпКІоCѓЗы~іЧўA5,›хœ9|ЙZ€Л'пRй;ЈвuпАXчІ‘лЗ4”-`ƒYнчtЮЎŸњgШgсžШR ˜ŠlЦѓn\НњїЌъœJSћwќdб‚›Л3ќР“  AIК~tЯцЕd\{Я$Є–#О=z>ёћАcc'dф=dЅеh;љw оѕGTIн‡[ˆ6щf^ьЂеІ qоЇ|wќ’ўтБŸЕЏh/„ЎэП9ЙЃЛWЁ‚n/oM-|Х–NЏ„BЅ&ЃБЈхнBЖ]ќїЧёвзC'фXМ.”ˆЂNЗIПoњКZУB§юs%€RеŒ;VnћЮ€AбПžџяЄЖoцЌГŽ2u%€'C€…’TІQxкrіАїhиКUя2.N“›З+]˜!ЗѕюяЖ?і|l№Црј+ёr—Ѓ`ъj=wХЅпљY87увхFЁrђlєZЏъgіЪКЯеa]Š<нчЌићe[Щ7,6-6ЬїХ)yrx"›quРлcGНеТЇŒs…fa}ЎўuŽŸ<,и>У…Ÿ~лёЫСѕm№uѕеjДauТ4ZM vХВvNЕокьзaЏŽЛœ•uхŸM‘!Џ-ј7#~rлчп]s<=ћъпW(пЈŠUџQЇы4ЗWg’МыuќxЫймвЙfS‘ЇлЅУІ+zН^ЏOŽ rŠIўё­Ъќ  dй ‹œ3›Ft|Њ‚$IъvК>‰јхОŠlЦЏ™к1xаІS™Y—Х,=Yљ…ъV§Ў @А`уђ.}љцЏЩkЧО ёr‡rфwХŠПOWЌћp№щЙT7ЪeAH­J•КFпш5щЭЎЯ гчњ”–ОоелЬ4ѕ›§A=kџ(ь“ЌзыѕW/&§25@7bТСŒвЙfSQЇ›њXвН ђХcGьj0ыpЪЅ”УГ|9ў@ІмE*WQЭxЙ€>ƒ[&|вМJЅZЏЎЊ8тЋўЕрЩ0Ѕ5lZо‡ЭpПюучмT?њAd™5_ЁK.ТL|]}WЗ_Н=qЛFЋи``d“HЙ+Ruѕзfюmfс]^­Fnњ{Є\••0LіjG‘YZзl*тtИc™W(YЗdЇђОщ&“PЉь]МќЪѓЭщAŠhЦН;Lкql’\А=4У(Iљ‹… ыЋ‰I–c!ТЬ?Wn=Аo‹я!„x:ъЏНќџ5oс8ЩJšФ“ъфп)Ю'.boD№ЦршVб <<јјŒŸоkау|єП2­ь ѓ*X&вЩУЇŠwЕ†Нч~бЬщш<жlЫЛЗA–*дŸпCгЁ~х\!}Мk;“Q€МАP’мBДzYћЙНМѕ*˜ tюNюЗКb…е ‹lщюф^єЁІЋ‡v]А+…Нsl•{PLм†к›GmЌ9rxPy;!DіеЖя hз!ќЕFŽG…П>`VЛ_Ц№• JмН В!1цге?џ9)ЌъљЕ_џxEOн@F7€ŒјYdSИŸ]'џNqЁqЩз’ƒ7ЧІФyМёЪяkgи•КvЏjmžИўLЎЌйђЙЋAО~|ЧБ*ЏiъЙЋны†tЋ’№§ЩrWЅ(E~WЌ)-ІєњЎз'П~’–“vчхЦ‹{w•iYлYžъPbЊtьxxьœУ™&‘ЭšM ŸТ ВКr})aНюxzіЕ;7ќ[О 2ШŠ EижBln$ЖЕЛ˜лŽ6bs#БЃмu<Ћ.ў‘фwХJЫIЛЛ+VољнЛЪЖ­WVОвPRьМк}вџzдИ]XГ фTЈAЎ?xо{yгZљzW ŽЪю;чџž&РYЉєђNQTЪH‹$sM.-’ФpГмRОі/(ВOЂёБnРу!—QмКыщz„yЭўфЄоgџ}ŠџBŽIмє(юWџƒ|э_Y?ю™•“т‹јЫ>џ%tП—ёН/Аи”иˆНЩКфЄХIюNю"}чЋўoьЭє•ўјч”ЦЅЌ/жНMЈU(J‘g–г V„wmfЧ$юVЌфТЧm-D^–Аwz§уѕб3_HwяMѓmЏпcпmбЗ/Ыš€f?Х;кˆьTЁіњУжзћRёХ?фdнz ~ пёI./~ќ–OktиєfY{!DоЕe“I^№ъў­~Qљ UюИ%U/вušбK]z 4Sцї@ШЌѓб'биљ€мuРм^о#њ$_о#wХЊ‹/ћ:нЊІЎINЩBУЙЄЕiеК5qqŸђм”шVб{#"іFЄхЄ Зm’6ФMюjSNbLяъ5Кt™юп˜КoBЇКž’фQПЯкГ™Њ(8з`эhЩ( („КNЭЖњ“КsF!Œgu iэjжЩŸm#ЈrаўnћнмЎiИ=qЛЬe>‰ыGїмh^ЫEОLBj9тлЃчП;6vтСыђUbѓ8з`эhЩ( ˜Oі‘Яž‘ tм”jzШсw ‰UKнлeЏл~Э{mћКмінЅлГХК;ЙOynЪъ—Vrр“^пїКgB+QІQxкrЮkябАuЋоe\œ &7oW{KБuœkАvДф† ЬטyEеtZќН^ЏпйеCѕˆWЗш^-cmbBТщu™еКфщ4‹$i‘F—Spy~W,пrОVпKV† ;?§0Жу—ƒыГž”­у\€ЕЃ%p ˜O^fjjќд`/ЩЋё{ыЮф>ђѕеukЕЛ~rбЂ„эkжU;…hћщѕ§Д!NЗШяŠЅеhЃўˆВтЎXђЩЛє]ф› М&Џћ‚Ф[ mу\€ЕЃ%PЋХ%ЫB„А2NўнGNyыЅЎЕўјшЅБГўzeZГG\+P]ОGћœжѓФћ?•аяŒ <ьяЖ?ъЈ†kFЗŠюфпщ‰Ъ.=ђўл8l†Ыјu?чіЈну< ˜ВHЙс\P2ZcЋDKрNX@Б№ХтT§е}…&ЗWj\_}%GˆG А„}ЃIЁњIХ;6ВId'ПN{#bNЦLi1ХзеїQыЕДtЦ7,VˆX_MLВk)fўЙrы}[|ч!ФгQэрWтяƒn=”Е—Ъs @ЩJikќ$hЩ( M˜Oох_зlМктѕ†GЖ'z6ЉZђ“5мъŠМ18ВiфРњKќ.Ÿ„[ˆV/kьіђжЋ„бСЙkGK@aJ цcчЌО ћЈ™§їOu™мПЎЅflЉеhcNФhДšфŒd н+X ˜Њ\“Ё›OшѕњГ{Ѓ^ЊhЩхžѓЛbљo žџї| о3”8,А‘M"їwлП=q{IwХкбFln$vД)Й{PЂв№ЈKУc|l<92b,KГ… (˜ЏЋЏVЃэ§}я†ЃŠхХЙFъcмЫзўvBˆьT!IЦшQЌ›ћт1J(PмFuјCxјѓpџG}џ‡љэБIв§ž“'yŒХЁŒг§№sя‘_љOіфАkiХуНљZD1Zr+yз~$z=;+@€eQVЕ’‡2W{ягЅм'0їп9СMG+и’BuGЇъ_o{ХгѕЃK…йp,гНС[гWO{ЭзIЎjaг’3’#іF!т&ЦљЮ*Љu wДйЉBэ!є‡ќЯœГE~ъ-nГаЯ мџQпЗyn‚9w‹}f‹ОчЧОпЛмяy+жщ6ЧЙ.в“=9,РvZcљ”lKnЩwэтуg РZ`ц`М‘*M8є§‡5 іЄыю<"ћШŒў_ћLќхЬѓъПNмњѓЙW|Ћ“`СмЂўˆš?пЫОМGH’БД}/ К4<ЦЧЦ“ #>„ц`ЬLЭvі({яœнЦд=ƒ[Дw№ђЩMлЎЗььчZІRаGs?%НBђтЧo|eef^СжЕe!ЦЧчыЊёWтƒ7ЧžнпmIЇW`aX€9фнИzѕяY!е%IђnєЦЬпвђ;"RЖŽsiаЪOе)G.9х­{ЃЎ‡TОіЫуМ\МPЅŒ}nUSз$Їф !„с\вкДjнъи ‘Л'|}јžмћ^/ъ(VV'LЋбњКо3l0]Ї‘nбшвK№@I Р‚rRџ\3ВK=ЩГр Ж!eлАжў’фUЛэpmŠЁШ=JсXЙэ;EџzўП“кО™ГЬ:š-DnвЊЦ_13дзQ˜Œй™Їу*Fю=›ИoD™хƒgЩ–Лf(‘КNЭЖњ“КsF!Œgu iэjжQ !LY3/f™ŠИB~ЧЋј+ёъxхЂеыѕz§Ѕ?Ї‡hz6(S’Js`A12bЧEj:(ВХŸы„Т”Жoд№—л^џјЄN§GяkЙЈщяwэYмЦэaЗj!ъ€ЗЧŽЪџgГА>_ЦœЫm& iзЋеIZОѓ|HяЊŽх§+еЌвиЛŒSХnНІЌJЩ еђ %RKнлeй~-ќ]Б}]nћ™ЎG?Y§тќыBЛ\eўјЦ”Ц7ЧЊцЯxн*К“Ї‡пtо…mужеВЙ ПeБј,(­1X;ОЧ(FКNsчЂuЅŽkыйk[‹tнЗљ›Y'ДП{іZ\ЉЌ“GŸPЯзЗПъzїžѓщулЏ{ЅПcєg[ѓЊ‡oн;=ШM%KёйGІО:рlџхQ/Л§ГєdхЖе„pi1uцЉА.‘лк/яњT—чЏпњз›k]кДђDХ@?gY JX_ђ XuёХcаНZЦџ%&Д6­ЫЌ6;Рщ™)НєSrtš5бЁк›SЇХ_‰исыъчюф^œЮўgбьЋЁЋžq)СтqхЎ Ѕ ­1и†BЉ ЉIзмkx: !œМjКg$ЅfпГG8Љ.япœѕЎ.љПck‚ї ›/зИi^ЅR­WWUёUџкљAƒКVпЯ_;9jЬю+eƒ&ЬоPЅњ‹ГеƒцFдawM]ЗVЛы'-JИбОfн‚^z*чŠe+:Ћ„"-'э“_?бh5‘M"WЗ_]ЬєJˆ‡—nu эшsяJ xєРRžдЭš`‹і**КCѕEьЗ№Wї>ъ{ї˜дѕТУƒ|\T"АOЪТГВЫs№ю0iЧБI…і„h“B„ЂёИƒGђїДПѓфxjƒ•Q—яб>Їѕ<ёўOхoОšл,}­"6%6boDЯХяxU ћдwП8ЕьяСЏЌ–ђ8фї*Šб%/Ал7ЂуАё{Ч•t(SœdЪв8zVwЫHLЭŽ9—NънjxЙмГЧA•c'•Bи9№Э6ТОбЄP§Є;їЅхЄEŠŠ9SмЏю’s.ўВы^Žf*,ŠЏќJtГW‘sЅРv>)ПŸ-Ые9tn‘ЙCw1-yЯ‚еiЯП нГGЖiЄЌ‡)ћъЅЋйE­^+›М18-'-.4юqв+!„ыKыvtѓ”gŽ8xBXŠT:{Ѕы4’$љ†ХІХ†љJ’š6tr]иг~Э>:кyцичЪ зчЧнЕw2e\3шЉв3oLџ%5O‘ёУ›Эоќ!CюТ№ИђgМŠин*:КUєЃ [СB(†[ˆVїHЦЮпŸRhгСЛу”;імœg*џъЗў]jeў:aдm сB;aHXдчыF>%wIVN’ŒХ>жу!—qѓ6я3їо‘Мљ3^%ы’“'](ЭJQџ PЉЪUђ._ЙiŸ9ы]ѕЮД_SѓфЎЩкщѕvХћя!nп`?}‘џОгДœДˆНљЏФVq3НКёЯ‚^ЯT”ЄŠ CчЙ^њF†о›ёYсВш†Г+5=5Кє›нNoгшв…!eлАжў’фUЛэpmŠсЎcМыuќxЫй\Йƒyf­№tА"†д?зŒьROЪoЂ…1ѕчЯ_oRU’$Якm}ѓovКNу—ŠХ&оЕ( –bИ…h“Д!n…ў!юќ7№Pe›}јЖї‘Ф,!„ƒwЇikЋ–Mћ_ІмUсmOмоpMCw'ї§ніUК}СЕS>?о}{bЂЖћ‰iQ9ГVШЄпїхЊLзќЩєнBДёц•у+пh: Y™Д}Ѓ†џИфиЙ#‹6z_КТ=(&YЏзыЏ^Lњej€nФN=˜_FьИЈCƒ"[фOQ‘ѕзЫЪиxсќ_sџєщ„_i{@n !lˆЊ\Г‘п4ЛЙeя4ь›УУф,ш‰1дю‹"vквЏyљЏтЏФЏ~iѕбU>ЗJnіF“P988•ЏVž­Oі‘…ѓrњ† _[xЏсќњaг#7†TЬ=Є§нГзњрJe<њ„zОО§јЖЗSйй ЃСdЏvфЗ'0;зжГзЖщКoѓ7Oў#оdя`gИvе`tђє+_№Е٘КghШxїYлЦКБ4 XŸ‚(з§Fл9ьN!В–ПгИ‚$љЕ{Еј3hньxх[ЮїюŽWЗ8?ѓQdЅ/љћЕYр7ќ§њjs•Ќdpg] gзO§3dhЯ;оzWv›э8lt;O;aHMКц^УгIсфUг=#)5Oˆ‚u-*жhиВwєЕоsG7s‘щ”ЌЛя€ЬTіvщ:WеЦ}уzЬбP-„†”­#Ц\ДђSвЋЂидЛ6Ђ˜ётіШ)чТї$tЯњ_œНБxгTхwМJЮHжjД <З§ђf IDATмїИЌПfFъЛыд‡іѓ:†Oћу•/ŸЕЭ уЖ›юЪ Qx‡М лоеiš••ЕИGeвя›ОЎжА5ўN?оsbITBї…*цЇZE|rЉлP{ѓЈ5G*oГП;eФŽ‹:дtPd‹?зЩ] мфВэтП‡—Н:dqї uDnвЊЦ;Œј>д—^аEАЉwmŠdГŸ„э‹‡‚Ч—urзпЮbп~њ™ЗWЅИЛк?ќљЏx6ипmџƒв+!„!э|šAЈьь„ШЫМ’iћѓѓпpwg_Г‚wC*Іmж<Жpіл*H’Gу!БщŠžз>урœ{Пlы#љ†ХІХ†љОИ"%OˆЌјeы{П^гI!„ЃguЗŒФд\!DЮЅ“zЗ^љ?3ЉдЕ{}TkѓФѕglwwзжГзN{ЛyС#ЉVurи мŒK—o…ЪЩГбkНЊŸйw*[CкѕjžёЫwž7Ш]йжЛ6E"Рѓ1d\ИzеЎЧ†п—ЗќcкМПn<шифŒф^пїŠњ#JЋбF6‰|ј— 1ИЦк—§§^ŠёџhX ­џ’љ№wNЊЫћ7gНЋKўяиšр=УfФgЫUl1ИuиtEЏзыѕЩ1AюA1Щ?ОUй^dŸкЕЯОеs ЂNч€Ю-2whу.І%яYА:эљWœo^нЁJзШŽ‡ЧЮ9œY:>№[зЩ`{Вт'З}ўн5ЧгГЏўНqе‰ђЊ8 св0bъW§гЃ"З]А§_‘‘­НkP$,0;ЕЋ[еР&UЋЖїП~:ѕўнeцџ=?xcpБ:^нЂ*лpаЗGЏшѕЉџЌдАŒmOОQ0р.дпщŽнљю"oИ3Љы…‡љИ8W lч“ђћYЋћ(œs.юВTЇТ­щњќИЩMtaOћ5ћшhч™cŸ+WшX;ЏvŸєП5nзХвёЕЩъO.ы’?gSA'YIЊ4њ™Љ}ЎOiщы]НЭLSПйдЫяXЄЎеїѓзNŽГћЪЃЬsiѓJЩЛ6Й1J€)ћђ… Wo/ЕmСюх\ЋЕпљuп'МтЗ;Й|§ЪEЭГžœ‘Б7"-'э!3^•rчЌићу2Ÿ/…BФњО8ћŸнoUЮ_ЖоЙїЦšЗ>ЋЫ8Љ„ТЮСj~q б&…ќлЕ§7'лОаСЛу”яŽOЙНЃаСBх8ъ›@‹ЉжxrXЏлs6ніЦЫ# mнl;xФruY~з $4xB†”mCZV“ЄJп˜ўkСšk?є ьѓC†Ь•2pЈњњ”іQЯ5|ћvупЏwO€•пё*Ш'ш:^•NХp”€wmAЌв$]ЇiЏ q3пmfХЭњTWsцсэ­ЎЎ9bа’9‹о­kы Ѓ rmўБюєЧE^Ібj„ћЛэїuѕЕlUЖ"ч\мeЉGЇ‡ Ћ“Ўгј†Х !„ˆѕ•„xЊž›ЇЬ%žякЬ O&чвё џ^­ќ\Нќп™ЗФхнаОŽ+—u•Л*@‘:љwX мUX› И+|QсУ5xчіEœ\А Мk(I !ДQщКЮхЅЛљ†ХІ™ћŽдеšWHXЇKШ2 сшлsюЬ†п„ѕ_|8y-mFКNу)5юЛшONъ“бїг“^Ру!РВQeŸyЃ]уAЛЯы KŽ r7їЉыFЬщŸ7єЮ+&!„ЪЕљˆoМptУбЬпnCЪ6{ЗеЉ‘Ло№O†ЅXІьЬlSсЦЌД,+Њp–ВЏвэ“р}b’ %}OvRр№ П~гХЋ БВs}Іп’CW.o3чL[—ЪЙz—)[7ѓљ>"8Ич№й›œИ‘'wY“ёгћЏлz&[!L™'6Ž yЎџоkrWxtX6ЫЅЩ„Н[пѕ+<Ы™[ˆ6ЩЌ3ИЃ4qє~aрW?ьџњНЇ.oѓњГ~~нwЄЫ]гƒЙЕ‰юБДGшфѕпLшіЌfоАЅѓлёњ+Ф$юx2щ;ЛTуЇ"њтХ$–• Sіх Ўо^j†iкЙжn>ЁmјЫпѕcpЌдігѕ іЭxЏпЊŠ3bзwЊШ2Ю`ш…'уіRЬ!эТЉŸљПШikіПpѕц„[ЄWfaHй6Єe5IЊдјщП^ЭŸП)у‡>}~ШАT цьИ—“оШ[Њдќ§ ПoђbuI’*5z§ѓ_ЎšyfЊtццв^u^™ќг…ѓыzеё”$IЃSxЏ1@QшeЋ )[wэПђXЙч†-љBy;!L7NЎ›Джя“Q-ЪšёŽьЪјНо?Hф\ќcлђЯо™ь\П]—n];6ЏV†xє‰eХЭњTWsцсэ­ЎЎ9bа’9‹о­ыrŸcЅER1oЕ8GъћнЙžН)ћь_њйжгЗІU{єNvYqs'xnљ‘бІIšабЕ?б%яЌ”ДЊ_—f‡ќ:ЖОњQnъСмBДz§УX ,•§їмБп?Н№Џ5†1'l зНх•ВcЪш­^&НfЮєЊЇŠMКoв§УфэQƒGtѓс+›-o]ЎdюЋєШЙt<УПW+?W/џwц-qy7ДЏуЪe]‹>іюШЩМ2‰ _шЕ юB{ѕc'“9WўЭєэнмЧЧЎcЅьгa]ŸrS‹њ]{е™Дђ\Ж0g€%Dю…ŸЂЧ}ОbчџўНjB8y<п926*;хo}uMŸы.ЕЎ'пѓхАЩ!3цОшQB_пMйчЌ™иЏѓЫяЎL{nєжп,!Н2uЕцжщВLB8њіœ;Гс7a§N3ѓˆЛbPй9ИјОаДђуЇWBu•ЦžЇ6ьNЬ–^б%яxЕМЦы'ЖХœњ˜5НЙ _ѕ|gНћлб?;)ѕЪХsGvЭ|M, [|:зЌwА,[eЪ3йЋ„ЪAm<НqХщ–Іѕo^О$ТЋМŒ“{bцN=nYœ[ЇЯО§сЛof {#И–;ћЬA]7bNџМљЃw^1 !TЎЭG|Лр…ЃŽоАјќэe?ъЗcElJж„gъzЬь“>mфi; gз “>kагц АВўн›№сАзkx•qДГw*[ЁжsН>Аћd–Yя`Є ЖЯhяпуІR e•щпѕ н—ŸiЬџbФэ X…а,ьЄРс~-ДэњLП%‡њ-Бx!ћЧO^ЋK§fуэѕулyдўv{лСЗЏіїОцЊё6чš­|Эњ|џћ/5Јтю$rвўћїаЗЋЋwЈщlў{”4,л•ц[0WwЌя­IЛЭ+ЙНМ5•йВKзЖ+N\ЖwАЗxзЏЧтXkРš%9cІі œaBиK5ZtъЛ8цНšŽrзxtX6JоUиLй—/dИz{Љ­#эPДЌ“+‡}vqрЂЁƒьВN{f…‰sоЊuї ЛтЏBXїL oчPИЕxЬSlБХ1…cхЖCЕjЮ›,Y:}_<фф–ьќ§ XxB†”m#zF,Ы­оqxєќСЯ•З"у‡>бё !|b†Фх?;ѓцїЕoЅUъ€о=ЏЕљ`Ukm_п;џ|‹™bH‹ЄGЬ;ЬwŠ-И8Іе­BHР$юx2YqГ>ееœyјЬпK;3hЩБ&ЙKВ%7Nь>]уЭNОNЗwйW ъZэфЎc7,UƒOБХЧdBА-Xx29—ŽgјwjхчъејyK4Б}ћ.?•M†e.ю>.W.хо—}ўШ%Ы-ѓhЮSlЉХ1Y…l žŒКZѓ ыt Y&!}{Юй№›Аў‹Їх.Ь6И41: &|№т§ WВђ з/й5ыНw667ЂЉ‹Ѕj(™S\В‹cо\…№ЗЄЋYЃбuѕь‘V­NЌўЂrW!Ь‹Пё••™y[з–…lŸП•Ѓг,зшn՘wm@)@€…'ЃЎ1Їоќб;Џ˜„*зц#О]№Тб Go0ЛY8Ty}С†ЪmєbЭJž^>uCFўTuєцЏ^ѓБмєuц=ХiБaО’ф›џ]КYkvЌ5`Э’ЎW—є ЊQЩЫУУЋR­ 7ПLxIбЋкзщV5uMrJžBЮ%­MЋж­ŽB'ьЬ-]Ї‘nѓЎзёу-gs…0]?КЄo‹*’$љИ>™и 4cwгoЩЁ~KфЋШЦЈ\jїќ|[ЯЯхЋР|Їи‚‹cZн*„BЈыдlЋџYw.р=_qV—ж.ЈzЪ‰№WcЕŽўНLBˆœФ mЖХ=(&^т&L9iЇvщ2lBчvsЄ/ћэ3ё—3ЯЋџZ8qыЯч^ё­ює№[€MЂ–™2џ‰оЙqUI’$ЩЗiз‘N=l>žtЦЯмS€вIёMjЉ{ЛьuлЏrЏm_—лОЛыБЙ‡Ндёomm“о(D^웈Rйй ЃСdЏv4$lкvНeї`?з2•‚>šћy(щ@iF€e1y)піеŒOn;§Їг.Ѕœи9ю™?>О6й w]Т> {ЕŒЕ‰ ЇзeVы .'фњМрQбЛBАПНЦ;7S0ЌИb†-{G_ы=wt3ЛѓG.9х­{ЃЎ‡TОіЫуМœ'wC-%чдš™‡[Э=№m$•ЂbНЮуvvBЄnжЏ{ЅПcєg[ѓЊ‡oн;=Јœ>vRшлг\­дцЃЗ2-2VHZ$YтnЫHзuі л_ФпNP„х‹yъКЕк]пЛh‘ИбОU]Ен*ічЙzЉ…aoЂQ•tЧ&`cмƒbт6доБјЮ7JМ4}П"І%’$IoЉщŠ3+ћЬэ7њxћgЭЪмо™Ўг4ˆ–ЏІbQ—яб>Їѕ<ёўOхеТОёац=w<§Н_Ÿjv&‡;7х.0?•КvЏjEN\яѕz5GсXоПRЭЊ!НЫ8Uьж+`ЪЊ”lA€Pj`YŒJЅ2цMBЈDКNу+„A1G"LъzссA>.*иЮ'eсйє\ЌѓVзЇ\еЊ&ЏїЎ?u…м•жЦОJЗO‚;Ž‹IкјЎŸu5rі&…ъ'lЈkдYј[…З/НkА=UКFv5bN9ƒ•}ЊЫѓзЦo§ыЭЕ.mZyЂb ŸГмх@>Ьe)Ю5‚*%nћ-е( жbг'ЧЙ !„P9–qR !„ƒB˜ŒFЃЩdB˜ђ#/ШЅЩ„Н[яLЏмBДIк7йJPv^э>щ=jмЎ‹yЎAfя ЈR§ХйъAs#ъ0‰;@)f]Ќ™Ѓ_!ЯЮќПwЇЋЇѕkщчЄ?ўгŠЅGU.їFˆjпІОй~ВS˜з?пЌ<’EШАin!кЄ›*зРQп !„ЈаvќЮ“уe+ B8b1іо]h'жо7М•ПwŸњЏLј§ЉЈб­Ыоs cэО“zІ ЌънтГЋ/6•TyLи 3.w<"uЃHLтnЋЌшЬJ‹Є"WxдcžЈЩЈзє­t>9ЅсQ—†ЧјиxrРіаЖж‚!„”KZ$Щ]@~XъоЎUVд} Oъіj­BЁіiбgЪт‰ЏVuBУй•]š|$О>ЭЌќ@iAWIРІЅы4~]КмeС=(&YЏзыЏ^Lњej€nФ„ƒ™BaвяћrUІЋЃмхА z`с~Rх..]зй/lПщЎНAВ˜‰ЪЮN &{ЕЃ"ћШТy9}У†Џ•Л.<Y†—шyА0,Р†ИЖžіеАor^вЋЁk~їЪtІAДЬU'-6ЬWТЩУЇŠwЕ†Нч~бЬEЮЎŸњgШgсžШ]•…у$fаиИМјё[>­бaг›eэ…yз–uо•<ЕЫиіBфш4kЂ#BЕ!NBˆ{6ЋE€иU™€žЃЦоуЂM ‘Ћр‰ИХФmЈНyдЦš#‡•ЗB˜є{ІЏЋ5lПгOђ– 3ћ:нЊІ~œœіTU{a8—Д6­кuьхЎ (IЬP*•КvЏjmžИўLЎBdœГbя—m}$пАиДи0пWЄфЩ]"€,дujЖеŸд3 a<ЋKHkWГzЪ‰№g–Vlћ§e“"'ёŽMРъ`ЬЁJзШŽ‡ЧЮ9œin6]быѕz}rL{PLђoUцwFPJЉЅюэВзmПfШНЖ}]nћюЎЧц:єRЧПЕЕMzЃyqwlж  hv^э>щ=jмЎ‹tЗ*y;кˆЏ§эvД‘ЛEтЩ(‹}@їjkNЏЫЌж=@\NШѕyСЃЂw…`{!Œwnж9А,ЪМsЪВО‹UЏ/iеХуQм1}›Ъ5pд7їЛц”Z№IzМпj=Šо§ХcWєј$щяЙг˜|эo'n>E(€Кn­vзї.Z$nДoUWmwЃŠ§љ_Ў^jaи›hB%нБ X?,K3WъФњJГS{ˆьTЁіњУзGЛшї8YоГєz3џЬГЃMС“€BЈЫїhŸгzžxџЇђjaпxhѓРž;žўоЏO5;“У›r— <9,Pрх=B’Œ›^й8ы~rXml’}ЃIЁњIъuўVgсэKякЌœu~@ёйзщV5uMrўЪљЋ­wcЕu`EАlЋ­ыF€`ћXmX5,€R€еж€5cw€<фY™ЮLKСтQБxЎАк:иˆ'yWхГЌ@6ўE†">++Ћ­€mxРЋ$Iz=oЛАMXЅЋ­ЋХXP4,(ŠАЃјкпnGЙы TД,‰9АЌ˜$•дlФ_ћы…йЉ%tѓ€5‘$–у*ТзўvBˆьдтѓЏЉяEЋ>м•’ќлч5З ŸtшКмe€’G, Ћь„MлЎЗ\ьчЊAЭ "]'„ҘКghШxїYыЛљz8Є›LBЅВsptёђ+Яч—R"ћфЪYёmf,юQЏœЂyп%ћњ !ФФџХ™œœTЂќГ•Хоl“Ьe  UЮљ#—œђжНQзC*_ћхё?^ЮBaHй:bЬЅA+? Ќа`јќіЎ_йЋвS=э=ЌОZц’a!9g_Ўж* ь]ЛэеЮ*! џщ&-tъ;јйЛ/6ˆ ШЪdЬЮ<W1rяйФ}#Ъ,<ыHЖЙIЋ>}ФЬP_GaHŠљtuХЯNКєыtŸ˜WœЮ•ЛfXˆJ%LFc=ЌL™G—ОзkM§ЏОжаХђu€"mk!Оізok!w@Щ  >юЧуS/€YШ2;ЧБМЅšUC{—qЊи­WР”U)9Я Cкѕju’–я<вЛъѕу;ŽU едsWЋмBКUsђЦРЬк]ЈЋ5іLм—ўz;IUhЗ)уаєАтЛ}НЄO€‹ъОз€в&/ЋрџжЛŽ6k(сА€в†hJё€ХбPКИ<ехљkуЗўѕцРZ—6­^НbвkuTЇw|1tuѕ9ЋЛњў/]VЏyЇ&/(ЬоYфe {gkЌ7wƒeXхЫиз  3‚w‡TЉўтlѕ Йuœ„BЈkѕ§ќЕ“ЃЦьОVo№МїђІЕђѕЎ•нwЮџ=MnQZ8јє\ЊхВ ЄVЅJ]ЃoєšєfьпПZlЯаІоRОsN1І„Ђѓб'биљ€мu%CЅзѓИхH‹$sѕ80уM}ћ’ФkУ&Yѕ™•$Ѓ•ўšXўаРЦžЋ~GsБЙЖнŠŽU рХE#Р€Ђ`”:[šŠЏ§ѕ[šЪ]@ёА ЁЅБf<)Џрџ–]ђЩƒYЗРу!РВ(жŒ€ћ3œ]йЅЩGтыгкЁг4ˆŽˆз†И !„Hзi|Уbo“|ѓ"Ee/LyBeoбЅжЅтўŠ—wyџ—ƒ#~фb–PIпŸ>wHЇНBˆkБ4кчзХ-IRjЪјЖшўсф‰сMм !ѕЯoЇџ,z˜гк7aHй:hёсkšОѓхЊ)šЪvњƒГœКуд ћŠЯО;§ы‰}…ИЃ-Ђ@1BP“~п—Ћ2]‹КЬ-DЋЯwхјЪ7š„hVжвх6цеCЂOЂєъ!Йы(вп'XVіџ6Йpхђљc”нњyLBЖBSкЏЋо0nYlЊI!„{PLВўъХЄŸчОruzЗЗW1фпHFьИЈCƒ"[”+ИтОQУ \rьм‘Х?Н/=ыЏЉяEЋ>м•’ќлч5З ŸtшКn‹€|АJ}dсМœОсъТ;Љ{Зh5ю`zўїTa8П~и4ЧШ‰!эхЈ€eГгsœ+UїѕPл;”ёnњЮт§[х7Ід§K~ЋљюРўuу—ўxщірG•“{ѕ–Ѓчw8>ouBŽBзжГзN{ЛЙWСpƒЌкп={Н\ЉЌїs}B=п~мдxтџтVМнаЫХЭяйРЪтzЖIмЇ-ђ#РШЯpv§д?C†Жё,ќЖdHй:bЬЅA+? tS !„ёЪюqГ‡nчЩ›`гЪЖ=ЁЉіеК;єˆяіѕ’>.*!вяi‹ўй§VeF, Xr0eўГfмˆ/жь?}MЗš/і9}LїЮw–~ч"\%†№ТVqfa5м:lКЂЂPЛ'tы\FLy*ЌKфЖіЫЛzлgŸкЕЯОUŸ |•ДbyёуЗ|ZЃУІ7Ык !ђЎ-ыМ+yj—Б ь…ШбiжDG„jCђЪЛ6Qкdџ=ё…ЮC—Яяџœ}jќюŸЮлћЛич&nZžмfЩ‰ѕн+к aМДхРЈm=„B˜rєЇЌŒќП_›}>нЏШљз:ЗШœЄ {ЇТ VЇ=?7РщвŽпџЅЫъ5яд,ˆМюm‹X…Х`†ххЅ|лW3>ЙэєŸN_И”rbчИgўјlјкdУУЏ Ѕ‹КVпЯ_;9jЬю+F‘s.юВTЇy†5ГЏг­jъšф”йєUя‚зTКN#I’oXlZl˜Џ$IЁiC'7б…=эзьЃЃgŽ}ЎмЕпПZlв7Сk IDATЯаІоRОsNх> ( /•^O ЫЪ99ЃuчПЧXв^КЯ 7нњѕЯАYМю•ўŽбŸmIЬЋОuяє З‡\їq1ИЬV9œаъNЎ$ѕzbw d•шZі•Б/ў\хЭ{О"ёЋmЁ)AпПsхУWcЕŽўН’OŽ лX/q@ЁMХѕРВІV(]ЇЉ?ух‰ЭЕѓ56yDзЇ\я)\’$s~Ь=5Пcл•MЇЮъзш†nђЂЌоCлˆИoЦ|qѕг=‹;хЇNfОG0kjл‹СЊŽU `ЁХe'МшпН‘ћ#$PNЊЫћ7gХш’иэбqиŒјНу–ЬъЮV—h ˜8Г”@-uo—=dћЕ№wХіuЙэgК›ћнЁ—:ў=4orыD!ђтц*Д‰'ЄrЎоeЪж?/<Ѓbћžotяјќг~^Ўъ’щі–uђ‡гCжіhюЅ2……L^qѕ§НG\ZѕТЪП2;Еs-‘ћЅщІхЉT*cžб$ФЭЮэ’$I]њƒЎcRз ђqqЎиЮ'хїГEЎ €ТйtЏ–Б61!сєКЬjнФх„\Ÿ<*zWіЗТxч&ЬСбћ…_§АџыїžКМeЬыЯњљuпёРЯЉъ3џЎнrфъдПЗЌ;nяэъ`Ь8љЧхЫp6РЃ–Х9зЊ”ИэЗдž/;З­^Ÿ?T№!зR9–qR !„CI‡Ž…ЧšбmЧ–pf(€Кn­vзї.Z$nДoUWmwЃŠ§љ_Ў^jaи›hB%нБ ГБs­н6|Bл№ %y'ъЇЭиџНvе‡f9ћЕћhўЧЏэY~јйOПjZІ$я”XчшзcШГ3џянщъi§Zњ9щџДbщQ•‡‹b:Уmи*Ю,%P—яб>Їѕ<ёўOхеТОёац=w<§Н_Ÿjv&‡;7х.еКЙ…h“B,{—vRрЕ )МЋ§Ђял[Ж(ѕ<„Ао§V]ЩГdEwjљ{,=/!l`nyёуЗ|ZЃУІ7Ык !ђЎ-ыМ+yj—Б ь…ШбiжDG„jCœ„їl€zp‚РŒ­ЗX:jщgб{“хe‰џŸНћkъzу~ТH@$Й"C(‚?*Z+к GЂu+Ё*nСQTlн“jЋИPTм'm5D­жL­д:PD“ JBH~р@ˆ2Грћy||ШЩЭНo’›фоїžs^а !ЈiЦnчЦedBˆтqњ~I“nЦКŽ Р`Ё@cИ5ы&ў[ји}<›<ІJКs\ВюŒўF$0u4QBфiw&–И Pijњ™ЎRпљTЧSt№ H`д<5АЛlFТЫбcIТТ‘–З6ќ~ЉgЏыЁEЫЛІR”МсR‰›UR‘фŽоŽЇ6шрAћ0„@Œн6ЩлŸ–šњр@~“юфyjЁУ—VЖњ8Ђќ№&€ж(ѓ’їЬъзойŠЂ(ЪЎEчРEПмyЅСюР…іёДІšјЮ;§ŸpNW+ŠВџ|ф–љш‚ •‚€&0ZИvuwыждз=šЕ`QŽЦ™g_<Ы~–˜І$„ісM-)|3ЌЯђЧО+NмЮzієбх}3Z^ыА#­PC”нкњЃЈнŽkMؘ5xЦ•оћSŸмO™§уфнл$дNH`hЃСрђ˜эђƒ0ˆ‰WhћkећŽY#UЉ›Къ й­›гћХDOэюоам”^пЁMПяїююwomtJ†Ж˜y]ьтп‰ндзпJм$(аЫЪЬЪkш(зŒгw5ДEЈЅ0€fЗY ^іцЃЉл–нЖМПЗдM-eІМ`hQПDЭВU7'ЩЖl9!fšиd‘ЌШЄF#ѕщЦ ІЙ!„ffiЊx­РЈ єРЈ#ŠфEFєR—/Lh*%ВI ча  ЮˆxьВхœ8!ZйЂш§І5ЙEЈа  n`њ Фj ќ˜Еe‹OžЦнІeз~вс‹‡g|хBQ”]›!+ЯО0€њO76Яп|Ѓ€Ђ_X3ьГFE9uЗ ХgЁ& @MЂЖ–НЌ]QтqтŒ@ЫЈ­дŠŽ+‚[ы:а+…іOє 9ќтГ)Л6v<9ujєПЯЎп,к5Ў•MзСшЃ‚ф ЫЯwмucžj7`^ѓ9ТŒуvщ{Чѕ›МЮям‚ж ]‡їiђtС.;lb+кЭuС?чŒЄNtIп4xl”OтLwКЎУ‡@MњDŠЂ(Б)*ЈЭввЂКDБ-йКŽ>B™—ЛdўКIwХJbfчй-`њ‚™§мъi(™$ЛЕѕGQЛзцОž?t№A›бћSКЄmх žМЛЧяС.Іšй(€A“чмЫgлоССЈ—ьЏџџ˜ вК лВ=eDпXяШ_Зž8тs›z4ыaAnЋљiЄцX*YОœnСxџІ,Шщ,3Œ4ЋЅ№Ц@…)s“ћЗАІ(ЋжAћ)>МSРј;ћћФћD\ŽаMxPŽТ1Уњ,ьЛтФэЌgO]о7ЃххА;в 5ДAYцuБ‹'vS_+q“ @/+3+ЏЁЃ\3Nп-аа& УбЫњўсSi2ЊЏ0уи7 QОКs”‡ђt0ˆь•ђѕгЬь\…#Ч9ч\j>!ђGЙoщnЋ‰юWyMњ&ьШC!„ЈђяФязqBтK lєXPa*Bužu№ffкIо­K/М*}pыр3Юˆ2E>ё>)9)К>Nvkчцє~1бSЛЛ747ЅзwhгяћНЛћн[ЂЉtR‘ЌШЄFcдЇ3˜цF„š™ЅЉтЕГЁЈХh992HњгїHо4(Х…Ў/НvJ+§O`[Еl!иљѓЯК/П|їиЁџ^миО-gаЪižfиг7bІеіСЫэ[<р юЦзМэ›КcŽХк C ТŒ­<Лv!„Шž*TЬF–Цja[В\СІы›ИnАGpxлpm #ЫLyСбЂ~‰&šeЋnN’mйrB4qj•fdХљ^№яћл&ь1‚‹ctOeXxЏ<љяЪлOаиіLэК§pШ#iѕјq{mW‹љлЊ;2Z=А rйЧ˜*ъЕfњ'fт(юŠ•’“R™ЎXЏџ‹ќЬ–Ђl=6нx…:5ЏH^dD/uљвШ„ІRj№Х–ˆxlŠbѓDХPХkn{Е‘TШuт Ѕ5ИТу§Ќ)ujt+oЖUгСЏѓmФ6n}—џ•y аЭZ3ёƒо@,Ј„ЂgП‡ЖYОVGъгзСи–ьиБ i эŠѕђќŠ•З&ЄMU­эqaјžЏъ—ѓЈ4‰ˆЧ.[0—ЂЁЭ1§(` ‡˜=љ—‚чne9xїюуыйˆaPЕaёћR'!Vє$>lЕљЂГ;2+xœыяьŸь’тяе%ЪУкуЃ‹š0э˜ЦJЁ™˜а4i€u5Nћ‡ћв“Ѓћndі9"РЯЫРЮtD*ьуФ;ЃІglЭ^l0ЊчЬ2CфO/нЕdјїf­ЛїаПWћ&ѕЊ1NKKСBHaі_Q Wю>ўЯН BнкНSŸбсѓЦz[ca­…!„PaљWі9ПО7ЛEQд—›гх?„л#6Мm8WРsnŽDў‘ёcfŸM oКНЇГ“oДгЬIS)м€HOŽюкoZф/—ГeZ YПг имŒоЦХЋя”Ÿ_Ьвж– •ХgУК{M9•).)ƒЯaifstлЖgn8ПahНФyН<мF§U*~Z О0uѓаQ‡X#ЃўИ•љ,7чщу'"‘Мm4UXt ,Ј0fя#/оў=бЉ]Й§§“’3^fјФћˆВDj–(ИqЬ‰ћN{АьЇЫЏk,jxCћщ$#‹f]GЬнrќzк•уZ<=8­‹[џ•.<.@" @-cЧs|’ѓ+v‘ЈКTВЬѓqKЧѕщ=vЄуМ#oФt­Юј}­_p/1У}jиMmъ™г-Кv ќa†{ъЉЛšЊЋ К‡!„ %Х]БвфЙёТл…Гш%ЎЩ*$™Esš‘!Eљ9љEК ДЖ*N'uёƒ,ћкя‡тbЇu™‘зм?pфШРО_8šir€бЈMŸImњLZђ$1jжwќ’ъ?јЁв9€:цm'љА‰щ'HїЋбхнMšЉГпЬлџњmэєэД“Н€*e]Лp9NЮ]ћЙОJН}zMиъ Пе&uА2ЎС­H…}”щMЭц‰$е[­v‚'‹єX5A"тБ?јђtшОсЪЉ}зДаQРPЛ hœ—‘UD!ŠЧщћ%MИRxzєЁб—hЌWФіŒs~NрЩ@‰М’G ѕкŒмœЁ‰АЋЏркуЃhSOЄfeќЛВйб™Ы.НвuH ПTE*c† Ё™0”тw?шМјЇ эдpў‡X|6ЌЛз”S™т’2јœЊuƒ~O+СЭХz ,€šРт№3ФЅН8Ša,№QR!ЗDжЛQЫ^Г{Tјa#EеВynЭК‰я + Q>ІJК7scBTOѓŸЈyл‹]Ÿ]ѕЎXzШЬkщ?ЩЛGzк˜3Ош`O^ЩTК виy№Аv”&ЮкЬёIZЬOWh`х„OД?ш!Ь #,?EрЧ$*Йфў‰љ§ТїЙМE .ž@Њ(ћшЄ!їѓк5aƒи]6#схшБ$с@aHЫ›sbПкєŠBDЛ(R/јЯa+МшЌW№мx!‰!ќЛќЈ.QUK3Ь!DёDИl }Ьц/jзл 5L"тБпЬ,)bП+„Тсgдф<цm'љА‰щ'HїЋюzЕ<б\ќ ЧРЈ6|Q@ѕаŒŒˆRЁ2f˜ОНJЉШ<і“ixМŸ­:ны’БћР&yпЅЅvUШoВЮўйŠ@ё Й №ЃП_аУкуЬ€3—#<у<ЃКDљ;ћы.шšЁЪПЙcЪ”Sэ7œшЉЇSu€>`њННše€ :xа{B #oІЯГmъйљлЈ—пn˜їyqbC™sjс:гАyн­kпЯ4Ѓ…kїWwЗnM}нЃY‹7SVбЬl-lЭдM*о6\РD\Ž<˜‘—ёЉK…\6O$ёињ8юR•wщчac}Ђb&zжЧєщ•WћŽŒ ‹УOЯўwэШ [Nџ}bWИя›юVђ;1ЉУПЖ­•?вŒƒ{ШcЖЫ{ j№vЪuSпэƒЖћšЊ_ОИ+–‡Е‡OМЯІы›>К^ІŸрЭ„5шГЊњ6Ц}ЄнФЎOи—ЃV ЙЫ*бu jˆтa\PŸuv‹~Пп‡-Kй?7tўo>{†:М-ŒИдnJИї•o,Иіуј(кєЉCЅ'fsg.ыпmЃw=ЦNїŽДЎСїЛЎёЂФ—cчŒ8в\txD“вљ йЭe_/№:rPяІ} ,MЉHfJmJЋ*йѓь<ЫF6 дБ€:)#/#$1D"—$/MfЏekmЛЧ|‰,—0ЌˆјъЇ;АWёВФЇшЎУCEžыO№х eВЛ{жІјЎо6Иe}BHћ11Ic!„Xv]ЗП+‘ О[вЬkщ?Щ*К™ 4јЂƒ=I”щ|KљНИЈлнз_ыЭЂRПујѕы/xЯнwЯЏUhЛЈ“ЉыБЎ§џЮЏЙJћЋuџaЏГY`!€>SdбЙ Eйy ћљм‹тKўyuњ#OЧ‘@U”ѓз‚^nжeя=nћЏД~LЦПУї‰їс8pЮ 8УЖд^іŠвћ4щw•є>­Эm–TЏMШxйњ”8xа.љУЋЯ›tqЗЈШВЦ 3!Š'Тe[шcІQЁi’,увsчЬЗ—Рh,ЯЏž_Ь—ZЮЄ} ŸУт№3ўдЯьA @Џ$Џ§Aи,ђъУылПО=JЬ­з:Яп@]GГщ6їШ'iПѕКДdщљ|эmX"—ž мt}“€+oЎН ы Ѓ_…Ќ—“o˜ГV0Ј”ЪŠžŒЉђonзzѓС0OsЦU!ЅƒWBh4Cьв!„zLўьvžs`'KчQcЬЧŒ1нГЃПЎЃ€КЬиЊugQМ|№LBkиЬZ[32%Є%„$†{Чіˆев&uы§i%чJ3vјхI€Ю‚=T•9Iє†СЯhтev"Y:Є;UnоG•wщgоф”;c‚мЭѕ!Kdцфm›&М"кЫŠF!*iђ‰єFœ„e‘’BTђќBCш*€c4iп0ѕ€0•;МЙ™){ш†ШДСМ 9}%Ињ:$rй<‘IЫIП$x0*ѓРЂ”EП§аєы_†[BŠ^юшs"уЧ~ <>йK]"—„$†ЄфЄФіŒхиsЊ9@эRvж]ŠЂФbУ(eHСг]G„~о-lvьюeƒмhŽ­ uY7ЁYй+yЪgЧB'э7ЊYЅŽ’4Шдe№фV‘пMкДуЇ‘Ÿ7^х‡OMjГh™ уЖ•QкЉГ{v&wьИ!3&4sу‚œ<Й’IзЯСzњBaДY?ЁhгМу9*BЭВ§Ќƒб_о<|ѓЕ>dђ Ўbњ ž?ММѓ‹„Щ+ЎTцЦnчЦedBˆтqњ~I“nŸЬ^‰ВD>ё>ьњь3Ю {:bт0tЛpЎyДŸЋ{џЈзЫ†75%D*фRХц‰$"›Ђ(Ў0ытцCЗN‡ЖkDѓ^ПPчС;лqxы`аgŽЖž#іYЮŒп:ШоиТ{сšўwƒн9імLџ†cM+Њзeщl‹Й_ŽњS_'\Іщi‚РРQ[Љ V!ЌШbPŒЂ”b1вю`Htв1^Гп*ŠьГG/а;uo–б-0}ѕе]]ыПЙЇ"_hВœ_§эИ;žMв6 ШтќЕШZ§хI‰\q)"!=!ЊKTI]сA№Њ@ЙjйІўvbЊƒДCд*|ДЂ_ШсŸMйЕБуЩЉSЃџ}Юp§fбЎЈq­,а§ *NЫ'ЯO™™ШЏЌџvдˆ\#ћžKuЈ_ў#JbPЛЫf$М=–$(ьIЉЯ^‰ВD!‰!жgœaбY56Ик“iЈIВ[[ЕлqэЏ ГЯИв{ъ“ћ #ГœМ;Mч=@tШШКыт“їХbqюBZUКАŽБћР&yћгRSШo2аНHШнJQ[ЙТ…œ#.GўИТ{ElXdЏ z`Ј#ЫМ.v шФnЊђЗ Э єВ23j0t”kфЁЛС.šЉК%‘K6]пФЂГ‚[kdкЅnєЃ…kїW‰[З’з=КД`а?”X %'%$1„mЩNHFъ JB,ЈнфiќбmQvэ'ОxxЦW.EйЕВђь‹ђъјЩŠLъбi4F}К1ƒinDЁ™Yš*^+4P^T"—D\Ž№‰ї!„№мx5ПНСh0И‡ћліFНьdx§џЧdж§н–эy,#­еЯќ–DФcП™ YФ~7)2'ЄІcŒИQќёъЭЌрЪrk$$-лщlD‘хŠњTЧИ . uVŸКs•ЖЂ(Ђ>6{љ_џ }ђi{ћdKN$џюяMfПщњІ9Т9+ќVžV>?v’оЁ)уlљ›5 ђŒр-ƒ ^m•[§,}[у~tј‘Р‚Zсшe}џ№Љ4юОТŒО„Ђ|uч(џхщ№щьгO ­ЎсэТљwј<7^pырvПЇXtу˜/‘х†_§TŸа . uŸњЎаxM@uЊSњуДђзY6WѕщУИŒМŒФ‰\B6‘рYХsџ)Ÿ&žЈзљKГH`дŒL9щфріœB­Цh992HњгїHо4(Х…Ў/НvJЋO'АJ’ ЙN\ЭЭЦо6ќЬ€3„ŸxŸˆЫЙЄм‡д2НO“ 4Њїщђыw•”ЛTGяг$(MЉ…џп'о‡уР93р yёЖЕ(ѓд ‹n--4Оy"OуыbЋСsНr(s“ћЗАІ(ЋжAћ)t…A j7#+Юї‚уќоІ‰Mиcўрc­WЛ>‹Юz—Цтпсы: ’Ш%'7]п$р Тл†p_ўѕƒ‡6іњO$ё:ЬЙR Ѓ .xuѓєыіЎцК @EЈЮГоЬL;ЩЛЕ`щ…WК‹Ф@шеY<@VœЦ*ž (л_=!-С3ЮгУкуЬ€3жЅРьѕ[ЎXœСчА8ќ +МЬД'дEѕкŒмМт#sjžБ•gз.ъ™г*f#KБ)XPЋUsєŸJ–/SІŸ ]рЧ$„eЄˆT^qЧЋ9ччФіŒ-нёЊ”пКх(љ%Џ*ИwpzчЦE5lбsЦэЯ'Ї IDATўдтю[Šм+qпїkIYыntРЧ)Вџ0UдkЭєrŠŒ&qј”МП& љ}Ржх}›0ˆ*џЮ/ЫІ.Й?=qпз9­‚Њ‘ ЙQ!)oЯ]•yзіЎ˜ ›>иНMЧЁTnЇКдЂ,QHbˆП“T—ЈVЋЈХУИ >ыь§~П[–Вnшќп|і ux%ZqЉн”pя+4АQ€j)zі{ј№h›хћguЄаНЈ\H`Am'ёиeЯ9ќŒ \оgњFЬМ8qpРѕА!Šи%{Ѕ=чnпдй+M+ћ–б.zѕ:ZЁюzFK)k™D.‰И‘žе%ŠcЯбдfdwїЌMё]НmpЫњ„іcb’ЦBБьКnW"дд†ЊЊшI|иjѓEfwdтb}E Е‹УOЉиP5LэК§pШ#iѕјq{mW‹љлbXВTы-=RмёЊxЦ+ЭtМzKў№ъѓ&ƒнQО*L*фВy"BDln…њ7дИќ+{ŽœOњНžBZE\Kœш„ЭЇреPчэwY nHEЛnA•1§щ~Кj@ФхˆM)›ЂКDљ;ћk~k4Q)•*Bp§*†щ'ыДГ<Гї‘uНЗ~Ѕ ЕZ•Г!:џ.0X)9)!‰!lKvr@Вf;^НУhтev"Y:Є;… @­„iТд+ЬўkmА_;ŠЂ(ŠВmжЁпДшѓ9EКŽ @ЏE\Žр ИС­ƒc{Фj){EЁЛާќ\иьифч9џ§ю7(њ^Ё–6Z€дnŠЌпІxлQ”kяЅПPBQНОЛювѓљŸ|\aъцЁЃБFF§q+ѓYnЮгЧ7ND";xлрŒр#|т}D™Ђ3Ю№мxкнВ‰УаэТЙцб~Ўvvю§Ѓ^.од”ЉKQ›'’ˆxlŠЂИBЉvу€Š9цKv:ѓеu Ч0„j5йѕ NЖкr-N1ПЯтЃЃ…#lВŽ­˜wФfтВAŸžъЗр^b†ћдCC:иFБhшк1№‡{Но-˜рbЊиы–UКjЯм:X{лћ`œ8УePф™A‘ЅРxpC Ы}ѓ?E)5ЙЋђЉЦЙ Е•*Ё™e›rе-WP+Ђj!Еš,ыКи%ˆуфLњЙЎЙrћєšˆcѕ†ЏоаОAyеЭšuaпZЛђ€ѓЄžŽ,:‘KžмЛt06ЭхыffZ‰j!Eю•ƒ?-ZuІ)џРIYGУІlЛњВaЛQkіЎрк›”nБјыb u9Ху*€*bXY.aXёUЋ™У•%Њ*t84Ў‚бlЈ†CЁvSЉŒ&„fТP>ˆп§ ѓтŸ&”ŸН"„˜КNŒ‹щџ"f ЇЉ••+gјšдžлју›Ёћ•жеІя\ЈгђD #.ЙO їЎO!D%Iš;ѓЯ1ЗпижсЯАyIвВ-:Žj"їJмї§ZRжЦЈ{ЊW7cЦx;Rхф3ѕP†\зё!Єїi”Іь}Zзq€C ъ ЅБѓрaэЈ яђІінBЗўžќ№…X,‹Х9i—6NтиЂг"T•eзuћйоцЭїHССEыРБ>v:X_LИ§ЂLЫытE•ЙЇЇ{wYxAЊв]єP=Ѕв— KВЋ'ьtXzіaц­иЪў~Œ €!Рй8дv§ІџŽˆ§Ў#‡ŸQљ!9*йѓь<ЫF6 i€ъSфІПduЖІBш6ЭXyчreeZŠ!D‘udжќgSј+;0ёэcА,ЛЎлп•H…uYъ/G_uŽіqВdЮД ]ЧƒXPЋ1§bЕЪЭ^)ВŽЮшм„ЂьМ†§|юM§ТМ?‚:§‘Ї…Иѕœ<?КM#ЪЎ§ЄУЯјЪ…Ђ(Л6CVž}QГг-R[ЉтЅўЈ5ЪІЃд$Ј гїN^єjVd˜j‚<ѓЦ3zбa-ЌЈЭ{/њѓy‘Ў#€Š@,u ’зў ly5ЁЫ‹CпЯšГ~ыиц•\G­ЭЖ$oX~ОуЎѓTЫИѓšЯfЗKп;Ўпфu~чДfдиvоЭ€HmЅЊ59ДJЅЂбаqєŽЉЕ 3/-ЗX™ЪŸн3›к˜—i1!D!yеФ-}зёLПoуG њTJYўƒdлШФG;žЦŽљfњкў–xжмhŽ…д‘?ЛчиХЩвЦyдЦѓБcLїьш_‰”MИP%Ўемх9їђйпЖwp0ъe'{Рыџ?&ƒДюшЖlЯcЉСVI…\6OTВ…ећрѕИ–К р#Ьмћxч/$ѓF5М+щДС*гb&%цž!?Fочѕ ?кcWџF(BŸdкРйЎYc?ЏFѕшЖнWьЭ’$Ає†ЈУhвОaъajŠSіа ‘žћxЖ]•дь9ХpєВОјTšŒъ+Ь8іMB”ЏюхпЁ<єс ФИбмЌыПЭШ[ИЈ3ВW ЄB.EQlžH"тБ)Š „.o+фЕrњ|кЭ>‘ :ж'––j!„ТpГrанЙѓOхр;Ј.QхџЧŸйЧЋ1EQХnзџћУї ˆTШЕq ˆЯ~3ъM*ф:q…вЗ{EQхрйkЪЖЫљƒЅ”\ŠіuoHQTCwп‰бХЪЯБ˜КЇLQE7žш6шФЇы<šџЏ_Ї— GЎ=Эqѓ—=wlПp2гј3€ъC @F‹ѕŠ6Э;žЃ"„а,лЯ:§хЭУ7_c !Œ–“#ƒЄ?}џ‡фMƒтQ\шњ‚бkЇДв‡V Fц;џњСЪчѓu );+Ÿ kЏПп~&~zыј’ЖЦ„“FЖ0§щ?&1їZxсFєзжје6XЅг—%22ъeУ]”бэчПd?ЫКs|сg——ЬмŸЁ FцЌœ˜ШГeKRВ8ќ ё‹Їщoшћтч#ї>ThъЩhˆтсоƒжНиuхQіЃ+;‡цGќдГ(ў@e№9,?уэь–FtK&гЌœŠ%gёjŸS†]€n1§•E.ПyЕЫ†ѓпљR4BˆmЫ> ї!„H…JуІЃ&Њ6nОо~–GйžC4:ЫЅspдІkfЧІ oa@ЉљНИЈлнз_ыЭЂRПујѕы/xЯнwЯЏU%VbФАdВЪK`у†нПЛЈ:б€жсZ.д„RCeЫѓkЇч3ф•YIНNыOЏщPOс€ЎЁhVЋ1VpБђ{cUЖ›h—šћ*5ъzYќy— ЙQ!)?&!RaTЉeT’ЄЙ3џьs+Ёѕэeўц%uоію[Ђ(ћшЄ!їs B Ў§8>Š6§DъPgщ‰йм™Ыњwлш]Ѕ<EUЃэИwбh4e‘RE­Dm џF!„˜иѕ ћrдJ!w™ЉкеЈ” %ЭШШРFНгhDЅ,~Ъ„BT„В5dUeЦN~кLBЭЌђ;’[еVˆXŒ Щ  <евH`TŸ2їяUуBџі??šmB!ba@ЭžkwЭюд œJ…}œxgдœApBд-^ѕ€•W˜§WдТ•Лџsя…‚BЗvядgtјМБожC /Дљ@!w­љиYа­‚Ќ‡$м~элоœB™‡Т~2 їГ5&Фиkщ?Щ*К™ 4јЂƒ=I”U2ORBnе\š5хиЅ§7w(зЦЈDžюн§tзсЁƒ"Яѕ'ъњhНИ”nџЅ‹žЭKX3'oл4сёа^V4BQI“OЄ7ъфlnЦЂфф+ гˆR”їф•™uНŠПРЋДОЫU Eт4ћ№†к§ќХбЯЈЊІž\h›ьцњ)[hV mќ6#ЬъЖl†ХŽя6ўgXУ7*ШтГaнНІœЪќ`6ъ >‡ЅыР S7uˆ52ъ[™Яrsž>Оq"rйРлібq6Pы)rг_ВšZг !t›fЌМємтYС•9ЇЎ3 ›з§эдјЦ 3!Š'Тe[шcІaЁЛ˜ !ІNƒg|ёЯwc>™*–ОЪО.Œо~“feўўР­^›ёВѕ;(?8–SЩХї“6wюѓщƒдwЯвWІ.ƒ'ЗJњnвІГѓхЏВў‰љnjR›яЛ0[ѕїЪкЛ7щ~юыќgЗOnл§ДуP Ј{РЈ6йуkbЗРoм,Œyё[oЖп1УЅЧ ІЯ/=Њ• ,cЧs|’ѓгѕ­РUСНФ їЉaC:4ЕЉgjdLЗhшк1№‡юЉЇюш:6аЕщфwb"R†m[ђHH•sћјРИ曆yšk)К1nд/ZАДyвЬ.Ю:ДюЛјтџ"ŽGu-‘V3j№UиШz9љo;ђHD<6еРжЙ§и_lцќВЙ_#Cыzjт8lЧсЌƒAŸ9к:xŽиg93~ы {cуF§6ЌяzqVЗціŽ}—?В=В rдABPm ћжЌ;ќ_nњ~ЫЮќ%.ёфФ…ЌЯi<ЌпмЦ€Ъ?U†yлХ‰G>lbњ в§tЭ;fЭКАo­]yРyROGШ%Oю]:›цђu3Lт дNЧPѓНмM­]˜yiЙ…ФЪTўьЎ˜йдЦ”RВуйЗёЭJ|KЋђ.§Ь›œ2`gLЛЙ>ЬEГhАъhРЊ[K~й;ќђ$рm{-˜ўЯˆеnТц?'l.еlbы;gџ?sд>D~}@+p  к­ЇmЇŒќЪЉQ“оЛьѓУ‹Т=ZŽ8лaЮ$OфMДЩдub\Lџ1c8MэlЌЌlь\9УзЄімЦпЬАЦбд тqтВџj~3fю}Мѓ ’ŸJ2NGЧJ:ѕu7#DvџD’q—Ž пїQR>;:щlПН[FщGі є‹"їJмї§ZRжoъ—.sЌЎE_(%—Ђƒ}нRеанwbєEБaЮФˆ@ѕY}~8хЉX,NK\3Ј§ЭWŸ‹ГЏnчиє#Е€Љ}За­П'?|Q<1WNкх„“8Жшj  ПЈ­TёП[ЃDФcSoq…RЫN —ЗђZ9}>эfŸШыBф“ŸSn KєПzyqѓЁ[ЇCл5zѓ@яѕї1yМ•'ZqЩ}JИw}BH‰2Чolы№gиМ$iйGќŽтсоƒжНиuхQіЃ+;‡цGЙїЁš›ьцВЎƒ…zwY8Џ€J+ИЛ'lЩгр­Ё­ŠK\Щnў<2Всвѕ#\Ы)y•’“’’“’ё2#%'E"“Hф’”œ”RЫxX{Аш,ƒхaэсaхСЖd{X{T=VЉы’"№cV} 95аыЊф 2ІК‘tЬ^+~ПНЂd‹e}w{|ИLя#Й†?4ФВыК§]‰TxАјfй2Ч/,KЗdJѕ8аw‚iд’пвŠ\FIќ™УдA?oљНИЈлнз_ыЭЂRПујѕы/xЯнwЯЏUhЛЗ'JR!зc]ћџ_s•іWыў;5Т^чвD @kru@ QЄэ ^ђpјЩцяВU їo‡ОєМЗЋ` [н—Š(Kq)B”%ђА~“т5чБ,UœœЂЖRяNbSrR$r‰D&IЩMспхgфeЄфЄpь9сэТ9іэUќ *ИwpzчЦE5lбsЦўдBˆъеݘ1оŽE9љL=”!/w%jЉлЛЪ–ДћxcэЅxђ[HЛ†ѕПсќ ƒ+RЖЬ1ЅЎ№Б>0u<ЙUвw“6}œ/•ѕOЬwS“к|7и…QЯЪ(эдПй2Yій;nШh„fbn\“'зл…H`@e™8‰><­ўoSОjfgmуаТяћПЯћuѓ I6oЛ8ёШXЇ’q0§щњ;Šє€тa\PŸŸUS~ПџфQђžЁ’ѓЫ,’нX=aЇУвГ3oХTўѓїcdА *дю]eJкSлX›™: ^›tz~ƒѓЧяЩtKЙЄB.EQlžшMНуIhЉ2Чъ ыЧa;Я` њЬбжСsФ>Ы™ё[й/\гџnА{#Чž›щпpЌiEѕК,m1їЫQцщ:ф ‰Ыы  (ЅXŒ”Бz%'qнТ—U5UљФ7Ё&шэЋJQТѕˆьПхeЎОАсЫч›ВK:(ˆ>ЛЌfЌmвьŸкНыЕѕВЋWDлР~ЧЅBЎ3яi№‰?–vАЄсЛЪa8{6€>“ ЙNќQЄoылeС•з: *Bў№ъѓ&]м->lЬМёŒ^t`X +ЊAѓо‹ў|^ЄЃшРАЉнЛ ˜тйПg'чЧ­§'_зС€!@ @3Lœxѓ}’–Ч?FђCЏН+бU‚J)Ыlžј(-iVН]гзоаџ!N дэ]№†тQќєЮн–ŠПфКЁЇ#T€ЮЇЌЈ-$"›*нHѓЙ–шˆ ѕЃ‰—uк‰dщюдћКђІ œэš5іѓjTn; а}Хо,ёФ96T–кН Š™иїп’м‹ЎУУX5„ХсgˆK{qхDєнuDшччТfЧ&?/(Шљя—pПAбїLўзЏгЫ„#зžцПИљЫž;Ж_8щIA10,jї.ƒЋИ Р€КЬФaшvс\ѓh?W;;їўQЏ— ojjЩYМкчЯнбхЋuŒ)BмшКSoWg{ЋQЫ^Г{TH!Šм+qпїkIYПŸN‘u4ЌЋ3Eй4я6SЅаaдкЂvя*[вŽ+”~ЄоТB€šРєЄћщ:Ј†Ы Ш3ƒ"K67ьЖшјнEКŠШАА8ќ“Јф’ћ'цї [мЇћŽRД0тRЛ)соWМYL%Iš;ѓЯ1ЗZп^ц?a^RчmОu {ЂšН‹0§jЪэЉm4v:X_LИužD.‰Исч™‘—‘ЬOжu8 за ЊсMљК•ƒcЃ&žпnXѕЙЙКХЙщ/Y­щ„КM3VоЙмК0ˆ>nгѕM—"ќ§Я 8УЖdы:аwH`@5А8ќфУЭпьћ™œŸцƒJ|PŒ‡q9‚]ŸдT†@ѕаЭЇЙўКєаУзи3ЕvaцЅхBфЯюŠ™MmLЕ ш ўОч>Oў~T—(W€ьTX OЄТ> mкFžЯ-*nШЭq9_ЅлА <&ާУ{]]АўъЧнЬмћxч$?•dœŽŽ•tъыnІнAЇDY"Ў€ћ.uХБчTє‘JЩЅш`_ї†E5tї}IЂ,ОCMЅKЈХР§ЂЊз~њpљЪaГŽe+! Їџ=йБюbОЎУ€ђйtŸ3сUФТO‹‘ ЙEБy"‰ˆЧІ(Š+”ZvZИМ­зЪщѓi7ћD.шX_зƒvЇЎBCxnМЪЅЎ!DёpяˆAы^ьКђ(ћб•Cѓ#ё)!yЂ…—мЇ„{cOЊ0шcыNaлYK‡ šГvЁŸђй+…RЉы˜ЊŒкJ•nZЅІБВUчAsЈ­TЉЗЃl МЧєЄћННAГь0w_‡Зэт2/ГзŠпoЏаbtzЈNэ`y!‰!/3Тл†ѓмxUY…ќ^\дэюы/ŒѕfбЉпqќњѕМчэП?$дЭВыК§]‰TxАІУ§„X ‡ŒЈŽ?№—7=2МuSПЃэ—ЬэhЁыˆЊA$Џ§Aи,ђъУылПО=JЬ­зшxѕiѕкŒмœЁУŒ­<ЛvёhTЯœЎP1Yы0аь`х)N]…З gбYе]—™Sл4сёлЏ=•4љDК}'TЈ{Ра4й-хcFЛыђt ™ќйэzЄ\јhџDПУ/>›ВkcЧ“SЇFџћœсњЭЂ]QуZYhцdвˆъ0ѓ№ЙЗ-?si\ŒF6VH…\6ODˆˆЭхgќ˜Z џЪž#ч“~cЏ'„Vз'~|2\ZN'щ$eІvА’”ЯO.пb4sївжњ|‹жРwЩм}}ЙЭЃ{КХяnЉб>вugC€кљѕ/9bБX,ЮрsX~ЦŸхgЏЄBЎc@|vбЛ›Х3ˆЋ юœоЙ1EQ [єœБ?Е@уСзIцm'љ0{ХєЄ—8G•нкњЃЈнŽkMؘ5xЦ•оћSŸмO™§уфнi>•Чєˆ‹щ"Й@aі>ђBќжпЕ2{UЇa+щхП6э™Хql@uŽyTЄбMб]Он™’+~ŒьU…€о12gхФDž•–œІ[ё0.ЈЯЯЊ)Ппђ(yЯPЩЦљПejіL>B–y]ьтп‰ндзпJм$(аЫЪЬЪkш(зŒгwk(Љ˜’“’q9ЂfV 9ЬоGr‹SiIcЃ1h.hгOюWСe•ЦMGMTmм|Н§,7…ТхwїЌMё]НmpЫњ„іcb’Цh*R(O‘ЌШЄF#ѕщЦ ІЙ!„ffiЊx­Јve@ў>џ?уeЯм:И‚Ја  fѓ%;ŽљжФКT„ѕхДСїWХОЋI.xѕy“.ю5БvјИw6Е.тr„ч>Oў>Я—<,ЙЪEшz“_лЃо5 6ѓ%ПЖ!5ѓ!Њ“№VэCЎ IDATжЏ^dЇГбЏ^КŽЃ†дВЇP z`д Yю›џ)ЊJ3 ћ№І‰]ŸА/G­r—™BЁбˆJЉTЂћ’S@$"ћЭЛ,bП{Л9!еXeФЅBHF^†(K’јё5Э,g=;Х„ЂBQЪj„Ѓ;Ш›Qе‚З*чўUUZ+!Єт3ˆ—їBЩ­zŸTэP­МЊеx1Ћь“пЎUyU‹_1ЂЊШ+VооEtПƒќ+іtЊCƒ4€O@  f0Ќˆ,—0ЌˆјjЅ+sЉ=uЁЛmyЎ?ЁТhтev"Y:Є;… –f•HN•Рy_kL3…лynч E) 1{E4ђ!Њ[№VVП+ќy)Ћ–=€RАgш/Ѓ_…Ќ—“Џ$ФФaшvс\ѓh?W;;їўQЏ— oŠьUэТБчИž/$1$$1$#/Cзш єРа3д+4vјхI@ёп —A‘gEъ*Ў:Ё2Х"5„чЦѓwіпt}SBz C,€ЪSЩђe*ТєЄП?Ј,даМЩ,:+Мm8ВW„(Х"ккSeэжsібЬBЉkуŸ]T|џЛъБ…їж{Sя8Ÿ}Eˆ"ыhXWgŠВiоmІ KAˆќс/Гz§Џ!EQ [|z(]ЎІєXя(В~›тmGQЎН—ў§Ђ8Ѕz}wџмЅчѓ?\0яЏIп„y(#„Uўјя§:NH|ЉѕxjЗ‚k?ŽЂM=‘š•ёяЪfGg.Лєš™Гrb"ЯJU,Љ|Kк,ОєL,‹ХтДMъЉ$Isgўй!цжул:ќ6/Iš~СЌkЏf=ЫККЮуdјЂѓOЫДф$а5 !а5Ѕ7VUЏрH-‚є—ьњ†'[mЙЇ˜пgёббТ6YЧVЬ;b3qй ‹—dњFЬМ8qpРѕА!Šи%{Ѕ=чnпдНкSЙ›m0ѓZњOВŠnfB# Ош`Oe*Ђ4n:jЂjуцыэgy˜Н[R™Ÿ+3kfaќўБw­љиYа­‚Ќ‡$м. b[™HU*BЃ™˜šл850kPКi}…w@#yљМ8 ПdYзХ.A'gвЯuЭ•лЇзDЋ7|ѕ†і ŒЫ,jjзэ‡CIЋЧлkЛZtШпЖь"ЕŽш@kŒf„Ђx"\Ж…>fѓѕa}9mpТЌи1cЌп.WєњХ‹ыk§\&п—0œ{Эй=ЕEnњKVgk:!„nгŒ•w.зИѕЬMƒЙ_ЗЖ/$ФДЭь ­™ѕš–jaшь™ТЇa!Р;Њ"•1У„аLЪёЛt^ќг„вй+ЉћvŽЗОЫџЪЮ<шfMQW(еQдЕš*џціёq­7 ѓ4/n2Быіхщ•ТlХл…LэЛš8%ъ\ц“Л‚1љk'ЎН)#ДR+*JчџkЛђяєьєs?;№gя~№КLKЁŸTz`h\йЮеИ`U У@Ÿ)kG•НрЫєˆёk№Q!‰!сmУй–ьY›*явЯМЩ)vЦЙ›—ШHб]‡‡6Š<зџMšŠс>rСмтЛ>чЙЏс?VљЙ0ѓвr ‰•Љќй]1ГЉќvє-ЧnKƒЦєрИ€7ЗщБR-Џƒ›šжHрPУРа8dd>Џ ш#‰ˆЧ~s‰EФ~w­…УЯxSmP=Љы’ђЩeъЖ%л'оЧпйПвXЪgЧB'э7ЊY™Б}ѕк„ŒпАъ’A!В?~3ёб„]Н™џёЗпЕяцТrяуПLЬе№rtЌЄгwГ5•zHxћыaГŽОзРУСвОt †ъ+$АДЁdW#dmJС‹zНЋЊ-МmxpырMз7љФћp8С­ƒ9іœ*ЎыхХЭ‡n%hз(Дјv‹%IпПЛгЈСWa#7ђ'BУ=hzч як;Ž*Вpя?л„цt‹І —ЗЮkЕ№…Еї„ѕЛ;жgаІo?nBіw2zcпбпЕbRKЕ ЅЏhbќBР[Ѕ‹1EfеUљЄЖRHтз8MНЊRa'оUй;дївЊH5ЊAѕ!јВo‡}Bѕс4,кХ4КƒщУPђщHф’„Д„ˆЫьњь№vсUOc`w€ЪБјlXwЏ)Ї2Х%e№9,]5Єl*СPВW`ъдЦЂГxnМфaЩ<7^HbWРхпс—\ %'EWБСA  2ŒЬёIZЬOW”П,@ІШНї}П–”ѕ›ŠЌЃa])ЪІyЗ™‚,‘ ЙNЈнYWМKcёя№=їyОKcѕ>кЛTJ рcРЈѓЖ‹Œu*9,гOŽмJШ-ŒИф>%мЛ>!„•$iюЬ?;Фмz|c[‡?Уц%!sUёмxЎ ЊKдЛ4жЫТ—Ё‡Юј{†ЎC€д4ЫЎыіџ4ВНЭ›LoССEыРБ>v:X_LИ§Кјeющщо]^Њ™Xj%Ž=Ї8w7ŽђZёzпн}_§њ•D.бuh зР=&rЉ7<{MйvYЂ$„(sџ^9ЄmcŠЂЌ›ћNйwOІы0Р№)эскv+qJQEa˜[MPфІПd5ЕІBш6ЭXyщЙE„ЂШ:2kўГ){~шРЄщ8BM)o(ЅК–К€EgнЬНYќїЋТW)ЯSкюo‹)БрLЪ_@‡X~Š З™$э|ьМ FвЯђ|UШŽњsNЅѕgПќk^яХчИЛКжзuœGmЅt”C%NZГ7пвд‚B˜~‚7Ек‹ВN r?ЗаipЕ…šUaњоЩ‹Lf `›j?-Щ-ŒИдnJИї•„”J™ањі2џ ѓ’:omwБTЫ6пZ?9%'Х_р/•ПЯ +TŠœ‚DЧžO‡БоB ЮrщЕщZ‡йБЉУТ—_NQ›)^ОP(щжN jядeы‹Q%зкЂc†IvcЫFљ˜бю3ї—lUd ћЩ4<оЯVђ+зч@п ІQK~K+r}$ёgN­э/Є)Іж.ЬМДмBbe*vWЬljcBˆBђЊ‰[њЎу™~п6Ў­чІ–]зэяJЄТƒХ7‹‡RђБГ [XIИ§ТВtKІtQоп*RTбУк#cdFЉFŠЂ2ФЅоСB04ЫVнrЎ<”šБ‰‘TШЕiь5&y№ІYž ]‡†LёшаWќB}­?8;RцœZИЮ4l^wk#bBЇ=?ѓkСXaЦ“[q>ЇУVЇ`‹Ъ2sяуLќT’q::VвЉЏЛ!цž!?nž ?š]ЄыЕЄьPJY™‚§ @ $АР`Ј” %ЭШЈјвгяшг{.ЂvЮи–*зq``РTтЄŸИ†8г?h–HўЕmё)“ŠбrєhŽƒЙ™]‡юY!ЁPЎтЉФи<‘DФcS ]оVШkхєљД›}"t|3 УuЬЪAwчЮ?•ЃдmМZSЖ/UйьoeежnšPћЈ^\JHЗџв…Q˜їLbbmcNЗn3(ахЧНї І5Ї—џx5ђ.Ќпјч‡5„BDьЏж§wj„}aЪŽCfпЦ7{wœI3­GЇBˆ‘ zTШћЉФоыѓћэяoљ в§!Фkс…Z LЗЪЅ4W7Ић@ј,€PЩХї“6wюѓщƒŠR–wы46юЖTітzќо; к8b!Tѓы_rФbБXœСчА8ќŒ?Gий§IЦ]:64жutPл”JIЉ\YмŒžбЏi#Tљ„ŠB,аoMBŒmлѓЫ§гlBз›д™=IfъјUш–Щ-‘Р€š%œќœм§ќЁкЄB.›'"„"bS„pі\\о6„зjс kя ыwwЌOŒ;-\оvxЩ–:ŽY;ЬZNX8ўшџй˃Șі7рпЉЉ)Љ9-Z™J‘-d %ЪНЈщ^ЙHe-kWїЂEТЕ]dНйwВDЖ ~vВнk•%ЁšJЬд4ѓћЃtЃ0˜™33}о//Џц˜9чщы4ѓЬїћ<{ушŽT P E‰љ|Lаўvп<€дZJšЖM№U>ЊтМ G†^№кШaBŸчїУЊ–K7OъlXѕДwB•ўAVщр•№kЉйˆЉиЗSШу:ЦЇ$y‚­№%Њsf(3сНи5Œб }ыП_хРі˜3Qoуя+ўEf€яƒ€l‰ђnьˆъгŒ2.Џы!ЮЛА`@›њE7rй™ŽTJгcЉJ6c/О•сЮ…ЯnёќмXOƒќН9žљ,лњ5|} Ф>VОИВ йŸƒ2X $АdЊ(yFє5‡Hчђё‚[ ƒ7ж8‘‘ѓќжrЇ3Sf]zCs€Еšј]i=ык+>ŸЯчѓ3VvЎ#УГ,ZАЦяЛW ,њwпŽLж‹cWВГЏ|RЗ‘ *)|ФР3ЉќН˜_Б„рѓPФ@ІєЛ-леђЪъ8ЭНž"бdjˆоф‹ФкЦж†ZєЦWЛ‰‹ѓ„:vzђщ,Чj1~љШ‘cК[‡–P­†/Šя{bЄcГьњ}џ:аВ–є$Аф‹ЁЩd”/”аiyј@KєЯЅQйЛќќ;K=mЧ=*`йєšМvѕoэйВ[’ aд%roJdху~7Ќ’йЮОь3йdЃqШ™x_І;YУBP^дZъ^ЕђЮЪo{!€xz™~z&ЕiтКДКƒЉЭД,<† ‰ЛєќEjRPёв1KяЁ:Ј‘2AХп%–пКПKPcytJ 3А@}deŸ .() ;€ЊJ‹^0MtЕ[ї АПэ‘`|#TDЂ ЫaшєЉх_Жѓц№WќГ₆9qђОI3"Du[бЋt№ђTШу:ЦЇTЉ$Ъ\зwШ“™Gg:щ–oад!eЂЉCј|yЭT@ ш‚X &тЦЛ&ККXКœя{žюXЊЄЬѕшДцђ ‘в&t­OQTН&?Nм•&wь4\[=жнЁEQѕмЧЌОЪWr• y\Њ*)њX яЮяхВяQБрѕЕј Љ]lБЂTгкџзssŸUМYяЫdX…ѕƒ –Р•WPRp<`х•IмЄШ6‘_~€ъУ:YЅVžUЉh NQцгZЭіv^WŽ™­{ŒdфВqݪؘhшВsзЧ\,”Tй&zВc˜їbIШџНxz{ЋoСŠ?<жqьіЖг !Є"ЋђбЖНЃОjbЭ†УЧHVЌКг>ТБЂ]IъжЅ)юKжѕoV—в>h§Й ™„ЋLJвwФ=ш{e„3›AHнNЃbcЏ8Oн™юй\vЧ`šѕœsфўйэ@и.ё)R$jдf`Њ*Ÿx5љђфэ?nЧФ+PGмЩ&#юВи—„АЛŒяџhсіЧЅ[Jžм|нРЭAO{WVТЌkЏm~p4`TТМŠП)ъ›жљŽќ№!гм;ЌЫ№<юœђŸgƒHФb !Œ^Ћ&>ў%„ууoX"uЖ#œPспМцЭАф@"Hн>,tkzН^с+уЦw6в,:9Ин‡…ЩсS <“2=щ€6H`Š)()ˆО}8ѓpœ[œ‹… нс(aNюЉ§i {yЊывЗ‘џтоЭ‘Н ЫˆѓЫˆ№o~uЕkлiл­?,ц’aТjрdœqьvс€”кfАtЌM3x7јОНŒ„")М},гЌГЎ[[[,&„ВЂouŒыHГ`!сD?;eR|iждЫž‡вIвЌ‰ўб vG5Ѕ;$PXBЊ$9;й5б5ыMжљОч‘Н „бЅ ng6оgѕžэ}їnŸ-6яе\щ+zє>E†eˆ{Ÿ’с.ыД%ŒнєXЌAДь‡„ЖЛ6iћэзAюПћ"=ћ­N/§ђ.T‰–mџqЭЯ§ўыЪ‹ЯŠKоfџНўїпЮЕўНП­AsЇьmлЮ=Ъ{WќъСёu[^vђuЌCwД№- f]s3C‹ЖУbw‡Мž:|бЅќќіhЁЋ­Ж+Œ@Ю(JЬч#1№эОyёЫKjУЈжИјДFЊ2Eсх{Ш{еяз„š}G*§эЈt№ ЈЪ.њzєЪ”•ѓ:ЭѓoьOw,Ъ‰efт5кФkДГ№eющщ сGіGxЏqWЗyP3i2SвчЙ”X д\]йкьѓ}Яsє9tЧB#юѕ€eZQдIIVъя.ьИ_J4tZљuмАЄУњ‘ш @ІРR(Šг]ŒО№я kоlZЧtoЏНпpМ>f —цuJз0{“ЉшШ^kOžкцK?,х*dDзц§}ѕЧžЮšQќГzŸšsЅс†Ўxkеѕ‰ЫBЈQ Н kžpЇ*kH>w9ŠV[зє~ЫяKj-% ]]умтПюxеCќ†шW9‹Гvž9ЕT?,џ]˜jкzк4M‹% Bˆ~Ы†4х(y­!•_чщ›™АPV”n‰AЉ%q“"лDr“И“/M.() ;ШЁ#;Јбэm.р55_gцp8zџн‡uЕ–Ы+Ё;0PЂьCЛ6 (sЇ‹/х—Яћ/:9ЌуА“E4GP 3А@йyйxнЖМ=љвdзDзyЮѓМlМшŽ@™h§Иs8ŸŒРЗм^:…gsѓА[ўžЈˆѕБkG4бЅ;(€`ЈЖ6;Ю-.Ю-nђхЩЧjчT,€O(y’:жyE­ЅŒЖК§њ0]Hw@ bJ^=(ВёrГж7qОb=79(hѓ#Ё„юЈ>„Ј  —лo;;Жмбrх•t‡ оqЯ ЪљзУхвпsЎˆш T ЋAћziЛyi !Zпх1-wњ^wГ=„@™ *&ВMd7щpЦan7%7…юpшІiыiгTчП"юП ˆ;|V“рибe+ЇЭ•Bњэ#VwЙЗїо;T)%‚ЈGcЧ$n’—7‰}=šюph…"ю№$ТтW‹‰UšzS’икŒ2oџыоЋ{'vЗЅ(ЪМѕ€ѓUс›(}К+ЈЅ1еР}кЉy“А7Ђ(‹vCзм-Vь> ЊcјоK;ћ˜TdЌ4є[\-їѕ!O…ЦВ`DwпCЅƒЙC TеиcoћнNЩMiЙГerv2нсаDыЧУљќ‘§IђдІ;0PEg~§9ьр!!„HŠ&Fyv}і нQIOp{љмЫ6пН>K2ЧoкГСМЌœЧЧCФЋЧ-ЛЇќ…!…їзЮOnЛёж™бY§'ошН+эХЃУCsцл’QJwlJ ,PalmііЖЯsž|68јl0ŠЛCэ„Щ§№] мЃУ6єї›ЛgчЌОИ+ољoXйC…цн”фІszДЗДtюe.ДіїijР2lса˜ыН ,‰№ѕ‹з_(….|~‡oые™ганЫˆп`X€“‘Ž‘“яpћЌSЉyХUPR}=%e@х *ЯЫЦы|пѓlmvЫ-gІ;EрфгЈ -s){Žgn›ОГо‚фџ§5ФЩP• *ВЌœŒэ=‘!Є~тeљйёл‡‡тR--Y B”}hbзeю4pёЅŠЕ‹E'‡uvВшѓ/,–1ыh3ЌКкš,] BCG_KєN$‡5„хЉ+зDWBˆcй@žРuРжfЯы4/‰›}=š›ФЅ;UPШуRLџ4їLЮѓн)Šтђ щŽMzЌfуb†.Š:љ~.ОшщŽаXAрвц K` n/ТГ‹ЙљфЮ†žўYџbKXIЃ2uuОяљШ6‘lm6н|&нШŒЃБуљОчЃЏGЃ$ЈДвœгЫЇEo:v5Г Œ&eлжУ7dЪxЏ†:2]8nр™ФџО)Н…<Ў­џГ> 7, rbсЃqj-%х^Ѕyf•ЩШF.QIџќїOLNPве )%%ЏйИYы›и _Б^w„_жж>вНЖ йŸSё§&s*Пq—`YЧ}-Кќяђ/j.хЮ0h€(Џo[$й&2ВMЄЬƒPвGыќкЮ_w"іoюZС Pwr{ч?3N­ѓЊ'гЅ9gтf,иrєяє|!DлиЁГw`фДЮЦR/"дk7ТэQTЏ_к…Э№iЊџщ№фЛў]"|zzUTшьƒEя7ЙФg%)Ј‰ЋAћziЛyiмСtД8ОЫc2њћЮ§Љр‹}П?‡(ЕШЖ‘ёу§ћm1і“гЏF*&€o%„ЪDzђБУФˆўэ5vѕї|ЕqK~гƒ"B,ЮmНU,г•І­ђО‡=4юф§чЏђr_>Л{,ІйшчПюБє-№:Ж}цмfy<иее7|йОЫsŠ„e2 T Х#зEпЮЩуПЇЈь!„е$8vtйЪiGs%„†~ћˆ„е]юэНїюkfЬђИжr\Мй&ђ|пѓ„зDзшыбh*3А”‰v§VFщЛмѕ№З|z`їM[}ІИ(ѕњ ІaйWЄŸЭrјmЯ€Ž&хyНzіІLмцœ*mЋѕ{в2ы2vеЩAЉЇЖn§cРјЋ/œЖ?мп[‘­ L]N—Ж,z> з :†яНTхБ~Ћ‘ыЏ\OK0ŸФжfGЖ‰лbьЪ;+уЦm1–юˆр{еАоvaЭ‹p•АJД@ @™Аš†Ќ;zTлPŽuё+'9щМ9Ељf‡)Ћкж‘щtьм8ї—.иmѓыŽVlmRR№"§ZТі лžv:пА; §FГ<gЩ4H)щuœj=KВKp Ќ2љœђ4нQ€ЬH“м‘О‚Љt№ xxsКˆђnьˆъгŒ2цђ )фqMЌќs*І›<ƒZєt+здИb‹(ћPX7Š2iфž”-ЊqЫЧћPTЧ‰ЛnНрѓљ/nэ‰ьjЂI ~X{|н`;wегВГcНOўњ —†ц&FF&ці.ƒџJћq]ќ(;)Ї_x&e*pЅоgŸ9wWт,яІцFя;+*№"№;WџI„ХBIеС _ЌŸPЫ 4)Jž}Э!$вЙnХ ]vюњ˜‹…5є–№Я§Е­XПќBJRpnjјщŽыя?ЛЛЎущАiч ЋoЉiџ№- аЕџЛ§$ПМjTnЦѕУ+~u1UСUњ[ОЮчWЅ™5iљѕчАƒO„„")~˜хйiєй7tG dT№—Ј§nЫvu#…М„їФš ‡‘ЌXuЇ}„у‡“ж…wзЌ( tпE!‚‡IWіИšыi ѓ3pјAОўЧ[оЙЗЏЖ!Ъ>0Сgєжћu;…mŽ\ш' IDATъbЈAˆф]ъю9ЛЌ'Ouж“ѓС y\ЧИрiГ?‚д­aГ_Ž]кМ|z˜№отЁ1ѕўŒbџёt1йЎЊЖђHƒIяMAВ?Їњ7(]'Dїш№Ћcњћн  к>{[сS7ЌьЁ*й7EA ”†„АЛŒя8bћуѕAЦџm=н3џ†чь@уqѓ2пАЛkBДMьиE—ђ„еЖˆjк?€‚ˆђn$,š9;ю|УјЧIžDђіо†Р?іо/f;YМ}Q?Ž6н!‚RоY>§xѓ5Зvˆў№žu(7Ф$ћШМiMЦЬщ'яьезel;ћЩру*ГU,‡AОoмЧmы–Фљ№VCЪ2ЬдZъ+ 6—dФщ3!ё'`ХJї сanфыиќ81nuXgCХ­7aЛФKѕЋFЫмcЪЧsKFмfК$y—ЉlЋѕЈ,!eТ4їыrj/Ї2%сŸ[Мл>ЬЯІЪ•~ѕvФ_г @Ю>^Ц.МЛdє&Ы?/>y~ћ/тП/<+Ё7>PzТь;|[Ў‹ЕMЗ>іoгœњ+lI–ч’хПv4’qZЃчmH}ŒуŸ\ ѕо=<ёИс`ЏЊ9YMSŸЉЧюП“mЌŸ&ИН|юхN›я^Ÿ%™у7эй`^VЮуу!теу–н**†oVШуОx“Ц?Э=“ѓ|w@ccХ№P˜ЪEл~ph§a1—|*’REWbЗœ=Нбђ/B!ЩœюЫnЮЗ5(ЪШ+%FZ%ЏRљ Mt?ођ5]ŸdьЃeьТД}‡оv]эj­Я".у—ЛаЈI™D“Х$ Т?Nмђxѓ_‹кRђјмYЏеРN­'žнЎJwУBз1Nк=0й–КљiЏJˆЩ …ЯяОвЕd+ь>Ѓ$7͘3ЈНЅЅF/sсcŸІ,вТ' ёœ­Я„Є…Œыо‚gRІч7ОџUгЭj/ЬРBHЕЮ)џ=T|/П:­ƒG c7=kBˆAЯ}Й|>ŸЯЯŠwaЛФgbгдлЙјHвэ—YЇVo/шќ“х№ё–oiќ %ЯяОв.л=А‰eиЈїЬгЏЫшŽTˆXгІџ@љdЏ!šV}'Лž›ŸљЭхtлFLsˆœАю|ZЎ Lє6чюБЅЃ†'ЖœбVW–‘~ЫЪЩјбоBъ'^ж‘Ÿ П}x(ў!евR1йЋяSšsfщXЯЖЖ&хѓАLэ:іПњr.о'р=Iiqaqi Ўj$АрГфзЫЏ|О4Ч?Й йŸCQœйyяп”5 Л‡ ­“[ќЉжСњgЬmУѓonнnќ=я˜щъжАЅкў1 ш" ‹п6<ћ4у\DЭ–оUўeM@ЛŠ ЄЪ+™rВПžбm3ыьСжUgKx&eJ_Ы‰i5`ѕоёu„tЗ376БlтuІўД§ЋњY*nЁЋйȘa…‹ЂNО_љ(zК#4VИ4ЄЙтXЂь!ЮцeпћЯ љхWБ’wЉЛІўyЙјГЏ+M[х;|{hмЩћЯ_ххО|vїXL?ВбЯнуREФ * шИЏЃяё"КУVIцЎБНЦž*$eЏNЭўЙY=ŠЂъwМќZсЇююЄ‡%„№YђыхїЙљвš–~ћ^јU{ўћ‰йLГ^ѓўї`^•ЌОѓБ@Yhк˜леїt2ЋЃmк7РaоЖl!iЉ C€6ЊuУаmфЛряњ"а0r‰JњчПЧLNPве …†№ЭuїщgГ~л3 ЃIyљ НzіІLмцœ*m‹ВЕS!ЫёOўp[2‡’ЖЉ%Но^_8#ЙйЊyu7f‡lдžx*нЯ,cыпб1н.ќЁ %Н О0 @žt›іщќц№С[/‹ѓяэлњаДƒ5–КЈ™oЎЛЏcчЦЙПtСю2ѓ"БX$ШzїфЖэЖнэ№FQkщužЕlLoSv^ЯЮЏ,ЅТчѓхН’‹…ЌN п3WЊьЭыR‹іM 4DE/ЪіiaЌgкІ_€}~Ъs40я†дD‚5жпъуeь~EK\Oј;Xйv_Ц YмX[Š=˜Xљ%ц”U>,ЏM)Є'LшZŸЂЈzM~œИ+M яoЄѓОю>ГМю~зY‹FЗ7”ЂiЄ–§˜ы}ђзЙ4471221ЗwќWкытGйaњU­ЅIЕП%МЩѕ™§Lкz-ї›‹д}Yб™_;јDH!’т‡‰QžFŸ}ѓ;дk5ШѕХژ„ѓщІУ†йs9=§жБ Гšєn"лКx…<Ў1хДіFж&ж"XB„B4tик‚мb11а „”НxЋc\щM€oPгњ/юбд™_Г ]vюњ˜‹=цК0оo=й1Ь{™љЬџ=ђцSvM §у€ыV_K)ю‘@aОЖюО–…GшZPy†ЊˆЁзШ;jsЯœ gFЅфЖnаР=:ќъ˜ў~wТˆЖЯоVјуд +{|Яб4ъyХ%–-™=cPи'Eb’”8зІЃїЈѕ›‡rdž{аk7ТэQTЏ_к…Э№iЊЛзZ , „ЂлмЧ){эЖs]‚:š•e_ЗхeЇIŽuОќ:БfУсc$+VнiсXБЈ$uывї%ыњ7ЋKiДўœb‹ќРч$ћsЈђ/“пёE‹ y\ЧИрЅЏvђЇmжetмйбqђ;‚–ЙЧ”=Žч–ŒЙЭtIђ/гяўP„Ёkџѓ”Э?O‘Et_8’ŽmŸy{^X7=иu‰щОщеЙЙЕ‰> ьЈ-d)BˆІYŸхБнЎFx4ВАrќiю“bzk —РW8тN6йhq—ХО$„нe|џG ЗWЖ"+yrѓu7‡ЯW„:x&ёk„$ШHхZrю№}S“Ц?Э=“ѓ|w@ccљмёЩ<ј*ДЬКŒ]uђќІQM_јc@kы_ŽрŽU}aT`šКOоѕїфЖЊVZ ѓ*ўІ(ъKЯ­ЩШ2ЭНУК _РуЮ)Џ…У`‰X,!„QУk@ђМ­§ЯзP~ж%Xъ}PkПщ j9ЕКбгаoф8Ы#pн€œ! ,#"Ь#,#ТПљеw5о‚jл­?,ц’aТjрdœqьvс€2X ЮТЋ%sе˜^Ћ=œZO:<Л]•т…<ЎЃДkЦј#?~ЗЁ(ŠЏ>‰‰ZIiMi”цœ‰›Б`ЫбПгѓE„mc‡Юо‘гF8ЧE†eˆ{Ÿ’с.ыД%ŒнєXЌAДь‡„ЖЛ6iћэзAюПћ"=ћ­N/§ђ.@yiZѕьznV|ІћЬЊбk5А‡SШ‰чЌFЭŠwaЫє(ЅiЋ|‡яa;yџљЋМм—Яю‹щG6њљЏ{ќ=ПY|%™wQх†XЪKУА{иаёуJ aZњnрiNтi?ю гМ}РДхƒjб(Ќ SiКmf=јсІђЉ%PkiZѕькkF|fтkљнЏ вЯf9ќЖg@G“ђщKzѕь;L™ИЭ9!U0кі›Й(&јJ2яЂЪ ,%ѓСэЋІЅпО~х_ГlћХœяCW\ „ЊЏ #XD т‘ждБsум_К`ЗЭЏ?:ZБЕIIС‹єk л3l{кщ|зŽ›“•}EPfH`M y\ЧИрtыP,-ћ1;ж—ќ1?ШeLV‘„ЂI5tі Z?ЪN%ціђИџф64оMq‰ЯТћ‰кB ЂцЯВЎю RаВ№]ыJwпH­К(‚ДРдMј@ѓ№@єЛ-ZЖГфЇ‰-ѕЫЛI}MЧНZOœwaсШа ^Л9LBсѓќ~XеrщцI бœKˆВL№Нѕ~нNa›уЃКj"y—К{Ю.ыЩSѕdtBзжџYŸ…–9Бexњ($јъ$ЅХE%књzZhгЋжшJ`‰ђn$,š9;ю|УјЧIž%OіMЕёrvЉ–yЧ!Ў™ч§vБkпЬEЏъЊ_ў‚7чЧДЕNMѕe’ХRX№):ю‹ХШЕM™њЂфбзB"ыB)О<=т˜ув›йЏВo.s<9ѓВШОџ “3›џ)ЌxAс?›Юš ъoїeЈ…„ЯnёќмXOƒќН9žљ,лњ5|}эЉюи@†„йwјЖ\k›n}ьпІ=8ѕWи’,Я%Ыэh$ух л>ѓюГ<ьъъОlпх‡9EТВякЇТ‚/фqЉ*8ўЩЩўŠЂИМТ/ПTM ,§nЫv-коЄтГІ!ЧˆY&‘CƒЉЅkbmШдВщ3ДСХM—јBˆ„yгЅњCћиЈD99cYД`?ŒпwЏ@XєяО™ЌЧЎdg_;љЄn#mКcY’”I4YLТ`ВФЗ<ю:kбші†ђъЎЇeжeьЊ“ч7jњњР:X[џrфЛ@Š ^ЏѓЌecz{ ˜Вѓzv>ŸŸяТv‰Ятѓљ˜„ЅЮ”c­4ЋEјЪў7ЕА01oъ{ЉO\X aZyк]нt!_B$ќK›ЏкzYЁbдJЌу—ЧtЗ6kа{ГХЌјШВHЧfC.vœќkKКcљkкєи–’ћ]Л†~#РY›ўw33яХўо2JЩ7xMЊЭшј-сMЎЯь?`вжkЙ"љGMHŠџїvЊ_>]­­OдоG‚/МЄЧЕVКщlЪ‘eЦOйnКрBІ§чЛЦ˜ДХ—7ЖЁ–Y-цl:—лЫѕвцлЭƒbЬф•tPrF]"їІDV>юwsР*Уљ)HічTчMцTVщu‰Я’нє"љ•ŸS@№я1єyGmю™saуЬЈf^}JYvBwІ$dх™-]Ќu ROФMœОЋ§ЎЁхHIO9т}ћрШ}+?n36‹aрйзjz|ъЛБ Е4LКЕОњдƒВ„ћmFt3QŽйbjЄЧUpс[‰№uN‘О™ НЂЊ3№Lт+МХ–ЌКјбМЖY—бqgGЃщЇ”<кsгmљхпн)!ФД™їŒЃо„М§\зн?жŠ›} ЃЬ6№рйХ.uљЩsќ†.Оœoю>~HБ„юШЋQŽЄЫЂ•Ж‡ї PјцсбНщ†Ž–,BaPƒ:?нАlMFЇ ЮЎqT‹(ћаФЎ (ЪмiртKљbB!E'‡uvВˆцШдWн€ *:юыш{яЬjI˜qхЅMЏжьS*LmЦыѓћ#xY/юяp=Ж$хMњІˆЬIŸd_˜b|љС;ZТ§šXх-*;˜MnБ`Tй"7ŽY}зhaPьяяЛРъЗюђxg†ы№vњє  . yо†дЧ8ўЩr;Ђрів)<˘›Oюlшљрѕїп)пЧЙЕКје" C\&–RѕџЫ+"VГР@K]ѓŽ=,ГЏ>-ЬИќВёŸІњ,у6ЕаЅ;№jhZBXгФТ)еŸXЇУ’ќ% ‰ @­щЕиУЉѕЄУГлељoc!ы(Зu%ЏйИYы›и _Б^w„_жж>ђ:HKЏѓЌecШk32r\Я†КE _N ЃгаХ<уа?yО\ђTLхЏ~†Vm!„h05!D"‹% ! Щћ”—RQŽ%„ ’DOЗrMЙМТjŸсP\оГƘ5ы5щРгRК#Је4­њNv=7+>SaНšX кзKлЭKHбтј.iЙгєК›bE5BПкCЫКџФџ>bёё4ОАєmЮоъ їFКеГA,Nлzi;ЇОц^лЙѕю—*X 7е3…%OіEєjZЂЈzMz†юЩ,ЉЙ7Ї(яЦŽЈ>ЭЈђЬѓЏФјЕБ (ЪИё“=GDIHјчўкVЌЏEЉ˜VЩчѓљќм[ЖёгЎ!l—ј,>ŸЯЯ™yqО/bж•bšcЈхtлЬ:{p„uе)јžI™rћШе$8vtйЪiGs%„†~ћˆ„е]юэНїЕMшWоХ/qљOoжЅ№ЮЌЎ4ЭњЌNњГбЙp7Гz–-~šuЕiєбИnzеžЈе(hŽoСŒŽѕЭœgчwoK1Ъ”ь'хшBjщП…Ђe9‡~ѕуqл‘Ы‘ЧWммзн(яєДоС3vщWУ ‹’gD_kщ|c7!„nЭטp,ЭзІ№и$nјЮujx(–№юš%AсЛЊn=пЖH+2бгTѓhхF††‹$š,-фЬ@§Ђ№юQЪKƒъОїR•Чњ­FЎП6r=}Р‡аХO§1єšј-<фЗ№У­žI™ž_МџКЧМS™ѓ*6ЮW\„вA фюПŒы.ЧˆY(‘CƒЉЅkbmЈYг єЛ-леђЪъ8§љїm‰Ж“A ;tД g…ЪЗЗ=н3џ†чь@уqUЗŠsOЬXІЖЏ‡Б)$Є йŸCЂmdieж х х л)_!@P~H`œUЭhс+ћs{ЖА(%DЋѕЄc‡[АЮJГM–!„ˆ^№цЌбZеЁњ\GP0 џмтніa;lДЯTн\ђp}tк/kzšVLДbЛФполhџдDЛЈpCЬО€oƒШз Qfќ”эІ .dњзОkь€I[|wZKЙIёН!!'кЏJг“xшWt%vЫйг-џ"„’ЬщОьпC,JS6юб”hЇ]х™ VЃ€ёі‘юБŽа@‹žh BЩуэС§УїЄi6ё[ДkЉЏЕі—_ЂrGЈ]ЈЕн!|;• ,+СЗŽмЗђу6cГž}­ІЧЇ FHГIбЕХўуRњnZ?ЬAЕ•AЯ}Й|B*šЏW4м>8vNгmXН†2­|"{Mˆm;ЁЕўџшѓіЦ’?/uођя!2џ‡q Ў{ЫПІЄтP›№G~\u‘Ђ(>_5J1Њt№@ ЌщQoтМ ДЉOQ”q#їщB_јши9MЗNя3,‹TкоƒBс›‡GїІ:ZJѓ9Ќје‘а_/ійЖf8]йЋК"Т'”<Л§šj\Џ†џT ““GПžqьe™тУ€їDЙom~hgaбЎ‡ѕЛЬ<ДLWќ@M!ЅжЗoЌq"#чљ­хNgІЬКєFБ|”б`ŘАbTй"7ŽY}зhaPьяЭYuОпуђ )фq)Šтј'—џ“бЯsім?кжЌт9ЮБJњ]%ЯˆОцщ\WЁ‡U U›ЏыџА3ѕШ/&Œў‰0є;NнЙА—ieћ@Q$„ЁЉAˆ††Т>RќjГ#юd“ЦwКуz–Ъ|ЅkѕЩ‡@!:NsЏЇH4™Ђ7љ"БЖБЕЁ‚kщџА3ѕ‡*5 ;GьI‰ЈВХ3Љ†9Ђ5nЄЯG]TWEXBIцT^ЙФgU~ф њGЌejОЎ^XУvхМ`Ў!~йOQтo‹JumВб „ѓшŽ”†:Ѕ_hЋ%Уя…п>ƒЁЩdђИџdЖ‘‡ДdбаХ@с)ўˆЕrІЅЄ'яјљќкЕтфˆ;ц–нq€2Q›єKэzCЏЅ <НL?=“к4q]Z нС€|є>E†eˆ{ŸЂ;9@KН•Нz§NLкЦ­ћи>9їH@wD ˜y пFКuмХw+ЛКя-8jKšЛМ(ўˆЕЕ–њшн}…ъСЋVќ oД-!EЄЬѕ˜5щаЪ~І™‰лЖЖТB€ZK”Бyьь'ƒ7ЊМ`9 ђ}у>n[ЗЄ Ž<Ў ФкMЅ—Њt№ ˜ЅжtZ…Ц{;Џ+ЧЬж=F2rйИfH`}ƒК"–ЗJPF%ЏђŽ­ћ{DЏ}cN+ЖW'Ј†wO}IЅƒЙТ'_ъMгФ-jп(КУPqЕІ--‹јИU„9ЙЇіЇ%ь}tцЉЎKпFў‹{{4WpЫQ€кJЪjDIою˜lKнќДW%ФфПOД„ЯяОвЕdЫщ’PёGЌѕ”тLћЊ?€Pщ&”*<ШЎр? ОjФчЋ2 К4aŸпНэњЯі^бЁЎ.ƒюˆjЛйжm1ЭЁwр“}клВХЏœп9rbЫGлъЊЫ€ЂRoMєУˆЈ$АTDBƒ0!BР€OcZ XН—LŸв=,ЃˆлЎ[РД§г},хvEЈј#€zТХ€*cvњЋџУШз'іЇ%L=ўTзХЇ‘Ÿ_У-tЕ‘ЩPАъГJ•q~CЗ‘я‚CО дљˆ ŽРPu,3Џб&^Ѓ…/sOHO?В?Т{;Ъ`(–2ІЋ@эI„љЏпж11dс“+i`ИTК*Ю~'ВЩFcПнqHЉ„ЧнЬх•а†”$зюŽuп^ZKелю>цюUО„юdDХNЅtФьoMŽИг‡МˆžgLъЙнŒZK™lї^TиrX‡ѕGћ"{ Ž$‚д!],)ѓV_Ь+#„мn№Щ"КSN.•rФlВбPп‹v5™EQђ+-Г>›l4!DB(J,Ћ}Vcє-/Z(ы(Mєфс~З Ѓzм8hBё_mŸ|ђ—ЁЬфН >>ПЫюЭ98нЩ+СSЛЦ§ђэч’МњeШчДљФyBЧ™№й—ЭЈ–Ё0OЎ?z2$нOqх–шъœ GšЙ\й[пМ({КчЙш_8Ы:jЪ-:јЌЊЋПaB–Ђ[[„+ќ_ёGP3Х—fMНьy(-$ЭšшН`wTSКCRf.•"ЬЋј[E.кeю›юхЅЁFПyе$ХчЋРЄ§§N–љ|љM|ћ–qјТхВ`?7qїO-Дтў9!Б є:ЛиТ@ЙІм–ЅяHyаЃы•fl!uЭGХvНт|yg:ЇyшюИ`П$OmBJxмЫк›_ўы5!›Л/ 81ЄNЭЗјЪv.ЩчДЉљ{ЄЅ' ќˆ;ц–спT‰9ЇR ШџY’т7шŽуkih3чї‹F№†НИџЃыЉ KR”э]_œuэЭЦ•i5лЄЇЕрjжЧЋ™э]т]Д]т‡žўTіJ ЉъiЃLzŸ"У2ФНOб‡œ0[ЖmRЇќьgдmоphK5љ`ЊбkїлPГЛBгЬkбŽ Œ‹ў.І;*Ѕ…сR)j~бВ€ј2‰fГРf.–š bжУВxЭг2вRЙђ? ‘ˆ%B*RXBƒЁ\гФф„aик’1|ЗYŸЗBf7Q8ѕдЃnЛЈэо?в4q лy3ŒЮ€”† @Н`HCЋŽƒBLeЦ\{O(Ї#о^>їrЇЭwЏЯ’Ьё›іl0/+чёёёъqЫфuDЈMРP;%/я4№hkfжЖЛ9БщянŒв5lЦѕЕЫЛљLNщЄ’ {б IDATмєbNі––ЮНЬ…жў>M X†-|ѓoЩыˆP›  zАоО@лД ћйщ9Я/{&yМыР]О џоСiF­­Xђ9"ЫЪЩјбоBъ'^ж‘Ÿ П}x(ў!евRNG€к ,ЕЃу2нѕяСMZG•NJ\dЛkcnыОD4"6Є™МXЭЦХ +\uВ bƒшщŽаXAрвцH`€ь”цœY:жГ­­ EQE™кuь3~ѕхм2КуЙЃ­ˆ;šШ гв'юŠO\ХЃоѓф~D #—ЈЄЊDР JК$їУ@­RšЖЪwјчшИ“[Б$яђВn[>СЯŸœJmЋEwxJImв/є$ААј@•ђИџфїX–ЮУц­ћѓgЫЂ ‹Ц„,ћпЃ7šѕкјЯ^Лh ‹BDy7ЭœwОaќу$OњТщI„OOЏŠ }№Бш§&—ј,%ЛœЄŸЭrјmЯ€Ž& B!zѕь;L™ИЭ9!U и–J €zЅ_А„ЄРv‰Ятѓљќќ—™ч;№"f]ЩНЕ0xcнˆ9Яo-w:3eжЅ7„BŠ’gD_s‰tЎKsШ№Š/FЎ1ŠО“ЧOљв1:vnœћKьў'3_ ‹E‚ќЇwOnлžaлнNGБ‘ЈФpЈк–€*bhhБHЂЩвЊу4їzŠD“Љ!z“/k[–фЅпmйЎnЄ—@sЄ№5L]N—Ж,ežф e?fЧњ’?цЙŒЩ*’B4Љ†Ю^AытGй)x§ J €zA ЄPьЯЁб6ВД2kаrађ…эt ƒ0хЋ uкF>а5zT—^ЧЩЁжѓЗ$ЛwБаQоЌŒ–…GшZPКУP•сP'јI)А]т3sўY:tєšSŽmŽt7е,пnрyшeњщ™дІ‰ывJш ОCбљ™sw%ЮђnjnDUрђ щŽJ…<ЎЕТCUнсPY˜Ѕ`F„ЈO5Pх8mЌFуэ#џмc= !ЅEЏ ˜Ц&КкЦ­ћиЮпіH0О‘6нA~’rŒ!€rЩЋGPvЅ9Ї—O‹оtьjfA!LЪЖ­‡oШ”ё^ uеŸ,e+1)Ÿіqig}-_k25k8Аj’Оѓš4ЯTЮсЊ!ђ…5;JXЩ[ЅƒZа•РњЈOYЩ“}SGFmМœ]ЊeоqШŸkцyП]ьк7sбпЋКъ—ПрЭљ1эC­ЯOnŠeJtaZљDіšл8vBkЭ”ЙГ&ZйЯ43qлCУжVјйј*Ѕжљ&ДПюDь;омЕ‚AЁюфіЮ?~fœZчUЏкjyнЦђИЖўЯњ,мА$Ш‰-—#ШL!ЯлкџМЄњ?ИWлT†KЅ3;*<а‚І%„ѕ)+О<=т˜ув›йЏВo.s<9ѓВШОџ “3›џy?Г№ŸMgMѕЗЧ2­4LzL§6zЦБ—Z­Bc‡Нз•cfы#Йl\ГђЯB—Ђ(ŽrAВ?SЉ>MzђБУФˆўэ5vѕї|ЕqK~гƒ"B,ЮmНUЌиHєкp{еы—i{џ-+іа_EЏеРN!'žѓЋЪŠwQp"IU† @На4ыЃ>eLCŽГP"! †SKзФкЉeгghƒ•›.ёЛїЄўхM—ъnЃрЮ@!žI™žя0є;Nнй‘Bˆ[дО;Q5<™ЯRЄ ]П•QњЎw=ќ-Ÿи§@гVŸ).JНў‚iXGSБ‘0tlћЬ;иѓТКщСЎKL№јKЏЮЭ­MєY ŽуK4­њNvэ5#>3q„5хp”oИT}х]ѕјU(xPхЈХjОВ?Зg ‹RBДZO:vИ‹0ЌМэ–lКџЃ—!џвцЋvбVЪ-Рїc5 Y1vєЈЖЁыуWNrвysjѓЭSVЕ­CC8Zf]ЦЎ:9(ѕtТж­ ѕ…гі‡ћ{аЩgшЖ™uір‡›>јДUq”jИT=нЃъёƒb(GBQfќ”эІ .dцd^Zl?iЫуRB4ЭzŒh‘Вщ\nY^ђцлЭƒz˜)Yір;hP'юКѕ‚ЯчПИЕ'ВЋ‰&1јaэёuƒэш+ЂЁпШ#pжІџнЬЬ{Ёtй+хƒсU )ў7>млЉ>EQХiыЕї‘ цgŠ Ў­ыюPЂЈzюcV_х+г"YхH`Н}pфОU?n36‹нФГЏUкёдw„ “nAmn9ѕрЬ–ћm‚К™(GЌ2ђQЋWqб­-3чь~№Ж†z„UрЬљN@€x&e&y"љ"%%.j-Uў‡ю@ОEe№*П+ЫNтЮЬђX|цqЮЋь‡GgДК>;|W–Јњ3EOЖ щЗьпцOsžоиф[ѓЫаmOjx"!DxoNЗў ЎwЌ‹ђX-ЈД=М=жЯ>К7наб’E! ЊsPчis—­Щэ4Ѕ3Ѕ6э\п+Hіч|ј“ЩИъдыrО‚С™ѓ0€ 4Љ[УfПЛ6Дyљœ+сНХCcъ§;ЄІіUВНБџфЂ-IiqQ‰ЖОž–RоI?bЕpИTz!žJЏдJэˆЙщЖќђяюƒbкЬ{ЦQяšŸ™О#юAи+#œй Bъv{ХyъЮєсз1.8%Щг€BзqYћІ—џКIЇћВO БPаr9šX…<.Ч?™BH2‡"ЄЫš„Qї&Кq~jзwŸИњїŠ7#ЂпnИЫу{§Џ>=Ъл%>EI3ї дpц|' ( QЦцБГŸ >оЈ2їТrфћЦ}мЖnIAœjїjвмсSkЉяMї­МSU6_3bRŽУїŽ˜2!D˜qхЅЭ/­й_NБ ГЎНЖљХбр§3ь–=­_'f ‰УЧOeЖ_явYбg>M Ќšњ” H‰ЈўФ:–<р/QHLŠESЁAPy8sО”ЧЛ‡'7ьХбўo“ІЉ‹OƒА„ћя‚8 ћ ПЪє‚JЩŠ—ј,%ЫЫ(УˆЉаpBƒС—‰%„0ЊœН5žЎ ‘ˆЫŸI!DRўjХ†ћjUW @e0й–КљiЏJЊn>ПћJз’­Ш™zg-глcР”зГѓљќЌxЖK|ŸЯWОtŒ2Œ˜ !DЇЁ‹yЦЁђФЄb.?+о…]у3­M3x7јяыK oЫ4ыlЃSўP\&&„IIq)M„‘Р ƒnлˆiёжOЫ”‰оцм=Жtд№Ф–3"къ*0 MЊЭшј-сMЎЯь?`вжkЙ5зlVЪ0b*4\„-ыў;ќ§ћˆХЧгјТвЗ9wxЋ7мcщVЯiйізќмяПЎМјЌИфmіпыџэ\ыпћлjЂQЧH#уФ?9BaЮХя „Сдеф•(ВK!XД`Z XНw|н!нэЬM,›xFЉ?mџЊ~–Š/ѕТаkфЕ9qљOoжЅ”gЭаG”eФTdИ!šf}V'§йш\И›Y=Ы?ЭКк4њh\ЗКеŸЩДИqяDvТАVVІ–-‡ьдO\лЯB“Ђч<у/ŸдБfV?Ўвўй՘QVЧэЯIzSЛ ?]ЄИя„СЏV‹ фG%хmJЋRЮџ %ŒJЕ` ЄGQb>Ÿoе ŠџПЦй V;O9\і|-Œ€Њ Љˆ;(exПІ( ЙTEЈЁВ7"ЈuŸH(-Lƒ‚oƒ3ч;a ж)/шўЅЮ^$А@Щ!J ЌЯ=л;ЖƒeоnьЎПїNьfMQ”YЫ~ .х+ВOdэ&ц_‰ёkcAQ”qу'z^Jw@в(Э9§зЈž­Ќ)ŠЂ(ЇžAбIКуR%Ѕ9g–ŽѕlkkBQEQІvћŒ_}9ЗŒюИдGђiЎаЖYŠ?"Ј$А>MВ|іЙі›япŠfEї›ђbј‘ŒьׯӘыBbя evj-UўчЃЏBЗцŠcќv,-;ыŸv‡Тч\{KwH_Tњh`ДюФЅƒ3ћxOоЙMИлЋЙ?ѓ^Щ4ёЉЮgNiк*пс{иCуNоў*/їхГЛЧbњ‘~ўыЫ.…YуЊЯ|I“1dПbЛЇ(ўˆ Nа…№гJ^о/h0И­™™FwsrППw3J—P\_Л[Ÿ I –lRй№ыКЗJ$C§?Фдqњѓялm&ƒvшhAЮ •“ ѕфc‡‰ЛњЗ7aHќ=чКnЩџuЫ ˆWлКlНUьеC_fЧQч3G~6ЫсЗ=:š”GЊWЯОSР”‰лœRЃmЕdsoРЉФЈ|ШЄЙќBЁo]Š?"@-NШHКcP-1XŸІmк„§ьєœч—=“<оuр._ярЮ4ЃжV2Ъ^IЋЧЅ>dуЂHБ1аD“ЅУd"zС›ГF;hB=Књ"эњ­ŒвwИ›џ.яЮн4Эє™тЂды/˜†u4ŒŠž9:vnœћKьў'3_ ‹E‚ќЇwOnлžaлнN‡юиˆЪŽ*€*У ЌOгq ™юъ3ИIkѓў%.К3™k3!_‡у1auH3'А <“ј3DФяžž_9}—сЄЎВ›ЫЃф$Хї6†„œhП*aLK]Кƒљ2VгcGъa*аБю1~х$'7Ї6пь0eUл: FEЯ-ћ1;ж—ќ1?ШeLV‘„ЂI5tі Z?ЪNFгЏО‹ŠŽ*€*c№љЈF 82XЌDˆфеnЯЎG"ЏntSўщHRЃ(ЊЦSQRtmБџИ”О›V sа­­Ыdrк5=sЄ$Ћ1ЌЎ6*Ј+Šѓљ˜  ъ vОЁ}ъК># *jнњї*фq­ЙМBњ”фмИјLЛ^]ХЏGS<ёЋ#ЁП^ьГmЭpЯ^б~ке?s$Тз/^+]4UUPuЪpЉB0\Њ ,UPЕцŽЁi“Ч;Ьm­ Х€фэЭеU{юŸ mkVёЭ;Ч>’]Кк@UЯQіЁ‰]P”ЙгРХ—ђЫЛ7жqиIe(5ЅЊЃ ЊЏчmјa-NŽrнQ)- €zA ЌO+фy[ћŸЏaЦ‡KpЕMдZJЪНJѓЬз:UЉЙSЛє>˜Їjпјзœ6Dъ3GЪЇЉЩ™#ИНt Я.ццaЗќ=Q!ыcзŽhђЉђgВ§б#еЧА:UPњн­ лYђгФ€–њхS y\Ч8šЃRZ.ѕBGKRќяŽ wœќ†ЛюƒЂџёKУЯN`(фqу‚S’< $!DЏеРN­'žнЎJёэOМхЩЉМ!Є4чLмŒ[Žўž/"„h;tіŒœ6Тйk–”взœ6gNJ^=(В pГж7БОbНюП ­­}j~ЎќАF*<ЊP{Hщ{&ŸАёі-ѓƒgЦЭѕ5=UУuд‡WeЙŸ№{м†пZ—нJX4svмљ†ёЅЛєњЎ#.џЫљтЄрљGНг4э0bёІ?Н-•Ёc€’bдq№:НъЯЄLOКТQv.ѕЂј%„eй Aм™Y‹Я<Юy•§№шŒVзg‡яЪ)</вДъ;йѕмЌјLc+M[х;|{hмЩћЯ_ххО|vїXL?ВбЯнcЌЅSNЪpк?sX кзKлЭKHбтј.iЙгєК›bКSщQ€кBєdЧ0яХ’џ=zёєіVп‚x^іљ—Hо=и2Ъ+ќЩ„јёэиХЩ3ЂЏ9„D:зUШЧh­ЧјэXZvж? ь…ЯЙіVЪу@эЂ№VЩЃ17н–ЏўнноЅЅkкЬ{Цб›{‡r їs›ћЏY6Дu=Š2rš˜\(!тќфйНь(ЪЈIп˜›Хtoжm3ыьСжUЇЉx&e*p"˜ §l–Уoa:64ЉЃЅЁЉ­WЯОSР”‰i'RŠŠО§Ї Qё3‡е$8vtйЪiGs%„†~ћˆ„е]юэНїŽюJў*=ЊPKSЗ.Mq_ќgџfF:u-к­?яkљ™IЂQЮё?Мћэjєзси~ж,Bˆ~ЗeЛ mo"э,§я<ЂŽгŸпо2ДЅ‰Ўu‡Žф­вѕых №–0уЪK›^­йп‰2ЕЏЯяŒрeНИПУѕTи’”7щ›"62']|’}aŠёхяЉRаБsум_К`ї?™љ‘X,ф?Н{rлі люv( ŸЁкgŽе1|яЅ}L*о'4є[\-їѕ!…&ЋSэQ€кЁфЩЭз мєЄzВИшжЪ€Ю§Зй.й6Љ“с7^~ї5Y:L!ЂМ9kДƒ&tnOP‹`яЙ/ю0€nŠ_BШ`0Фeb !U›yqyEDТjшbЉЋcоБ‡eіеЇ…—_6тгTŸeмfР ŸЊсЌоДьЧьXя“П>ШЅЁЙ‰‘‘‰ЙНЫрПв~\?Ъѕ!р3pцШFTƒA$bБtØоок™т4{~ї+&&<)Ёёˆ’т{FьhБ*!ЌeэМтƒЯЉг*а‡Йo{ђ“ЂRЬЯЈЭ^Ф]ЇЁ‹yЦЁђ|Й&хЭМ*ы[3Дъh3!DƒЉA!БX,‘HaHоЇМLК5lіЫБkC›Г!„я-SяЯи!іЌЯМ*%7%%7%ыMVJnJА  Є %7хЃч8;ВЕйlлбиббШ‘ЃЯq4vЌqoZЁk=BЋn’_ч№…н ЊdJ}>VћЖг†(рЬQп6†х#–’›’U”U>t)Й)%ДJfkГЫGЬбИbєЪ‡TЪРTzT V`5p2Ю8vЛp@ъЫ— u]ц­Œє4v` ѕі 7р-щeњѕ-)Оћˆ’Ђk‹§ЧЅєнД~˜ƒЎZ]л€ŒМНЕ%сюрДЪM.ёYRg0"Нƒд„ТXZж§'vˆљ}ФbжЂ‘]­ЕљЮlйpaЄ[}*‹гЖ^кЮУЉ^ў&џюмzW №ЩbЂŒЭcg?|МQх-3ЫaяїqлК%qЊ\rvrєЕшфьфЪcџFўlЛђ†™B­ЅЪ›І•пW RђRтSуЫяЗ],\"лFКXИT "ћP„o№†лЅЖНТуVNшdЈAHбЩaо“Єє•Ї ‘тЬЉRe +г‚хЯ?œq8%7Ѕ|иумОмSY…Gj mћ!Ёэ<Т&mп2Ї_cЦу# CЗлЦЎn№йзАь‡Ўп]аџ—О37šсђЕK ПѓˆЦNўѕbŸэ;†л}сsЈЕє=6ЇОждb*~х(…'АˆІYŸеI‚ссns2Љ–Qї€шЃ“Кщ[ќбЕЭё§_PЧњъu?Њ-uЎLС=Шо=<ёИс`/Žі›4M]|„%мФбЏс‘m#ЅœЭQ™в*ПЭ&UюЋ? ИНt Я.ццaЗќ=Q!ыcзŽh‚ЉѕJэыO"3ЇМ_žstмЩ-Ž ŒX’wyYЗ-ŸрчON%ЖUђѕn_?†^ж^c[Œ§дdДЊикьђL_е|_y2ыЫЉєЈ@mСДєнРгœ4Фг~мІyћ€iЫ7д:C ’§9дћчИФg%}аFžЁчП™џгPППvml2­i@2!„d%ХT—я;тРЋkїoьnkV1ЛѕџьнyXTхРёwиTр И' Ђ˜Й/ЙašKbЙ/˜Ѕ’eПTTД,Е,Ь4W\qsЭЧL35ZЌ\Q3%м7@…aцїИЃ‚ЮЬНУ|?OOsЙ3їЬЫ8sчмѓžЗъgZ‘ЗT<рібУ‡MпrєJ–p*]Џл˜YSоЎVЄрхz™ бƒ;лxЩЛїœЙ-Жја gпз†GЮkђЌ=рЄвjЉЊ}Œє§џk№A™uћТ_МwE0уШјІНЕ‘NoјLiЄћKiђ%uGЇZпєўs{W/•ШJњін^[^]БЄгЩ.5 [–$ДкBqц „—"mGзZпєјc{7Џ{gwЦЋk_oДnјсuЏ=&І УGYѕЈљVxоКcŸ5}ѓ`џшШОѕJˆ+,ичлfліЎъєєЛJ’tяЫNЦ_aѕпОѕѕЮqЦIAьЉ­^ˆ*xжШF АœЁ>žKНQуќЃћ[єsќѕŒl§эЫЧwЬиocЭёЃъYЌJ]ОA‰јЕšј ЃŽо=fOЏљm№ E‡S,\Œ†ќSТЫFXљzy УGYѕЈ`Ѕtч%Wщгух2EŠ”mмЇ•+$ъ ў8™зџНхнКAйВк•жљwzбM]МzЇоUДGЮ?УЃ,Žж8”ы>У‡Х6}ЕRiOЏВUЧюyaмІy]ЫZnтЅКjшЌAйsЧ}н(„PЙ6Еn~гNЄгуTБ№ВжО^ž2Ц№Qж=Њ€ТۘёяКaЏМ IR‰ЊЏ _Ÿ!DцйяFЕ{Б„$I%ЊЖБ>ё™—™”ŸК|}Џ–Fџq9]ЏП}aєвS%ъ{чЃќъ‘Ч)WЧѓЬ†] :щ Mві7‹ aИ}jkє)ЉfйBT~…S-Ъ4ѓ˜ #fЌ</›чЧљЧ2`mєgЃпj;Гє„ХŸt№жХ­љxФЏ};ЏЬЧѕ†zЮбL|е#љЇqЏ‡&Я>Вј•ЂrGњŒŒiG…§oЪЦУWВ„SщњнFOŸмЗzБќ\Ю}pj˜!96тэaqЁ;WJBЁOŠъиySуo–ŽiцY˜оѕ˜WPŒ`-d.hРГ0ъЎ]Ns-хЅІ ’Њ ЊQиКЇЩQШKwzХŒИ–гuЋVLб $j_ˆК8o‡TЃQЈTvŽ.^>Х­јЌ_хZkРќ=ц?яуиyŒљѓоmя˜ПBžїQ–R˜.6Jњ‹[‡ПR^’Jзщ9ѕЗ9­Џв~ьлАяi2Gљež=|­|sџЫЋдеGЮэvш­ъeМJПиуЗŽ‘aVйЄzyЭŠVзБб-0†‰]O#-”о4%ЏBаNAф9\"яcИ"Ѕl™WџIѓэнмЧеЫЗпœ(—w{…8ЎXвIюЈ |Ekѕl]ЇішmŸе/rocЊ&ЈFЄ|1Y?F @ъђu<vMэоZК—СК§Яі“хzUsWЋм;—ћ4њtК&А?љIЕфИБI `͘BЈlъђ JФЏеФg…pєю1{zЭoƒ-:œb;0(œ}ЙЮcšэ›Ј—;’Т„Q(“пл#ъџ6zебkзџў.<АыќэЪT—тзkўIен<ѕ§†‹зАц…і )"C^ЉRB’$ЉdеVя-;q;zh@aGKйдUCg Ъž;юћыF!„ЪЕСЈuѓ›žиp"ўэЖтк_Ђъљ€gИЃKн‰{ЗМыs‘Ѕ[`LЂ-іц1|Ѓ P‡В=k>v™шWКДЇШєо“њT,V}иœй_7ї.ѕBГ]ШЌџНdН ,퉙ƒІ&ї\qєТЕk/ю8БџЌ2хŽ `qђL!4yMfсЂl'5ЙсЗћnЛжu`@”|СВNЮ/†Ы…uc …КBзщ?w~џІтMF­%W@ІЄ;(ЙJŸ/—)ЂЂlу>§ЋЬ\•ЈUо1Ÿн  я(фdыeТOkšЂБ;НŸЫNй0 щ•Qы5(nzЛоŸяя0Џi‹Чрр^жхFќеLсuoбAн…уW]ЪК[рKLЊ&ЈFdhœeSW9ьЫuгЌнјшФяњ˜ѕ™ъ.гVшру+:њ}sшŸнпDl/вgкьХэЭyTSS—oP"~­&>ЈOegGяГЇ't t§“иŽсЌX2QЉ‹—(ЎVЩЌЏœчФЌB‘к§Лн›9'{š-šз(UФХIot+х*Ы7t—zЃЦљGїЖшчјыйњл—я˜1АпЦšуGеs‘# rЉ;qя–ГWn1‰&ЯІГіjЁrPўлИќПW&~=Шњв1ъЊЁГeЯї§uЃBхк`дКљMOl8‘nђОB1\€5Ѓ @є—ПџшƒиvпЌ­.O.ЭЁ\їљФЇУ‡О–&„ЪНR‹оу6}кЉ,пaLЮ`ял­g=Щ*ЫьЄ†#7ќvпmзZЂ ˆ2у!­yИ+ЦП9ЫйTG,ѕеnЊ#wЪГНЅXъkЗНЅмq(/›чЗЕ‘XъЋнкHю8А*йWя3пы‹5Ÿ6•я{КЪЅrЏЖ>ЋеjЕк‰ОћЂSEГ'гŒК[:у§O†Œ” й|Iељ˜Ё'кЃMы%I’фkОf* P’Ћ’dОuU’Mѕ@K}э„Т($Iі@eЩ]2#“^6Я/g Г3фŽ+’}icи4— kG7vГЙ™їi{оыўCч…_МQ^-ŒЗN}7щƒЯЮ лћm[Ы7У27ЗР­Vю ЌУШ­$АДж№VВЉŽF!TBЋЅ№эл[ ]ВP{эaFцaМlžпжF";Cи;Ыљ—Њ ђŽ"ж;(:IŽ>тЗ­иђћОЭоГ„тЅˆ#{›ЗИ’ИЕŒљзрnНŽ…uзЏњleъk/žлк’‚TMŸрŸѓXG/ дд‡ЪКМ'rќWЫПџупz!„“Ї“§УЧНлШгzZ;1\€ЭА™Я!шxHH’dЙ6 {}Зм(XЧCrG`§:ќ.w”ьЕnЏoЙaГg­ŽЅ[}ДОЦОiЌ,9-v}ћ’ЮN­еГuкЃЗ}VџОЅS5A5"M| Ќјy=њ­oљуђх=дЦєфЄЃ;fы,vЧ ЊрhтЃ™ Уи j:X“ЙЧцFŒHЩL1ёуІj‚юД5ђЊђЦ{._XлЛŠЇХ›й—ы<ІйО‰б‰z3(упНIў„uoXбЋˆЃНSб~{4м?~зi+ъНРp6ƒ ,жЄНOћˆƒЭ66 Џ\%иd+{сл.u'юнђр&ЗИФ@ЦЙRsя“3ОZыћоk5ЪЙ;‰Ь”KџXЗ*ЁBлJVе{сlXЌ‰ЗЋwdѓШШц‘бЇЂƒb‚b/Цšъ‘Г.я™1$А^Џœ:Ќ’•vќpўязГMѕјЪтш7xuTЇQ!K{yxx•і шѓMќk‹ЂVbBмЃ.@nT`А>eb‚bЂOE‡ю (`‚GДН&GŽeZXиj„мaX †  ,№I2Ш`›<žОЫ”gtiЁ”Џ§F>uфg"ІyжбiбЯJn“ЃѕнzЉ„Bф69Zйhнщ K&Ає7ы4hХЩbУ–EmZмNcњщЕ“жјŒљИQQг'UT!ј|Ч)‹Ї…дqЗоЉ9 `+H`€{ДZNЪɘЌћRžЙ*э€ќ=ўSE‘OЯѕЌЃOEGŸŠNК™\%8т@ФѓЦЂ&GКcГ?нљв‚#ЋѕŸt˜ИЕПцmЏ‹лПЗХk№ЄЎ&LЧф(ZџнцgЦЖыR?ь‹Q^tЕЦO† Аќ›`MR2S"FдќЖfєЉшр*СG{ Џn‚ЧUH“#нХcк A>О-:њнŽџgї7aг’ЇЭ~ЏЁ‡НЩЅrЎаёЫ-›ТЪю mжЌЧШ™п§~ъršЮЊz~1\€Э  €5™{lnRZвЊ6Ћjxж0э#+ЃЩ‘1лhЏv*Ё6ќЗqљЫОљКždЮТЧRM‡Ьћё­г?­[Бт“юўuЉЮЊS›^w3уMŠсl ,жФ4ѕVљ”Њ Њ(G†Т`ял­Їyг1wиЙVnеbЋў-p,saИ€Т(IJlАwn#ГXяЛЭЂ“LšGs ŒI 4нУЩ‡сlƒl Ќќ.ƒbЕђ~‚Sђиžп†š@с–ЊщPщэ‹oF,ўІMW;!„ёкц^V4˜5ьeѓ/ќ–ЊщрќГёб_„šћаїs ŒбЪёјu+-гЩЕЈЃJ†ƒ?;† Ађ$Аl!ec Я0-Ѓsе7ЋьиѓFфšАКХT*Яз&Z8tnрО№еf>vбZ=[зЉ=zлgѕ‹м똌 Њiц+CкЮђM–Д> `qЌB@1ьЄzƒ­ъzр§їзžЭBхR9ЈЇп•?’tц?Д}ЙЮcšэ›Ј7џБ” U$нЧ;86%6и[’Є MЊмБ)УШX–РДA ПTъJ}/ЪђAњWŸwѕˆн‘рZЅ„“%ŽьRwто-n*ФŠ6™8s№”ЭЩu„ПпЖЂKšœэъ­УШ–%Ў @UЄк€YуЇ yЇк‡‰іењЮлPгYю {Љюлб]NЧܘа-Њtаъ6RyіŒ.@n$А(ƒkЋЅћ_vuBaчб$lЭ‘0™#*єTE+wЛЌэх_–L—A5бS0\€ŒH`YШ§Г)Шђ R{•~іVэ…~Ёsѓq*еtPфоAЖб­ўљ1\€,фH`o§НzќЈ)ЋўяІn•^}kьдOКT|bMpЊеO0&iЫxєЬгЮE}Ž’$iЕ…џ‰€Аќ*„йз…MHj5uЯ—Џ^<ѕ§јZ?Й&‰ ФШ‹Х+А2ЯЌž~ИљьпџзRR !JVы0ўћBˆфMAЭжО1Ш1ђГЭ йњoй;5 ˜6vRЏwІў~ЃtЫпОeДtЄ pLœ,† А^O`щі_ёэRл]ѕp NЊk?oЪˆж$ЭЗл7Њ]иДИ]НЕФaєЏgп)ujQПщ–Ž”Œ‰“’ч\ZF А–ŸBЈRЉ йЃBЄj‚ЄAš4aTWып? Ќ‹sщ†­Ы^ќы\jТяWЊМнщEWЕgнюoUwБxЄ€uаŸ[Tв3H“šз/яuп9їЮs7Ьт ,чŠЅЖў™lBИЦhЕкЄшw!„*Ч"N*!„АsАBЃС`0Bу”€‡ЕћОYyЫеё1ПЮ9ыжjЕкыџЌшYЗзрњE-ЯЯт ,GŸnУ_ўуяNнЏеeнО|L3ё •‡ЫЃЈНы•ˆџvлщ›КыО]q<Ув‘ж@w|СœЬўўj!„Щ›‚^ ^0ѓк%$ЩЃЮ№идЛ‚ѕж‡}эўy`I{йbU–TMѕh`,?…аОTЧљ1ŸWо7ВЙoЉeЋП1ёЏ#ОlёшU ЧЪ!“zЄŒoјBЉFŸнxЕžЄЪ6X8ЂЅgю™}noйw5I—NЎnЖ;lZœN!„сњЎё3УЦЕіДќWž—Х›И !TEЋіšВЕз”ЗЦ$цўшvччж_юNќ2wуј‘–‹А FэОЉk§ТVћ:эЙЗ-ЗЗЌJ4l]іт‚s:QS-2OEEФwYаЖЄІЏR5|‚ЮЃ-I@Јхƒœ~~…AкўYЫї~гЊЌф›ь§ъђK†GzЫ !2т–Ќw~Ћ{%'c•UбZ=[зКы‚і~wЛё`Емк~w§n.& :щЇЗKчu†Џ;ГcŸ}ѓЦ%lЗљ•}ЙЮcšэ›Ј—;Р3‘c !KЪ<єšд­„Эж_ !„Kн‰{З<ИЩэО6&eSiЕZЙc“$ЩПьицГ~Œ`-˜BE#E#E#E#E#E#E#E#E#E#ESiЕZЙc#„сuУй‡}и‡}и‡}lpРѓ“JљйM;@ўЏ?&”Яg- н6 `е‘Р‡)„P4XP4ЙРEŒ 1˜Cž}ŽlЁЅбЃOмžѕ3cИЋC @сaГi›}тЯ†сЌMм6wыkl*OqU‘M=ёgУpж…ЭMм#FXр((”X…ŠЦB(XP4XP4XP4XPДB—РЪŽ›АёЗВsoн\ИaB\ЖМ1рйК–}•Ю/$ЏNʘ-„њѓ‰kRЪwЎb/wT<(т`„м!VЃа%А„КJЅVкгšѓ! ч4ё)­+UМ‘0Ђљ2IZXЎёО ‡џЛћѓw r €Їq;гSK]Zы†oЛйџ]БmmV›щЎЇgюкYЛUќ/x9dЛ~BюЯrЧ АeсuУхА…ЏK{џ.хгж$ФЧџЗіVљ.ўтв ]Й^^Bˆьћ~€5АDЫтm>дU§Zп>Нpa|z›JUеі%Ћ:&ўpхВ^qџЯА…БKuёnm2ЃgЖщZ\-ьk~аЈЭ‘§Н–yљчS]яўМgэYz`(žJЋеЪ№X…Г … ,( ,(šƒм˜’ДPzцћjа @‰lЅ‰Л$I6ђL І ƒˆƒr‡X XP4І@бЈР€ЂY"E›<3*А hєР€ЂQE#EГ‰)„[‰ь aя,:ќ.w(( ЙА„ьŒмџK’AюX2аjЉ8Ќ˜M$Аьs+Ај6ˆЋ€ЕГ‰„N‡пEпѓЪq0BюЋa ,X/›hт.„$ѓР6ёX;Nш h–H`бцЯŒ ,(=А…€Еу„ŠF ŠF ŠF ŠF ŠF DŒ;РjР€ЂЉДZ­м1X‚$ДZВu`‹јЌ'єP4K$АhѓиŠTMtOЉjэFo>—% к§г{е-#I’g•зFoН•ЛЗ>љаъБЋIžAšTYУ(XLЪ= :IЋеjo\IќuВПfдФ§зLЉњ`GќХЄ?ПЊДuфЄЗ…BЄХŽ8р?4МQ1™C(œƒŽ^7мG (*;;aаэеŽEъ|ўЧQЃ“ГƒJЙaБWgBскbцš"UГNцHJg‰’ь- сфQЖ\Љђ5пš=ЅО‹АЮBЁПЄ™ДР)dоЫEх`UH`0)ї€шЃ*oњxcЅБ#ŠпЅlМubЩаЁЛЬ[7ИІ‹œёЌ=А˜šJ]Йї‡~›>_6З]Л1эРдž!{›EF ЎYL%opыC €8”ыою№ЇГп2 Уеэ#оћЕуЪ§ќ]Ш^ ŽГАѓj=fаэˆё;ЎЄќ5o§Щн#ъ•’r4šu&K!R5A’$yЧІФ{K’ЄI•;h€"ЉДZ­м1X‚$ДZВu`‹”љq0BоUz#FˆЇ­Ь>ьУ>ьУ>ь A PШ)ѓ#@іOХЇхPм =Ж€я@ўQ(фјЌ%NшsfVЯ€+вP4І(iЁdљƒjиФ;ЬФ6?hЛ €ТФAюX Ї“dI™”УцЎH` (П@aB ŠF ŠF,Xэ-….YЈ=ФыЛхX ,™I’AюЌЦR_;!„.™AГ ЧўfŠЃИC’зЧ=йЂqрilpБПgЦ*@ў‘Р’пїђщn–і0#f]gP–5ЕZ‹Ў{ˆgCr€B†Ы-”ƒDЌЦыЛEпѓ…ъћ@vм„oЌИ•{ыц’Р тrnej‚–i2яьљаM H`€чc_Ѕѓ ЩЋ“.f !„ў|тš”ђЋиЫрЙЊЫ-Ќœ%X#,p u•J­ДЇ5ч BЮiтSZWЊpёTџZ‹KжнyЭ(„ШLxр&P0T`€чЅ–КДж­нvSŸusлкЌ6]\OЮ>pрЕvЧb*Е!В>p( K$АЈ;РТ,]ўlяпЅ|кš„јјџжо*пХ_\‹Я*лдЃdЉЭ|э…0"ПшсчЄн?sШЩлЯЄл—|љнЉK?яPжQю|RiЕ6ё]T’ Z­~)60ebИ%SьПPХ`bїXњГбoЕYzТтO:xытж|<тЧзО]XeV“‰УжЯьс›КctPИнтƒs‘;f ЈР pб^1#ЎхДEнЊB4‰к"„Ÿџqдшфь Х_nXFьеQ ыСi —ЬГ‡Џ•oю_єЁЭіjg•њKšI œB†Нќ№ях"€ ,НJ А-*•0 yTXoX<Аїъъѓж…еtБ|\РГb !xvЯГ,)‹B€ТEŒАќЊ 0 uљ:ž ;ŽІvo-ЉюлlL;05ј§ИЮKЃњњЛЈ{o@H` ƒBѓ}р I(I’ld­ЧЩяэѕ[…^Е|Rз*ЊџЖOБЊТЌUџёоЏW­юWI-w€@A1…€ ДћЇїЊ[F’$Я*Џоz!+U$н/Hs^фЄI•;RЫєfт“xч†КBзщ?w~пЏ_п’Lq4ЌXLЧЙЮч]ўNM/7Ÿ—–ЗяЎЫЋПА>ьkЧ№ЯKкчl0$яжЈљј§ЉЌм x K$А(ПlGоыђЎя?г1l\kЯмї§Х-Ѓ>Й:tХG нh ˜Ћ 0Ё‰;3о:Бdша] ц­œЛ.oцЉЈˆј. к–ЬM_e%Ў|‚УЈНМeŒ`-˜BР”ŒiІі йл,2jpЭbЙХUqKж;ПеН’гє)ЗЫ{Ц-ћў‚^Ў0Тђg&$А˜Žсъія§кqх‚~ў.wЇъЮьиgпМq ћЛЛЙд ўСŽј‹I~UiыШIn !„QЛя›•З\i’J~-)=А˜Ž[žыђЖљіt›ћіЙГВoёћ[,2РTдU*ЕвўЂ9я?а[œгФЇДЈpёTџ7cc}{;…™ Їпwг‚ КдLgя оj{•(UЏпЂŸћхўЦ˜ќsдŸ•о]п;КгтŸЎvuЮнЎrrЏ№ЪШЙGŽ^п3МЊ“Ў-fЎi!R5ыrіШ8ѓ—gяѕЭJuђшлЫГћЖŒS?џуЈбЩйA%ŠПмАŒиЋ3 !tЧЬЩ щя?reŸГUS№kIyЈР@Ќ€ѕRK]ZыжnЛЉЯКЙmmV›.Ў'g8№ZЛc1•ZƒйGИiIE›X/цЭЊuкО5ь‹ЈэqзюLю3\љ)ъˆpгŠMоzщФ’]ЕђPЙОдкчњЁГКМSŸœxгНЂЇ“ТЩЋ’{ZbВ>ХЧѕчжO>8ЂЅ'Y†QюkIyxiглкH,ѕеnm$w–ЕНЅиT[lo)w`"\ny,{џ.хгж$ФЧџЗіVљ.ўтZ|VйІ%K•hцk/„сС›хTЁз‚?ЯќЙ|T?нягК6~gы5ƒ"ћвQЧ_ nтaябј­šЇ—lh=%ЃAoPййЉђ~а<7oX<Аїъъѓж…еt1jїM]ыжЫз)Џ]ёЪ}-)SAЁ_%0;#їџ’dC— —њк !tЩЖѕЌё­–+Ф€-PWѕk}{яТ…"НMѓЊjЛєrі~НqЕ‘~o‚A•єРMЫ2шnыеejЖъQГUA! кДџdЋШWЗ.њэЪ‘пќŠчюuaыљQїнЩxуРЖФ2M+ЈѓzDGЯ ni ЩYТУ1ѓъi­[E/GaL;05ј§ИЮKЃњњЛЈ„Hн?kљоŸ–”§F!DЌїЋ3џоѕv›ЯИф‹r_KJC ˜žНГШЮіЮЖѕe~{KЁKjЁ=lCЯї#w‰BІа_nyътнкdƘ#олS\-ьыŒhаАЧі—vњє-я`gtx№І%УвћМi‡§Н–ЭдИЌ}rмЎ=ь}]ьГО[–д2ъдњ.%э„0\нмГaФж+B!Œ™кџ~_ўПпъ5е'ЯўыЮўнšs4И_‰ƒѓWЅ4™эяtuћя§кqеъ~•rS^nmПЛЎBˆTMPШаȘ@7 =уB@ЁЏ%хQiЕv\6БˆƒВПёI’A™'аŠ L™.@Щћ/TБzЖ9ђ’$Yрф Še›/{JbМy4*ьS6Кœ%JжюЙ_Mзœ_Їj‚Мƒcя=fРŠПоџ5є‹ўИсйhаЌхул8џ№†oЏ}ї2іU?;јѓаŠŽЙї%ѓ %3ХІL  dЧЊиР =лyX6Ю6_іX€%>_eЯ^3Љє­ IDAT`khЛ €Т„ DP4šИPQў €ЩI ЅgОЏvЬё^NE жХC[ќ‡ ж‰7m@ЁђфЌmQ Ox9ёZЪS hT`<Ѓ<ŠџЇф=#Р6K§L…2ˆ8A›ЊТ!?™ЉчirСB(0cЦПы†Нђ‚$I%ЊО6|M|†B}ђЁеc;V“<ƒ4Љїя­?З"ЈфУdжПГIwљљѕЖeУJq0Bю  ,(§йе};L5§сЬЅsGWєH™ѓЩц йBЄХŽ8р?4МQБі6jї}Гђ–ЋЃRƒ4Є'‹к\еjЕZ­6an“"Žд†Q~ф ,РЌsIе•­?љdцн_gХЯlђB‡‡Krђ.™ТшNЏ˜зrъчнЊy8+г $j_tВіBИƘЙцыwx=81[w|СœЬўўjЅiИ•Ќsі(joйј€uрr хАD‹КSиœGъ\T†ыПl>~grVЦЉ˜/шКЯcJf 4™g_+пмПh~іеŸ[?љPрˆ–ž–ОVџ Ггoм86#А‚$IЅjїœўgŠСќб@AQ˜С#u.FuљЊgзџЎ5 !Dк UЫЋмхq%3P•J угw4jїM]ыжЫзЩќA=,пA:–iеo№аШп.\:rkЦр'tц ШЋRwŠg“ЯЕЩ­darзZЭгжьКвЂk‰ы{зІ4kшінё~Ÿyі№ЕђнђWз9ЉЫзёLиq4Е{kIѕф=гіЯZОїЇ%eПBы§ъЬПwН]Ц"YЩќЉічгs~Ќмзџ›шѓ™ЂК…'<Тv™шWКДЇШєо“њTtМ“МѓŽM‰ і–$)шс&§Ъ Rчпwи+ёc”+эїцЪ’Ѓц Њ,У„G˜EЁ*ПКџЫ2‡ѓ”ъ„,І$а-0&1аa=(пAЖД§ф$‹…л2EюžYбњя6?3Ж]—њa_ŒъєЂ+зћOcЬЮ§П$YшњЧR_;!„.йrG|NZ-ЈŠ”гŽyкЂnеŠ !„Dэ "}ВЮЙ’Т+'˜AЊ&Ш;8V!DЌЗ$Ф‹ем<…АѓjжЅьиЕ]ЯЋ-‘Cй‹5іЃпє{џІCщНЧЭюSбГW)БСо’NeЫ•*_ѓ­йSъЛ{с,„њKšI œBцН\T!ьеyl`ыR5|‚Ю#ЃjЩ0TЮ:~ЙЅэ/‹> m6­d›=ЛДkђ’—ЋZYЇqхPй cЖPй[.MГНЅа% Е‡аЖ‚ФЕdйlQžэ˜я,Vўў™ЕoЛ1 чаР]із ,Р WŒужsлЉžB!ђ,ЩЩЋdЦъИDнPyгЧ+Pќю{œёж‰%C‡юj0oнрš.OмРІ­еГuкЃЗ}VџОBѕTMPHЫЧтXЊщy?ОuњЇu+V|в§УП.еYujгыnІ;@Њ&ЈB№љŽSO Љ#џ9!рЙМy@H’Є}\IОМО[H’Є=lE}ЁLwW0ПЏаТБLЋ~ƒ[ЗэпЕЖуё…§ЛžбњзOd_ы‰Г%ІІRWю§ЁпІЯзŸЭmnL;0ЕgШоf‘QƒkЛѓЎ˜чFРvDŒ;EВ/зyLГ}ЃѕrG’ЫЮЕrЋў—ўp81љ’IГW9юЬUЗся4ЎLЫЛГ‚љ№jџw>§јэFe‹8—ЈмзџЦ‘ѓ™rХw ,fрPЎSxЛУŸЮ:|Ы( WЗxязŽ+єѓwЙ›ЈЪs#сRwто-яњм_#ю“hђфбуXђp9s7…•нкЌY‘3Пћ§дх4]ЖEŽ OЧх №Ыsѓ›J\Ќœ,*ыђžCыU№ЪYŒГdЅ†?œџћuЮд !;ЏжcнŽПуJЪ_ѓжŸм=Ђ^Љм5XЭ:“%nцЕА%…j•@[`д]ЛtЭLЫMфЬUќyщРЏmўЄћЫ>>]ЖЫЙŒ)А)y­`^L‰‹•Ћ,9GWF’dPц’Š Ь,ВтgЕiГЖQФз[е(яЁ6І''н1{иИПћэŽTс‘†хвBI;р)ЏЯќь˜Pž/9Ћ~š№)і MБY5iЁdТGЛџѕ–uyOфјЏ–џЧП7єB'Oџ&њ‡{З‘ЇХЈы/nе#tёбЌ эFFЮжИИ]nЎаИ‡+Гђљ%янѓ˜АjМсЖЬТ=Аd9т3уэБ@Ќш/kI–xQwŠ\џюMђџ Ќ{УŠ^EэьŠ–№kмћЃсўёЛNg˜сpFн­Џ•2R2LгaDŸ|hѕиŽе$Я R.’’љЊ{н$IђЌмrшЗџъфШкd&DПUЁЄ)џ Бcc/ЦцwoCђО‰эЋzJ’GѕОkЮ=ЖљO>w{Ю`žЮєУЋ^/< L€v€і9џЋсYуЫЦ_о{мЌјy=њ­w'ђЧ“Ў&_ПrўјŽщ]Х’^С‹ўГX™fЦбi*M?|іитЖџ|24ъdКy Џrч*Кšяг XЛ‡OМгі є-aЃчсd@aAЮ•š{Ÿœёек?odш }ЦsЧ\Й*ЁТЋ•œЭpИД=яНЖхЌN!ŒЗNmиxао›&yфиёќ‡†7*fŠG3‰Œ#SB—Е+сђ…#Гыьљhтo&yІЖуі‰нщ ќLКbФ‚фюBzeдКvŸќєѓ§ЗŸoЗччЩЬ0\А:сuУS2SЖ%l{ž‰8сюф>Єњ{›,|Љ#O™WџIѓmпмЧеЋNП9QAБ!!Ыޘiђ цќД˜PЊ&ШSЊВ№PŠх.2d]ўщ›mkљxJ’$I^Оuк†DФœЩ0пg”чЁoу;.лYЌ*]a,‘РЂЭr9њ ^ещFTH@Хв^^Ѕ§њ|џкЂш•™?hn-#Fz,южы‹ѕпNьќrаœєрХs[›dš†k‹™kО~Ї—УгwЕч:_Œ[дГЊdoШвœ<}Š›cH Б"ЕћwЋќИО„вBщюїп|ђCЦ^Œ­сY#Пи{дlбМFЉ".NzЃ[)зЧ}&хsЗGд№Ќ‘Ÿ Ќќ>Э'ТхЯ‘Э#Cї†ІdІ<лнуЎЧЭ›й<ђ­Од‘'uљ%тзjт3ŒB8zї˜=НцЗСƒ6зѓ}ZLЫТKЧfYмВhзo[&tь0цлM F6ПњХ›ЁšЋъкŽOМ зпщдАЂ­žˆ+ш 8lc™V#ЖaЉЃ•nѕбњћІ АВфДиѕэKъDЕЪоA•Њ ђŽuЎОmsM[}S3‡ћ;зфГпMNіЪнЩН@в_ўўЃbл}ГЖњџ|љмэ~юNю99Ќ€2OиэюSГъЎ^А˜ž5‚ЋљmЬУIЈќ нњeу/Н]Ниъш7xuTц'“C'Ѕ…іRХFэCЬuЉ#OъЊЁГ…|8юћРеНT*зЃжЭњАџжєВц9žm}Z€ЫY:Жэ/‹> m6­d›=ЛДkђ’—ЋкЖyэ?іЅ\ iЇ^r(^„KЖ)ћТЎE[U+*wВЁ –”зКNi?іmhъ5˜мcф^ВСДыsхщС™ЌДЋ)ž^.NžЕЛіЎ0yх™ŒЭДаЉžкЃЌЎ(щfRц !В/m ›ц2aэшЦnЊчп-/5Ÿ{ь…ињR?е­C+ЖќОoГї,!„x)тШоС>yН?чsЗМд№Ј}::Ÿ;?хiц{И`MR5|‚ЮЃ6 є‰їkял>њttФСˆ|ж|ЅdІ„ю l™їлœUEDўИМFyЕ1=9щшŽйУz‹н1ƒ*XhЁўтцa­8YЌqиВшБM‹л aL?НvвŸ172їUOЃюкх4зR^jЫ}^ђС-0&1аВ‡Д“_sdј§›к,мйЦВA@fžxoNжŠTMPШа§6—НL!„EYl]'sї;Ь™єс›ь­ŒЙЮЕFЬъ{ћЫWМKUh9н8`цћешU n19Г•Д&KЧИЋ вЫэѕ-ЙѓЅДZэ/MKхsЗЧФ“Ђ{Цfл„aњс‚ќŠжъйКЮа]ДїKŠШЧ 9ВyфмИЙqзуђsœˆ5О-:њнŽџgї7aг’ЇЭ~ЏЁ‡‰'1о)L>{lqл>u2…бƒ/ЙА uеаYƒВчŽћўКQ‘ГЎSгNЄ›zš§!ЗИыqыe~5•h ѕэ-ХІкb{KЙу0'[xŽJАНЅXъkЧ8лВž5†дК7яžялЖХ] ЏWРД]кЮ5zьД|CЈœ‡їzц0uЧC‹&РГ*|—[X/KT`хe"vВЎыdj’єФЅёІШ€B$?ѕA–њк !tЩB’Ктяёић˜џЉ=ъёOж<ЯёЎчxВљ]ьSЬ~kќ;2…tg]ЇењO:Lмк_ѓЖзХэ_Žлт5xRWgЏ2ЂwЖё’wя9s[ў22lёЁЮОЏ œжЄИЉЪЕOќzc’'Oл[ ]ВP{эс‡цБ.ЫЉРѓ<йgxŽ•ч˜фї#a€ЉЂxКЧ§эђъгтМ;ЮАZYџEѕь0M1kЧТІнГЏžиЕфгmzниЛОПoўлOE6 нP6рў\Uшоа!5†–ўŠnСѓ:ЙŽ(ЫweВЦа]VњwДФBЪЏЫ‚ы:ЭўтїЦЫŽœhœдkмљ>šЄЫџэj˜џўЬ:гЩъНО[єM0МО[ю8ЬЩžЃ0ЮJSрЖЛК“Kч%vŒšџAkџ.ŽNХЪжю8vхђŽџЮ˜—Q€‡ (P& тРНЃGŸŠNJKЪяЩ€НTїэˆшх#Ћœа­ћшЎ|QDBєР‚%Yl]Їыџођnн lйFэJы|‚;НшІ.^НSя*к#чŸ#•ЂеоџŸщТE!ЄР%џИ0"”Ew!ю†їЋU‹нЗIхњR+Ÿ”у—3 іH_6ў2њTtЮ?ЄДЄ1П‰lY GP­мaьВГпИНnQ\ Ё@ 21ѓКNхъxžйА+A'НЁIкўfq! ЗOm>%е,KwX„Л“{JfŠмQ< %3хщэ‡PˆМќ9;3лЮщЁжv*ЃСXРrwrЯ™H(юL|ЖфЉSЉІƒ"їžПМ•љƒ ЫВаКNеоŸо7ѕыБ?оI шЯ­1+ЃџŒЁ/‘Р‚ЅЄш–РвЅИЋI`с‰xg–$)чэњYЉНo{w'їЎпwMЩLЁ“ а2Є]1Њc_I’ЄвU_щ=сЛSЗ zхЇВЮ­ Љщ)•o9nїпš1mќ<$ЉL§wПeЦcТ|Ву&l|cХ­ьм[7—n˜—Ў Z(I %i‘_ѓ=‹ŽfEц#[lMмaA\зЩ#`lЬŸїn;x‡Фќb‘CпcЅёђЃ?5S (—їаBlђŠKf !žЈ€oбљШЯžїк цЕ ЁBЈЂiхPгЌRК“ 'Чж[rфуєOzt[чеMќж ƒЛНПМЭC*˜х0'ћ*_Ht1јХь…ў|тš”ђSЊиŸNбНЖЖчџ:іNПпќj$ођJ3л<'"˜E~жЄˆ8q "М^Иu•'Xѕrу]Ь{[т6ЙЃx@мѕИі> JЈСкхч­@Z(јус›ыоul@БЧо фЎВцƒ&9QekwЛВФ•ЦЁѓу‚ПЌыlŽ#^8І­аЋ‰wEc{њіЎусlWМG?ПщыOgР2!§Х-#:ZіЗSƒсЋз}мФ\o„PWЉдJћ‹цМџ@oqNŸв: ŠZœBЁrrzЁAЅ7œЗ­>žє№}ГЦfЩхd&DїѕCэœј˜РЂзїLь=pіяWœЊv›ДdFП‹( +)SyЄdІDŸŠBDŸŠVZГ$ЄйЦfCЊQHІІ’“УRHЮH9‘р.ОфЭpѓŸMSПXsЙоЯWБ‚•c#)I’жB rK‰ і~є2F@ЈEŽ{яац<Ђ rђђ+š№УчъЄўš”vKgІrЇ\ъЊ~­oя]ИPЄЗi^ѕў3Ÿl§… Л„яgеэЏ=ВХЌ!н‘г™дЁк{пmЋЁŒs2X€ rЪЏr2VюNюaJсѕ”ѕUZ<@оnюђMЌQlо§ЩПˆNЂ‰;X'ЈObЙ%Њф;ЂmrЎ9$ЌNћ> Оіš—G73gMдХЛЕЩl1GМЗЇј,Qfl№2Iи•ЈU)|aгEŒлоbоˆюp ŒЙvіЬїу:Пџeч§_е3G[ЗВD‹КSр!9IЋЛ7‡T’г …‰Ђ*ž №$n1785 OYчж  нpЃжаesяќрƒљ^SћН9aYф€—Š*|ЦН5бЇ\•z,;щВІ[7§а*цNмизžдK;щюMЇР˜‡ыЛнb~њЫПnнядЄuЅnvЗгЬй,џhˆЊ<Љš Ÿ MЊBcЦПы†Нђ‚$I%ЊО6|M|††ф_Оъ^їI’<+ЗњэП:™УХГxhТ Л“ћъCDЊ&HКЇTЕvЃ7ŸЫ’1Jф›UЏЬhеСCщFšшqюџd”ЮCюX!эшŠQјzH’$•ЎњJя пКmОXК“ 'Чж[rdЯ ЄQн†z}MќЅ3лоЙ<љ§х |m0!;‡ЌC3;W­№ътrcОhчe;Y“œ9ƒ)БСоA𛙇fuї/[сѕu~УG5TЦbа–јSP~ѕЌєgWїэ0е8є‡3—Ю]б#eЮ'›/м:2%tIБQЛ._82ЛЮž&ўvSю0aBюбIZ­V{уJтЏ“§5Ѓ&юЯsЙн‰I-К)ѕЛœ>љаъБЋIžЙп6ѕЗ†Е№•$ЏЪ­FЦ\дѓEА V9РЬВў‹ъйс‹ѓ-ПмёЯХЋWЮќvxЕƒamz-1[6Iwс˜ЖBћ&о[Жїа–ялЛŽ‡ГG§ќ’vŸЮ0г!m’]ё€ ЛЯiЕзŽ,{Ч/ЭŸ25A %iЁ$-ђkОgбб,Eєёзпо>fK%iЁTqѓищљЈЁr Œбцˆ ”<[LмyFЋе&џН6є%ѓG›єРR0нщ3тZN[д­Z1!DƒЈ}!BёХС8ЃНƒўц НСЩгЇИ2–0›]кIeg' zЃНкбpaЫШОЃ–џqI'„[е.Ÿ.RцЧЮMІТће™яь–В|hП‰џж:Ux§ЃЈязu•Йx8-v|ФzCУZ+„Ц”}ќЉaдЩmеџ™д~аИ}ЏL“7>Ъ–Њщрќsg}ДЇ(Œюфвy‰Ѓж|а$Ї:ЅlэŽcW–Ив8t~\№—uЭ2я,[—эPФIЅХœьеn.vB•ГЋЃ>]Џˆ„‰ms ˆюЕЕЕ8џзБwњ§цџг+Эфnн™Мѓ—vxЭћћѕ—тўhџў/ЭїЗn[\цž ,Ы<{јZљnўEкЌВwPх”і9з пЖЙІ2–0[\к)wU'ВхJ•Џљжь)ѕ]KкOљс)B3Џџёu`№чПїXД:: Fdh\L`‘Фљ}чиј!ЁC™ЋлТК _ќњЮџљЩ›гtm1sM ‘ЊY—s3уTЬ_žНз7+]дЩЃo/ЯюлўIo%„ТМ{Dрї[?mшЦ„}РєЌЕќЙh­ž­ыдНэГњїѕ'Mееˆ”/&ђЂЛwУћэЊїЯ­RЙОдЪ'eбхL!аёЇrrzЁAЅ7œЗ­>ЎoжXоt‹ўяЭWЫМл№е2Ž%j (Гщo}л&VžВйœжHЅFƒ!Џ\К[рж+џў4AZ:|Q|ІХуBОДћЇїЊ[F’$Я*Џоz!_…Фюб‰—џœёЮ ЛйБ,МeI{ЁПДугNѕ|K/YЉэWџ\зІпПŒkњЉŸПœS IDATџЛцн—НK•ЏзMТёи3J+ж''оtЏшщєію<.ЦќјwššщаЬгЁУ1•RЅB‰”e–•›P6?Зrь’ЃYьЪUlфЌYLумHЙЁШ•TTB5г=гП?:tЊ˜ГљМ_^эЬ3ѓ<ЯwЖfцy>Ячћљ „КІф’ЌB>Bёђ.ЌњэГџёЕђНjmšЄ ‘ЃЁ€Bпе=аёVPTќyu|._‰а(" ЄŒ6{ '"ь$/ †е*Т0ЌњЖјікMEе˜ЬџX,h§™т%(љШгьFTF)Лiђ~tHd ЋџO4ƒl'`Щ0bwЬ+)Х ?ўЊJ>Љ AЧz’ЗЩћ[2Ае*Ÿў1?ЗјJz^іƒmІWnyTоЖqФžоKЬўй|ц}B•?мєП˜ЮЋ.>{ŸџљuИ]у@Ђ2ВTi'теE‘ъˆ5œєЕDQ#№-)CИхЏ‹”Е№в‡ЩP™UY…Њтd+х?ќ#џЏ #˜ЭX>№юŠе‘)_*+ ^œ  N:№Ж$uыШ!ѓЂ_sŠžХžx­eнUJSБъuŠZЃЊuЊ6›џK96гJWd4ШЮ•sк~!FЙы„€бO~пѓЄLˆTєЌЬЛ™˜Q0~цЅ}'ВЊJs 9BœВОВ „+P3wэёfџсџ>WВ_ž˜=ˆКћ•ЌeфЉш˜J2 ЋBмЯoXЄКЪёихнuR^Ю•г ЭсЛOэ˜iЋ[s~]=MržЃ†ўрYž:у^хз+T/нЂѕr4T:ŽBi€DH>œT|mЮ№ёKBЮ%чЗум|† АяввљМмG™з‘ёдОR`)їњЅѓчШ—‰я99w_EИџд0[PT/Y’ €%Ы”ЛL‰`ЎS;@530А˜ZсНezЭ~ЫїЬ*Fб7qњьўЕЗ”X,Vѕ?щь^р‰ЊЪ8„x™[ў&Ь]:Јq53„P‹=ц•t]”г7\љЄдcњoіџИщ[ЮПйћсйE+эg\CN›WkЌ:ћFХ{яІоŒ)= Œ†lЪГtЊAœ/щ;ЈZŒЕ/ЛФHљФЮŽ?Щ2ЮB!5+П?і/(І\ЬчK{€"аТ4IY$GCUа%o’'uВvƒЛnкщж&6уќџ<ћ0Y?Ќљ dkšй7Щы(Іsд)€=9| ­z3Я0m—Ё:цЮД<жgfо№іЮBP"xЩ'ч%М:$•‘E­НC4™’8)ЄўуКNkЮ=[#љqя ,K;ьянvџщ…V­wm№ЋЧiк­;i‡BhрІћ…›jџђ”Е!„а‚ѓY BiN Kš&тџ€ъ!„’(BЧnэячеgC‘ާ‚=ЧwBWBˆh6wлЄуг~Л>,ьgЙЄЫQ/9*ЄŽžL—зЎ аiШк yбQІ[/RБ8}цL/кCЂ8Ж”4L‡ЯX7|ЦZNўгЋgЂ#—8-+щщц=sІїИA]Uс8OŠT†ьхv(ЋгЖOpssЪн>ЎъRO `vkvк Єb5%,yєЇзЏЉюGЭВPSœЏ•б$И“†§†ојZшwЕŸ№‹ƒŽ/­6Кr4T:„‹ішˆБвE{i€ 9љЯяY9e№OЖўW5<ї3ˆ+œ$({{ѓицљЃћйЬ:јJвюЄєЇЬАеSь`ў PкЊэХ™Ђ%?­Hc.BЊZењ4I|ё[˜уЗдмћпIЌ 9*ПВц'†‰1ЬbЩ}щ@шeooŽŠŠОЂlы>}ЦюЄcХ[ЋєЮ– g5™l“[}Бю Y$‰фЖOНи!„Ђžћ… ѕKm†ЪЫЛрщ№IiчГwžІ* Ыг"ќчќvіeйrЦŸ‘;&QHРКПлзїKxНAѓў<Вyl—яžїк4,…a˜Œ4#а”нНb&ЭВсз1/ы ћŒї/oДЉiдWEќJ„WcŒIЌЁ1э љpЩ5тІЋі€l‚+xВ‡DeАXЌь(ВCT6‹ХbP›&  йЗж­МawшeЮѓƒv7VЌПUŒ8ЯџZpЄЫц;яs_FNќw;‡‹Pхг?ц‡т_IЯЫ~АЭєтЪ-ЪЅ№‚€ŽIйШы7Ч[[csј5 ЦоCГ2ББїЄ:*ш€x…ЃзŒяща˜ХUНнcе1іН#Г’kФЭѓЛ–К€d($ІЪЇЪзŒ‡:оg 4кГь€Ѓ‘&9,йыP§<›ЭџЅ ЊЪ8Є5ШЮ%p Х(HП v’ЅЩ„zœуг2яЎаћ ФЇ$i§бџћЧ1!$Ј(DжAЎ-6§БЖjЙXђ‰W˜UJюЁC@tMЩ%Y…хЙЯ?ј1S{icZ=ЧlМёЅњb0žЈЊŒCˆї‘ЙхoТмЅƒ4Є;n@žе$G7Tt:—€xiп}jЧL[нšќ AY!GU[К' X €%Џ'Љ œВw)z 2o­R?КtзsNэ#eiѓНЃћю?НТJMвУ/МœГОƒ 1ƒОЇў;ЛlИ†aњV“Жн-‚ђcШ ~EQбГ]T Ує­Ї†<`УлE,љЄЂcB*Щ,ЌBq?Пa‘zшЊi˜ŽЄкшЋc}нН-ŠŸчqBHXђшЯЉsC-Дъ3Гe‘ќєUGЂ2ВlеёUІюнtЫішЫЇt"}вкГ/eцНЛБBљ џž4Nыk$AХpфь…ўЁws?ОaЬ-лЕpМ=PР’OЊcэЫ.1R>БГуDВ‡ŒГањiќвИ O?•Ѕ;ўZo‘*B‚Я—–/К3ўФпГ-д zВ„žL—іЭс~zЩю>r€Оў€ШиcloLMЋ7mŠiс“‘Ÿ! 9e ” *й•I@Ћˆ3_7УО‹Кjч^Г,ŠžцpЅ=$€јAKNА“М(u}6hЬbЭ!Жіgzѕ1И$mlШяƒ;!M‡ ПЏ{Yt5Б›шПзЯœ€PщУ§g^Ц/ _ГЂ§žŒ*iПFаыEЮЙё8?їо•сЛSчŸГ*‹в.œLзЖюJѕОJn.њeХ…їеiѓeЏcзP/H(ѕ^ј2zЙ…ѓќбŽўч2Ъ*П<ŠŠxc8дфлoЯb&ЭˆЦ,FЈ˜Iгэъ›ЯoДФЭŒšfЂWїїаш. а…PV‘ЈŒ,ъзл,V“'ŒОњ*Ио|ч‘/Пйир9c.6Y€ шx]Б№&эљЖ7З!–|7ІjщџЛу„щНЌ [1™ЙщDёЈua.0M€ІŠ™4ŠWBЁ$ †аааУУnкvЭзА˜№лС= mн’’ЙрPШ—­Ž$˜Ђъ)O‹ЏА5SЛжќ]  €бhKdЊйВDЙЫ„аћBkю]ќЭgџƒ‘kЯXоњkОЯ НП’ЮИщAS5 cdхrKsWєН&lљŽ- №=f/юлџЬv•ЅЊ(†:uы9ЙБAзšП dƒ$ІЪhо)m!ф|љјЅaЙЊSЬЄеж†а5Зѕf~nŒЗЙNuЅбэа”‘‡.ёШиљŠЋ g uxy— ыŽa6SџМ[T]RНфпYvГў-нNHTЋYащёS6Лbhќ6f>Oк#Д‡$ІЪJо)hŽіэы+эz2О%*u@•)Лж2MCžФ9YГЪџаž№yНдФАŸЊќ›ЁЖЛќпл"Bˆ c1dьœ€ѕѓьu`! `иЬ=їi~1СlњђnГBюN@P |ЏИЬ87c7iBБ@@ЁИЬ8ƒ–]’-э РјЉcЧ/ЋщŠУ/=L=Л1•/н1ZЧђaЕњя{Ж+ђ9k ИŸ_•Л9iъкЬоwˆ–4wюб бџ"ЊвїO™}†<3єп—ЙŸ >х<П2 іє:ГšhЂАљ„Хж эпиІКЕп|Юž#яpF BЕиI^”ꆕѕя6Ч/С/ъuд76ЩЏˆŠћI738щЙыSБ€ЫЄЅ1ЙЕН[љ"ѕћђсKП5№v!Ф 1мŒнcЁ`Rƒ7wяVЧG!^Nж)vwwsИ ОЄ_Щ‰ЬYmDьnл9=†™^)DH…2eoˆеIЏŸА"нKхл„l‹Х+&лѕаUWQТ4:› і^ЛЬ"§њ›J‘юа%­+fЊ”‰іН фжз™н *ЉЩнцЄxІ„= ѓK№ka‹Eџо§пMУ§fфЄŒђрщ?šџ[учg.ѕzеkЧPš>фЖX †o_пDїФЄм$ЧXЧд‚TiD47ЩzУЬ $јРLg˘і(Ъ\юtУТЛОuіЩЛКлчrсX ‰V•—U‰ѕЂhэœЕїЯ"~~ѕ›џЁ—p VŠˆНќі,р‡­П\ Dс4mW>04эlZ…HO,TM(/wm‹yUTЩx•Ežџ{"2гd„)єE@фHTFVmT"Ћ.ятyюcžп‰L 3h 6—э}Э›Эe7~˜їтмGђxг!&D =}џЎ3(ЭD_„%ŸЗOM|с9bƒ‚3­ƒџGр+Š&…Acx™{б4HХ@ђˆиDNL\)ЏЊ4.ІЪuЂц›нїЏYLџт“swЈiЬЕЗ‡MшоHLЩЕ)–SЎ‰5J2sж@[)av+Яо=9^З&bЅЄйЯчаЃ‚/Ey–ЋbЖ0ња„ЂCszшjkы˜9Lп™>ъ`д|Sбэ€8‘ фHзH2LcаЧАХy$#еo~ІѓlN:UeЖн_GЕ; 8UЇbЅЄB*’†З˜иНфTfzњЛ˜Вю-аЧ4NзсККЪ!~НлHLхѓ§Пэ^‰АюяœкOУ0Ѓ!>Ÿ—uфшJ1“†еSSУАЋ`ќ(ЩЬY2FХpфђ№Ћ)я‹ЊчЈd&Чэ[ф ѓ !—œбcЅKЮ?КPЇPпООVбV NŸ•Ш†ЪEщм–зCпwэ:]љ`иЇвŽ|d%:РЭ hR"]#њ@*’EьeцRў&<<НТеДЏзK%ыъЇ|BЈўmа!ШЧЇ+7‹q”‘ХEˆ“ЖлїЯ‚™ŒємєXЏМ­ѓB_ѓxLОi кНpЬШЩkO&чБXйQd‡ЈьoUСјQ’™ГкŠ—wопоУЬЦlО]S‘LXёцдКЭїЪФМчb&ЭHlqR q k~bэзhS^ц^szЯљ#љЏ‹”{{t)§чЭэь*NQQфЏзіНnк ЇЎЃЂ3дzNщУ•gJЁ…Gы €Zфfь–т™віTЌ’›ѓ;УQ?„ЈхсЪ=СuЄEDxЋХіЎOџЕа 7”јzRнэ›1я!/H'ч ЋяТuеuћOež7Гз™Цc§gаЃŽ­ь•Мбcђъу Ф8сœЕЊЇцZщ`нзЧП`Кšic˜сР™wьЄ9бт<лћћЕ>?}МMяdаХ|Ф§p)ШяЏ/c§l5Є=6$N>.З№]ˆк5?ПЇЧeCQЏЃ"в"Vї_]oy˜}ЈлчE§шїМќ‰е43МqMjЅќјхМ џ#iРсЇы*~›тqZwЮЉє‹&™с^ПsНъkХ•к‚“їŒe2ЫСШ7лљјUќNњ%ѕщэЕещQN1sЌ‘Wb3Ї*-ЕГ Zcт† XO~єXУ/С/Е 5Х3ЅбЩ2^е1€šVя€Ъ№ЉљЂ2fRЋoЉы^їƒЃPš‡…ЭŠЌNХЪ.ЭvŒuLЪKjіљ‚‚{зv=ˆ’ РkїюU2qиР~.[“п\:ѓЂЂђyФС‚Iл–X‰АQZeЪо­ї}ž$мтЙ>g:3;џн5С_wЇqDЗ—яBаК 4!'_”еЛй\6=™і,Ld[Ќ“ћŒeт6„вУйM›е}–ЗЖЊЖЭ”йfйёo:pвœˆ љB№Kт#КcЌcЈSЈƒсшѓ…,TЬЄY†њн‡шэі †aM !•)Лж2MCžФ9YГЪџаž№yНдDП%m‡5Œџ8e\!B8„2e.ус\A%›+@ЊRIЏЊЧ!*ћћУvЂ^Gy™{љіѕm1§Ъч;7ў_‰€ш•фСBаxsїn…бйy|„тхdbwwяЏFъъ—рч—рЧцВ!яd‡hвŸЙŸ_•Л9iъкЬоwˆ–4wюб QNЌЏфцЂ_V\xЯA!aйыи5дС JХГЏV‘ЂВ›ЖЬўЁяИ€ў‰ю‰!ЧXGz2НI5I1Я\HЉ€h ЂЙщHжfŽ!Сf:лХдМzV‡ƒЁCЂ{"™@ЖŠЖŠЫŒ“ђ0ˆБЛmчєfzЅ!Ъ”Н!V'Н|ТЧмw’3}Ѕv„‡чж3'ƒмбіUxE„ЙtЌ‹"dЙ.Œѕ:JкУ'РRќ‚›П6зС0C{Ÿˆх­]?o4Ё‰ˆMtсФФ•ђЊJуbЊ\'b_Ћ’ фрСС‘Ѓ"яVїЧ№HБ—пžќАѕ— „!œІэЊг†ІMЋР‰ag*#зžЙАDљФя';oKККs†–({Ж˜ŠЋУXО}}ХЕ€ŽXŠЇ;rн…з3Я~ДiѓНВvЎЗ˜иНфTfzњЛ˜Вю-јLZ8†…г˜мšЧЋSБ((ŠЅаŠ™4ь+§оЃWŸџP…Ќћ!ž§ 1 г1ЕњbnB oo›мП†a:=§OОхH{ь€ц(av+Яо=9^З&bЅЄйЯчаЃ‚/EпЉїбЁk>nыЭќмosб7}S BNGX?'ЈdWŠЛg €8AKaрЕћsшEц}fу:›ъЈДw}b/3—ђ7ссщЎІНˆ*У‡ХђaP _ŸQŠХ 1шЩtHХR\Е…cŠ>eнљУ‚Й*ш~Сг?ц‡т_IЯЫ~АЭєтЪ-ЪЊ|КняpЇUз3ѓsŸюЕЙЙ6шЎД*н %єф–[б)•бДодзœњММѓўіf6fѓэЂъААтЭЉuэПќ#-2UP @ €ЅHŠ™4нn63яўsЉeћ“Е<\Й‡"ИЎ“ДОЕВЅŽeЂ{ЂЅŽ%Єb)8œ’№„xЂŠКЭцџRŽЭДвU# В3Dх!BЊ6[“SNэ…сU<AЧHЋнAU€Ш(ч;pžэ§§ZŸПŸ>оІw2штG>т~Ифїз—Б~Жв[)@A1€dРх€ь€–"!Q_о'їk№уЪіЏŽЗотЩbynБnCI’€ўuЉXй%йэп[ь$/ †az=Ќ†M -Жw§@5„'Њ*ут}dnљ›0wщ „Тс••ЊƒЊsS<ТVYЕ?Ј €\M—@q“P(‡›5ЧZ3А]tісйe#L0 3АžМэN‘t&НqђžБLhFЦУЧ›•ЇПŠпЙтЏlъ_{йiKЇ&зї™‚b€|рfFM3бЋ._ `нојГЉŽŽщЯAЗY0_v@Ka№ђяœЛ№АЏе™ЄT–_ТћыRБcУž…‰}@FЂВђьšЙряјлWŽ8ыUŸ2 Ыв"ц{Gїнz…•Zн“Iд‹ŸооиˆYv0лвв#™PNeЪо­ї}ž$мтЙ>g:3;џн5С_wЇIЇ<ž/Ф•N™(x{ьнА  lх%ўХ"%—[јqхiёЖfе'*МЇ‹д К{oSЇПў ўsgаFЪи=™|вЇЄЬ}Мgкь…J†Ѓ6ŸБы$Ёнєp3rѓK№‹ЫŒ u ЅhR$Дc E8bOя%f›Яб'wWA K§щѕkЊћ‘CГ,дj*AW•|f+ышЊtЌ'y›ќq"ЃrIOТ77 ‚кPЊхнЙc&ђ‹_м‚Зe”iЖ]К(6рМѓš№‰ˆњN№6пr<‡ƒњJ5=S€7і˜*†—,>$*ƒХj§i@tАpLкC№Уд­чxфЦ]CЁЪŒЄЃ_œЭLбxЃ ы•>I>ƒo“D Ш%сAз2‚ЄАчъT,z2н1ж1`4W Ъ]'Œ^ЗjљžЅжj_.-_tg|dєlгЏчЁ•Љ[GNЭ^}1l’^Vь‰зZж]a !ВMŒЁbWŒГз3i“Ч1ГЧ!„ ќѕХЈз˜Ui}2А“М(5Q‰$J]xТ!*[ZuхлЁ*џfш†mЧ.џїЖˆ‡"шX ;'`§<{9I"“+,ŸЦсB УXCЙ&ЈdqTHЊJJˆЄТ6О2D—!§ „њ$К'ЦeЦбДяЋŠuЩ1VКф,ђЁБPвu \PNпpхћсў3/у—аЏ™дbП'Ѓ Љі[ОgVy№0ŠО‰sˆаgїЏН!€€H‰Ќьnua;ŠWRM…Лj"Fь§kШЌтkў­э^ЫћН|Oхœ]ў}ЄђЩ s]лЃ*}џ”йgШ3Cџ}™ћЙАрSЮѓ+!“аaOЏƒяЊЄ=6@.реДˆœЂ >ПМCФдрЬ€ , 9M ƒЦ˜vmšе:+tД-kжПsФX !Ф)D1pYEЂ2ВЈЕwpšvыNк!„а…ТfЎEы:­9їlфЦ&mX8<82œ‘а|4%m‡5Œ_я+Sц2Юџ~;ЂЪЗ й‹ЯLЖг­žА­бйlА#r IDATїкe'ьOПЉ\`§^€VЉš:QоŸ;]xOgЊ*эё€ZР’“]’э—р‡JйœBйеюbX—œЇЕы‰# ‡“~tЁЧŠsядm—FЦЌwаЊїз—Хр€Ф@њГ‚R5uЂМмЕ-Цxб(ЫЎdтВ?О}t:2гфg8ўZTЬЄQМ’JЂаЂВ/КošyЪг~А’§ЪЈ‰]!Kf@ HHu ,7c7ё}gяcтбј'hLМШ‡€ш>ХчЬ‰OO;ГдN] l№ ƒЦp3vsŒuйм.hDХlaєЁ E‡ц:є0аежж50s˜О3}дСЈљІ~шPx…ЃзŒящ@—UYаєз!oП ЏTŽlЗіrFaA:3` зЖ №+тƒт~в Ч NzюњT,р2iGiЬКNы\&-УЊџЖѓђЕt:-Ы9`ЖсЇnŒwМŒ_sЏє0ѕьЦT~›VM-HuŒuLЪMJtO„љS ƒЋ|sх™jчЄ™}њЭ<‘GжlrЙЦЗЏoЂ{bRn’cЌcjAЊ4†шрT G.ПšђОЈњ0М 39nп"=HКt,%Iш,ќьЁ=œ,hњыPИ_PбПwџwгpџƒ9)#†’Ч›1!jшщћŸpAi1ж‚Cˆ/РЉРФФя,аFDsг‘Ќ7ЬB‚ЬtЖ‹Љ9!$ЌќTіЉRиЬ е‰WЉЉ­$^•ЇХWиšЉ‰mрH’Q“дЭЎЗnvЎЦхя [ŽэVЇbеНMкЖѕŠМћщa˜ž•gиѓђцоw@Ž@ј@ŠDйц^Pќ‘G2R§цt}n’зQ зГNx0dрЊŠл%јкŠˆMtс,‹+3ХХTЙ†hІFŽ+GЁЄЃRїН15иІ6ŒLOІ‡Ѕ†…:…КЛЕВ]uы9ЙБAзФ;z :X8&љВ|$аMTЭ†хЦ\Kgt=[ЋЏ!ё[ЯЅhR"]#у2уh šЏЅoы%ЗKяo{51.sБpзHOњ§щЧG(JJ62M*ŸŠ-*fŽ5ђJl&Рэр'љС(ЈТжŸ€ќ 'гЁ+шЈ8…5?1Ќ§_хлоU"*ЅWp‘ат*‡(Яѓ6йў›бк]f]!ѓрh3МХФю%џЫL.Œ)ыОл‚а/и›ЬeвЂC§<дкїijAЊ_‚E“’т™B&Ѕ:b .'ЩжЩсЗ)w›М№ьфСVх3žя§ЭV57cЗ”.)~ ~ŽБŽЁNЁ–:–-oœd@Т „ЇЌLаъЎѕ˜хœt M?1 cБЄsзш7еХЦzuмІъ_3i–ЁR “ˆкumюл§Хнј EЙЗG—впоміАЂYzf§Cжb“цжУšј›^]ж№я)i7˜BкŽиЫЬЅќMxxz…ЋiЏšsœЊž†ž*!„и\vрн@ƒа? в5ЂW@!с4mW3пБXљїw5hу—™@Žt ш@cаяВЙьцŸЇкoI@ˆQЦFЮŒV.ъл†ш@срЛК:о ŠЪ‚вАQш8—[„e/ЂVŽЕщ†a†QLXs6Ѓ3iК]=cѓkzSеU ,fвА]ЌFћLf7-Ш-ћьG|-:cжйТyс‡,A“ЊˆЭНd У0Ќzс•‰ц“ЎtмŠcтбЌLˆк쓇й‡К}^дџˆ~ЯЫџ˜XM3УзЭЌз‹!„я5Зiпи\yќЃ’6IФќ яДУ jyИr‡яC‹njеž:Ћ8GLrF%х%љ%јYъXBтпЇQ*–ƒЁCуgT> ЁgЬН’БПoєœЩуv‚тq@ЦШSОdЧЅж?(сBУE$*#‹*б€˜3iЏ$„BI !‡Јl•двГљyЇчв6 §УnjЄЪ~s=tйњ•ЇlУ;+Љ‘ …мqйъHТ5Xƒь•ЪЃЪЮМЙ~ћLBт™нх*a†їўФŒIЛЕж}|Сc%GЮ™8S-щьјžNЂ2XЌъŒ]Пдкџ“ЅMIЕ-I/MЯ§Bћ4X‚а…omAўсUЈiѕTFƒ4m*cfѕw1Žм%фVЩЎЃЋї :МѕOж–†Ыи\6§=ъuT›*^5Uћa—DЁ}ѓ[€ŽЏ:+.3ЮћЊЗ—ЙWР€€с`;—Эы‰SRBˆ_VPЦ—о@hŽЬMІаU\кˆ›ђФiяНџ9c8„^яБ.E3јГ їэfЛЪRЕЩz8йd˜ohиSЛе‘щSzЕ\нHцpпF‡Оrйsž=‡PЇСѓїьЙoПюф[jŸvlD‰ЈI"З)€емЏƒкp †AЦјQ’˜BщWXR^’cЌ#›ЫNёLљžшЊљАcБX,DЏ@Ј:Ы3…Эe;Ц:&х%}}@УnевЇЦŠ2^ВТNCzCђК58™ї?Ж&уš>$DфЁK<2ЖGОkЉ{4NГ‹QСуїБQд8йОЛZжх•сШV?}y˜Э§цZЈйПгNНѕ' P |ЇъŠW~ ~ЁNЁЁNЁ0mШ,QіЧ•2\§ЮђK№CуPMU,œ†•џщДЋ№Х+ѕfС:Шсp8_ DЈ~Б'Г!„ВСиCуЗ1ѓ[Ј(№8%%9;єТсP јк•VˆТсПa3mkХAШ ‚)„R&‘DJэVЏэкRэ’ІГBЊ+^e3ГГfAшЊhюяАх?›э->">-ЗЖmН[љc%TгWЌo7бПб н˜F-VХ eў,‚Тлл}–пv‹‰CQF!ггuПеЎЃЋ‡hС%ANaЭЯ–ПЩ!„jƒЬ‹ Їаt•ъ{Њ{СlњђnГBюN@Эхh=ŠЫ2j"_§sTьѕ2™YSFkуBHXœr%KˆБš*™PYP&@$%„ПфcЙЊŽzЛОУV"leЛGŒYЈіЗ РwSœ–6B2Z†ƒХїAo+/МюtКщљsSе‰WIyIЁNЁД…ДкшUХ‹ѓІЎЫB”1Ѓ-ьЙ!rЄ…ПРџЄRЄљGЪш\rЎы+жїš(пhuШ2ыЋ:dь`ш<8ј{BЦѕЪjЖVта2NкџПqўЬ)нjŸШ#З,;>њћЦ%­ы#_'6 'ˆкurэ>ќzдЊbфБlPШџц§Iмс3ЬˆРzuѓXDN[эыБЁКЕпќžлп |š ЙЌwїŽќяюРmЉќи+‘0_ћ„ќoQис3j?‰ X|Ыzу’в›М№З†ЮЕгчg'<іi№jЫvMмоОЃйjuфќИ^к!.3Ю*кŠL 'К'6H)НМэеФИЬLЦФз;шїЫЄ7DšЦ?A"ъ+fќдБуŽз–gч—Іžн˜ЪЏIХ"ШVбVq™qэоlmЅЙЯџЄвІДяP‡“ѓ”eю§‹Й†BEчЧPЈXDзI=О<њ _…Q@~Œ‰GГ2?| ‡з€БЙч­•NЦњЛєє№'њхасѕ*Š*iX1SН Ќ6aŸфEСДєŒmчг <ЗМ>ў‡ iЪ]Ї>ЛŒ|zVПЎz]Ќfœд\>ЩзПwЯ№‡ЋFі4ьj9nыћЩ!ЃuФбя(:ХЩР?„Эeћ%јЅЄFŽŠlf“2Щ€„NY™ е]KОЎN ;№цюн Wgчy§д x9YЇинЗ›уЊŠ_zсФД_"мŒнќќЂоD}Oс9~ўХ 1цЫў‘ЏаШЂa_ђыЈsiЮг(ЙчЂГˆЏмЯˆћї}ЇžКrд— NЃ—чі‹žjaPYдклј.žч>zж.я]t•ШьПБ`ЃХЪzЮЇў lvR§џ!ШШРR‚Т[AnНt0LЛяЌSZ(PиМъФ+J'JуФЋ:Њ§–єˆelф|РhхЂО0€яD47ЩzУЬ $јРLg˘šBТЪOeŸ*…5ЉX”N”яHХтМп]ф9ЏŸšxFк КЪbп%{}!#ŒєЛ9jРАь=уŽ]р"ЋІ­з€HAKa6lещДмЬk^/п|ПМM+БЙlяkоєd:ƒЦјVёЪЇ!єŒЙW2о]їyЗeGr…Ч €b!b]81qЅМЊвȘ*з‰ši‘vд+‰›фuУ"3№фрСС ƒžLїОц]г АuO".hzŽю"oщяШ%эЁgS?БXЌЬ„“l'яђ…•џ$ТKЮъЂ@лСх€ь€™$ Џm5м !ФљФ’є5лp—ч—рчkщщйЪSyь\6Џ'NI !~YAmаaIЅŽЛЂР[Lь^ђПЬєсҘВюЛ-§‚НYС\&-:дЯ“A­ІdЉc™шžHOІ[E[…:…КЛЕВYNЦе;„a ДсЊ…ьPŒ.аmˆА /џђкХIЃwЦ|{–_vIvрНРь’laЉcйњv5ьV-э1uŒёNЁЁЫЦSv­ЏфзwДэAьeцRžŽ*\zеМSqЊzzЊMš{єp3ЊЉŠlLбЄДИUnNъЭЉК&€@иаq(Цх@5nfдœKXћвдN…З6OŸПыіGaЗёa—~эС,M’ИyЇ2‚џљjРєК[O§>ћЦ/>ьY˜cЌcu~G›ЂW!œ†•џщДЋ№Х+ѕ&Їй€Ж#jyИrEp]'iеFšUœ#&E87}Њ{Ћ:Ц:†= kqЃšЃbв/ЙыР›€oЋxqРЛŸ†щYy†=/J{8Sž_akV]2їЛj‰›,бDЏ™љMл›ŸєЄ@Й$ќБ+ўRлГz0ЉЅSиь’lП?6—нжФ+€8р­ЗxВЖДgКTЌИЬИPЇаoЅbОЁє^№ЖWу2 wєЄпŸ~|D'iI2д­чxфЦ]Cш{jI€$XRЩ;mKdJБъј”=>~со­ѓ”=!д‡ў4aЁQƒп~иГ0њ#КЏЅ/ф  ъЊb9Ц: №эы+э)Ѓ'гсѓ н”I$М@ˆpЪЪ­юZ \„Ѓ5ˆ$Іcf`fЦ\(j1ЈGcаB‰ю‰И€\ шрегK*ЉX—œбcЅKЮhLМФі €ЈЉі[аУ~”q">pWFb7’WWƒhерoе ’$`„r3vƒ| :Š&…AcLЛ6Эj:к–5DSpњˆБBˆеЋeЄ_|ЪЇ!єŒЙW2уїžГ#yмЮAjв’фЕЁ‘фA (R!0@]1Л”Э)”]ЭРт"ЂЖФv€ЬвFОXЙХcчВy=qJJёЫ ЪјвФ3iЏ$„’(ДЈч‹О]ƒH*d$ а1 oo›мП†a:=§OОх4]RЬЄб˜ХвЉ˜pžoъ‡е}ЎPт-KЂ^G9Ц::tqќŒр1ёhVІцљІaЗjiScŒFE/YaЇб–u„ьМ@ћУv№'дД „—I ЧАš4fY§ЛNcrХќ*т•_ М`Š…c=ЮЏЙRСk}•СЊЦ vsЁˆUыЖ,DЏd`DЉђщvПУЏgN ”о\?Ц/шЎЫ’+–8M‘і(ХIPV€А#ѕъМю’nдСцВ§ќВKВЁ‹(пЇaх:ЭП=Ћ№ў[wѓжЄ_ВчTE,y~+›пл!DpˆђdP 5OЁњА—I‹ѕЋЗPœ Џн^|Ewџ‹1}RџsћѕЖг}—ŸЕъ=—™IONN-(Адб шппЭиXcњAU›­ЩЉЇіТ№‚*ž€ cЄЅйdIMи\PПдоiУ§b‰')‰ПЌА0ѕG]Lзf~Ьћ*Iэ6.3Ю*кЊК!DЏф=™.э!QЈL;Аl|§Ž›X €Vс”ТќyoјКKŽ9/ДєЕьц№^œџl8ЏяC•.Ю–>Ÿўyб Ыд/!!x№`–O№рС~ IyyвiлA J8МВR1“ІлЭfnŠGи*+b3KBММ Ћ~ћь|­ е‚ёФ5СaёoŸьЗМЙqзгЪіЌЫOн;юxэ${~щaъйЉ­MЙgsйозМяFŽŠ„ЂнHjяцїV•і0@<рr m‚А~фJЗг,O ё}ЮЉ^ШMђ:*Й ƒ J>ђ4Л•BЪФnšМХ‚њЛ†:99"„ Cœш}{{d ЋџO|џљ `3i:˜Эм№ЧlAыOH‰zёглБ#ЫІs›[R•uтзхЋB<)*RЊШL~Y8зЅ‡Жб№q=ЪпДы‹ oюо­0:;BМœЌSьююцпМz“”—фыHщDItOt0tј‘Щƒ€#€]rFGŒ•.9‹dcJ˜ў‚аqЯ_ŒrКћреЙN‡Ј™,–‹х#™9ƒFD2TfgUV!„Њ8йХЪфсгњsнŒ!Kд4ЮsЪX3zтњГ/J Š€,Њ*љќЅB€pыIо&яoeT6YТAˆЧ.яЎ“zєrn* Ъў—Л'ўfІГrnЧeъєяFlзЪDsг‘Ќ7ЬB‚ЬtЖ‹ЉyK`sйw§ќBBƒ“ ф;@#pЙt`œТšŸXћ5оџMDт’ˆТRМВ&AШ“‰О…ЪН~щќ9ђeт{NЮнWбю?ЕVН}/Y$РYо)Nеd|№…VtЙцчш8eхюsї^ч—pФ№З!ф”qдхTВ+!d@Ћ*SЗŽ2/њU1ЇшYь‰зZж]…M–RГђћcџ‚bzРХ|™јp!%Ub>sЩ@уО‹2Цo]аЋ},DФ&КpbтJyUЅq1UЎБцзЏNМЪ.Э†Ф+ЄЏКс4;Щ‹eАyBдЎљЩjПЦлТwГгЪћ3–B9ТФzх ъP‘tЇ"m—Ё:цЮД<жgfо№іЮ CPoу23ыюФef:Жя%Kƒќu!TбъЛџпionœ>~ќЗЩK~Д‰|§Я’HїQrsбфЋюс[Чu'"aйыs[oЪXšpђgбю€ŽGЕпђ=Г| Ѓ,тЈtБќя_{“Щ—я!„бlюЖIЧЇ§v}XиЯ:r• њmИN§—џѓzљїЎŽЗ˜иНф™щУ…1eнw[№™ДЏ$ф5ѓkж1=™–ъъfь&ЂA~‰ЪC:Дۘx„aж‘œŒЈѕщ{ъyпz T†O“#•1“*ŠнЕ‰В:mћЇ17ЇмэшЊоЈ4Щ5П„Ÿ"‰DCУИЬLП„„ШQЃ$6Ая&‰–ђN•4{Žœ4rNЈ7\фL_љpЁ‡чГ“y‘›NZцб+Z‡зuZsюйšњ‹š,Ё2ВЈ!dГсўs‰NaсЋСБ—™KyBx8ЊpuъE$єЋџЕ—Zъ—рGбЄЄxІРœAа*z2ц}(ЖN-њЌИ<ЯvъЩQ ъП5*№юнд‚KШQЃЊ К[ЎиЩOт‰ЪШbP%ER1ЙіЬ…%Ъ'~?йy[ве3lДdЁ& У#jyИrEp]'i5˜?HOІг4пООћU4њuѕnгLЅb&ЭЈvN“АђэщЅУКaжЙзЈeЇв+оо6Й7 Уtz:ћŸ|ЫЧыH ŽdИ=yzЃшB9&КЛГ||нн[^Щљ `5Ћўщ™Ј6X[ЂLз|мж›љЙ1оц:†Aa €Dр­ЗxВXž[ЌkЃцй%йŽБŽIЙI‰ю‰^=Ч<К’Џдю€:я}єЌБ §Џf|ќr| {пoчsЫžnї;мiеѕЬќмЇ{mnЎ К[*т—Є вЏ@G"5АФ *Y4…Змn`ћ7Eˆеtв/в€aшТ нЪулkўлш]SwЗйїKиГА@f`05иЗЏ/BH№хв5‚]ті ѓцјЎTчПzєю„В{шж\„кšœ*Ф++ёJ‹x‚Ž‘V“Ы2(И&“|[СцВУž…!Gё@qЩOЋ˜9жШ+Qиє?Qю†—sжТЏбй]=w…Км_Е,т ›HqY~ |Х`-9OWћN„‹%юwp+я”fUп8=Ю.ЩіK№csй( љЎђE!$ј”pE}иPе#э `qп?љвнУBЃбb^Wн@Mu@@мyЋvіL”+к­ў‚јеЁЋЈзQ^ц^YgГЄ=€H~b2§ІКиј_ЯmаШ1;ЪAД…Œ+SїnКe{єхS:‘>iэЧй—2ѓонXЁ|аO”‡HJды(ЧXG‡.‰ю‰ЈЈv)?їњ‘НЧЁк‡CB ™+ˆDНјщэи‘eгЅамЙЧцВщЩtЧXG„PЂ{b@џшБ’ТћpœІЇХ^€|тЇnŒwМŒ_sЏє0ѕьЦTОhУўф‘šVBM—(.љ `сЛК:о ŠЪт‰s/мO/йнGаз0Т{ŒэЉiѕІM1-|’,€јБЙlяkоaЯТ4FуFeЯNŸй7њ'Џ$v’—]руЪ6o”инF'ѓJJqУVUЩч/„#шXOђ6y+ЃэЂ@OІK{р‡@ш ЄKШКЕѓD™&д@r oюо­0:;BМœЌSьююцТџжнМ5щ—ьŒБ д>пЪц#ФkВDЩO !ЕўA цеŸѕ(ђж„Н^фœѓsя]ЩО;uў9ЋВ(эТЩtmыЎyrMkš KwLtцЦeЦYE[YъX&К'ZъX6~6iєљТъЬS‡ЈћС6Њmо СlЦђwWЌŽLљRYY№т\uвЗ%Љ[G™§Њ˜Sє,іФk-Хў” 5ЉЉuЗ!tP2|Й…ѓќя}мЙs,рШ+ЂЙщHжfŽ!Сf:лХдœˆS"ѓфНсы.9цМаPг% LžX’ jщџЛуг{YЏЉZЛУ$’fl`тќoоџоŠќЩиllXБп9ˆVuтUрНРШQ‘­4ћžРНr—)ЬujЈfB+МЗLяЁйoљžYхСУ(њ&Ю!BŸнП*єЇœ4@—@9ѕ:jЬХ1BW 3xЮќё˜КмYNhќ"b]81qЅМЊвȘ*з‰сЌЙRчэ4ЫC|_Їsjf‰ƒї{#Ъ]&„оЯc}zюm;6јњ;‹ѕ1хьjE­р^ЋilИGQцrЇЃоu№­ГOоен>—+not,IyIŽБŽ”N”DїDC‘mЗAЈ‹h2)$ё‹Хњђђк.o uТы:­9ї,ŸХb}~~.`ЈЖbЪаЂeЗ—-ПНМДЊBW$Ѓ—[„Ќ[֘­№4&H{$ќМХФю%Ї2ггпХ”uŸhG)aњ BЧ=1Ъщюƒ?№š]ЂИ$qТ"ЂМS^оy{ 3ГљvQuDXёцдКЭїЪDБљo(fвŒН4`уиАц›нїЏYLџт“swЈiЬЕЗ‡Mш'СД›ЫМш—ръ<8Ю‡5#ўqђЭЩ ^сђЫѓ(t%`?:рыlбУАЮЮ ІqКзеUFёынДYuтUviЖˆЏЂP]є*ѕKjyU9BHˆ„1щ1й%йпЛ=оћ3&эЎ№<њјCў‡ЧGІ”…LšѕWљєљЁИХWвѓВl3НИrЫЃrбНшЈH?Ÿ+ЈыJя•}c†с7ы›3iК]=cѓљuwЋ„•oO/ж УАЮНF-;•m€ЄЕ<\Й‡"ИЎ“Дˆ!„яfЇ•їg,…rў„‰ѕЪAЪЭёЏ„ IDAT-Q`’xѕЂЩ;хф=c™Ьr02FуЭv>~П“~I}њ_{mЕDZŠЉ˜9жШ+Б™^ѓ~Ђм<"і2s)OGЎNНˆx~/•ЌЋŸђЧRє•ёz_oK{”Ш z2=,5,д)дЭиMкcщPАpЌ™Ѕл›YоЈ‚~ЧCOІЫшМyѕ:*рnBˆ'ќšЉ_VU6цт˜Kc/5гcЁUмЗбЁЏ\імŸgOЦ!дi№ќ={юлЏ?•1yљцџR„Ueвdgˆ8Э„јQJjф‚C!w\Ж:’pЕЫxяЃgнmАёjЦX 'ѕдКхПw<>Ѕ ”њ’„ЗотЩкђѕОZŸОЇžї­џŒІK—„|!žЈŒpˆ(x{ьнб;`"O гш7еХЦzuмІъ_3i–ЁЂо“ќ!jyИr‡яC‹njоjБНыЄ-tyjц=w†кЛ.ЎЙНыьАЩнх'БЩK-HѕK№ЃhRRь€Ѓ‘&9,й[S\оЪє№CTL&џкgзџ…о1s Vё“Ј€ХЗЌ7n5ЦОД|бё‘бГM‰в#Ш NaЭO ћЎщџ> юЬІ/я6+фю„CˆинF'ѓJJёd .€я%)$O~X ЯdДd8Џ0Ћ”џL0Ž™кЫљFОЮр%_7BžezјЪ]ЇFœfЏX6­яšBЁ’ў@ЯUgіL4Р—^кцх­˜њЫЋŸжkSrЂщŽdQq QБžДћPЊЙј‚КЕпќžлп ˆHХlЦђ#WЌŽ<Жe’9юнЅэЫ#MіD/0…Я`ат>ЖЧ0ŒezDŠžL—і€d)aЖОпfœЄєђк0­O'%„Hc.ВъЙб+ЈoL<š•)/В *iX1SН L€r—)ЬujЈfB+МЗL‡Я`dА@Љш˜J2 ЋBмЯoXЄКjZЦІ#Љ6њъX_wo‹тчy„”щ@DpZЮ›ж™ŸІѕь13ОDкƒ€жtЫ- ŠуЛxžћXP}—h2)$ё‹Хњђђк.o u8Ц@–A ˜ЊХXћВKŒ”Oььј‘ь!у,Д~?Є4юТгOeEiчŽПжdЄŠ КLЯ‰Пg[ЈI§ШNXUV\V%џEИ K Т"˜L;’ZШЪ‰riкWВŠџ9>hмOКf`эЙыaБ ЎхЗЖ™гТƒ)%5‡Ї%7чwЎю5'`нојГЉŽŽщЯAЗY„тfFM3бЃ1‹тмќ}ДЙ†кћDМ(—џƒ[ €(’Ц]\5‡lикŸщеЧhр’ДБ!Пю„4‚ўrМюeбеdФnЂџ^?sBЅїŸyП|€~ЭŠі{2ЊZп—˜”\›b9хЄЎШeо 6žН&ЉXˆАшб•|%ГqMu ўZ@BВMcHаю…лЯії јѕчj%LšeЈ_ЊиBWBN— Aќ:URPЩцШЊВмNѕњFЩцџЛжcВа5xХ+HЃЕ›3Љш“+Šy‚O Wд‡ U=r!„•,Ž IUI ‘T8ьЪІWєЊ/г*ї^t.Ю’иТ~\ЪUєЫЗ’8І„є+пѕŸA:ЖВWђFЩЋ?*р‰uw%7§ВтТћъкѕeЏcзP/H(ы.ХBъewEо7 @j”Щ†ъEщŸЙЭ>Ш§єКЈ“Б–Rюѕ+#{kд,ХЋi9E|~y!‡ˆЉс›ЌFЂ2ОМO>2(юзрЧ•-ь—DeАX,ыѓу?ЉД)–ъЂy5rЊУf`СUSшHp=ЧЎ9њsўэУзЄVŠѓТЩ™ОђсBЯg+&ѓ"7(Е."ЬEЏtЄжлУЁєЗ“З=–б|f§Vжт„"~YюЃ‹зuS_СГ-gі%ФьC%йоxИШ‰ђў|ќл!шТ{Ъ8Sе†фхпЙxŸ0ФХД3IЉ,ЋфлWhљљ7Ԙ/ћЇ{‡ сДIЧ|ѕ,ŸЦѓ0 c5­ќ@Ўє‡.MX*жЈŒ\{Цђж_ѓ}Nш§•tЦMЏщх2yщЯэУЯ[B›}ќ 6ъЏ+‘sL ъУ‘‡m u›З ї\дЭ5№аA3ТmФNђ2Тrч~ТџДUя„;_ШBХLšeЈп§` aM3OyкVВ_5Б+ўы|Р$ -*ѓЈњу=гfЯ(T2ЕљŒ]Їoэœѓ"|w‘ч‰~j’zЕ2ЊcАtpBЮ—ќM}нzЕЊ~X3етНЭc”P Ъ]ЧџykСГ“џЫ­‚Уы8œKЋw…АЙўHЈ~%йnэхŒЕ ЊПJаЕŒ ЖьЙтIФMЯ ]фѓЊЊA dH3гŸЗ7?'КiЊiЧХЫЛИjŠ_DJ•Щш•ЁaKk)!Tђя,;Q—roЖK#Px~іZќўu ГWьъ-œŒЋwУhЫf[I‚џ CX>Ќ6ў“іH%Ј2eзZІiШ“їЯ"~~ѕ›џЁ—BqэЊ*џЦЮљ?ї3вС0 Уtm~žKgќŸН;‡j}ўЮ 3$цXC5F„J…і•б.-J%К~ЗEEлmOЫ-mTЂД(’[бh/qSнД ЎB–n–lƒdfŒ™пZ„Jš}žяЇOч8sоgЦЬ™sžѓМяћš%Ді€фр•]пzПќФцбBъ3Ъc>rыЇ‡a˜ІЩш•q…ѕе šVgЗи’†ЦпW3h4F5Bѕ9ћmБЯЈої> Ф-ŠѓJХ0­ю#–ЧqтМљkХик†i›Y“ЯЉfаАІhŒjЁ< AjГОХXпЃЋxЈ•JмabЦy›^ІjЄѕсР с8Ѕ/kЈNC TЕ,ч Ѓ%{zFМf #ЇTџњ(}ю9Ьѓш”K&:œНpdљв­|Ѕ-Ї=ўebŸ%|х§?BNЎАяЌŽ ћЏA№ћg=лО їПЋйEџь0Š[О%Ес•ЩхaAїЊП~7ѓъ*PпЉЅL&“Щdц… ъРЏКЛfљm›АЬЗЯкмі[{ЗКіў+Ўšя}ZTZєtŸљuџ ї Ї(b2Ы_žœоЯma•oD"QШі‘ЬЪwљ_љчфйЇоp[ОPФ$ ^ЊЃЃГ&k pр i]@Щ}ЗС&H]­ЕГЃйД™н•)Ў‚ђ\ш^хуЋžTbeнЬ5]хb­…угЗ:œЈ\tbЦŠвSv'Ÿе:Tts@ЂЈЛTбЪч+№q woo2‘ќЋћWВмќ0OTRР!ѕ6z(‘ЭGсpxEe-ѕO'tмТП]ŠўБŽR4љŽH6ьђЬfхщьщў-_(€>„YA*А@Щ{ЗСІHf>ћНBж^)ч#„pЊж+ЮЖ{qўE oCЛєбШ‰КјМВЎ"уbєKB'U^MжуbѕBШРѕ€T(Ј)А8cљ*ђзwE ))рт3Ж!z.а!>"л-vyНѓtn“~r u••{ 1 ыдwzа?UfЌ№Њ}ц‡Ѕ–—Х xf@Rпƒој}# ѕКкМBVZ*НёtРj?+е[^ ŽЇХGОŠД8k‘\”ќу|ПіEјї3НѓГј8Ж‚ЎГŸн­ŒюЇѕFЬYшœRXœяYЛwсоlд#g$LPGˆїсU\ф+ЬB_кЪЏ€hj|w№CР ёЊ’щ Ѓа“јˆЦЈh+ЄžПyTяZuГъу юg–эgЭныл XрлЧwЇ›аiё4ŸDŸ‚šqG ƒфbBRLЭ1^Dcр5ьWХџѓeYтџШS$MЉїy|w К3FгhŠљ[љЗЃ+ dЈРФ №q ИC?№Г2‘ьпЯ% )‘\˜ьын-№Г D$žяпЯŸO H ЈтT§јБ’˜л-мŠ'gVMь‰i6 РЋј{ЧД~]0 гь>мїlŽЮЖ"cšџ˜‚мњщaІi2ze\aНИуВA6ЛbЁXѓU;[[љѓ7W€YмrЂ:ЅщЇЄ8Ф:lГнцDuwD‰W“М>0еЪзпіI4BБžэє9ж1рFо$Ъћ;kЧљlLЁE э(ю хY‹?аіСИ%WГ]ЉеWWв–o™4т ИCВ@6XЈm™ЉVSZmХ-Ој?Їy‘9ZЮСWУщEqЧ#%ШDr№рфЂdŸDŸШЌШр!Сd"YмAZ!)З[T‡ю‹ŠЊч•,З>Nч№мї•\Qг@ПтетДљaŸЈЄ€CъlєP"›/ој€ŒEB‰Љ;,E—Нwo­SПzАќЌЦ Э5Э-ЮX„d„ˆ;€4С№е šVKЯ4—0_А„!”pq‹[Ž=— Pw@@&Шl€а)hіЕЊІQ7rНЏі‡Гѓvёячяdрp9яђЖлЬ5ЭХ‘,Р0žИCРdТ€ХпЅцї.чщБnKNЙОИ;Qмё€Џёk_ѓѕНa}шмB eqгЦ’vЂH`IJн) 7ТїЏ(pKџЙG МОvОЫ#`–v1з4ЇХ‡d„атiоцо№жШ}H;ШB~W}Mi•‚І–2QГяTwУэЇ^Г %Yј5ЉвKŸ|<ЬУT'юh>Д”Дƒ/6€vуўЛd№ˆЭL;š t`љ5оННгмввЫг-ЮZ$%‹;€cЅo1hо™—еьЪŒиSЏдћvўўИšAгъь[в№yб€ЦЈFˆЯЪ9Зdp УДЭF/Ъf‰ vQуUЅіnЊa˜Жщ№…‡1yM^FŸЋ4ЌЉ&лќ\ЃЅ Ын›xъШ Ъ^]Ш˜ ЃдАˆˆ‚оЄ#i“Žˆ; YA&’O:}9яВOЂНž§Жл`pwBU3hzcb;™‚!dwшŒGцђС”ElХЮУ–љ­чn!р•ЩхaAїFnuPћœPсО9усМOwУЕзЮvzдšeы.:œtе'ѓ‰ˆїЭЉYSїЉЏŠxrЩc>>0wЪlхфѓПБЙšc<“‰Њ4ѓ`ŸєxGЕ6ЗгќдГ>ѓyДUЇeП6лє8 !Щze[ž1B}–фƒйбъ™†aL&œ‘ 5œЈNіњіЉg,‚‡;QФ@м+_›>nUлwР#t›Г№P†ѕ sЅЦUœЌ“{г‡я>ъвГ#BШк3ьЎЇ Т•œœ3С/Gю0Я–ŒCЈуРћї?А]s6ЧБ—€jэдЬZ$YНb!]%ЄЈ !їэyяz˜nяЈ‡ч—5Р0Ќ“Хд)•’ѕ9€МКh…ŽS™­ФG$ GњЂ„стŽуШDђЖлтiёiё4q‡гV Убq*^b_UЄ‘Р>V|DЖ[ьђzчщмњk8ož–ub*гpА RЫЈЃЬ?WсШc ЪpФэ%=XЌє›юZGdЦсЧN]нcSBо4НТsо}ї;ўНЎ7Œ:qу7|ќ_ђG_>NХ#„иэUуЧ›ьlзŽ›0з4Ošœ4хЪє­оСЫИŠ_ тg|~U‚вјbW kзѓ›ќЌ ыьg7gƒЖE!„‡ј<!ЅЉљsф#„pИцO˜Яџ‰].Gиђvз YEOMПY  K*HO‹ѓ.ГЊыLЋN№УtQІ‹sOLa4WЃѕ'пВ‘€X|v-‡ЈBњђЙцБЊ8DВ’еЋlђ1K †ЄЊ Ž€ј G‚ р†#v"i цгі…кžПьЯQWPSр“шSХЉBпКĘпЪ:1њќЊ…Єёљ`ѕг‡–ЧЂёЬe]<‚R&!BЄЎ–šyWгЊЇФd6ƒЅd`Ћ“ЧxТtЋC!~uкеќNƒЈЪJd"ЋМ–‡д№Ё†šтJšкјmАSvr=2ѓDф‡ЄŸ]}Aд1#ПН§ЄЄ№ўеЗќмЈ‹Я™ЌЪ—ЮfkќhЪ‰vЈЙГh‚пЅ7l„тзОŠ]х8а+ёН [€l™Š<ђА ЉтŽЃ ЦнByМqЗФЧЗEОŠtˆuАзЗOšœ$юXкJђ_UiHп;ўdэЧ поs<П!Нq‰У EаŸЛ/5[’'№q xєЧЊC_Ÿь§ЧsyxЄh№#rP~@;UqЊмЏЛ‡d„Фгтс“"•&“ЛTœ)(j@!юлќЈЊЎ“M$kў1 П№ъУќfw(Џх!Є яЮXЃ|ибXWзtRpћ–™нХŸ€)tž~ьќRђ9>uє-fU]:U@ш4ёРўЁVŒшЎзй|ќж7гТƒЦjJOnШ-œLNЬ„…bmЉќўfмwww/˜\gї'јЦ€С0ždv›‚YХE>_y)zжЂџЬЖх эrоeŸDosяІЉЋ6žкI 9Š= vљУўю|–Ж€‚ђХЙй_ŸSўП ЩёŠTw…‚Ќuєиžy ›,Ц;ХЌ„ћQrДћЅЂC‡Wˆ‘(މBЌ;­fа hŒjюћHЫdќж;%…бю&š† ДШ>ЛВД’§3Ѓп‚oi,М Иpzєi(М’v$lЪHvєхїмњї—ЃыGMQЭ<š:zlF|w>“‡PCкW‹@@RџkjŽёЬVХ;BB@ЮёYYg|эє1н>гџМWб€ЊЙ9ГџЬ›5тLњ%%;Ф:P:R’&'йый‹;№ЫІSКжDхegчFзvbŠЪВыѕэ4t:i;P ёО^к@ ,СмCЋf8ЋcЭQшЩUиwSѕ%wіz;Zj5Ж cd3qёсћх n€шШуœіbvW6еІl\sп1.ћIјиьzрƒj(НњuUœЊ€”ŸDŸр!Слn#ЩтŽЩЬxф‡ЌааьКQFf$<ж™PxЏВДЄ41‡юыE  ЄЇKЅЯє‘–О7 ПЊ‹*ˆДьIN}і!з91фйС73 K+ЪпН}~5h*:цF?š+cR!тV<9ГjbOLѓcЯSnQœпP*†iuБ<ОˆлЪšяt†mв­УАЮу–EчВEњt$JCYвЎ™v&К†aъTЗЩх Ќд}žАBѕйA6:цrBьДu§z/yX'ю2‡SшЈлI]ЯЪcДoйš9ЛR*рзЏh,М*x_…WВ‡Єю2ŠЮ5U„,—YлмNш5ю•RW<ПйЂИC Є'Eш<9РсюЦШ|Ў0[aх$˜ўЯošM7­ŠxQEлx ћъЅІй7ВXТlШ’šфѕЉІОўЖBёЋюЎY~л&,ѓэѓЃ6З§жо­nЙцћ;$лG0™LfEIю-fзќџИї^OC"е=кМ№˜Ъяž—”—fž_ЈriGd6Юdœыў?яИˆWљфN•vеgU|дPšš\еcTw%qЧ €˜РBBЁвџГ(mT IDAT;=Яc!„:9э:ГwlзУZqG%ЕК_sпfЛэєЈгPx%ƒ}ЗИ1™n[њBЄn&Gў™ћюЩˆзg^r"6[wЈЄ‚Иј Ъ§6&^њz•šc|ОЃ лP2BЩмЛ#šКhДyg2qЊŠsRЯЮ3c—С T‡ю‹ŠЊчYЏтiКЧ8шЊ5<м4Ї]~YЉк|Mн„BМŠ[Ы7їЦ§aЃ†kЙcЧуАIцzВ6Пo›ёие%Š!EƒDРЁNVsŽ&ЭAё5Чї(Žzё~ОFцЭw§нћхпxY7Бї‹ыoКŽ6Wmх…Š5_ЕГЕ•IёьEИŽ§Wэџi‰ eяwіЉŸ8’Vщхщ>‰>UJš[ЄЎав”РEу…gТ8ыЖ{к/,Јс#„X7['ЯЃ‘ Œф6e~З"џ=yА&!Dд2"зЄTА[Ќi@!nбЅыJ}#w4Я^U%г)ŸЎ5GџyuIДOArЈиЎнhх2Сь‚љаaC†vž0в\KсАўN]ЖмЬЎъr;CcЬ‚бQKѓЋ”oџЋfПRG’Žq e…{–ЄЙ^ёŽ…p˜њиEv–ъiТиЕ@–Д%3еjJ Ш•РЧ!щ!лnЃ›аХ Є†єt!EНЫBЏЅНЉleЋ<яёхƒ‹ь%ъ*H›–5@­TечŸњmУ‡AnХ&у^б5ŸЛV–§—vЩћ§NяcЏхwD6ЂЁл‘^џsb…Г1ћўюЉgЧ•ёRаБЎє8%у^ пквШвŠ›|?ѓaЪ‡оУЛIRЊЏсбц;ЧTњ\x>ЗМlNцљ^*—GfУи99уы\˜œ49 ВWј)R”Рт]єЕеХ0уq›џЎlœЎ„_—Еfѓ}a=ёЖј!EMCЕšМŠz„Ї4‹ЉжMKЙХ„ИUКjІG\)ф"Єцџqž‚xGеЯ;Т)tЄ8ЬёЄц\—чйxьѕ$=‹Ў‹6„&\_^Дjнƒ‘Ј#lX7уJэ ШінŠт.\.6гKEмс6ХgWѓ”tU)‚‚B'ЋG“œ|Y'Ѓ}“ыBˆЯbЬŒІЧБx!ФНчŠa]5B1н(З§Ѕ5|ФЏc†Я‹Ё~YУŽЃЗѓŸIІЁvbфъџJ!&]`–@™ЕSмH6К =žOQЅˆ; ,X(жютŽ€D“žТ"vЦ?Ўї:ђь wѓЦИЙŒYZE лж^вZИeЊD]ЃаŒ’ЉГmэ–ј4њэЧ‡OW :`ŠЕXЃT”-|ЖНІOє1ЉSЋнЪX%Љ‘Ч^iлQфvЌSvЦf;чn!^ѕ щ7юЈЪ„ВйИюџЮМжuыHХl9eЭƒЎ‹wЈKTŠ^Сv­• Уь‚цаa‡ІNЉЉЅЈтф­Очрeƒ е‹ђм~џЌ4ЏабLПВ`EBЃьn†ъ•цљMI7~тЭЛ –зђЈŸжŒыŽ8On+^М;7Ђќх,к§А™“ќЭ G"@‚Е{ј3)7Mў|ч…a“ J)ј8fH)J`e0 =ь ЈhЂёž'/oэ Lш0sїku^ЎU3œ шI­Ьхkя#Шf€LЋfа(єd„BЩ !ћ“ЖіѓЁїZ_ЉiыЕџФРŽˆ0h§ж~3›ЎЙŠB$cЯSOЮXwcpШЭ&Љ—/c`uњN^ц+Пc`‘z- _эїћ|ЋM%ѕHAЇяфeсў$„ъhсdŒѕЕд" ‚ЖЅ5™•g5Xв}DУюGўщV”^t7Љ№Цю+'эRNQЕ†˜^ї№Т”С1oћгвВяЪЫ›њwјВВšA3tK@vЉ9ЦЗИЛш|эхЖ&‹ ЦnћjЭЇљ4-з?xўуНЩ1\G‹y‡nЯ;дтx—ЫE.?+YэШdюqdmСkјР%шYtqЕштъеѓШЈИuКд^0‰3/4чпЫ Ž›NеЫєЭЉNсXRІ]qы№щ0W#\q@Шє&k8Œ}8<з8Ђ!ЬИС‚л-Щ!Š6цƒG КLBі !Dш<9РсюЦШ|Ўvg ›ЯїšєфnA}=ЗЁ$§ЭBІŒCˆ`2ЃG‡№П#;і˜нƒдcVег‡)›o\Є‘u(ѓaiCUцЫ9тіНФ›Œ"Н†‡7уtЮгЪ†ї/s#Г”l $ЊЫ$ŽT]юT%г)FЁ'7ў№yš6ЏЎмocтЅyMKгдуѓуей @юz-БКkў|ЋукZсН\3;.сoA@)tэц3ˆhэmDUDŠTЃ…жФA>FvГoъ™ык=м`аЃ’q}Ї(юЭжрRшоПvНMxлGu3э<ŒЁџ ПYx„nsђЪ`5п”§ќШAŽч\Sв7л|uІBŸp8М‚ЂВ–КЭ­ €Ÿ ,€єPБ]Лб*~‚™х˜KЖ†%Є—е#„ыяд%ћfvUоэ 1cG“гѓЋrnџЋf?@.gјE8eу Ћ#nІПЉ`2™LfEСг„ƒ>Е„1e€Ђюˆе1—+œњуЌіŽфk{fYЊЫзЬ Еe|гi“њj“ ЪњMЅ›ёJпKw V |DЖ[ьђzчщмњІЋЙџХlтИlИцwNL›oCъН<ФхЩŒоzZК=\S&ћС l€lƒ@Š нŽќѓњŸ+œйїwO8;ЎŒ‡‚ŽнpЅЧ)їRјж–F–Vмфћ™S>єо Ўf>ЛЌИŒнJ'АіЊfа>M-Ќe2~ы’ТhwMСO4,щTЌ—.дЛ}яПZnЋјat‚жќ%TФ•Р)ш:ћйнкС(с~ZУgо§3киЯњ>б-ЗсцGЎ>­Гуяќ’ќ”?ѕ#Wžј:'фUгБејЌœsKwС0LлlєвЈlЊЯйoћy*sŒъ}яƒ˜У№ &<і‡z’žХзEBЎ//ZЕюС„Hд6Ќ›ё ЅЦіdћnEq.Žщ%{~@†>wmС-Š[:И+†щZNџ3ЅВqHѕš›67kзˆšc<Г…Ъ’ьЬу#TзЪ7qђЃМЧzпЊF ЅЗ6MшЉaX—3ЄV‹zљš{[ЗЧž]хдЛГ–ІЎй˜€s—6 ыЌ.ƒ‰<ЂёЬe]NЅTЁЦ^о5іŸHм3BЃа“Ћ’щ”a'ŠZžЕмцѕ‹„ЬЮSi=Щ$В™уфЮйзГЄКЛ%<ю›3Юђ}ЏН.ў/эЄkеСu ыы*PпЉЅ‡™МAФ%€Жƒю5щСЮиlчќР-"Фk >Ё"§ЦBU™€R6з§п™зКn=аЉ˜ !ЇЌyаuёѕ_Nбcжо‡VќjлHVкое Ѓ Ї—‡TЦЌZсЖ?tžрGoGˆ[ЗТе'<­оpьђр%еёiВ`ŸєxGaƒѕсёЮѕЩ=mыШzВЩїqщ­ЗNy'Кz §{]Г^iXh›Ž mмŒ9ŸљеВкшs…•xМ< нзЁЏЯ‚Sn;sy$„RѓW9!„Њ4ѓoќб[nCJЫЦВc/ЧLяRtх|ŽКЙ>н‚ІиY'їІп}дЅgG„Еgи]O„ъTА•ŒTфЋwђ/ |(˜YAр—A €vрV<9ЗkУІрЄn‘ЙТПИj^ХпЛњюЛіњ=AЛ}SшЎщF2x&OъЕ4|Епяѓ­6•д#О“—…ћ[BЈЃ…“1zдзR‹€к–жdVžе`ЪЏOаЧd2Мэ"зœв—5Tї!ЊZд9У”чЙy*ž<6Iа­ˆ(Mі яЫъѕ&˜ЉсЙ5Х Іг'іжTСiLu7оyЖƒš%АšЇœЇОфN№њ'Ў<ЬЉф"„ˆšІƒœчњЏgЋ)ЭWке …žŒB(™‚!дЃЇšfуo№ъУќfŒќэлНўš?ж>Вры/\Rя%ЬїBљMь2|щсп{Щрзјœ7OЫКʘ~]ŒнPWY™Бзб№ЗзU$ъи€аУџГ&C‡pФрчЕ6ЗǘБžэє9жqХМ’Тg,яЌо˜"›sЯу:ZЬ;tћe)“Щd–НКsФЋŸZуQ ЏуrЙ(cK_BHЩjG&3К ЄЎжкйбŒl!EŠы ‹ГtЏЃOЋлЙŽSњВ†ъ4Ф@UЫrЮС0ZВЇgФkAŽБѕ}*}f8‡KЪḘ­™s?'чйе№cfуD—EЋЯ>ф:'†<;јffaiEљЛЗЯЏMEЧмшGЅ{\ЇцCSю}IBєнў*.џ:'ЅцŸџiMѓЧ6YџqМњ 1щ%L&ѓ]FЌПœд‚ЏсpˆЯу}}(Qд1gЁopJaqVМgэо…{_АХє˜л-мŠ'gVMь‰i~ьUЭџ№"ЬгЖ3†aџ‹)рˆ;>€ˆЂK,uЇmЌо =T‡ю‹ŠЊчФШJ–[Їѓ xюћJ.Јi Ў(ю2€dцГпЫsёк+Žg&jсpЊж+Ю[<7ЎN_ ­|L“бfvWRЄИЪsЁ{•pšь[№кNСБ Л7­ŸсїфM ХЧnЅк8/‹˜MY:+'БРє1гlДћЊht_Нє”эЙ,–—!Я%X+'œ;[? ^љhЉЋЅfоеДъi#Б/§rIІГџXгјcК‡щžШЗ- -„ЊI^˜jхыoћ$!„ћљnЏуњ›яНDzvdѓЅПпŽЇўzэ=@ВЩfТ–Ї†AW лp\c‡ %+џЫ-рlLшфЃл&wxЬfљљ”&ЫЊ}ц‡ЅЮh#ЂI“}NйxТъˆ ЋEгZk”Œ†P2їюˆІ.mо™LDœЊтœдsЇѓ Ч)‰/*а6mЩLСU1 ЯZж„пЪг'ЖL5Сх&ь\vкpџqћ˜Љ џѓŠЇіodx–оCјц–ЭюГГџŠћ0јАƒ* й/>`/ор""Šjk‰Љ;@жЉ9ЦНЫЙН;Оєh6R ›МtлвJJf9lд˜&;;ёc§бЧ4YyYœиЌfа D8їŸЂёТ3a“*У<эЛщjihhщлЯм“=њhф#(П є]Уk”;ыъšN Ўsп2Г[GS%ƒГЌ;ыO8ЅГтWwЈй‘RœТчЅФ†шщf˜zїqn—Е˜Л ƒdГ БСНжЏoљжз”V)hj)5ћNu7м~ъ5k1œ“ tлr[tqЩ$Џ“™њEDЎВSЧ#ФЏЫŠоeАЦVхЧo?>ЛЌЄFЕ“I’&хьБНщa\QoФВаЫИwф“šc|ОуЇ’сд ЄЉAMпiЬ–„Ь-Ђ ŸЧЎЭMг JќяиЛгž–ьє`є?@цA aъhЭ/ЂXщ[GL/X2U'?ід+ѕОс+\ј л&d‚)fgјуzЏ#ЯЮpз9oŒ›Ы˜ЅU”Аmэ%­…[І 2{Х-Š[съžVo8vypШ’ъx„jnzићЄ Ізj†Г=Љ•1уэ}ZЌjcgБŸ>ўW3h†єЗw†яіД”ћ)б>СС Q2“9wиbцСьŸёš; Ь] ƒs$drg ёеЉКF]-;u ъLv7нvЊˆрL ™'я'IДG5ƒ†a…ž\•LЇ`&Тn&пЂдgй~лS:тЯпї[Oј  шЖ dЛ(ƒiHГ7 hќ!ћх­=~Л wXdЃA`+ЌДНЋFAOпd„yЙЮ7,ГNdS"„TњLiщ{Ѓ№Ћ)я "эЩ"Œ!ЄвозЋЦNY{ўпбŒ^/Љ˜ѓ™џФІ/nеYžш“_™zЕ/ШУ uЪ=&zљвГwЕ•/ў:љJg€СїG ЌfаД:ЛХ–4|^lь'Юgхœ[2И †aкfЃ—FeГD; н РЯћжмотDаВъЏŒ&“Yњќ/˜M\$ъkJЫъxзиmѓЭнзpЮdПO ) œ‰—{"w№Ц]^жъ‚ОЪф”ОЌЁ: 1PеВœs0Œ–ьщёš-ВЁѓф‡Л#ѓЙЂjБU8%У‰л.]№гПюуррК|п_ї_•дАхkP,kљOмAсшаwЎKїЯїкxхїЏmКСН7№ЭяЛеЌиэpƒnкйpи>’я“ W&—‡нЋnњэТ}sЦУљOОяЕзХџЅt­:ИюbЁ|w2а…кКm9У#P]І[aТШŽ“КZkgG3Вi3Л+)R\хЙаНЪЧW‰ЊIЙпЦФK_ЏњjбQьdч}шцŒЌлчNž\7mёЃbЫгЏ.Œџ=Њ+yХ{—xЕУ`;ЅуїФ `jŽё-ц”Ї]Щкац№нц,ф<”aНТќcЕ'ыфоєсЛКєьˆВі Лы)АxТ U­аq*ѓЂ•ИуШшЖ ~дЬиxЏћЫMяFэ:M2ѓйяеВіJ9!„SЕ^qюАн‹ѓ/ъ$iќvбСЋv1wуёkOѓ+Šх({%QъKnяY0І&†aІEЕуџš%ЪЎ­ђЄЁ№ЦU•=…:+b Убq*>aј/яˆШv‹]^я<[џq чЭгВЎCLсН€д‹ ,~УЧџ1LОG•ЃёуMv = ћaЧŠ Ё!mxё[r@лЖmѓюэ-аHЛmЎш>0­нёѓУRч‡ Пe !І‚/ бЦ~‚ЂЋЯЊ}”>їœеіЃ7із1Ж†Вf,ŽвЮЎ›рƒЛuдI[.nўŠVmЦɘƒ‰бBЩ6ЗŸlГќў`F@Д fVіbW|ќП ЇО­™пфg]g?Л9;Д-SGуpˆЯуё’Яћ%HЙH`сˆп€pФdТIˆ6ЭB%є DqU)кѓЌ j мЏЛ_ЮЛ<$˜ЂJxLДƒxЏ@SЌЌ“~›оy‡.ыеXGЩ~ёчь эЭћg‹ЉЎ’__[У!ЊЊ(ЪЧ%UЫЬ†aтќŽceнЬ5]хb­…угЗ:œЈ\tbЦŠвSv'Ÿе:TT3мЂ‹K&yЬь8а/"r•:!~]Vє–(ƒ€5Ж2_в8‡/BЩZdAќХ &ЊfаЬƒ}@і 4Gв@ь Dв@ЬЇ?}XhyBN4žЙЌ‹GPЪ$„CˆдеR3яjZѕД‘˜|nzr‘а™Š<ђА ЉтŽ &UJвф${}{‡X‡ШW‘т IИyо›оŒ˜њe@i’щ зїл;U ЎaнkЎЛšЛ^ЏSы€иЅFNдХч•uЃ_:Љ*№jВ+ЈwрьŒ\яuфй“:g7Ц7 Ю }v—9ћXЫ|і 5чгL8jŽёљ’0+hNьЗ[ЦнByМqЗЕП}}АїЯхс‘ЂёЌe§SќVžN+cБЪџ§Ыпqъсœњя .ЂH`IЭ0™цпЯ?ž’т~нНŠS%юp’Ёюемn3(M&А"шиOъšu5ГNT14ЮЎѕй—Ч:жh#Rпƒој}# ѕКкМBVZ*НёtРj?Ћ‚k…]”С4ЄйP‡N4ў§ђжПнŽЛ,Вбє4Ÿ€Џре‡љЭюP^ЫCHAп5œБFљАЃБЎЎщЄр:ї-3Л)Š;>РЗЩEBhdЎiž49)№q Х‹р!СNT'qG7ВОrev)i}щ0Ш.|^ЊЌOйY’Ъ ћюМXбoОџocК)з0hцС>щP".xЬfiдГЅMW Н>JР­№ј’Т!/7іDnФž]Т™х€š 5HаwћЋи­ёg’сд ЄЉAтŠ №SDё=)іКS€р1ЙѕгУ0LгdєЪИТя€ћїѓ?=њtР§(Х2 ЪŸлJйjХZгШЙKŽ&e—ГИJž_нЛ`NЌХњVЪЂŠ€ѕ›ybЙйу .гVžL-WчE№M|vYq[8ѓђT—щН~О*2ѕlћ‚`мџЎfќГУ(nљ–дплм^Я>irЅ#Х!ж!Й(YTQ$Bчi‡Я/юxбw˜‘ЎІ–О™уЊ;]ж^84U_Фeъ8•юЮЋ"bŒџpюh: #nQмвС]1LзrњŸ)•SXзмєАёИ)иЩ;Š~щ1књ­ƒ.„‹&"_(Yn~˜Ц'*)рњ=”јУћфd"yлРmNT'ŸD''+2‘,’X(ў 8хюЎ;т\wˆ;„"vВѓ Nє wђŒ•Жw5У(шщх!•1ЋVј†эg&јj<5Чx‰œMXИg/;…~vдrRK2XE[ЮŸІњ[љУuІ@HJ!Ф-fl9Bє<4 mГ85–bљ$њ8Ф: ЖзГjйЗЁљтŽќ NщЫЊћU-ъœƒaЪѓм<O›$јvъKюЏпqтЪУœJ.BˆЈi:ШyЎџкyЖšbЦ]zs@pяdt!@<Њ8U‘Џ"B‘Џ"a&AсзО_р~ІїЁs~mП[N&’O:НЭv›ћ5w6фЉЋЕvv4#›ХGH‘тz Шт,нышг*ž@[ЉЯ>ф:'†<;јffaiEљЛЗЯЏMEЧмшGsП3ˆ# ЧdГЋ•л/пЈX–о[L@к…d„аMшЉtzHFa§:~MъŸєпв'ѓ0UўљбcœЈNiњiŸKБЬ5Э…#2Ъ€, ™љьїђ\МіŠу™‰Z8œЊѕŠs‡УЯЋгd+ЌœФгџХLГбjќЦRб6шОzщ)лsY,/CEA6ШйL`ЁЖeІр<ˆKcљUвфЄРд@яооБоННaІ_Т+MXЖшоФгgц‘кЛЦRЌШW‘ДxšЗЙ7dP>”БїXЫo^ Ә9Ъš; Ь] ƒsтеФЪЯСc6ЫЯЇ4YVэ3?,u~˜@Q2BЩмЛ#šКhДyg2qЊŠsRЯЮ3cЄ$а†Y]ƒЦђЋЦŒ™Hn,ТwPRю§ЃC1™З–Yuњ8‹“эўзэьƒA7Ё'MNJ.Lvˆu(Ј)l˜YSЭ РДq­сWІ^-СЭЉьКд]ш‹†џрq­аq*ѓЂ•Ау7Eу…gТ&U†yкwгеваав5ЖŸЙ'{єбШFP~$ ŒЎ2[€$kLZ}^єюэн8h?Еq—*VшAQЅФгтC2BЙGI2 IDAT,ш(Љ}ћЈT0@VЩXљ•МЈf8а“šOrjя#–`$ЏќўuЂM7вН/kИ!ФЎ@іНбЄŽSё!~ƒућnбХ%“МNfvшЙЪNП.+zK”AРлЖЭвŠz#–…ŽXжtŸ]VТdѓЕH?п^‚4ЄoИИКл˜ПfЊB я9_-июhpŠžŒТiѕ1іпoчiСO E|НFQЊŸ6ŸT3hцС>щ",>хГЫJjT;IљЁ€6€bрнлЛщ"™HnЖU3hzђЇ%’О­ЧЖЃ›'t›ВЂфнлл;ЮћЧлф‡ъа]‡ќЮrЦ/uЗPmЌbЏfаЬƒХ•$тНKМкaАвё ,­ўˆЄиˆЄ˜OПзрЂт7 œ'тcgјуzЏ#ЯЮpз9oŒ›Ы˜ЅU”Аmэ%­…[І .{…З(n…ЋOxZНсихС!KЊуЊЙщa#кы^a ˜LюRБВ ˆоЃ qпцGUuнiBxƒˆі‘nq#блGГчЄ˜оЖEЭз vъч-Ћрv‹„‘нCm Š.„Pw @{э# ˜L&Гђ]ўНэІŒдŠ;$sИІЎkў˜љ){…RsŒЯ‡k† o\UбѓЋ|ЯИ[Ш#wыŠ<ђА ЉBŒюиELCšНuшDуй/oэёл]рИћР" AfеXi{W3Œ‚žОЩѓroXf]ѓЪ>Ac?пдчc7{lь_BlŽdb4‚™ХxЫCˆї#ЛjЄ‘ЩЇс)qDbkЃёJџyоаb WHёpђ"gъ@W_ е guЌ9 =YxŒ‹ўа€$1Аt8<ёИ|I‘WxiљhГЦAž(Жža™uЁŠ Д^є#ћfїеЦ0 ЫЅЩе|ФЋHкфиУ0ЪПMуŒу˜ќКЬ№yЉІkщЖџq |гЂкŒs1Чі 'W%гmžА~e_ЂЯ>№ј’Т)xЙБ'roмхe­.ш’0NщЫЊгU-Ы9УhЩžžЏйB§zце–уЌvЅ—3™Lц•IТьjDТІŒdG_~Я­9К~дьЋщU•Јф†тjоїжв‡ЗъЌ•…Гs чTњLiщ{ЃйTAЄН№ff§ЁI"ŠдаUЩt †a:н,Я~?уРкўЊњуw^Ы,a2+пхœŸБuѓ§ї)qeIXѓХ™gnљэNŸО<ŒПфnю›ЛЫIWџaђ ќ‚П$,Л–WђцяЕjaKУsк9О9h†[ёфЬЊ‰=1MИЏ $”?qR{БЂё*Ю>ђС6Ы_™VOЌйъ2н Цљ2ЉЋЕvv4#›ХGH‘тz Шт,нышг*!%qB ЕщлД0-Ыбo„{"@0вЕ&*/;;7КЖыгЏГœЏ*Јъјk„дoДCпЙ.нл=C1пCш<9РсюЦШ|aеЖ њC’Dš*АъKnяY0І&†aІEЕуџš g ™xЬAn§є0 г4Н2Ў№ЇЯЩі‘љ%џьэuфжпW#ќ‡ыЗјъ“ЌЈкъ:FcvМ,gжёBˆOъ9wЎНОВ’ЎЭH§ЂGџUч?,5›уbЎЎJ§›—…2BuЏn?Э‰š7€вЉЋемЈМчЩЏщf8јЄ&y}`ЊЉЏПmGqGH §+Х’}hМ‡DЁ'М™дH ї*Hf>ћНBж^)ч#„pЊж+ЮЖ{qўEа*Ѓˆд)ЋЖ…мЪyzШќЮ†НЯ„{&@23љ!+44Лn”‘Yг?_З05яЂNяMјцЄˆrП‰—ц4YZЈ]ЫEш@’HЯ юѕЏвчžГк~єЦў:ЦжPжŒeУQкйu|pЗŽ:iKS"ШжГэ ‚qKЎfЛRЋЏЎЄ-п2iФAл?ЙЉЛћbcџЭ1гК*Ђ6§­Н!.УбDЃю­ФЇЭ;q!„WР#„ŸЧGИЦo1‡B8Є: $эŠ['јЈ”ъа}QCQ5уœИ %( ду™›жіл№˜Эђѓ)M–UћЬK&Д‰†z"„јjуЛ}8]ЮAшW*у~„Єю2Š3є ZtG§SўŠ“LР^Л‘Јu~Bѓ5B ™!ђC’DzXЌЌ›ЙІKЃ\ЌЕp|КуV‡•‹NЬXQzЪюфГZЇ‘Њт€f”,7?Lу•pH}€JlНwњr„цw? 'љ]ГbПЩў%}‰:&]*Œ)XC^ТСSљѕяпVАљ-BьjЉё22юеиi OЏSFЪ&ЃКe:іpфтх1‹gEZžМ№?SЂ`ž(ƒЯ.+ЉQэЄEF-ECYЪ™иJлiЯ/чiіы"ьЊ6Bп-nЬ-Ÿ‰Žёѓ›Ѕ[ЎОGzЪ1ˆ]њhфD]|^YW‘q1њ%Ё“ЊЏ&ыqБ‚zAжsђЃМЧzпЊF ЅЗ6MшЉaX—3Є kXI У$%BмbЦ–#DЯ%к;ї6^kd€з‡РѕWпсЛЭ\g{a”A'ѓwњэ<6ЇrЙэЌыя[<€h:oуфwЋmКvБЛЦжT#Pмlъяк]з`аІ’qKІCі 'nQмвС]1LзrњŸ)•'š57=lrvхЛYwЖЉ™“’,ŠыџяЊжЁ=^вJ№§ћfхї7WsŒџ89œа†%ђ‹“{z^} ыjы•Я‘Э в“РBxЬfiдГb&“Yќ,ЦАЉ Н~tІ‘ + о—еыY›ЉсЙ5Х Іг'іжTбщ7енИ2Нр'ёkRџœю™шЖаЂЃHЧUdхЦЌ›жG_KЧpФŽЧо%цТфа>0K m"ЋйNщЫЊгU-Ы9УhЩžžЏ[m@ќpDbkЃёJџy.ВЉжОƒћяХRНyН‡щ)ъ7ŸЏћюТП’Ožьоœ2шФПџГMњcЧуВи"’DŠX­Љfа z;NЅЯ ‡т sI9:Г5bючф<Л~ЌРlœ™˜цoвŠWšАlбН‰ЇŽЬ1UёЌ „Nу‚юf•2™LfIЦХЕУДЁоJXЊ4Ќщ4Uп=}юˆёёQЫ Eа„8Ÿ~ј)эXџэЬ/ЋЏк7шИѓOьЇ}эјuЄЎжкйбŒl!EŠы ‹ГtЏЃOЋ$uа E%*ЙЁX"ЦдреsUЛB Є.Њ\ЩˆJvСэ–яс–ч} ŽъЏЇзЄA]~…rЉЂoI"х ,Уk;Ч.ыШX?cЌЫіјџqжУfяЭw ‹˜M‘žёюDxџшPLц­eV>ЮНmЛџuНИc‚іЅ. mеDћШйLцќЦёŽ*ŽёГу?GЦ{Бх/—ŸJ'сјхП~ўщоыUоЭТoнНohmчФЏЂГ зHf>ћНBж^)ч#„pЊж+ЮЖ{qўEˆяzЕчУЋJЊК$мУЋщ)TхГъBѕь‚j]В_а$ЯCeФ&>Т№сё"ћшŠОE$‡єdeЊЮєЄVЎЭь}кNйxТЊ##§ˆ*M&€сБЊX<В’;‰Ѓ6юRЬ­О‹У  іq‹wD!ю?‰ƒі”!1lŸћuЮ пc+™DЕqЋ‡љMѕ†ѓљc§:—„фъŸtџkьЇ”ŸаЕЧћ˜ћьОУI8TŸ[mжџ!„x…—ю{ЌШ|Xм€бlŠѕЇœ‘;wюђ[єхˆЛš6џ@LАї”•‰ ўЄСW6vъXSМzмпИ]Ю›сЄ№ЋАPlлРmоННХˆdТc6ЫЯЇ4YVэ3?,u~˜РР0Ќ=лйЪКnajо Dнд[X fДKзg&MьkšћђLЙюњM.hкљЌQ…€‚kЮ_чюKёЗ*мnљЊd:хуЛ.™ђљэgY Д^ЯЂo‰!ŠVру@јTњLiйwххM§›Œй^Э ™џъž[ЊЙГhкЕЩЁ[Чw%!~эЋПЖќoгы%‰gЧР№+8Щєˆ&чєІщwkћHћ˜`ЗxG…ќУ7,ЏхQѕJѓќІ$‡gŒc?zЄџЪЁіеХƒj§šЈџо 5в.]ЅoЃіњ9BсѕЧК6~BˆS^ВЫёZаŒ)‘іч“e—Я}оUУесˆіы‡бhwжнхxљоП3Gœ…ь@P.ч]Оœw9xH0E•"юXф “‰GЈ=7вАаЏ@п\xэ>FўЁvжœ9щhŒДћѓцейцi5ъ9МiФLІФн>„є,SsŒё[Nє- IЄЇ‹аyr€Уиѕ‘љБѓ „Ек№РхКИeјMуžоtЊzєš№‘Нќ"Ђ}Є[“.{Fы ј†WЗЫrЎмеИˆѕšзясоНЏ:ЁY!(ŽЌ3†{яB>еёng”-9ѓуznqС&яћЩUЬz„Вo2ЙюЫЎ>Ўщ ЕєАйЄБotИ6фФ9O‹Щqˆu№6ї†:щCtŒŸ/‰—Ъ h;' wЧ5ЅWРЈ’P@D‘РдљŠrП‰—О^ЅцŸя(MQwФъѓЛЛЬ?ЅГ;9ЦЉЭS РЏУ!Х!гЏИuј”Ўт0іс”[dЏBOВqЦя=‘_љO‹ј\9Х}Д))Zл&.УРDƒ{‰ёѕю[юŠ[]WЃHФ•|ЈцЂNpР“ ‚)р—yїіv2pђIєqШs@њтŽFš—,щипД—п•yжгЯŽVw,@ŽБВNњmzчКЌWу@і‹?gioо?ЫXXwEп"’Cz*АDЃšAЃа“ПZхn S1@шp ЪxVy=‡Їl2Šœu(ѓсШ>=ЪГЯzeyrЄёЗЅ1ШˆМсqLOЋљъИWтu,А.jŒ——~*Ÿїўm=_Љqч­œхѓЋ‹7ћОujТиИ+>{:]\ЉењˆЂJi,Х X cЉUf‹% У$А›,ТЉщэ|Л(ƒiHГ7 hќ!ћх­=~Л wXdЃ!Шё†9љёёљ„и/іyџY>;>Л0;–^Дu^№+Ž›_d"љєЈгў§ќiёД€”€*N•И#€vPш<э№љХ/њ3ведв7s\uЇЫк ‡Іъ ­NDє- AЄш}ЮoрH ‡HМмиЙ{vYaТЫПБп>eі^8ЋПVœцt“н‘y,dJќёу€ЖБЁЌ›jЕWё_бXŠu9яВћ5wК нпЪŸL$‹;(Р2|Л uЄЇ !BЈ*™NС0 =Йё‡hŒjС5AашiV4epџ>#З>ЮJˆљЗŽѕ<ќhљд‹-”з Йз|цDuJsKЋтT9Ф:$%‹;BёY9ч– ю‚a˜ЖйшЅQй,TЭ ДИєјzeCљпуL zXp?Ш­Ÿ†aš&ЃWЦж‹<|=вSЅц/‚)]Tlw\џЇY9цW. Н]@Ж4эO'?ЅIRїЌ1Œзо‡jќx“ŸZљЦ\M_"2‘<$8Й(й'бGUœ*Љ-ХЊw@ ИoЮx8ягнpэЕ3…ЕfйК‹UПћ~нЫ“ПЭ>Єфw.’VБо&ЗфjЖ+ЕњъJкђ-“FДэ ЂаKкoЗД}ЎXСXўха'Г- >ЂH`Aн) oЄ"}#pвѕЌл7-§чGџp‹ЯзmYьѕь“&'ТЈX@ЬиY'їІп}дЅgG„Еgи]O„ЊпмžЯ-ЙОС}щу‘G.ЏЈŽG›Іё‰J 8Є>РF%ВљЂ‹|&њc2ЖqЃЂo1’Њ.„@І‘‰фmЗ іIєёIє ІЁќЮcM41LЯv~јП Ÿђ}œ7OЫК1UiгЦМšg!юƒ\Nю>Еr zуѕЄЄ€Cˆ[Ьиr„шЙd@лір;D‘Р‚ђ+@ФŠ; „“i,Х"џпоЧEUѕq?У*pY qASqпХ%ЗБд\БВ4г,{мRДЌДRlеЬ-\Kq}ЬЦLsХдT|MSTРб€\‡™чQ7˜{>я—Џ^Ю33Пqˆ™љоп9ЧЁўъњсБ,цP,T.>кrіZьцnЧ>ћќа-ЙЫQ:•J †ЧћО}bMtЃЯfНpxьИѕ—Вђo§ЕєэСЋы-\?ЁОmIе eXxj%‹фДb­ъКjђЁЩƒw ІыYЉъЕѓЋэ OЙ‘ЊЊшхl%w= ЇЉжШ9v{Tкc%Xќf. Б`у„;ŸєўрзыйBcњБoллvў’‘ѕ+ЈJИZ(А0CeЂ§9M нуZЇлЄЭ—я Cђ/ћ7Ў*I’sЭŽЃзœЯBЁOи:Ёƒ‡$ЙдьєAX‚^цЪЭI Ч"9­XюмiХ*iк—Њ†юіЭX_мХ(œЕїыу›œ0iUд?IЇ ђяЛшќ#ЖдxYВюЕsяї™‘t}лјwџшЕђЧ7}lIЏ ˜`€RЫС/4^ЇгщRЎЧ§1ЫG;qњсЄ_ZVaтЮиФЋ'~hДчУщo aLнїбЛ[,9sхдтЛ'Lн—ішЛЦc+сX$Ї+, ,82˜VЌgbяіЯЅШхЭУп›yё_ЖMR;VДЗИ•˜^xbtRД ЫR2gпйћ/ыtКЮь˜3иЇœЪо?L—_˜ПНіўaqaўіџоШBjѕЩОГ;эNЮ?ђашLк4wїЬyЧП‰ЇKN0љœW‹^cJЪ6бУЇяр;`GК‰ P ,PjхvCrbгeCї‘;6№як_З pхџ=˜Œѓ{у}оŸаПE —rVjыђН[ ўpœOЬЮs%д|ZОѕєяGvядџУ5‘ ):]|Ј_юФљ|M@Yb)w%E ‘ф.”<•Іцр1оAŸoЈмПš•wгoЄZ:ЛиZ;7ь;иsжЪ cjZ;{кЇЧ&пNVY7ЮщьkИ0›ЇИфФ"гM§АAƒzTя1jяЈ№и№љэчЛлЙ›Кѓхыь›“a­ъВЪзйїОыєЇЙцаЋIkO•pНВ‹Yк‡юИ~уЋћOђпцgЭЩђR/82ИLь ђ8lМкЛŸ™ѓх:wЛњVqАYЉзЮ[П*жѓE/›’yDЕдјѕраWЮ…Э™жoIЅЃъб=Œ2Ю<,нpнG$Iвщ<€\ј>Pœ,ЋєъібФЙЕцŽmЈŽžбi`ќЄ­ њ>ЗqхYЧ†U4Bh|zЖМѕEXTр›#­Jm§ƒO }й€ хДbGЗни6ЈIа;ѕо‘Л"ѓQh†eHЛІЗяfSdЌ?ђyФUяG;бц”BVо#W/Щњxж0П‘ёщF!„ZЊбВЧАХЁo{•фIUљš=ЇЌx1ёРВiSЂ3шМB™ЦYPъYИtž<тv№ЇлЏ[5?їл3лЙЛzvœmў§{u4BЛжŸЮhЌ Ќ[Нщ˜ПzЮўЄUЩOtƒ‰5кпgxlx@X€ьЋbmы(–{Xlы(oХ#/УКo.Ё…ƒ›eJЬЌТo'„КоФ€С–‹\ПЩњWf€г-љYЙuђ[дЅ”œХљ“b#УчНыїœ)šBЌ]лŒ˜ПїJтV&Ђ,3Хџlє€тgячџя•]‹жДBб~Ъ/'Ї<0жвЕлЬпўžiЪђ`*юvюaaЏюxЕўGѕХŠЧЙEr UВмУB‘™,$ЉрЅЁLЫщinєеНПњ:ћNk>mђСЩaaЙ‡,ыєЋ|ѓуsњ5lmwsУдЃКї§<МU9g+ч6 ‡юкёС†vпїЋР|]˜Е4m€яќQб&\”Ъє(†yN!@Ÿ?jя(!DдчQюsф\ k[G‘™,4NBї?%Ьrxšе3ђ/#§ЩŸŸЌъВ*пѕэZЮяБkDухWE….“;.іVY+$!ќB‡„нK”­ZLhОЋїЎYеЛимŠ…мХ@UFV†b ,(“$t:%|Ц`nh†ьЄщсeI‹]pd№‚шЌU\ђ^ЕшЄш‚зqW0гќШ™ Ÿѓ(хŸ"MлГzрўfЦњ…ЦчіCѓЗNг?" l јE<ЁшЄшЖлF\ипgСщUš6@Ъ M3y‰ЅViLЏ€WОСРЮFяМЊЫ/>дЯСŒP6,ЬэW0oС‘СaЕУТмэ ™6hяІгщtКЧПёр[ЮД%–ZЄW@СдUњLnЛozhœо|P6ІrRJG4Х­„цsE'Eк;ЪнЮ=ќэpнХЧИџьФC_њЯІOл{1цG ‘мэмKizХBГДЕЅШЮjбѓмЅd,w Ы<;Ађ0m LД_СLиwп’ђˆOVёщёЃіŽJЭJ Eаћ јЩЗї‹ѓџї‚ЦГяь§}g?j˜y‚ч•ђћСџьq[xЄsгђКЅуNlКмжхС!ж~ЁƒТќ­3Џ|кmw№aяЅэЬќыL‡Џr`ця0ќ‚б‚“ ‚ПућNPу ihЮзб;ЇН5pjxœpя>mѕ’‘uЫ6љ0ѓдgЭл|'„ЂхВ лz;223fХШ~~ЙXЎйиUыІњ92Ч XшOџrЭЁW“жž+с:ze!ВД… U ‘mPY™ХRaИŒЇ[ј*рІАXц   BьяГпнЮ§оᛇf~љї+сБячt|јЕŸ_ЈPШэ З’TMОŽўэ­jE#†ысA3Џ нѓJЦŸQjƒБјž@gHЛІЗяfSфЄЪЌˆР’ТЖ|Ѓ^M75ѓ“у9•‰7™ќнЇљІбУЃЧ;ѕоy№ЈЅ}%{ЕС(T––жŽе‹ˆGВo%'GЯjы2сІGџљ[цѕЏV№иŒsлOкTTЉ;=Ѓг—[;г$„$„pzš[~•яяn–)1wВ„ЦКаёж~Ёƒ67Š§ЙјpŽw•2ёеІ•їUŽяqLё.#{ћПьe эЯ]ЁРlŒ ЊбВЋЧlaпmбСzšТяТку•)3_якл;rLзOцœxщыІЎ;ЎOOLIБыЗчшY]>˜wbрЗЭl‹у ”r:нг|Оoе!Ы:§*пќјм~ [лнм0ѕЈю}?Я‚nЄvѓэѕлдџК§8 <Š_хфa…PJt‡gjь&I’s­Ў“Ж^Н[РЁOи:Ёƒ‡$ЙдьєAX‚^ЄiЊhгфЎН,Ы81;јТАэ.ю~ё‹Џ#я>вкѓх‘У:зpЊосЅЗЯ'e2ЬBcg_ЕEуЊU[tёИ}1љn‰T]&9Дk9ПЧw/w­љы&ЯњЏzЋsч J!љі"BЈkk`?яW Ве 0{œ$Р •‰іЋŒГоžЏЛ=f€GкіI|бЛЭ[›8вqЦэ>инbЩ™№zбcФд}эО•ЛlшSЏІъkЊ,,„ШО•t+Л№‘йџ\Н1ЅeџњЇТcW-ЌWЫЦЛCѕЋыvФМT}gМc=З"ZК№„д6mƒќџЪїлФ?ьОvџА!9Њ*ЯоWйДХЪ,P:й4њќЯ(ЃЕЅJ86oс&іfj:rчlиQчСкV*oэєЦ чўспщ$„ТМkМџ4‡9[?ia_иx(х[L[c`wяŒnЇ­mQО№‘6šDэ˜ІЏWh0rщЌк…%S–UћЯљпў­ъпіy}ёц:X˜#І€вJ­ББT ЁПІ§тGыac›—шˆ&9юІC gk!„Е‹—Cz\rЖBшЖLќјЦшŸ?$Н’Њ|§быџJвщ’Oo]П\Џ€ЊBуё›ЮъtКЫ{ƒЛ>Wјть*Лf“ДuКФУпїЌT№щй‡ЇŽІi*7uцоDИЛ1пЗЎкS›&„0$јВуЊ’$9зь8zЭљL!„а'_=ЅWЩ9я~>J (ХŒЗўZњіреѕЎŸPпЖ #Ф#wуVО7эіФйƒм‹иђижQ,їаmыјˆa[[ŠхК­-ŸщБT†Є›OнЮН”q6ьїЋњœПžјjдВ wЦ&^=ёCЃ=N?xSˆєˆOƒљŒjYспл?|”І v ,ЦєcпОнgљ’7|lUБrіДOMО+œЌВnœгйзpБBŸzЛZ­ИП^ѕЕj™ў(ф$„‰ЗїJ–ЄGЌђНмУB‘™,Š™3,;у™Њ1jЊ=iУ!]УŽ’JЄл[Лšц”Bи4šmT[ZшoІш жЮе­„аtј~m‘І]Ÿw{Л‡Ž€C( 7Жї^+|37Н*рˆOЯ–ЗЖ…E]OпЕhUjы—|l„А­?jжТiСA[‹X@ХNЇГxф“Bhœ1Xm#„9џ}v кЇЏнyн 7іЎKmлРўп+TjK‹4m€KеFУЂњ-˜XŸuЕPVGЫ]ф"Р@Д_ƒ›Gn8Гk|W)GЫЙ'=xф‚MыOg4жж­оtЬ_=gв*wВ—Ц{и—}Я}єёЮЄG4СФКяНў'КяzФАž‡ФБ†ž‡žёбTM_дЏй—qEЛ&ЋK‡ћ&œкћoН~~ї4iљИХ1Y…н0‘2н7J1ћю[’œ7њЁ#Bt›љлп3я]є‹ѓBˆFŸ>U’хЁ4АplбгzЮOлRŽZЌђђЋЛщ7R-]l­іь9kх…Œ15­хЌ Ї[(‡):Аш;™13хFJІQю2”ЦТЉu‡MГ6иїiщ˜їЙ8#zFЇжo­ў;-3хфЦ•gVa !rc !€й1fœ[=КMeЉRƒпќ‘œ-„Hџ§ЕІЏ§ž.wa2Jt—ў Э§ЇАpiћJхdїО­яЭДi0~юЗgЖswѕь8л8ќћїъh„HгH’ф‘{?к+I“щЉPЈt:я>JЛ–u7wПж`bэuл†ŠАщужT§rн”ч#zњЮцџяBх’$•ъЯ’dащ8[АЇўЧ‘B$н№вњSQЊ‹?с№~'˜•ЪВB%WGЗ&oЬ]7њŸоќњ`2[.€в‹ 3DћUYWОщћC\OХf!,]{|НzЌjйзо’Л*Ш-3fХ›*JRѕ.г"RЪТœ†ф}г{дv–$ЇzoЌНЌ—ЛРГ`BГЃЊаtЪšІџ^RЛјMXѓП r0\šyeшЎ˜W2ўŒRЪТŠўF!Е›И~DГj—gwќљсž л”“Л$РгЂ (2Юm?iS1bHнCV&8иЉхЎЧдNѕ;Дїu-gk­7кЛ–‰Ї ц‹ (єщ‰))§ў{tEЛШЏчИ#w=ІЂOќѕУї#К}7ЖžFюRЯ€ GЫ]ЪМЏф.&fЁБГЏкЂqеЊ-КxмΘ|WюzL"ћЦoAЏ-r™Бі“6п| Tуз8J#'Й (mlМ;TПКuGЬЅ#;уыЙ•…vЄьk'|k;mХЄVŽ|эy:œn ќ&@ьРд,ЋіŸ9RмЊўШЮго­ѓшۘš0Йх2IZќ|ПшПю!ВД!’”ћ'@{+џEI аf•ќГB{лф-^RˆTcѓ”эwŠмZ№жёŸЗšлннQ’$ЉЭТ8і!€RŒ]€В@eзl’ітЄЧЎџѓЃ=ћњО?єюв1ЇіХgзёBXћ… ѓЗЮт?\'ВДЋчЪwА„%я8№ўv—…ЇЛзўГЧ{кюќЂcacэЛoIб™І,sХщЪaŠ,њN€RFeamL<’p.лeЬOGњ(d ?§щЭ7моЊї‚›UхŽОУ+]пt:_[UшйГm7n”BBкnмzіЌ|UŠSP”Н›ej\Ц]!ФнЬј4ЫJїОаtйЊ•Ÿ››ТЯЭ-'У’ЃФbP|/ЂBDМ%ў9Zя Mхœє*‡Ÿ›[DBТу§#$—@ЁЯdЙ‡…Ш}‹!ГЊЄš&]S=ћ]€ŒА0CД?›!•gЏ™[^<Ај“QmП}ЎЫ€Џtk]ЗК‹FK3/я^8eќg[.ц-Gфцo/gQe–ЦId& “а§я‰з/—BђХ=ъЊ-њot'*ПиrCsK!ВrЇ !„№ "K–Sч6пќО}ˆoTКЃыЛ ;wЬWёљˆ„„М +"!СзйyПЎT.тО­cо‹Xом§jНї\э˜еЅВЦT­a’$ё9Ж0’dащžц•(ЮŸŠ’•ОkЯ€ƒuзMЎX!яyJ!m|ЧчЬ"ŒHH˜|№`PуЦ=<x0:)ЩзйљzѕHЏРœ`(žНXœПмEЎ|‹ЩуЋЯњ)ТoT7B,˜€ЪоэЋШз<XЋV`­Zrд(q|Т@ьˆbІ Ј M“Л !Dњўi3жnœоѓљJNR.eЬXццОЅИŸyиЃEВыєгйд–ътнфьх}Uд€RВ tС‘Сь @!Ап№dвД=Ћю7>|…пЈ‚†›2ОЙ›ИgўЇ_ўєыŸчSєBkgŸж=‡M}ЋЅѓГnHђ0…@ёЪ7иЙбшWuљХ‡њ9Ш]ин˜…омр0dўяgЎоHNК~хдій}ХВA‹/о•Л6ЯŒг-”УЫ|<u•>“лю›Ї—Л’dœпяѓў„ў-jИ”ГВP[—Џшнj№‡у|bvžЫЛ6˜^vєД/§|+;ївЭeўџmLM˜мr™$-~О_є_w„тс#<XЅ€mущ{ЗМU=џђіўaqaўіВ•$„6^энЯЬљrн‘И” НС ЯHЙ|ъї•Ћb=_№В)Žћ/8B‘Ѕ X Эњwф! u­>U“WЧ'd !„ўJмкдj}jџќhЯОО/Ч_ш9ТіЦОјl!єрQL`бw €‰бў БђЙzIя”%УќjTrqrrЉфэїкw1]‡ОэeUї_` ђЌ‹kЁфhjyuвг^1aИЌIэьUKЃВА6&I8—э2цЇŽ#}дB<|2fœ_?Ж]UI’*жю:nmLFС{о0;щ@№KЭ_™}4е O>ОzJЏ:’3Л‚0,т`ns{СЧTєbъVnЦ‡t_ŒwM-ЏNКк+>oЛ‹Ык˜дЮ~ž g‡Оfх1ив(„ШŠ=;2пEШL#Нв9s\јЭЁo‰№uwЛЬ–4BнdjЇІ~еїЈcяV?ЭЎх­yјˆмe+’ўвъ7z~_iкozКgFЏ§hќЧ›лЮГ+ђ&Ц;џќо…6ж‡і­ЎIпѓ~№Б&ЃƒZ_gЂ’ $``†h6?ч~ž№йѕwBЦзЭљЎŸљз7CfWќ|юы}їœ§ћЄЉXЖљ+Й]s<ˆиљсЗc]ЛŸ=ЃCЌйQ?ЫwВSћМR-§?Б1ŒыnUћоG-„А\GЬiј ОАkж‘!~–‘ЛlЪ<їѓœшŽп.юWЇ‚ЂйА%ћ† ‘І-tМQŸИcкрq‘ ŸиЪбBaзсћЕDšvНЩj€’ФXŠЇ]ёЮg—:ѕ­™—Vi|^psж{+ух]жнЛЊ}^Љ–О66&цтК[е^ёџФм­мЦщ9зŠm=дBюПљij{wО}.$$цNЏк!DіЙЅћЧ,MОЉЖДГ6ъГ <‚‡e]њп?екћ”ЌС†є ЗюЗвѓл•“rв+0;ќrPМ;gw^ЌёZwы{‡дЯљѕЎvnћyЗp3Х.„ї"Rѕе?Rn$оиkBuџE(€ЦБ_—Ќ%KГКєuд!„Кj Ч„o6КЛo^щй№ƒц–AT*a4ofьэkЂ}6ы…УcЧ­ПФ^ЬoŠgщPй6%цF–pЙ7a0ѓъЉЖ•ф§4їя.„яvѕ­т`-ВRЏ?Ж~UЌч‹ХГ Ё"7щ0OМЛЧQ#дЦ7k1`[непЈfiaДМџbБ=&žКсƒt_мЛl[ЗокSѕђxјЂЉжШ9v{TZџЮ’ъ‘ƒ+јЭ\фoŸй\3ЄgяьЕпv{ŽŽDц† GГLž€m“‰S}КыђхИоЭ< џќНЭЌЩыњk[Y ГђЙzIжЧГ†љŒO7 !дR–=†л.„9ю D45j§xЄжїЎ}р"`ЌН_пДг„IЋ~њЂo-еХm__х9wQЕ"oЃёВd]jПWњL[КѕS?І0/XЪgYЅџЂџŠOЦ~aBlК*ЏƒЇnњЄweй?Ь•№.„@™eYyРR­zвыўоянДЌдl№д^ЋaЕGЄFКчm3ъцŸџFЊђОЃCWш^2шЛЕЫjO}~p„Bˆw)wА§“СщЪЁвщŠaї”.ХЕ aвДОѓGE?ёWeI2шtOг}#…HЄ`%ѕ#]†`PйOкP„ €$IтмyЉCz@9L1/:82иSKгіt”ф‘*waРМААžVљ;7НѓЊ.ПјP?Й цХ}Ї˜эЯ0u•>“лю›Ї—Л<•ьЛІПєМ‹$Uj8hЮб4Cš6 ЇЮЩЛ§ШХQщЦœaщ{оіЈ MBtІНшхььѕтє:ƒBdХ†Оъљ\€6MˆьЄ=ŸtЋх,In-‡/=}л(у3˜:А№єlOпЛх­ъљVЕї‹cївИђћЄџьiН№ШХ+Q‹Z™ГщВ^ПаИ”ыБ{fz­~sJDšQcЪБэ‰j!„њЫы?^e7§рЁЯ*Ќќx§eНЗџкuЇ™ЗmЮ=Њ\:}ДхьЕиЭнŽ}іљЁ[2>7€Й!РР бў рбюœўхCЏ~­=Ы?зbєЪŸ_wЯ "U*kћЊЭzПdГkѕЉ;Тth‡u‹!„"ЎTЙЃЗз НЊ_‰И!DЙ†CћеЬЙRЈъЕѓЋэ OЙ‘ЊЊшхl%з˜!,€2щЙ €ьєiзюиWw*8gВrіpИs-MoИОw{Йv5mrŽ2t™Vі66іV™Љ†‡n–І pЉкhШсnпŒѕеђИy%I’rf&№X@™dщрV.%цFVWf]?›RСУбтъЮэх;е)Ÿ{TmыЈЩLЙ“};9S#йЊК™Ни?—"—7oцёŒBзо?LЇгщt7Žу0РЗ\ё<€y#РЪ$л:§ќnnZs >=3хЏUяН:яlN–eйЗЎлКSјЌg8Й~УМnЯFЄFƘ|\xЕwПДyзљѓЛЗ\roяesџъџјeЫб$ЕcE{‹[‰щE/эŸИѕгuЕЦѕ­fYф0„XШ‚]ШOхаnЦќЧпm\ЭЕfџMžЃ_ѕЖ"5"АКф\Н}аЙў!5+gпmsВNъчрzxfЃђUњ|6фЮЧ-[}š9єѓWЊЈ…HгИFЄFКhoZfŸлпЇВgїѕоу&ЖЈPдƒgžљ>eа[ lMѕlЅ›JЇгЩ]eNpd0ыЌУЄвДОѓGEплP’$>š+I2шtŠ;Q}џмУукоlЫцA•W(ђсн €rаА € ј>€’•ІэY=pПёЃ~Ѓd)xXц…пўАn7Т‰є №˜xЫ0;vО^8aьм}—’uЙтC§фЎ Ш“u%њ;/—‚7@„rpК€r˜b !}ЇJУB3VІ№dїЦфgŠ‹і+LŒ]`NшР€Ђ™b ,( ™Ћ­-Ev†Pлˆž‡ф.х~ќШž…Ѕм(6йЙџ•$ƒмЕ< YюЅ`>д6ЙX мˆ€ЇF€˜ž‡˜Ќ0Cœ–@ь<>,@8н@9АAPу ЙKJ гуЪ –I2cМИѓcŠ,њN№д˜BE3E€Х2˜эЯ0't`@бXФ ,bo3Ц‹ 0?XцO ‘sЄn8K^Y@A€ESќXYк€кЌ‚އHRђ 6$85ЖїЏчB$)ф9Џ НЧž:h0iљ(šсќЋv8yсnзe;сWх—Ю„0ІŒљьЭѕЋ-–ЄЩiE§ЮПў_нЭћоTyл@‰Б”Л€g`э:(ЬпКk qЋvv™rЋЧЧ­ТКz: н…k[ќ9Ане/wtфЎјр`о‚#ƒБKЏEРІОл?ћАЯ?+UўkŒYП;™аЅm` Ubјўnя$6ŸиbеLЗZЮЊДИЄЃ‡.џќщ/Нјыч•% Слn)ѓ№Є3&—™^Y€+ЭVQВЮџчуД!›zMid™ѓqмЕvесГ]Mп<`ЬљжзЌЄ–ЙB”@хTeв0ыП8?qkэЊљ>ш/ŸБХzјŽ*в?БЏŽMє_їђч-­sоR+жtэ^гЕcsЋџ‰=’ьжХEХлn)CЈaЎxeQь”rКJСТЇcLиіз_ЭšŽlhyпЩd•Uуw›4ŽўызkFЙ*@!є}@э3ЌQѓSЧчШЮwP|оџЮДlќІХеАЈЃ šŽmn­КџfŸњПќкК‹‹ŠЗ]”83эРЪОpрf•Ю.’ъС+,ЄŠ]OЋЊњIDATЋоŒИ§F3}ъN–TпiVDрŠцљћ… ѓЗТp'Х`[бЊ€љ –VЯйf'нbMYђX6|Зсѓ-#—ќэ1ЅŽZˆь3‹#џЌгшћj!ВюшВm+Z9ЗнRˆhУ\ёЪЬUi>ZФ"ю*Њo%dщ…цС'ЈП{эЖкЙМ™NрЉXVѕšђrф›СWF,wwLЙМфnяŸМЊX !,ь\-o^Щв ›Т?3№Ж €fŠO”2єЊkДЕЛђkbвCg|К;ьл{Б–,РЌG?бx•uЋБѕм~?К&6ћтšcЛЊжг"gSBЕw{ЛЫ[ЎgqcоvPТЬє”ЈЪЕK&QЧО;˜uпgiЃ>rСБЈІѕКUzh•Ъ6k/Ÿ)/м^ОќтŠхЗЛ|XГ†UЮaUХЮО­Я§lч"ЌЬПЃzДлНі’З]”83 А„…Ћч737ѕлќю‚KЇѕYYњgЏ.жwѓЌЏЋW4зЇ @ŽЇhЖАщ<ЩЧИhџЯOь`“—9YTЌўЭюG†nzmжХШЫY™њl]ќ+МњђБЋМ:TЖМэ Є•†5А \Ќ=pд#neQu@Ч}еNߘuШџc]Ъ]aэ"Еэ]oнžкЭœ9 @4uъ~а&цПƒŸЏ­ЩXхкнoЯЮ ГgE iѕћЅtЃPYWoV­џН–ѕvЌNёЖ €’ЄвщиЉЪES? <щ.@YF€(Ї[(2xŠ]€2‹Eм hІшРЂяO)„P4SX,ѓ€‰бў sBEм ht`@бА hXP4,dР.Ру#Р€г-”ƒ 5’Л дPщt:Йk eŠ,њN№д1…082ј‘!cУЦ0†1ц:І„(эi2†1Œa cJяS hŠшР C€E#Р€Ђ`@бА hXP4,( ŠF€E#Р€Ђ`@бА hXP4,( ŠF€E#Р€Ђ`@бА hXP4,( ŠF€E#Р€Ђ`@бА hXP4,( ŠF€E#Р€Ђ`@бА hXP4,( ŠF€E#Р€Ђ`@бА hXP4,( ŠF€E#Р€Ђ`@бА hXP4,( ŠF€E#Р€Ђ`@бА hXP4,( ŠF€E#Р€Ђ`@бА hXP4,( ŠF€E#Р€Ђ`@бА hXP4,( ŠF€E#Р€Ђ`@бА hXP4,(эџМ‹nњњыvIENDЎB`‚VeroRoute/Src/android-sources/res/drawable-mdpi/icon.png000644 001750 001750 00000001250 14206323065 023522 0ustar00alexalex000000 000000 ‰PNG  IHDR00и`nа pHYsФФ•+ZIDATX…cќџџmъэ[о1>BЭГUЎцў~ГуAѕ"Lк“YH2Ÿ‰ ::ƒQЃ"А8Ш-XdљQ§хЧє=BEˆ1BЬŸЩt7ЋйVё@ЂМ‡п|,F$IЫ(qШ(r$Ic|3—Ї<“|31ъё›?Ђl~пгЧї~<ЙџcAпSbŒx8хяЗџО?јїpЪ_bду7ŸShзк7ЛжО!ЦhxЕёпЋ„ n"Э Q6А`а9K"ј ‰ё Ÿ!#†“у й$rt †E”­œљќЪ™/•щ˜№„ЇKвУAWЮ|!ІШРРžNВсƒ.ЪƒˆŠВџ~џѓјЦ§O‹Ÿ```ИqџЫзп|œ,ВLŒьTQOРAnС"‰Eв Œ ћŸn[ѕќыя[o~ьљЧ№“щћёу їŸ}xё§'Л‡ 7ЋšGˆ$йъwЌFЏдД‡~ў}ёічў ?БУЯЗ?їџќћ‚ѕ˜Ъ]"аbg–fwdbРїL ьТьŽьЬ”ЈЧTF =ФФШЪЫІЭЭЊђ§ЯcEЉO––< Џo}љїŠŸ“E’H)QO”ƒАxŽ‘›UECQ(6V•сжЁл/Ўт+IUЂ—HutƒЮA, :&<Ф(%Rй!ЪXТг%ЩЈ‰$™ЯТ@њxЉ€$ѓ]u!0ъ B‹ƒЈ;оCЊљX„Ј;оCЊљC!ЪЈ;оCЊљXšдя!еќЁe FD :ѓrdbHn’IENDЎB`‚VeroRoute/libraries/gEDA/veroroute_linear/Generic_SIP12.sym000644 001750 001750 00000004534 13515171161 024027 0ustar00alexalex000000 000000 v 20130925 2 T 300 0 8 10 0 0 0 0 1 numslots=0 B 300 0 1400 4800 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 P 0 4600 300 4600 1 0 0 { T 205 4645 5 10 1 1 0 6 1 pinnumber=1 T 200 4600 5 10 0 1 0 0 1 pinseq=1 T 355 4595 5 10 0 1 0 0 1 pinlabel=1 T 200 4600 5 10 0 1 0 0 1 pintype=pas } P 0 4200 300 4200 1 0 0 { T 205 4245 5 10 1 1 0 6 1 pinnumber=2 T 200 4200 5 10 0 1 0 0 1 pinseq=2 T 355 4145 5 10 0 1 0 0 1 pinlabel=2 T 200 4200 5 10 0 1 0 0 1 pintype=pas } P 0 3800 300 3800 1 0 0 { T 205 3845 5 10 1 1 0 6 1 pinnumber=3 T 200 3800 5 10 0 1 0 0 1 pinseq=3 T 355 3745 5 10 0 1 0 0 1 pinlabel=3 T 200 3800 5 10 0 1 0 0 1 pintype=pas } P 0 3400 300 3400 1 0 0 { T 205 3445 5 10 1 1 0 6 1 pinnumber=4 T 200 3400 5 10 0 1 0 0 1 pinseq=4 T 355 3345 5 10 0 1 0 0 1 pinlabel=4 T 200 3400 5 10 0 1 0 0 1 pintype=pas } P 0 3000 300 3000 1 0 0 { T 205 3045 5 10 1 1 0 6 1 pinnumber=5 T 200 3000 5 10 0 1 0 0 1 pinseq=5 T 355 2945 5 10 0 1 0 0 1 pinlabel=5 T 200 3000 5 10 0 1 0 0 1 pintype=pas } P 0 2600 300 2600 1 0 0 { T 205 2645 5 10 1 1 0 6 1 pinnumber=6 T 200 2600 5 10 0 1 0 0 1 pinseq=6 T 355 2545 5 10 0 1 0 0 1 pinlabel=6 T 200 2600 5 10 0 1 0 0 1 pintype=pas } P 0 2200 300 2200 1 0 0 { T 205 2245 5 10 1 1 0 6 1 pinnumber=7 T 200 2200 5 10 0 1 0 0 1 pinseq=7 T 355 2145 5 10 0 1 0 0 1 pinlabel=7 T 200 2200 5 10 0 1 0 0 1 pintype=pas } P 0 1800 300 1800 1 0 0 { T 205 1845 5 10 1 1 0 6 1 pinnumber=8 T 200 1800 5 10 0 1 0 0 1 pinseq=8 T 355 1745 5 10 0 1 0 0 1 pinlabel=8 T 200 1800 5 10 0 1 0 0 1 pintype=pas } P 0 200 300 200 1 0 0 { T 205 245 5 10 1 1 0 6 1 pinnumber=12 T 200 200 5 10 0 1 180 6 1 pinseq=12 T 355 195 5 10 0 1 0 0 1 pinlabel=12 T 200 200 5 10 0 1 180 6 1 pintype=pas } P 0 600 300 600 1 0 0 { T 205 645 5 10 1 1 0 6 1 pinnumber=11 T 200 600 5 10 0 1 180 6 1 pinseq=11 T 355 595 5 10 0 1 0 0 1 pinlabel=11 T 200 600 5 10 0 1 180 6 1 pintype=pas } P 0 1000 300 1000 1 0 0 { T 205 1045 5 10 1 1 0 6 1 pinnumber=10 T 200 1000 5 10 0 1 180 6 1 pinseq=10 T 355 995 5 10 0 1 0 0 1 pinlabel=10 T 200 1000 5 10 0 1 180 6 1 pintype=pas } P 0 1400 300 1400 1 0 0 { T 205 1445 5 10 1 1 0 6 1 pinnumber=9 T 200 1400 5 10 0 1 180 6 1 pinseq=9 T 355 1395 5 10 0 1 0 0 1 pinlabel=9 T 200 1400 5 10 0 1 180 6 1 pintype=pas } T 1200 4955 5 10 1 1 0 0 1 device=Name T 300 4955 8 10 1 1 0 0 1 refdes=U? T 1600 2055 8 10 0 1 0 0 1 footprint=SIP12 T 1900 1845 8 10 0 1 0 0 1 description=Generic 12 Pin SIP VeroRoute/Src/images/bot.png000644 001750 001750 00000000317 14064443243 016227 0ustar00alexalex000000 000000 ‰PNG  IHDR йsВbKGDџ‡ЬП pHYs з зB(›xtIMEх;ЦгŠ-`IDATHЧc`Ѓ` РˆUє?ёъ™hу\nРЂšf.РцЌjiшt7рPIS ЛЇ:ŠЌ`P`"Ъ}ИьџТРNYќcр!Ќш?~iІAџSfѕŸ4P| LU† вIENDЎB`‚VeroRoute/veroroute.1000644 001750 001750 00000002260 14562414722 015057 0ustar00alexalex000000 000000 .TH veroroute 1 .SH NAME veroroute \- Qt based Veroboard/Perfboard/PCB layout and routing application .SH SYNOPSIS .B veroroute [\fIOPTION\fR] [\fIFILE\fR] .SH DESCRIPTION Starts the application and opens the FILE (a VeroRoute VRT file). .SH OPTIONS .TP .BR \-h ", " \-\-help\fR display help and exit .TP .BR \-v ", " \-\-version\fR display version information and exit .TP .BR \-p " " \fIPATH\fR specify the path to the 'tutorials' directory. .RS By default the application looks for the 'tutorials' directory in the same location as the binary. If not found, then it tries a location relative to the binary. .RE .RS For example, if the veroroute binary is in ~/sandbox/usr/bin/ .RE .RS then it will look for the 'tutorials' directory in ~/sandbox/usr/share/veroroute/ .RE .RS If not found in the relative location, it will look for the 'tutorials' directory in /usr/share/veroroute/ .RE .SH AUTHOR Written by Alex Lawrow. .SH COPYRIGHT Copyright (C) 2017-2024 Alex Lawrow .PP License GPLv3+: GNU GPL version 3 or later . .PP This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. VeroRoute/libraries/gEDA/veroroute_bbd/000755 001750 001750 00000000000 14405612071 020311 5ustar00alexalex000000 000000 VeroRoute/libraries/gEDA/veroroute_linear/OpAmp_LM324.sym000644 001750 001750 00000002676 13515171161 023437 0ustar00alexalex000000 000000 v 20130925 2 T 200 1100 5 10 0 0 0 0 1 slot=1 T 200 1300 5 10 0 0 0 0 1 numslots=4 T 200 1500 5 10 0 0 0 0 1 slotdef=1:3,2,4,11,1 T 200 1700 5 10 0 0 0 0 1 slotdef=2:5,6,4,11,7 T 200 1900 5 10 0 0 0 0 1 slotdef=3:10,9,4,11,8 T 200 2100 5 10 0 0 0 0 1 slotdef=4:12,13,4,11,14 P 0 200 200 200 1 0 0 { T 150 250 5 8 1 1 0 6 1 pinnumber=3 T 150 250 5 8 0 0 0 0 1 pinseq=1 T 150 250 5 8 0 0 0 0 1 pinlabel=IN+ T 150 250 5 8 0 0 0 0 1 pintype=in } P 0 600 200 600 1 0 0 { T 150 650 5 8 1 1 0 6 1 pinnumber=2 T 150 650 5 8 0 0 0 0 1 pinseq=2 T 150 650 5 8 0 0 0 0 1 pinlabel=IN- T 150 650 5 8 0 0 0 0 1 pintype=in } P 500 600 500 800 1 0 1 { T 550 600 5 8 1 1 0 0 1 pinnumber=4 T 550 600 5 8 0 0 0 0 1 pinseq=3 T 475 575 9 8 1 1 0 5 1 pinlabel=V+ T 550 600 5 8 0 0 0 0 1 pintype=pwr } P 500 200 500 0 1 0 1 { T 550 100 5 8 1 1 0 0 1 pinnumber=11 T 550 100 5 8 0 0 0 0 1 pinseq=4 T 450 200 9 8 1 1 0 3 1 pinlabel=V- T 550 100 5 8 0 0 0 0 1 pintype=pwr } P 800 400 1000 400 1 0 1 { T 850 450 5 8 1 1 0 0 1 pinnumber=1 T 850 450 5 8 0 0 0 0 1 pinseq=5 T 850 450 5 8 0 0 0 0 1 pinlabel=OUT T 850 450 5 8 0 0 0 0 1 pintype=out } L 200 800 200 0 3 0 0 0 -1 -1 L 200 800 800 400 3 0 0 0 -1 -1 L 800 400 200 0 3 0 0 0 -1 -1 L 300 250 300 150 3 0 0 0 -1 -1 L 250 200 350 200 3 0 0 0 -1 -1 L 250 600 350 600 3 0 0 0 -1 -1 T 600 900 5 10 1 1 0 0 1 device=LM324 T 200 900 8 10 1 1 0 0 1 refdes=U? T 200 1100 8 10 0 0 0 0 1 footprint=DIP14 T 200 1100 8 10 0 0 0 0 1 description=Quad Op Amp VeroRoute/libraries/gEDA/veroroute_transistor/JFET_Nchannel_2N5458.sym000644 001750 001750 00000001551 13515171161 025752 0ustar00alexalex000000 000000 v 20130925 2 T 100 500 5 10 0 0 0 0 1 numslots=0 P 100 500 400 500 1 0 0 { T 100 350 5 6 1 1 0 0 1 pinnumber=3 T 100 350 5 6 0 0 0 0 1 pinseq=3 T 100 350 5 6 0 0 0 0 1 pinlabel=3 T 100 350 5 6 0 0 0 0 1 pintype=pas } P 600 1000 600 800 1 0 0 { T 500 850 5 6 1 1 0 0 1 pinnumber=1 T 500 850 5 6 0 0 0 0 1 pinseq=1 T 500 850 5 6 0 0 0 0 1 pinlabel=1 T 500 850 5 6 0 0 0 0 1 pintype=pas } P 600 200 600 0 1 0 1 { T 500 50 5 6 1 1 0 0 1 pinnumber=2 T 500 50 5 6 0 0 0 0 1 pinseq=2 T 500 250 5 6 1 1 0 0 1 pinlabel=S T 500 50 5 6 0 0 0 0 1 pintype=pas } L 400 800 600 800 3 0 0 0 -1 -1 L 400 200 600 200 3 0 0 0 -1 -1 L 400 900 400 100 3 0 0 0 -1 -1 L 300 600 400 500 3 0 0 0 -1 -1 L 400 500 300 400 3 0 0 0 -1 -1 T 700 700 5 10 1 1 0 0 1 device=2N5458 T 700 400 8 10 1 1 0 0 1 refdes=Q? T 595 95 8 10 0 0 0 0 1 footprint=TO92 T 595 95 8 10 0 0 0 0 1 description=N-Channel JFET VeroRoute/libraries/TinyCAD/VeroRoute_Regulator.TCLib000644 001750 001750 00000176000 13515171160 023004 0ustar00alexalex000000 000000 SQLite format 3@ Bћћ.!%%‚tableSymbolSymbolCREATE TABLE [Symbol] ([SymbolID] INTEGER PRIMARY KEY,[Data] TEXT)ƒ8!†9tableNameNameCREATE TABLE [Name] ([NameID] INTEGER PRIMARY KEY,[Name] TEXT,[SymbolID] INTEGER,[Type] INTEGER,[Reference] TEXT,[ppp] INTEGER,[Description] TEXT,[ShowName] INTEGER,[ShowRef] INTEGER,[DefRotate] INTEGE Ч PкLЪpP›››Н] aIMeanwell SPR01 SeriesU?DC-DC Con'K9ILM336/LM385+D?Reference DiodeЧ„)yICL7660U?Charge Pump DC-DC ConverterЧ)!=LM336D?RefereI 9ILM336/LM3853D?Reference Diode=! !ITL4314D?Reference Diode= 91LM137/LM337U?Regulator1 !1LM317U?RegulatorA )ILM78LxxU?Regulator 100mA9 %=LM78xxU?Regulator 1AS )mLM79LxxU?Negative Regulator 100mAO %iLM79xx U?Negative Regulator 1.5AU %uLP2950#U?Regulator 100mA Micropower9!=TL431$D?Reference IC$L?чЩФПКЕАЋІЁœь—’ˆƒниЮ~ytojeёті`г[VQћL0šd -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 =м ю  ю <;:$  &&[‚2!11„tableAttributeAttributeCREATE TABLE [Attribute] ([AttributeID] INTEGER PRIMARY KEY,[NameID] INTEGER,[AttName] TEXT,[AttValue] TEXT,[ShowAtt] INTEGER)"!51aindexidx_NameIDAttributeCREATE INDEX [idx_NameID] ON [Attribute] ( [NameID] ) ММ -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 CAP+ GND CAP- -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Gnd Out In ++‡U‡R ( -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 In Out ММ -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Adjust centre_name='0'> Adjust centre_name='0'> Adjust ((‡U. -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Gnd Out In centre_name='0'> Adjust centre_name='0'> Adjust ppЊф@zœж0jЄЦЦЦЦЦЦЦ8i$$SPICE_PROLOG_PRIORITY58i$$SPICE_EPIL8i$$SPICE_PROLOG_PRIORITY58:i$$SPICE_PROLOG_PRIORITY5:i$$SPICE_EPILOG_PRIORITY5 )PackageDIP887i$$SPICE_PROLOG_PRIORITY588i$$SPICE_EPILOG_PRIORITY5 9)!PackageTO2208:i$$SPICE_PROLOG_PRIORITY58;i$$SPICE_EPILOG_PRIORITY5 <)!PackageTO2208=i$$SPICE_PROLOG_PRIORITY58>i$$SPICE_EPILOG_PRIORITY5?)PackageTO928@i$$SPICE_PROLOG_PRIORITY58Ai$$SPICE_EPILOG_PRIORITY5 B)!PackageTO2208Fi$$SPICE_PROLOG_PRIORITY5 ~њњ4TŽШъ$^ЦŒl2јиІІІ„dti$$SPICE_ET)PackageTO928Si$$SPICE_EPILOG_PRIORITY58R~:i$$SPICE_EPILOG_PRIORITY58Gi$$SPICE_EPILOG_PRIORITY5H)PackageTO928Ii$$SPICE_PROLOG_PRIORITY58Ji$$SPICE_EPILOG_PRIORITY5 K)!PackageTO2208Li$$SPICE_PROLOG_PRIORITY58Mi$$SPICE_EPILOG_PRIORITY5N)PackageTO92Z)PackageTO92Юi$$SPICE_EPILOG_PRIORITY5c)!PackageTO928bi!$$SPICE_EPILOG_PRIORITY58ai!$$SPICE_PROLOG_PRIORITY5`) PackageTO928_i $$SPICE_EPILOG_PRIORITY58^i $$SPICE_PROLOG_PRIORITY5LOR>000000 centre_name='0'> Adjust ММ‡R ( -10 0 400 0 0 0 0 Arial 000000 1 Œ9,˜v -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 In Out ((‡U. -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Gnd Out In цце( -10 0 400 0 0 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Gnd Out In ЂQЂ1Ж№*J„ОіМр‚H8Pi$$SPICE_EPILOG_PRIORITY58Oi$$SPICE_PROL‹$(–L -10 0 400 0 0 0 0 Arial 000000 1 -1 -10 0 400 0 0 0 0 Arial 000000 1 -1 ((‡U#. -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Gnd Out In ((‡U. -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Gnd Out In ((‡U. -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Gnd Out In ММЪpЧНН] aIMeanwell SPR01 SeriesU?DC-DC ConverterY )yICL7660U?Charge Pump DY )yICL7660U?Charge Pump DC-DC Converter7 !=LM336D?Reference IC7 !=LM385D?Reference IC? 1=LM385-ADJDŒ9-˜v -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 000000 ((‡U. -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Gnd Out In ((‡U. -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Gnd Out In %%‡X4 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Adjust Out In %%‡X4 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Adjust Out In ((‡U. -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Gnd Out In ((‡U. -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Gnd Out In ((‡U. -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Gnd Out In ((‡U. -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Gnd Out In ((‡U. -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Gnd Out In ((‡U . -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Gnd Out In ((ll‡U. -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Gnd Out In ((‡U. -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Gnd Out In ЂЂQ‡U#. -10 0 -10 0 400 0 0 0 0 Arial 000000 1 -1 -10 0 400 0 0 0 0 Arial 000000 1 -1 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Gnd Out In LOR>000000 LOR>000000 s='0' centre_name='0'> ТТŒ3)˜j -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Adjust ММŒ9*˜v -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Adjust ММŒ90˜v -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Adjust ММŒ91˜v -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Adjust ММŒ92˜v -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Adjust ММŒ94˜v -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 VeroRoute/Src/images/layerbot.png000644 001750 001750 00000001022 13734471231 017257 0ustar00alexalex000000 000000 ‰PNG  IHDR szzєbKGDљCЛ pHYsФФ•+tIMEф  )˜pYŸIDATXУХ—=в‚0@п~CЃЇбF;'Д^СVузz[ь;*=–kcФѓУŒ[Щ М—ЭВId_жќ2ўјqd lыRЗuЉ9я(|77Ч‡ѕй TUўЋ“Œ"А9Ў>~жчpг4ђМжTщanc2™8С§0ЦXBEМS Ж‘’‘Т5њXpŽH‘:bcŒ§O–HсЊъ№X"ЂЊ“ъО€…cМCХZˆHє‡H…жHЁЊЏд$[’@7В/ыЈШЬдGŸ(vЇ ЊZКХ‘š‘0РюTсtDВ2тьЫк/0ŸЯИ^ЏQ"<›ЭИ\.<$ќZ |#ЇџU‚ж‚Ёч\k„ё‹ ‚љ.ђжˆhb'™ЌчT4њЃ}—`QкH2Рн ФзРрW D}#‚QлЖ,‹qDzрћ§.гщдпˆкЖHљю6#og‹‰{7ЅМ\.эЕПXsМ9ЎоРЗлЭyЦЪ€*жЁХЦј§Mfzш}у{к–_m<luf.э­;IENDЎB`‚VeroRoute/libraries/gEDA/veroroute_regulator/LM78Lxx.sym000644 001750 001750 00000001443 13515171161 023506 0ustar00alexalex000000 000000 v 20130925 2 T 1700 800 5 10 0 0 0 0 1 numslots=0 P 1700 800 2000 800 1 0 1 { T 1800 900 5 10 1 1 0 0 1 pinnumber=1 T 1800 900 5 10 0 0 0 0 1 pinseq=1 T 1600 700 9 10 1 1 0 6 1 pinlabel=Out T 1800 900 5 10 0 0 0 0 1 pintype=pas } P 0 800 300 800 1 0 0 { T 200 900 5 10 1 1 0 6 1 pinnumber=3 T 200 900 5 10 0 0 0 0 1 pinseq=3 T 400 700 9 10 1 1 0 0 1 pinlabel=In T 200 900 5 10 0 0 0 0 1 pintype=pas } P 1000 0 1000 300 1 0 0 { T 1100 100 5 10 1 1 0 0 1 pinnumber=2 T 1100 100 5 10 0 0 0 0 1 pinseq=2 T 1100 100 5 10 0 0 0 0 1 pinlabel=2 T 1100 100 5 10 0 0 0 0 1 pintype=pas } B 300 300 1400 1000 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 T 600 1100 5 10 1 1 0 0 1 device=LM78Lxx T 1100 1400 8 10 1 1 0 6 1 refdes=U? T 1800 1400 8 10 0 0 0 6 1 footprint=TO92 T 1800 1400 8 10 0 0 0 6 1 description=Regulator 100mA VeroRoute/libraries/gEDA/veroroute_passive/Capacitor_Ceramic.sym000644 001750 001750 00000001276 13515171161 025325 0ustar00alexalex000000 000000 v 20130925 2 T 200 700 5 10 0 0 0 0 1 numslots=0 P 200 700 400 700 1 0 0 { T 350 750 5 8 1 1 0 6 1 pinnumber=1 T 350 750 5 8 0 0 0 6 1 pinseq=1 T 350 750 5 8 0 0 0 6 1 pinlabel=1 T 350 750 5 8 0 0 0 6 1 pintype=pas } P 1100 700 900 700 1 0 0 { T 950 750 5 8 1 1 0 0 1 pinnumber=2 T 950 750 5 8 0 0 0 0 1 pinseq=2 T 950 750 5 8 0 0 0 0 1 pinlabel=2 T 950 750 5 8 0 0 0 0 1 pintype=pas } L 600 900 600 500 3 0 0 0 -1 -1 L 900 700 700 700 3 0 0 0 -1 -1 L 600 700 400 700 3 0 0 0 -1 -1 L 700 900 700 500 3 0 0 0 -1 -1 T 500 300 5 10 1 1 0 0 1 device=820p T 500 1000 8 10 1 1 0 0 1 refdes=C? T 0 100 8 10 0 0 0 0 1 footprint=CAP_CERAMIC T 0 100 8 10 0 0 0 0 1 description=Ceramic Capacitor (default length) VeroRoute/libraries/gEDA/veroroute_transistor/JFET_Nchannel_2N5457.sym000644 001750 001750 00000001551 13515171161 025751 0ustar00alexalex000000 000000 v 20130925 2 T 100 500 5 10 0 0 0 0 1 numslots=0 P 100 500 400 500 1 0 0 { T 100 350 5 6 1 1 0 0 1 pinnumber=3 T 100 350 5 6 0 0 0 0 1 pinseq=3 T 100 350 5 6 0 0 0 0 1 pinlabel=3 T 100 350 5 6 0 0 0 0 1 pintype=pas } P 600 1000 600 800 1 0 0 { T 500 850 5 6 1 1 0 0 1 pinnumber=1 T 500 850 5 6 0 0 0 0 1 pinseq=1 T 500 850 5 6 0 0 0 0 1 pinlabel=1 T 500 850 5 6 0 0 0 0 1 pintype=pas } P 600 200 600 0 1 0 1 { T 500 50 5 6 1 1 0 0 1 pinnumber=2 T 500 50 5 6 0 0 0 0 1 pinseq=2 T 500 250 5 6 1 1 0 0 1 pinlabel=S T 500 50 5 6 0 0 0 0 1 pintype=pas } L 400 800 600 800 3 0 0 0 -1 -1 L 400 200 600 200 3 0 0 0 -1 -1 L 400 900 400 100 3 0 0 0 -1 -1 L 300 600 400 500 3 0 0 0 -1 -1 L 400 500 300 400 3 0 0 0 -1 -1 T 700 700 5 10 1 1 0 0 1 device=2N5457 T 700 400 8 10 1 1 0 0 1 refdes=Q? T 595 95 8 10 0 0 0 0 1 footprint=TO92 T 595 95 8 10 0 0 0 0 1 description=N-Channel JFET VeroRoute/libraries/gEDA/veroroute_transistor/JFET_Nchannel_BF245.sym000644 001750 001750 00000001550 13515171161 025666 0ustar00alexalex000000 000000 v 20130925 2 T 100 500 5 10 0 0 0 0 1 numslots=0 P 100 500 400 500 1 0 0 { T 100 350 5 6 1 1 0 0 1 pinnumber=1 T 100 350 5 6 0 0 0 0 1 pinseq=1 T 100 350 5 6 0 0 0 0 1 pinlabel=1 T 100 350 5 6 0 0 0 0 1 pintype=pas } P 600 1000 600 800 1 0 0 { T 500 850 5 6 1 1 0 0 1 pinnumber=3 T 500 850 5 6 0 0 0 0 1 pinseq=3 T 500 850 5 6 0 0 0 0 1 pinlabel=3 T 500 850 5 6 0 0 0 0 1 pintype=pas } P 600 200 600 0 1 0 1 { T 500 50 5 6 1 1 0 0 1 pinnumber=2 T 500 50 5 6 0 0 0 0 1 pinseq=2 T 500 250 5 6 1 1 0 0 1 pinlabel=S T 500 50 5 6 0 0 0 0 1 pintype=pas } L 400 800 600 800 3 0 0 0 -1 -1 L 400 200 600 200 3 0 0 0 -1 -1 L 400 900 400 100 3 0 0 0 -1 -1 L 300 600 400 500 3 0 0 0 -1 -1 L 400 500 300 400 3 0 0 0 -1 -1 T 700 700 5 10 1 1 0 0 1 device=BF245 T 700 400 8 10 1 1 0 0 1 refdes=Q? T 595 95 8 10 0 0 0 0 1 footprint=TO92 T 595 95 8 10 0 0 0 0 1 description=N-Channel JFET VeroRoute/libraries/gEDA/veroroute_transistor/NPN_BC637.sym000644 001750 001750 00000001562 13515171161 023770 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=3 T 100 550 5 6 0 0 0 0 1 pinseq=3 T 100 550 5 6 0 0 0 0 1 pinlabel=3 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=2 T 400 850 5 6 0 0 0 0 1 pinseq=2 T 400 850 5 6 0 0 0 0 1 pinlabel=2 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=1 T 400 50 5 6 0 0 0 0 1 pinseq=1 T 400 50 5 6 0 0 0 0 1 pinlabel=1 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 403,209 L 501,200 L 431,273 L 425,240 z T 600 700 5 10 1 1 0 0 1 device=BC637 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=NPN Transistor VeroRoute/Src/images/addarc.png000644 001750 001750 00000001015 13734462775 016673 0ustar00alexalex000000 000000 ‰PNG  IHDR szzєbKGDљCЛ pHYsФФ•+tIMEф &5лсЇšIDATXУХWЛn„0мБ(ЅK Ј)N:ЅЪћŠ|dОтТOœDAЭIwJКMŒьХ6ВХYцf<Гь8ЯЩЌч—ŽкІf"ЂялhуRrЁmj.•‡Šюоyw{зОКnД”™žЛЪД!К'ŠbД„ЛђƒЫC5ыўЖЉ“7цПї8ЯGнЎi›ккМХc™Щ?–dЖžYdWs с”ЎWы733рЧ`fžCr›6ќДЏ„ˆН^"NђДDDЎ}! \ф˜yD" ;Am}žNA 4ы‰l-ИоуRKЪmк%IЈ5р_Чуp=ЯS#fOьSkNО2,:œдdЃM”ЫџEY O{ђI„ }Op–RхЧЫeŸ4”@16$cя#ЙE­‘{Sf5qз ЉoF(}уљRи b=\ђюр (%х‹!сЕA€kљЉ(ь8N1’‡СцHC >В …мв—<ў…dІЯІђуЁ?^Њ‚™ћ"љр§2šыѕ2=([ `]ПЖVщwФтEIENDЎB`‚VeroRoute/Src/Board_components.cpp000644 001750 001750 00000136700 14427720201 017471 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #include "Board.h" // Methods for component creation/destruction void Board::DestroyComponent(Component& comp) // Destroys a component on the board { TakeOff(comp); // Float the component m_nodeInfoMgr.RemoveComp(comp); // Remove the component NodeInfo from m_nodeInfoMgr m_groupMgr.RemoveComp(comp.GetId()); // Remove the component from m_groupMgr m_compMgr.DestroyComp(comp); // Destroy the component in the m_compMgr } int Board::CreateComponent(int iRow, int iCol, COMP eType, const Component* pComp) { assert( pComp == nullptr || pComp->GetType() == eType ); // Sanity check assert( eType != COMP::INVALID ); // Try and produce a simple unique Name for the new part if possible std::string nameStr; // We'll use this string for both Name and Value const std::string prefixStr = ( pComp ) ? pComp->GetPrefixStr() : CompTypes::GetDefaultPrefixStr(eType); // e.g. "C" for capacitors if ( !prefixStr.empty() ) { // Append number to prefixStr bool bNameExists(true); for (int iSuffix = 1; iSuffix < INT_MAX && bNameExists; iSuffix++) { nameStr = prefixStr + std::to_string(iSuffix); // e.g. "C1" bNameExists = ( m_compMgr.GetComponentIdFromName(nameStr) != BAD_COMPID ); } } const size_t numPins = ( pComp ) ? pComp->GetNumPins() : static_cast( CompTypes::GetDefaultNumPins(eType) ); std::vector nodeList; nodeList.resize(numPins, BAD_NODEID); Component tmp(nameStr, nameStr, eType, nodeList); if ( pComp ) { tmp = *pComp; tmp.SetId(0); tmp.SetNameStr(nameStr); tmp.SetValueStr(nameStr); tmp.SetIsPlaced(false); tmp.ClearNodeIds(); // If pComp has a sensible Value field, then use it if ( pComp->GetValueStr() != pComp->GetNameStr() ) tmp.SetValueStr( pComp->GetValueStr() ); if ( pComp->GetNameStr().empty() && pComp->GetValueStr().empty() ) // This may be typical for some pads { tmp.SetNameStr(""); tmp.SetValueStr(""); } } const bool bDoPlace = ( pComp == nullptr || pComp->GetIsTemplate() ); // Leave copied components floating return AddComponent(iRow, iCol, tmp, bDoPlace); } int Board::AddComponent(int iRow, int iCol, const Component& tmp, bool bDoPlace) { // Adds a new component to the board, and returns its compId assert( tmp.GetType() != COMP::INVALID ); const int compId = m_compMgr.CreateComp(tmp, GetUsePCBshapes() ); // CompMgr makes a copy of tmp and returns its compId if ( compId == INT_MAX ) return BAD_COMPID; // Reached component limit !!! Component& comp = m_compMgr.GetComponentById( compId ); assert( comp.GetType() != COMP::INVALID ); m_nodeInfoMgr.AddComp(comp); assert( !comp.GetIsPlaced() ); // Sanity check. Should not be placed yet if ( !bDoPlace ) return compId; if ( iRow != -1 && iCol != -1 ) // If we passed in a valid row and col { // Put the component in the top left of the current visible view. // Grow the board and float the component if necessary. iRow = std::max(0, std::min(GetRows()-1, iRow)); iCol = std::max(0, std::min(GetCols()-1, iCol)); const int incRows = std::max(iRow + comp.GetRows() - GetRows(), 0); const int incCols = std::max(iCol + comp.GetCols() - GetCols(), 0); if ( incRows > 0 || incCols > 0 ) GrowThenPan(0, incRows, incCols, 0, 0); comp.SetRow(iRow); comp.SetCol(iCol); comp.SetDirection('W'); PutDown(comp); } else { // Try place the component in free space on the board. Just used for Import() method bool bOK(false); while( !bOK ) { for (int iRow = 0; iRow <= GetRows() - comp.GetCompRows() && !bOK; iRow++) for (int iCol = 0; iCol <= GetCols() - comp.GetCompCols() && !bOK; iCol++) { comp.SetRow(iRow); comp.SetCol(iCol); comp.SetDirection('W'); bOK = PutDown(comp); // false ==> the component has to float } if ( !bOK ) Pan(1, 0); // No free board space, so pan the board down } } return compId; } void Board::AddTextBox(int iRow, int iCol) { // Put the text in the top left of the current visible view. // Grow the board if necessary. iRow = std::max(0, std::min(GetRows()-1, iRow)); iCol = std::max(0, std::min(GetCols()-1, iCol)); const int iOldTextId = GetCurrentTextId(); const int iTextId = m_textMgr.AddNewRect(iRow, iCol); SetCurrentTextId(iTextId); TextRect& rect = m_textMgr.GetTextRectById(iTextId); if ( iOldTextId != BAD_TEXTID ) { rect = m_textMgr.GetTextRectById(iOldTextId); // Copy old rect rect.Move(iRow - rect.m_rowMin, iCol - rect.m_colMin); // Move it to the top left of the view } const int incRows = std::max(iRow + rect.GetRows() - GetRows(), 0); const int incCols = std::max(iCol + rect.GetCols() - GetCols(), 0); if ( incRows > 0 || incCols > 0 ) GrowThenPan(0, incRows, incCols, 0, 0); } // Methods for component placement/removal bool Board::CanPutDown(Component& comp) // Checks if its possible to place the (floating) component on the board { if ( comp.GetIsPlaced() ) return false; // Already on board const bool bAllowWireCross = GetWireCross(); const bool bAllowHoleShare = GetWireShare(); const bool bDiagsOK = GetDiagsMode() != DIAGSMODE::OFF; const bool bWire = comp.GetType() == COMP::WIRE; // Wire's only get NodeIDs while placed const bool bSOIC = comp.GetIsSOIC(); const bool bMark = comp.GetType() == COMP::MARK; // Marker can go anywhere without a pin or SOIC pattern const bool bTrax = comp.GetType() == COMP::TRACKS; const int& compCols = comp.GetCompCols(); const int& compRows = comp.GetCompRows(); const int& compLyr = comp.GetLyr(); assert(bTrax || compLyr == 0); const int& rowTL = comp.GetRow(); const int& colTL = comp.GetCol(); const int& boardCols = GetCols(); const int& boardRows = GetRows(); if ( bSOIC && !GetHaveTopLyr() ) return false; // SOIC parts need to use top layer if ( bAllowHoleShare && bWire ) { // pA and pB are the opposite ends of the wire Element* pA = Get(compLyr, rowTL, colTL); assert( pA ); Element* pB = Get(compLyr, rowTL+compRows-1, colTL+compCols-1); assert( pB ); assert( !pA->GetCompExists(comp.GetId()) && !pB->GetCompExists(comp.GetId()) ); if ( pA->GetWireExists(pB) || pB->GetWireExists(pA) ) return false; // No duplicates !!! } // Check limits const bool bLimitsOK = ( compRows <= boardRows && compCols <= boardCols ); if ( !bLimitsOK ) return false; bool bOK(true); int jRow(rowTL); for (int j = 0; j < compRows && bOK; j++, jRow++) { int iCol(colTL); for (int i = 0; i < compCols && bOK; i++, iCol++) { const CompElement* pComp = comp.GetCompElement(j, i); const Element* pGrid = Get(compLyr, jRow, iCol); if ( bTrax ) { const int traxNodeId = pComp->GetNodeId(); assert( traxNodeId == BAD_NODEID || pComp->ReadFlagBits(RECTSET) ); // Sanity check bOK = ( traxNodeId == BAD_NODEID ) || ( traxNodeId == pGrid->GetNodeId() ) || ( !pGrid->GetLyrHasPin() && pGrid->GetNodeId() == BAD_NODEID && !pGrid->GetIsHole() && !(pGrid->GetSoicProtected() && traxNodeId != BAD_NODEID) ); if ( !bOK ) // Special check for unpainted wires on the board { // If have blank wire ... if ( pGrid->GetHasWire() && pGrid->GetNodeId() == BAD_NODEID && !pGrid->GetIsHole() ) { const CompElement* pTraxEnd(nullptr); // The point in trax corresponding to the other wire end for (int iSlot = 0; iSlot < 2 && bOK; iSlot++) { Element* pW = pGrid->GetW(iSlot); if ( pW == nullptr ) continue; int jj(0), ii(0); // row,col of wire end (w.r.t. board) GetRowCol(pW, jj, ii); const int jEndRow(j + jj - jRow), jEndCol(i + ii - iCol); // row, col of wire end (w.r.t. comp) if ( jEndRow >= 0 && jEndRow < compRows && jEndCol >= 0 && jEndCol < compCols ) pTraxEnd = comp.GetCompElement(jEndRow, jEndCol); bOK = pTraxEnd == nullptr || pTraxEnd->GetNodeId() == traxNodeId || pTraxEnd->GetNodeId() == BAD_NODEID; } } } if ( bOK && bDiagsOK ) { // Check for crossing diagonals if ( j > 0 && i > 0 && pComp->GetUsed(NBR_LT) && pGrid->GetNbr(NBR_L)->GetUsed(NBR_RT) ) bOK = false; if ( j < compRows-1 && i < compCols-1 && pComp->GetUsed(NBR_RB) && pGrid->GetNbr(NBR_R)->GetUsed(NBR_LB) ) bOK = false; if ( j > 0 && i < compCols-1 && pComp->GetUsed(NBR_RT) && pGrid->GetNbr(NBR_R)->GetUsed(NBR_LT) ) bOK = false; if ( j < compRows-1 && i > 0 && pComp->GetUsed(NBR_LB) && pGrid->GetNbr(NBR_L)->GetUsed(NBR_RB) ) bOK = false; } } else { const uchar& boardSurface = pGrid->GetSurface(); const uchar& compSurface = pComp->GetSurface(); const uchar& boardHoleUse = pGrid->GetHoleUse(); const uchar& compHoleUse = pComp->GetHoleUse(); const uchar& boardSoicChar = pGrid->GetSoicChar(); const uchar& compSoicChar = pComp->GetSoicChar(); // Check surface and hole use. // Need separate checks for SURFACE_FREE since that can be // added to anything including SURFACE_HOLE. bOK = ( boardSurface == SURFACE_FREE ) || ( compSurface == SURFACE_FREE ) || ( boardSurface + compSurface <= SURFACE_FULL ); bOK &= ( boardHoleUse + compHoleUse <= HOLE_FULL ); bOK &= ( !GetHaveTopLyr() || !(compSoicChar & SOIC_TRACKS_TOP) || Get( LYR_TOP, jRow, iCol)->GetNodeId() == BAD_NODEID ); // Cannot place SOIC if board is painted in top SOIC tracks area bOK &= ( !(compSoicChar & SOIC_TRACKS_BOT) || Get( LYR_BOT, jRow, iCol)->GetNodeId() == BAD_NODEID ); // Cannot place SOIC if board is painted in bottom SOIC tracks area bOK &= ( boardSoicChar + compSoicChar <= SOIC_FULL ); bOK &= ( !pGrid->GetIsMark() || (compSoicChar & (SOIC_TRACKS_TOP | SOIC_TRACKS_BOT)) == 0 ); bOK &= ( !bWire || bAllowHoleShare || ( boardHoleUse + compHoleUse <= HOLE_WIRE ) ); bOK &= ( !bWire || bAllowWireCross || ( boardSurface <= ( bAllowHoleShare ? SURFACE_WIRE_END | SURFACE_GAP : SURFACE_GAP ) ) ); if ( !bOK ) continue; // Check pins if ( bMark ) // Marker can go anywhere except for pins, holes, SOIC pattern areas (or other marker) { bOK = !pGrid->GetHasPin() && !pGrid->GetIsHole() && !pGrid->GetIsMark() && (boardSoicChar & (SOIC_TRACKS_TOP | SOIC_TRACKS_BOT)) == 0; } else if ( pComp->GetIsHole() ) // Check holes { // We've already checked the boardSurface is SURFACE_FREE // Now test it is not a marker and not painted on any board layer bOK = !pGrid->GetIsMark() && pGrid->GetNodeId() == BAD_NODEID && ( pGrid->GetNbr(NBR_X) == nullptr || pGrid->GetNbr(NBR_X)->GetNodeId() == BAD_NODEID ); } else { const size_t pinIndex = pComp->GetPinIndex(); if ( pinIndex == BAD_PININDEX ) continue; bOK = !pGrid->GetIsMark(); // Pin can't go on marker if ( !bOK ) continue; // Check relevant layer to get nodeID for pin const Element* p = ( bSOIC || pGrid->GetHasPinSOIC() ) ? ( LYR_TOP == compLyr ? pGrid : pGrid->GetNbr(NBR_X) ) : pGrid; assert(p); const int& nodeId = p->GetNodeId(); // Read nodeID on board const int& iCompNodeId = comp.GetNodeId(pinIndex); // Read component nodeID if ( bWire ) // Wires have no NodeId. Need matching IDs on both ends assert( iCompNodeId == BAD_NODEID ); // Shouldn't have an ID yet else // Regular component ... { bOK = p->GetHasPin() ? ( nodeId == iCompNodeId ) // Need matching node ID : ( nodeId == BAD_NODEID || nodeId == iCompNodeId ); // Need no node ID or matching node ID if ( bOK && ( p->GetHasPinTH() || (pComp->GetSoicChar() & SOIC_THL_COMP)) ) // Check for short-circuit between layers { Element* q = p->GetNbr(NBR_X); if ( q != nullptr && q != p ) { const int& nodeId = q->GetNodeId(); // Read nodeId on other board layer bOK = ( nodeId == BAD_NODEID || nodeId == iCompNodeId ); // Need no node ID or matching ID } } } } } } } if ( bOK && bWire ) { // Check for short-circuit in this layer assert( compLyr == 0 ); Element* pW0 = Get(compLyr, rowTL, colTL); assert( pW0 ); Element* pW1 = Get(compLyr, rowTL+compRows-1, colTL+compCols-1); assert( pW1 ); bOK = pW0->GetNodeId() == BAD_NODEID || pW1->GetNodeId() == BAD_NODEID || pW0->GetNodeId() == pW1->GetNodeId(); if ( bOK ) { // Look at other layer Element* qW0 = pW0->GetNbr(NBR_X); Element* qW1 = pW1->GetNbr(NBR_X); if ( qW0 != nullptr && qW1 != nullptr ) // If have other layer ... { // Check for short-circuit in other layer bOK = qW0->GetNodeId() == BAD_NODEID || qW1->GetNodeId() == BAD_NODEID || qW0->GetNodeId() == qW1->GetNodeId(); if ( bOK ) { // Check for short-circuit between layers const int iNodeID_A = std::max(pW0->GetNodeId(), pW1->GetNodeId()); const int iNodeID_B = std::max(qW0->GetNodeId(), qW1->GetNodeId()); bOK = iNodeID_A == BAD_NODEID || iNodeID_B == BAD_NODEID || iNodeID_A == iNodeID_B; } } } } return bOK; } bool Board::PutDown(Component& comp) // Tries to place the (floating) component on the board { const bool bOK = CanPutDown(comp); if ( !bOK ) return false; const bool bDiagsOK = GetDiagsMode() != DIAGSMODE::OFF; const bool bWire = comp.GetType() == COMP::WIRE; // Wire's only get NodeIDs while placed const bool bSOIC = comp.GetIsSOIC(); assert( !bSOIC || GetHaveTopLyr() ); const bool bTrax = comp.GetType() == COMP::TRACKS; const int& compId = comp.GetId(); const int& compCols = comp.GetCompCols(); const int& compRows = comp.GetCompRows(); const int& compLyr = comp.GetLyr(); assert(bTrax || compLyr == 0); const int& rowTL = comp.GetRow(); const int& colTL = comp.GetCol(); if ( bTrax ) { int iTraxNbrLT(NBR_LT); // For handling diagonals on a rotated trax switch( comp.GetDirection() ) { case 'W': iTraxNbrLT = NBR_LT; break; case 'E': iTraxNbrLT = NBR_RB; break; case 'N': iTraxNbrLT = NBR_LB; break; case 'S': iTraxNbrLT = NBR_RT; break; } std::set blankWireIds; // CompIds of unpainted wires in the area covered by trax // First scan over comp int jRow(rowTL); for (int j = 0; j < compRows; j++, jRow++) { int iCol(colTL); for (int i = 0; i < compCols; i++, iCol++) { const CompElement* pComp = comp.GetCompElement(j, i); Element* pGrid = Get(compLyr, jRow, iCol); if ( !pComp->ReadFlagBits(RECTSET) ) continue; // Skip non-rect points if ( pGrid->GetNodeId() != BAD_NODEID ) continue; // Skip painted points // If have wire(s) ... if ( pGrid->GetW(0) ) blankWireIds.insert( pGrid->GetSlotCompId(0) ); // ... store its compId if ( pGrid->GetW(1) ) blankWireIds.insert( pGrid->GetSlotCompId(1) ); // ... store its compId } } // Second scan over comp jRow = rowTL; for (int j = 0; j < compRows; j++, jRow++) { int iCol(colTL); for (int i = 0; i < compCols; i++, iCol++) { const CompElement* pComp = comp.GetCompElement(j, i); Element* pGrid = Get(compLyr, jRow, iCol); const int traxNodeId = pComp->GetNodeId(); assert( traxNodeId == BAD_NODEID || pComp->ReadFlagBits(RECTSET) ); // Sanity check if ( traxNodeId == BAD_NODEID ) continue; // Skip blank trax points const bool bBlankWire = pGrid->GetHasWire() && ( blankWireIds.find( pGrid->GetSlotCompId(0) ) != blankWireIds.end() || blankWireIds.find( pGrid->GetSlotCompId(1) ) != blankWireIds.end() ); const bool bExistingNodeId = !bBlankWire && ( pGrid->GetNodeId() == traxNodeId ); SetNodeIdByUser(compLyr, jRow, iCol, traxNodeId, false); // false ==> don't paint pins const bool bAllLyrs(false); if ( bExistingNodeId ) // If the board already had the NodeId ... MarkFlagBits(pGrid, RECTSET, bAllLyrs); // ... set RECTSET on the board, so TakeOff() doesn't wipe the point else WipeFlagBits(pGrid, RECTSET, bAllLyrs); // Fix up crossing diagonals if ( bDiagsOK && j > 0 && i > 0 && pComp->GetUsed(iTraxNbrLT) != pGrid->GetUsed(NBR_LT) ) pGrid->SwapDiagLinks(); } } } else // Regular component (not the "trax") { // First scan over comp. We need to SetSoicChar() over the whole component area before we start painting NodeIds int jRow(rowTL); for (int j = 0; j < compRows; j++, jRow++) { int iCol(colTL); for (int i = 0; i < compCols; i++, iCol++) { const CompElement* pComp = comp.GetCompElement(j, i); Element* pGrid = Get(compLyr, jRow, iCol); assert( !(pGrid->GetIsHole() && pComp->GetIsHole()) ); // Can't overlay holes // Update surface and hole use pGrid->SetSurface( pGrid->GetSurface() + pComp->GetSurface() ); pGrid->SetHoleUse( pGrid->GetHoleUse() + pComp->GetHoleUse() ); pGrid->SetSoicChar( pGrid->GetSoicChar() + pComp->GetSoicChar() ); } } int wireNodeId(BAD_NODEID); // If we're placing a wire, this will be it's nodeId // Second scan over comp jRow = rowTL; for (int j = 0; j < compRows; j++, jRow++) { int iCol(colTL); for (int i = 0; i < compCols; i++, iCol++) { const CompElement* pComp = comp.GetCompElement(j, i); Element* pGrid = Get(compLyr, jRow, iCol); // Update IDs at pin location (No pin ==> Leave existing pinIndexes and compIds) const size_t pinIndex = pComp->GetPinIndex(); if ( pinIndex == BAD_PININDEX ) continue; // Work out which slot to use const int iSlot = pGrid->GetFreeSlot(); // Store any user-painted nodeId's under the pin (i.e. "oridId") BEFORE placing // If we are about to place a part/wire in the same hole as an existing part/wire, // then inherit origId from the existing part/wire if ( pGrid->GetNumUsedSlots() == 1 ) { if ( bWire ) wireNodeId = std::max(wireNodeId, pGrid->GetNodeId()); const int iSlotOther = ( iSlot == 0 ) ? 1 : 0; size_t iOtherPinIndex; int iOtherCompId; pGrid->GetSlotInfo(iSlotOther, iOtherPinIndex, iOtherCompId); assert( iOtherPinIndex != BAD_PININDEX && iOtherCompId != BAD_COMPID ); const Component& otherComp = m_compMgr.GetComponentById( iOtherCompId ); assert( bWire == (otherComp.GetType() == COMP::WIRE) ); for (int iLyr = 0; iLyr < 2; iLyr++) { const int& origId = otherComp.GetOrigId(iLyr, iOtherPinIndex); comp.SetOrigId(iLyr, pinIndex, origId); } } else { // We've already done SetSoicChar() (thus setting up any TH pin flags). // When a TH pin flag is set, Element::GetNodeId() will assume both layers // have matching NodeIds, and so always return the base layer NodeId. // So we must use p->TrackElement::GetNodeId() here to avoid tunneling between layers. for (int iLyr = 0; iLyr < 2; iLyr++) { Element* p = ( iLyr == compLyr ) ? pGrid : pGrid->GetNbr(NBR_X); if ( bWire && p ) wireNodeId = std::max(wireNodeId, p->TrackElement::GetNodeId()); const int origId = ( p && p->ReadFlagBits(USERSET) ) ? p->TrackElement::GetNodeId() : BAD_NODEID; comp.SetOrigId(iLyr, pinIndex, origId); } } pGrid->SetSlotInfo(iSlot, pinIndex, compId); const int& iCompNodeId = comp.GetNodeId(pinIndex); assert( !bWire || iCompNodeId == BAD_NODEID ); // Wire shouldn't have a NodeId yet if ( !bWire ) // Write nodeId & flag { const bool bAllLyrs = pGrid->GetHasPinTH(); Element* p = ( bSOIC ) ? Get(LYR_TOP, jRow, iCol) : pGrid; assert(p); SetNodeId(p, iCompNodeId, bAllLyrs); WipeFlagBits(p, AUTOSET|VEROSET, bAllLyrs); MarkFlagBits(p, USERSET, bAllLyrs); } } } if ( bWire ) // Handle wires setting the wire ends on the board to same value { // pA and pB are the opposite ends of the wire Element* pA = Get(compLyr, rowTL, colTL); assert( pA ); Element* pB = Get(compLyr, rowTL+compRows-1, colTL+compCols-1); assert( pB ); const int iSlotA = pA->GetSlotFromCompId(compId); assert(iSlotA != -1); const int iSlotB = pB->GetSlotFromCompId(compId); assert(iSlotB != -1); pA->SetW(iSlotA, pB); // Link wire ends pB->SetW(iSlotB, pA); // Link wire ends // Take logical OR of flags on wire ends, ignoring the RECTSET bit const char iWireFlag = ( pA->GetFlag() | pB->GetFlag() ) & (USERSET|AUTOSET|VEROSET); WIRELIST wireList; // Helper for chains of wires // Handle all connected wires. (We just need the wirelist on one end, so use pA) pA->GetWireList(wireList); // Get list containing pA and its wired points for (const auto& o : wireList) { Element* pW = const_cast (o.first); // Set the nodeId's on the wire components ... for (int iSlot = 0; iSlot < 2; iSlot++) { size_t iPinIndex; int tmpCompId; pW->GetSlotInfo(iSlot, iPinIndex, tmpCompId); if ( iPinIndex == BAD_PININDEX ) continue; Component& comp = m_compMgr.GetComponentById( tmpCompId ); assert( comp.GetType() == COMP::WIRE ); comp.SetNodeId(iPinIndex, wireNodeId); } // ... and on the corresponding board points const bool bAllLyrs(true); SetNodeId(pW, wireNodeId, bAllLyrs); MarkFlagBits(pW, iWireFlag, bAllLyrs); } } } comp.SetIsPlaced(true); if ( comp.GetType() == COMP::MARK ) Get(compLyr, rowTL, colTL)->SetIsMark(true); // Set marker flag m_colorMgr.ReAssignColors(); // Forces colors to be worked out again return true; } bool Board::TakeOff(Component& comp) { if ( !comp.GetIsPlaced() ) return false; // Can't take off a component that is already floating const bool bWire = comp.GetType() == COMP::WIRE; // Wire's only get NodeIDs while placed const bool bTrax = comp.GetType() == COMP::TRACKS; const bool bSOIC = comp.GetIsSOIC(); const int& compId = comp.GetId(); const int& compCols = comp.GetCompCols(); const int& compRows = comp.GetCompRows(); const int& compLyr = comp.GetLyr(); assert(bTrax || compLyr == 0); const int& rowTL = comp.GetRow(); const int& colTL = comp.GetCol(); // If we have a wire, then pA and pB are the opposite ends of the wire. // Find out which wire slots are used before we take off the wire. Element* pA = ( bWire ) ? Get(compLyr, rowTL, colTL) : nullptr; Element* pB = ( bWire ) ? Get(compLyr, rowTL+compRows-1, colTL+compCols-1) : nullptr; assert( !bWire || (pA != nullptr && pB != nullptr) ); int iOrigIdA[2] = {BAD_NODEID, BAD_NODEID}; // 1 per layer int iOrigIdB[2] = {BAD_NODEID, BAD_NODEID}; // 1 per layer int iSlotA(-1), iSlotB(-1), tmpCompId; size_t iPinIndex; if ( pA ) { iSlotA = pA->GetSlotFromCompId(compId); assert(iSlotA != -1); pA->GetSlotInfo(iSlotA, iPinIndex, tmpCompId); assert( tmpCompId == compId ); for (int iLyr = 0; iLyr < 2; iLyr++) iOrigIdA[iLyr] = comp.GetOrigId(iLyr, iPinIndex); } if ( pB ) { iSlotB = pB->GetSlotFromCompId(compId); assert(iSlotB != -1); pB->GetSlotInfo(iSlotB, iPinIndex, tmpCompId); assert( tmpCompId == compId ); for (int iLyr = 0; iLyr < 2; iLyr++) iOrigIdB[iLyr] = comp.GetOrigId(iLyr, iPinIndex); } int jRow(rowTL); for (int j = 0; j < compRows; j++, jRow++) { int iCol(colTL); for (int i = 0; i < compCols; i++, iCol++) { const CompElement* pComp = comp.GetCompElement(j, i); Element* pGrid = Get(compLyr, jRow, iCol); if ( bTrax ) { const bool bAllLyrs(false); if ( !pComp->ReadFlagBits(RECTSET) ) continue; // Skip non-rect points if ( pComp->GetNodeId() == BAD_NODEID ) continue; // Skip blank areas of the trax comp if ( !pGrid->ReadFlagBits(RECTSET) && ( !pGrid->GetLyrHasPin() || pGrid->GetHasWire() ) ) SetNodeIdByUser(compLyr, jRow, iCol, BAD_NODEID, false); // false ==> don't paint pins WipeFlagBits(pGrid, RECTSET, bAllLyrs); } else { assert( !pComp->GetIsHole() || pGrid->GetIsHole() ); // Component hole can only be taken off a grid hole // Update surface and hole use pGrid->SetSurface( pGrid->GetSurface() - pComp->GetSurface() ); pGrid->SetHoleUse( pGrid->GetHoleUse() - pComp->GetHoleUse() ); pGrid->SetSoicChar( pGrid->GetSoicChar() - pComp->GetSoicChar() ); // Update compId and pinIndex use if ( pGrid->GetSoicChar() == SOIC_FREE ) // Should not really need this case. The else should suffice. { pGrid->SetSlotInfo(0, BAD_PININDEX, BAD_COMPID); // Slot 0 pGrid->SetSlotInfo(1, BAD_PININDEX, BAD_COMPID); // Slot 1 } else { const int iSlot = pGrid->GetSlotFromCompId(compId); if ( iSlot != -1 ) pGrid->SetSlotInfo(iSlot, BAD_PININDEX, BAD_COMPID); } // Update IDs at pin locations of component const size_t pinIndex = pComp->GetPinIndex(); if ( pinIndex == BAD_PININDEX ) continue; const int origId[2] = { comp.GetOrigId(0, pinIndex), // Note the original NodeIds ... comp.GetOrigId(1, pinIndex) }; // ... on both layers comp.SetOrigId(0, pinIndex, BAD_NODEID); // ... before wiping comp.SetOrigId(1, pinIndex, BAD_NODEID); // ... them // Wire-ends need special treatment, so just handle non-wire pins here if ( !bWire ) { if ( !pGrid->GetHasPin() ) // If we're removing the last pin, revert nodeId on each board layer. { assert( origId[0] == BAD_NODEID || origId[0] == comp.GetNodeId(pinIndex) || bSOIC ); // Base layer check does not apply to SOIC assert( origId[1] == BAD_NODEID || origId[1] == comp.GetNodeId(pinIndex) ); for (int iLyr = 0, lyrs = std::min(GetLyrs(), 2); iLyr < lyrs; iLyr++) { if ( bSOIC && iLyr != LYR_TOP ) continue; Element* p = ( iLyr == compLyr ) ? pGrid : pGrid->GetNbr(NBR_X); if ( p == nullptr ) continue; const bool bAllLyrs = false; SetNodeId(p, origId[iLyr], bAllLyrs); // Restore grid element to original nodeId WipeFlagBits(p, AUTOSET|VEROSET, bAllLyrs); MarkFlagBits(p, USERSET, bAllLyrs); } } else if ( !bSOIC ) // Special case. We're removing a TH pin from a TH/SOIC hole-share. Only revert nodeId on bottom layer. { const bool bAllLyrs = false; SetNodeId(pGrid, origId[0], bAllLyrs); // Restore grid element on bottom layer (under the SOIC) to original nodeId WipeFlagBits(pGrid, AUTOSET|VEROSET, bAllLyrs); MarkFlagBits(pGrid, USERSET, bAllLyrs); } } } } } if ( pA != nullptr && pB != nullptr ) // Handle wires ends { const bool bAllLyrs(true); comp.SetNodeId(0, BAD_NODEID); comp.SetNodeId(1, BAD_NODEID); pA->SetW(iSlotA, nullptr); // Break pointers between board points pB->SetW(iSlotB, nullptr); // Break pointers between board points WIRELIST wireList; // Helper for chains of wires for (int iEnd = 0; iEnd < 2; iEnd++) { Element* pEnd = ( iEnd == 0 ) ? pA : pB; pEnd->GetWireList(wireList); // Get list containing pEnd and its wired points int origId0(BAD_NODEID), origId1(BAD_NODEID); for (const auto& o : wireList) // See if any of the wires in the set have a valid origId { const Element* pW = o.first; for (int iSlot = 0; iSlot < 2 && origId0 == BAD_NODEID && origId1 == BAD_NODEID; iSlot++) { pW->GetSlotInfo(iSlot, iPinIndex, tmpCompId); if ( iPinIndex == BAD_PININDEX ) continue; const Component& comp = m_compMgr.GetComponentById( tmpCompId ); assert( comp.GetType() == COMP::WIRE ); origId0 = comp.GetOrigId(0, iPinIndex); origId1 = comp.GetOrigId(1, iPinIndex); assert( origId0 == BAD_NODEID || origId0 == comp.GetNodeId(iPinIndex) ); assert( origId1 == BAD_NODEID || origId1 == comp.GetNodeId(iPinIndex) ); } if ( origId0 != BAD_NODEID || origId1 != BAD_NODEID) break; } if ( origId0 == BAD_NODEID && origId1 == BAD_NODEID ) // If no wired points connected to pEnd have a valid origId ... { // ... wipe all their nodeIds for (const auto& o : wireList) { Element* pW = const_cast (o.first); // Wipe the nodeId's on the wire components ... for (int iSlot = 0; iSlot < 2; iSlot++) { pW->GetSlotInfo(iSlot, iPinIndex, tmpCompId); if ( iPinIndex == BAD_PININDEX ) continue; Component& comp = m_compMgr.GetComponentById( tmpCompId ); assert( comp.GetType() == COMP::WIRE ); comp.SetNodeId(iPinIndex, BAD_NODEID); } // ... and on the corresponding board points SetNodeId(pW, BAD_NODEID, bAllLyrs); WipeFlagBits(pW, AUTOSET|VEROSET, bAllLyrs); MarkFlagBits(pW, USERSET, bAllLyrs); } } } // Finally fix up case where we had a single wire if ( !pA->GetHasWire() ) // If we've taken off the last wire at the location { const bool bAllLyrs = false; for (int iLyr = 0, lyrs = std::min(GetLyrs(), 2); iLyr < lyrs; iLyr++) { Element* p = ( iLyr == compLyr ) ? pA : pA->GetNbr(NBR_X); if ( p == nullptr ) continue; SetNodeId(p, iOrigIdA[iLyr], bAllLyrs); // Restore grid element to original nodeId WipeFlagBits(p, AUTOSET|VEROSET, bAllLyrs); MarkFlagBits(p, USERSET, bAllLyrs); } } if ( !pB->GetHasWire() ) // If we've taken off the last wire at the location { const bool bAllLyrs = false; for (int iLyr = 0, lyrs = std::min(GetLyrs(), 2); iLyr < lyrs; iLyr++) { Element* p = ( iLyr == compLyr ) ? pB : pB->GetNbr(NBR_X); if ( p == nullptr ) continue; SetNodeId(p, iOrigIdB[iLyr], bAllLyrs); // Restore grid element to original nodeId WipeFlagBits(p, AUTOSET|VEROSET, bAllLyrs); MarkFlagBits(p, USERSET, bAllLyrs); } } } comp.SetIsPlaced(false); if ( comp.GetType() == COMP::MARK ) Get(compLyr, rowTL, colTL)->SetIsMark(false); // Clear marker flag return true; } void Board::FloatAllComps() // Float all components (i.e. take them off the board) { for (auto& mapObj : m_compMgr.m_mapIdToComp) TakeOff( mapObj.second ); } void Board::FloatAllCompsSOIC() // Float all SOIC components (i.e. take them off the board) { for (auto& mapObj : m_compMgr.m_mapIdToComp) if ( mapObj.second.GetIsSOIC() ) TakeOff( mapObj.second ); } void Board::PlaceFloaters() // Try to place down all the floating components { // Do trax component first. // If the trax comp won't go down, then leave the rest floating Component& trax = m_compMgr.GetTrax(); PutDown(trax); if ( trax.GetSize() > 0 && !trax.GetIsPlaced() ) return; while(true) { bool bPlacedOK(false); for (auto& mapObj : m_compMgr.m_mapIdToComp) if ( PutDown( mapObj.second ) ) bPlacedOK = true; if ( !bPlacedOK ) break; // Couldn't place any more components } } // GUI helpers for manipulating user-selected components void Board::SelectAllComps(bool bRestrictToRects) { if ( bRestrictToRects ) { // Build the trax object Rect bounding = m_rectMgr.GetBounding() | m_rectMgr.GetCurrent(); m_compMgr.BuildTrax(m_rectMgr, *this, GetCurrentLayer(), bounding.m_rowMin, bounding.m_rowMax, bounding.m_colMin, bounding.m_colMax); assert( m_compMgr.GetTrax().GetIsPlaced() ); } for (const auto& mapObj : m_compMgr.GetMapIdToComp()) { const Component& comp = mapObj.second; if ( bRestrictToRects ) // If we have rectangles defined ... { // ... only select components within them. const int& L = comp.GetCol(); const int& T = comp.GetRow(); const int R = comp.GetLastCol(); const int B = comp.GetLastRow(); const bool bOK = m_rectMgr.Overlaps( Rect(T, B, L, R) ); if ( !bOK ) continue; } SetCurrentCompId( mapObj.first ); if ( !m_groupMgr.GetIsUserComp(GetCurrentCompId()) ) // If current comp not in user-group ... m_groupMgr.UpdateUserGroup(GetCurrentCompId()); // ... add current comp (and its siblings) to user group } SetCurrentTextId(BAD_TEXTID); } bool Board::ConfirmDestroyUserComps() // returns false if user-group is empty or has only wires/markers/vero-labels { std::list userCompIds; m_groupMgr.GetUserCompIds(userCompIds); for (const auto& compId : userCompIds) { const COMP& eType = m_compMgr.GetComponentById( compId ).GetType(); switch( eType) { case COMP::VERO_NUMBER: case COMP::VERO_LETTER: case COMP::WIRE: case COMP::MARK: continue; default: assert(eType != COMP::INVALID); return true; } } return false; } void Board::DestroyUserComps() // Destroy components in the user-group { WipeAutoSetPoints(); std::list userCompIds; m_groupMgr.GetUserCompIds(userCompIds); for (const auto& compId : userCompIds) { Component& comp = m_compMgr.GetComponentById( compId ); assert( comp.GetType() != COMP::INVALID ); DestroyComponent( comp ); } assert( m_groupMgr.GetNumUserComps() == 0 ); // User group should be empty now SetCurrentCompId(BAD_COMPID); PlaceFloaters(); // See if we can now place floating components down m_rectMgr.Clear(); m_compMgr.ClearTrax(); // Clear the trax object } void Board::MoveUserCompText(int deltaRow, int deltaCol) // Move text label { if ( m_groupMgr.GetNumUserComps() != 1 ) return; Component& comp = GetUserComponent(); if ( deltaRow == 0 && deltaCol == 0 ) // (0,0) ==> reset rather than shift comp.SetDefaultLabelOffsets(); else comp.MoveLabelOffsets(deltaRow, deltaCol); } void Board::StretchUserComp(bool bGrow) // Stretch the selected component length { if ( m_groupMgr.GetNumUserComps() != 1 ) return; Component& comp = GetUserComponent(); if ( bGrow ) { // Get bottom-right corner of footprint int maxRow( comp.GetLastRow() ); int maxCol( comp.GetLastCol() ); // Work out what the stretch will do to it if ( comp.GetDirection() == 'W' || comp.GetDirection() == 'E' ) maxCol += CompTypes::GetStretchIncrement(comp.GetType()); else maxRow += CompTypes::GetStretchIncrement(comp.GetType()); if ( maxRow + 1 - GetRows() > 0 ) // If we'll go too far down ... Pan(-(maxRow + 1 - GetRows()), 0); // ... pan the whole circuit up to make room if ( maxCol + 1 - GetCols() > 0 ) // If we'll go too far right ... Pan(0, -(maxCol + 1 - GetCols())); // ... pan the whole circuit left to make room } WipeAutoSetPoints(); TakeOff(comp); comp.Stretch(bGrow, GetUsePCBshapes()); PutDown(comp); PlaceFloaters(); // See if we can now place floating components down } void Board::StretchWidthUserComp(bool bGrow) // Stretch the selected component width (just for DIPs) { if ( m_groupMgr.GetNumUserComps() != 1 ) return; Component& comp = GetUserComponent(); if ( bGrow ) { // Get bottom-right corner of footprint int maxRow( comp.GetLastRow() ); int maxCol( comp.GetLastCol() ); // Work out what the stretch will do to it if ( comp.GetDirection() == 'W' || comp.GetDirection() == 'E' ) maxRow++; else maxCol++; if ( maxRow + 1 - GetRows() > 0 ) // If we'll go too far down ... Pan(-(maxRow + 1 - GetRows()), 0); // ... pan the whole circuit up to make room if ( maxCol + 1 - GetCols() > 0 ) // If we'll go too far right ... Pan(0, -(maxCol + 1 - GetCols())); // ... pan the whole circuit left to make room } WipeAutoSetPoints(); TakeOff(comp); comp.StretchWidth(bGrow, GetUsePCBshapes()); PutDown(comp); PlaceFloaters(); // See if we can now place floating components down } void Board::ChangeTypeUserComp(COMP eType) { if ( m_groupMgr.GetNumUserComps() != 1 ) return; Component& comp = GetUserComponent(); assert( comp.GetType() != eType ); // Current type must differ from new type const bool bStretch = ( eType == COMP::CAP_CERAMIC || eType == COMP::CAP_FILM || eType == COMP::DIODE ); if ( !bStretch ) // If the new type has a fixed footprint, grow grid if necessary { // Get bottom-right corner of new footprint int numRows(0), numCols(0); CompTypes::GetMakeInstructions(eType, numRows, numCols); if ( comp.GetDirection() == 'N' || comp.GetDirection() == 'S' ) std::swap(numRows, numCols); int maxRow(comp.GetRow() + numRows - 1); int maxCol(comp.GetCol() + numCols - 1); if ( maxRow + 1 - GetRows() > 0 ) // If corner will be too far down ... Pan(-(maxRow + 1 - GetRows()), 0); // ... pan the whole circuit up to make room if ( maxCol + 1 - GetCols() > 0 ) // If corner will be too far right ... Pan(0, -(maxCol + 1 - GetCols())); // ... pan the whole circuit left to make room } // Now change the component type const int oldPinSeparation = CompTypes::GetPinSeparation( comp.GetType() ); // For LEDs, and electro caps const int oldLength = ( oldPinSeparation > 0 ) ? oldPinSeparation : comp.GetCols(); WipeAutoSetPoints(); TakeOff(comp); comp.BuildDefault(eType); comp.SetAllowFlyWire(eType == COMP::PAD_FLYINGWIRE); comp.SetDefaultPinFlags(); comp.SetDefaultStrings(); comp.SetDefaultLabelOffsets(); comp.SetDefaultShapes(GetUsePCBshapes()); if ( bStretch ) { while ( comp.GetCols() < oldLength ) comp.Stretch(true, GetUsePCBshapes()); // true ==> grow while ( comp.GetCols() > oldLength ) comp.Stretch(false, GetUsePCBshapes()); // false ==> shrink } PutDown(comp); PlaceFloaters(); // See if we can now place floating components down } void Board::CopyUserComps() // Make a blank copy of the user-group components and float them { std::list userCompIds; m_groupMgr.GetUserCompIds(userCompIds); CopyComps(userCompIds); } bool Board::MoveUserComps(int deltaRow, int deltaCol) // Move user-group components, and return true if the grid was panned { if ( deltaRow == 0 && deltaCol == 0 ) return false; if ( GetDisableMove() ) return false; std::list userCompIds; m_groupMgr.GetUserCompIds(userCompIds); return MoveComps(userCompIds, deltaRow, deltaCol); } void Board::RotateUserComps(bool bCW) // Rotate the selected components { std::list userCompIds; m_groupMgr.GetUserCompIds(userCompIds); RotateComps(userCompIds, bCW); } void Board::CopyComps(const std::list& compIds) // Make a blank copy of the components and float them { if ( compIds.empty() ) return; const bool bMakeNewGroup = ( compIds.size() > 1 ); // If we have multiple components, the copies will be put into a single new group const int newGroupId = ( bMakeNewGroup ) ? m_groupMgr.GetNewGroupId() : BAD_GROUPID; // Make new groupId bigger than all others if ( bMakeNewGroup && newGroupId == INT_MAX ) return; // Fail if we've reached the max allowed groupId for (const auto& compId : compIds) { const Component& comp = m_compMgr.GetComponentById( compId ); assert( comp.GetType() != COMP::INVALID ); const int newCompId = CreateComponent(-1, -1, comp.GetType(), &comp); // Create blank copy of the component and get its compId if ( newCompId == BAD_COMPID ) break; // Reached component limit if ( bMakeNewGroup ) m_groupMgr.Add(newGroupId, newCompId); } } bool Board::MoveTextBox(int deltaRow, int deltaCol) // Move text box, and return true if the grid was panned { bool bPanned(false); // Set true if we pan the grid if ( deltaRow == 0 && deltaCol == 0 ) return false; // Move the rect and update the manager m_textMgr.MoveRect(GetCurrentTextId(), deltaRow, deltaCol); TextRect& rect = m_textMgr.GetTextRectById( GetCurrentTextId() ); if ( !rect.GetIsValid() ) return false; // Pan the circuit as needed if the rect has gone out of bounds if ( rect.m_rowMin < 0 ) // If we've gone too far up ... bPanned = Pan(-rect.m_rowMin, 0); // ... pan the whole circuit down else if ( rect.m_rowMax + 1 - GetRows() > 0 ) // If we've gone too far down ... bPanned = Pan(-(rect.m_rowMax + 1 - GetRows()), 0); // ... pan the whole circuit up ... if ( rect.m_colMin < 0 ) // If we've gone too far left ... bPanned = Pan(0, -rect.m_colMin); // ... pan the whole circuit right else if ( rect.m_colMax + 1 - GetCols() > 0 ) // If we've gone too far right ... bPanned = Pan(0, -(rect.m_colMax + 1 - GetCols())); // ... pan the whole circuit left return bPanned; } bool Board::MoveComps(const std::list& compIds, int deltaRow, int deltaCol) // Move components and return true if the grid was panned { assert( deltaRow != 0 || deltaCol != 0 ); assert( !GetDisableMove() ); // Treat the components as a single large footprint with LT at (minRow, minCol) Rect rect = GetFootprintBounds(compIds); if ( !rect.GetIsValid() ) return false; bool bPanned(false); // Set true if we pan the grid // Work out what the new bounds would be are after the move rect.Move(deltaRow, deltaCol); // If the group will move out of bounds, pan the circuit first to grow the grid. if ( rect.m_rowMin < 0 ) // If we'll go too far up ... bPanned = Pan(-rect.m_rowMin, 0); // ... pan the whole circuit down to make room else if ( rect.m_rowMax + 1 - GetRows() > 0 ) // If we'll go too far down ... bPanned = Pan(-(rect.m_rowMax + 1 - GetRows()), 0); // ... pan the whole circuit up to make room if ( rect.m_colMin < 0 ) // If we'll go too far left ... bPanned = Pan(0, -rect.m_colMin); // ... pan the whole circuit right to make room else if ( rect.m_colMax + 1 - GetCols() > 0 ) // If we'll go too far right ... bPanned = Pan(0, -(rect.m_colMax + 1 - GetCols())); // ... pan the whole circuit left to make room WipeAutoSetPoints(); // Take off all comps, and finally the trax comp. Move them but keep them floating. for (const auto& compId : compIds) { Component& comp = m_compMgr.GetComponentById( compId ); assert( comp.GetType() != COMP::INVALID ); int newRow = comp.GetRow() + deltaRow; int newCol = comp.GetCol() + deltaCol; MakeToroid(newRow, newCol); // Make co-ordinates wrap around at grid edges TakeOff(comp); comp.SetRow(newRow); comp.SetCol(newCol); } // The trax comp Component& trax = m_compMgr.GetTrax(); if ( trax.GetSize() > 0 ) { int newRow = trax.GetRow() + deltaRow; int newCol = trax.GetCol() + deltaCol; MakeToroid(newRow, newCol); // Make co-ordinates wrap around at grid edges TakeOff(trax); trax.SetRow(newRow); trax.SetCol(newCol); } // First put down the trax comp, and then all other comps. // If the trax comp won't go down, then leave the rest floating PutDown(trax); if ( trax.GetSize() == 0 || trax.GetIsPlaced() ) { for (const auto& compId : compIds) { Component& comp = m_compMgr.GetComponentById( compId ); assert( comp.GetType() != COMP::INVALID ); PutDown(comp); } PlaceFloaters(); // See if we can now place floating components down } return bPanned; } void Board::RotateComps(const std::list& compIds, bool bCW) // Rotate components { // Treat the components as a single large footprint with LT at (minRow, minCol) Rect rect = GetFootprintBounds(compIds); if ( !rect.GetIsValid() ) return; const int DY = 1 + rect.m_rowMax - rect.m_rowMin; // >= 1 // The group height before rotation const int DX = 1 + rect.m_colMax - rect.m_colMin; // >= 1 // The group width before rotation // We'll try and rotate about the centre of the group. // Need to avoid the group drifting as we rotate it int dy = DY - DX; int dx = DX - DY; if ( dy > 0 ) { dy /= 2; } else { dy = -dy; dy /= 2; dy = -dy; } if ( dx > 0 ) { dx /= 2; } else { dx = -dx; dx /= 2; dx = -dx; } // Work out how the bounds would be modified by the rotation, and grow the grid if needed { const int deltaT = std::max(0, -rect.m_rowMin - dy); const int deltaB = std::max(0, rect.m_rowMin + dy + DX - GetRows()); const int deltaL = std::max(0, -rect.m_colMin - dx); const int deltaR = std::max(0, rect.m_colMin + dx + DY - GetCols()); GrowThenPan(0, deltaT + deltaB, deltaL + deltaR, deltaT, deltaL); // GrowThenPan modifies rows and cols so we must recalculate the bounds rect = GetFootprintBounds(compIds); if ( !rect.GetIsValid() ) return; } // Work out the new centre location if ( bCW ) dx += (DY - 1); else dy += (DX - 1); const int newCentreRow = rect.m_rowMin + dy; const int newCentreCol = rect.m_colMin + dx; WipeAutoSetPoints(); // Take off all comps, and finally the trax comp. Move and rotate them but keep them floating. for (const auto& compId : compIds) { Component& comp = m_compMgr.GetComponentById( compId ); assert( comp.GetType() != COMP::INVALID ); TakeOff(comp); int newRow(newCentreRow), newCol(newCentreCol); // Start with the new group centre // Then correct for location of the comp's LT corner w.r.t. the group's LT corner if ( bCW ) { newRow += (comp.GetCol() - rect.m_colMin); newCol -= (comp.GetRow() - rect.m_rowMin); } else { newRow -= (comp.GetCol() - rect.m_colMin); newCol += (comp.GetRow() - rect.m_rowMin); } // Then correct for the fact that comp.Rotate() rotates about the comp's centre rather than its LT corner if ( bCW ) newCol -= ( comp.GetCompRows() - 1 ); else newRow -= ( comp.GetCompCols() - 1 ); MakeToroid(newRow, newCol); // Make co-ordinates wrap around at grid edges comp.SetRow(newRow); comp.SetCol(newCol); comp.Rotate(bCW); // Rotate the component ... } // Take off the trax comp Component& trax = m_compMgr.GetTrax(); if ( trax.GetSize() > 0 ) { TakeOff(trax); int newRow(newCentreRow), newCol(newCentreCol); // Start with the new group centre // Then correct for location of the trax's LT corner w.r.t. the group's LT corner if ( bCW ) { newRow += (trax.GetCol() - rect.m_colMin); newCol -= (trax.GetRow() - rect.m_rowMin); } else { newRow -= (trax.GetCol() - rect.m_colMin); newCol += (trax.GetRow() - rect.m_rowMin); } // Then correct for the fact that trax.Rotate() rotates about the trax's centre rather than its LT corner if ( bCW ) newCol -= ( trax.GetCompRows() - 1 ); else newRow -= ( trax.GetCompCols() - 1 ); MakeToroid(newRow, newCol); // Make co-ordinates wrap around at grid edges trax.SetRow(newRow); trax.SetCol(newCol); trax.Rotate(bCW); // Rotate the component ... } // First put down the trax comp, and then all other comps. // If the trax comp won't go down, then leave the rest floating PutDown(trax); if ( trax.GetSize() == 0 || trax.GetIsPlaced() ) { for (const auto& compId : compIds) { Component& comp = m_compMgr.GetComponentById( compId ); assert( comp.GetType() != COMP::INVALID ); PutDown(comp); } PlaceFloaters(); // See if we can now place floating components down } } void Board::FixCorruption() { // The following should not really be necessary, but if we have a corrupt state // we should at least allow the user to try fix the board so it can continue to be used. // Destroy any components that have an invalid component type std::set badCompIds; m_compMgr.GetBadCompIds(badCompIds); if ( badCompIds.empty() ) return; for (const auto& compId : badCompIds) { Component& comp = m_compMgr.GetComponentById( compId ); assert( comp.GetType() == COMP::INVALID ); DestroyComponent(comp); } bool bBadGrid(false); // true ==> grid has references to bad components for (int i = 0, iSize = GetSize(); i < iSize && !bBadGrid; i++) { Element* p = GetAt(i); for (int iSlot = 0; iSlot < 2 && !bBadGrid; iSlot++) { const int compId = p->GetSlotCompId(iSlot); bBadGrid = ( compId != BAD_COMPID && badCompIds.find(compId) != badCompIds.end() ); } } if ( !bBadGrid ) return; // The process of floating all components and then unfloating them // can make the wrong competing diagonals be used at some points, // so should only be done if we have a bad grid. FloatAllComps(); // Float all components // Ensure there are no component related effects on the board elements for (int i = 0, iSize = GetSize(); i < iSize; i++) GetAt(i)->FixCorruption(); PlaceFloaters(); // Unfloat components } Rect Board::GetFootprintBounds(const std::list& compIds) const { Rect bounding; for (const auto& compId : compIds) { const Component& comp = m_compMgr.GetComponentById( compId ); assert( comp.GetType() != COMP::INVALID ); bounding |= comp.GetFootprintRect(); } const Component& trax = m_compMgr.GetTrax(); if ( trax.GetSize() > 0 ) bounding |= trax.GetFootprintRect(); return bounding; } void Board::CustomPCBshapes() // Allow some parts (e.g. DIPs) to be drawn differently in PCB mode { m_compMgr.CustomPCBshapes( GetUsePCBshapes() ); } VeroRoute/libraries/gEDA/veroroute_transistor/NPN_BC212.sym000644 001750 001750 00000001562 13515171161 023755 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=3 T 400 850 5 6 0 0 0 0 1 pinseq=3 T 400 850 5 6 0 0 0 0 1 pinlabel=3 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=1 T 400 50 5 6 0 0 0 0 1 pinseq=1 T 400 50 5 6 0 0 0 0 1 pinlabel=1 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 403,209 L 501,200 L 431,273 L 425,240 z T 600 700 5 10 1 1 0 0 1 device=BC212 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=NPN Transistor VeroRoute/libraries/gEDA/veroroute_linear/OpAmp_NJM4558L.sym000644 001750 001750 00000002551 13515171161 023754 0ustar00alexalex000000 000000 v 20130925 2 T 200 1100 5 10 0 0 0 0 1 slot=1 T 200 1300 5 10 0 0 0 0 1 numslots=2 T 200 1500 5 10 0 0 0 0 1 slotdef=1:3,2,8,4,1 T 200 1700 5 10 0 0 0 0 1 slotdef=2:5,6,8,4,7 P 0 200 200 200 1 0 0 { T 150 250 5 8 1 1 0 6 1 pinnumber=3 T 150 250 5 8 0 0 0 0 1 pinseq=1 T 250 200 9 8 0 1 0 0 1 pinlabel=IN+ T 150 250 5 8 0 0 0 0 1 pintype=in } P 0 600 200 600 1 0 0 { T 150 650 5 8 1 1 0 6 1 pinnumber=2 T 150 650 5 8 0 0 0 0 1 pinseq=2 T 250 600 9 8 0 1 0 0 1 pinlabel=IN- T 150 650 5 8 0 0 0 0 1 pintype=in } P 500 600 500 800 1 0 1 { T 550 600 5 8 1 1 0 0 1 pinnumber=8 T 550 600 5 8 0 0 0 0 1 pinseq=3 T 475 575 9 8 1 1 0 5 1 pinlabel=V+ T 550 600 5 8 0 0 0 0 1 pintype=pwr } P 500 200 500 0 1 0 1 { T 550 100 5 8 1 1 0 0 1 pinnumber=4 T 550 100 5 8 0 0 0 0 1 pinseq=4 T 450 200 9 8 1 1 0 3 1 pinlabel=V- T 550 100 5 8 0 0 0 0 1 pintype=pwr } P 800 400 1000 400 1 0 1 { T 850 450 5 8 1 1 0 0 1 pinnumber=1 T 850 450 5 8 0 0 0 0 1 pinseq=5 T 800 400 9 8 0 1 0 6 1 pinlabel=OUT T 850 450 5 8 0 0 0 0 1 pintype=out } L 200 800 200 0 3 0 0 0 -1 -1 L 200 800 800 400 3 0 0 0 -1 -1 L 800 400 200 0 3 0 0 0 -1 -1 L 300 250 300 150 3 0 0 0 -1 -1 L 250 200 350 200 3 0 0 0 -1 -1 L 250 600 350 600 3 0 0 0 -1 -1 T 600 900 5 10 1 1 0 0 1 device=NJM4558L T 200 900 8 10 1 1 0 0 1 refdes=U? T 200 1100 8 10 0 0 0 0 1 footprint=SIP8 T 200 1100 8 10 0 0 0 0 1 description=Dual Op Amp (SIL package) VeroRoute/Src/images/editor.png000644 001750 001750 00000010236 13661712157 016737 0ustar00alexalex000000 000000 ‰PNG  IHDR szzєbKGDџџџ НЇ“ pHYsФФ•+tIMEу )e бM+IDATX  пяџџџџХ*џХ*џ џџХ*ЯІ8џѓџџХ*ас0ђџХ*џ џџХ*ас0ђЯІ8џіџџХ*ас0ђас0ђ;жL|‚џџХ*ас0ђас0ђџџХ*ас0ђас0ђ;жL|‚џџХ*ас0ђас0ђ;жџџХ*ас0ђас0ђ;жL|‚џџХ*ас0ђас0ђ;жД„~џџХ*ас0ђас0ђ;жL|‚Д„~џџХ*ас0ђас0ђ;жД„~џџХ*ас0ђас0ђ;жL|‚Д„~џџХ*ас0ђас0ђ;жџџХ*ас0ђас0ђ;жЫљџ5џџХ*ас0ђас0ђ;жЫљџ5џџХ*ас0ђас0ђ;жЫљџџџХ*ас0ђас0ђ;жЫљџ5ас0ђас0ђ;жЫљџџџХ*ас0ђас0ђ;жЫљџас0ђас0ђ;жџџХ*ас0ђас0ђ;жЫљџас0ђ;жџџХ*ас0ђасас0ђ;ж;жL|‚Ыљџ;жџХ*ас0ђ;жL|‚џ;жџХ*;жL|‚Ыљџ5џџ‹M@ДяЗIENDЎB`‚VeroRoute/tutorials/tutorial_11.vrt000644 001750 001750 00000151002 14433261426 017667 0ustar00alexalex000000 000000 9ŽTUTORIAL 11 - TRACK STYLES There are 5 track styles in the tool: * Fat * Thin * Curved * Vero (Vertical strips) * Vero (Horizontal strips) These can be selected using the "Track Style" menu item, or with the buttons in the toolbar. Try out the following track styles on the current layout. FAT: The horizontal and vertical tracks are wide and enlarged to have the same width as the pads. THIN: The tracks are narrower than the pads. This mode is the easiest way to work with things visually. CURVED: This is similar to the thin track style, except the tracks are smoothed to avoid sharp corners. Note that the fat, thin and curved modes have the same electrical connectivity, so the difference between them is cosmetic. VERO: There is no topological difference between using a Vero  track style, and using another style with diagonal connections disabled. For stripboard builds, it is advised to use the "Thin" or "Curved" style with diagonal connections disabled during the bulk of the design process, as it is hard to work with the Vero  track styles due to "visual overload". It is best to switch to a "Vero" style once the circuit layout is complete. Note that the strips are not created before the layout is started. Instead they are determined by the layout, and the program can create the strips for you. Try the following for the current layout... Select the vertical "Vero" style, and you will see that there are many short strip fragments. Now check the "On" box in the Control Dialog to enable Auto-Routing, and then hit the "Paste" button. This will automatically fill out the layout with strips. The "Vero" styles automatically draw elliptical solder bridges to join adjacent strips together where needed. This is especially useful when the layout is viewed in a flipped ("mirror") mode with all the component outlines turned off. This then shows a view of the strip side of the board with all the strip breaks and required bridges easily visible. џџџџџџџџџџџZ.. 2< џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@)џџџџџ@2џџџџџ@3џџџџџ@4џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@5џџџџџ@6џџџџџ@7џџџџџџPџџџџџџџџџ8џџџџџ!@9џџџџџ@:џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџџџџџGџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџLGџџџџџџџџџџџџџџџ!+џџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDAџџџџџџџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџPAџџџџџџ‘џџџџџџџџџџџџџџџџџџџџ1џџџџџџџџџAFџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџ`FџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ @џџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџ @$џџџџџџџџџџџџџџџ @$џџџџџ  џџџџџ @&џџџџџџџџџџџџџџџ@&џџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ фџџџџџџџџџџџџџџџџџџџџџџџџ @џџџџџ D%џџџџџџџџџџџџџџџ ф%џџџџџџџџџџџџџџџ D'џџџџџџџџџџџџџџџф'џџџџџџџџџџџџџџџџDџџџџџџџџџ"џџџџџџDџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ#џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ xџџџџџџџџџџ еџџџџџџџџџ “џџџџџ џџџџџ џџџџџ џџџџџ џџџџџ 5џџџџџџ Cџџџџџџџџџ џџџџџ џџџџџ5џџџџџџCџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ <џџџџџџ Oџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ F џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџFџџџџџџDџџџџџџџџџ@"џџџџџџDџџџџџџџџџџDџџџџџџџџџ`џџџџџ0џџџџџA#џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ FџџџџџџџџџџpџџџџџџџџџСџџџџџџPџџџџџџџџџБџџџџџџqџџџџџџџџџСџџџџџџ DџџџџџџџџџpџџџџџџёџџџџџџџџџСџџџџџџDџџџџџџџџџџDџџџџџџџџџHџџџџџџDџџџџџџџџџџDџџџџџџџџџ4HџџџџџџCџџџџџџџџџџFџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ dџџџџџџџџџ<џџџџџџGџџџџџџџџџ џџџџџџџџџџџџџџџ>џџџџџџGџџџџџџџџџџ Dџџџџџџџџџџ\џџџџџџџџџП џџџџџџGџџџџџџџџџDIџџџџџџDџџџџџџџџџ@IџџџџџџDџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџFџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ`*џџџџџџ џџџџџџџџџ  ,џџџџџ Ц,џџџџџ @,џџџџџџџџџџџџџџџ @-џџџџџ F-џџџџџ  D-џџџџџџLџџџџџџџџџ @.џџџџџ F.џџџџџ D.џџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџ @/џџџџџ D/џџџџџ /џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџXџџџџџџџџџ…џџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџ Dџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџџФџџџџџџџџџ џџџџџФџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџXџџџџџџџџџ…!џџџџџџXџџџџџџџџџџ…џџџџџџџџџџФџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџLџџџџџџџџџџџџџџџџџџџ  џџџџџџјџџџџџџџџџџхџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџџџџџџPџџџџџ‘џџџџџџџџџџџџџџџ1 џџџџџAџџџџџџџџџџ џџџџџpџџџџџС џџџџџџџџџџP!џџџџџџ™џџџџџџџџџџџџџџџџџџџџџџџџ3џџџџџAџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџBџџџџџџџџџџџџџџџџџџџџџџџџџ BџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџCџџџџџџџџџџџџџџџџџџџџџџџџџCџџџџџDџџџџџџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ(џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџAџШI Wire9 Wire9WireWire WF(12П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџџ$D1 1N4148D Diode DIODEEF( 1 2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џfD?у333332?у333332Пй™™™™™š?й™™™™™š@V€џfD?фЬЬЬЬЬЬ?фЬЬЬЬЬЬПй™™™™™š?й™™™™™š@V€џfD?ѕ™™™™™™?ѕ™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џfDd8 Pad11Vol1PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R2010kRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џє#C130.1uCCeramicCAP_CERAMICNF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PџџШH Wire8 Wire8WireWire WF(12Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџџџ,R221MRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d: Pad13Vol3PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпd5Pad8 Tone1PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R1720kRResistorRESISTORSF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџШB Wire2 Wire2WireWireWF(12Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџџєC70.1uCCeramicCAP_CERAMIC NF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,R9470kRResistorRESISTOR NF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєC8500pCCeramicCAP_CERAMIC NF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PџџШC Wire3 Wire3WireWire WF(12Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџd2Pad5Sustain1PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ, R1210kRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d7 Pad10 Tone3PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R19100kRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R139kRResistorRESISTORSF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џџџџџџџџџџШG Wire7 Wire7WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџєC2500pCCeramicCAP_CERAMIC NF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,R8100kRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d)Pad2+9VPadPadPADџџџьWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R512kRResistorRESISTORNF(1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d6Pad9 Tone2PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R18470kRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R2322kRResistorRESISTORSF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџџџШF Wire6 Wire6WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџє!C1110nCCeramicCAP_CERAMICSF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ P   L.Q3 2N5088QTO92TO92 WF(123Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џє C103n9CCeramicCAP_CERAMICSF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,R16390RRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєC10.1uCCeramicCAP_CERAMICSF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,R2100kRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   L/Q4 2N5088QTO92TO92 WF(123Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i    џџџџџџџШA Wire1 Wire1WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџєC647nCCeramicCAP_CERAMIC NF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,R3390RRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џ'D4 1N4148D Diode DIODE WF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џfD?у333332?у333332Пй™™™™™š?й™™™™™š@V€џfD?фЬЬЬЬЬЬ?фЬЬЬЬЬЬПй™™™™™š?й™™™™™š@V€џfD?ѕ™™™™™™?ѕ™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џfDџџ, R11390RRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєC5500pCCeramicCAP_CERAMIC NF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ P   L,Q1 2N5088QTO92TO92 EF(12 3Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џєC30.1uCCeramicCAP_CERAMICWF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pd*Pad3InPadPadPAD џџџ№WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R61kRResistorRESISTORWF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ, R1012kRResistorRESISTOR NF(1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєC40.1uCCeramicCAP_CERAMICWF(1 2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pd+Pad4OutPadPadPAD$WF(!1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R710kRResistorRESISTOR NF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d9 Pad12Vol2PadPadPADџџџфNF(!1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R212k7RResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џє"C120.1uCCeramicCAP_CERAMICNF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџ%D2 1N4148D Diode DIODEWF( 1 2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џfD?у333332?у333332Пй™™™™™š?й™™™™™š@V€џfD?фЬЬЬЬЬЬ?фЬЬЬЬЬЬПй™™™™™š?й™™™™™š@V€џfD?ѕ™™™™™™?ѕ™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џfDџ&D3 1N4148D Diode DIODE EF(1 2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џfD?у333332?у333332Пй™™™™™š?й™™™™™š@V€џfD?фЬЬЬЬЬЬ?фЬЬЬЬЬЬПй™™™™™š?й™™™™™š@V€џfD?ѕ™™™™™™?ѕ™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џfD   L-Q2 2N5088QTO92TO92 WF(12 3Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   d4Pad7Sustain3PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R1512kRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d3Pad6Sustain2PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ, R13100kRResistorRESISTOR SF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ, R14470kRResistorRESISTOR SF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R4470kRResistorRESISTOR NF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d(Pad1GndPadPadPADWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџШD Wire4 Wire4WireWire WF(12П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџџєC947nCCeramicCAP_CERAMIC NF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PB@џџџўINVALID TracksWF(џџџ€џџџ€џџџ€џџџ€џџџџџџџџF#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Р@Р@@V€џVeroRoute/Src/pindialog.cpp000644 001750 001750 00000013334 14217067216 016147 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #include "pindialog.h" #include "ui_pindialog.h" #include "mainwindow.h" PinDialog::PinDialog(QWidget* parent) : QWidget(parent) , ui(new Ui_PinDialog) , m_pMainWindow(nullptr) { ui->setupUi( reinterpret_cast(this) ); #ifdef VEROROUTE_ANDROID ui->tableWidget->verticalScrollBar()->setStyleSheet( ANDROID_VSCROLL_WIDTH ); ui->tableWidget->horizontalScrollBar()->setStyleSheet( ANDROID_HSCROLL_HEIGHT ); #endif } PinDialog::~PinDialog() { delete ui; } void PinDialog::SetMainWindow(MainWindow* p) { m_pMainWindow = p; QObject::connect(ui->tableWidget, SIGNAL(cellChanged(int,int)), this, SLOT(CellChanged(int,int))); } Component* PinDialog::GetUserComp() const { if ( m_pMainWindow->m_board.GetGroupMgr().GetNumUserComps() != 1 ) return nullptr; // Need single component selected Component& comp = m_pMainWindow->m_board.GetUserComponent(); return ( (comp.GetPinFlags() & PIN_LABELS) > 0 ) ? &comp : nullptr; // Component must allow pin labels to be drawn } void PinDialog::CellChanged(int row, int col) { if ( col == 0 ) return; const bool& bCompEdit = m_pMainWindow->m_board.GetCompEdit(); CompDefiner* pDef = bCompEdit ? &m_pMainWindow->m_board.GetCompDefiner() : nullptr; Component* pComp = bCompEdit ? nullptr : GetUserComp(); assert(pDef != nullptr || pComp != nullptr); QTableWidgetItem* pItemLabel = ui->tableWidget->item(row, col); const size_t iPinIndex = static_cast(row); const std::string strLabel = pItemLabel->text().toStdString(); const int objId = static_cast(iPinIndex) + ( pComp ? ( pComp->GetId() * 1000000 ) : 0); if ( col == 1 ) { const std::string& s = pDef ? pDef->GetPinLabel(iPinIndex) : pComp->GetPinLabel(iPinIndex); if ( s != strLabel ) // If changed { if ( pDef ) pDef->SetPinLabel(iPinIndex, strLabel); if ( pComp ) pComp->SetPinLabel(iPinIndex, strLabel); m_pMainWindow->UpdateHistory("change pin label", objId); m_pMainWindow->RepaintSkipRouting(); } } if ( col == 2) { const int iAlign = ( strLabel == "L" || strLabel == "l" ) ? Qt::AlignLeft : ( strLabel == "R" || strLabel == "r" ) ? Qt::AlignRight : Qt::AlignHCenter; const int& i = pDef ? pDef->GetPinAlign(iPinIndex) : pComp->GetPinAlign(iPinIndex); if ( i != iAlign ) // If changed { if ( pDef ) pDef->SetPinAlign(iPinIndex, iAlign); if ( pComp ) pComp->SetPinAlign(iPinIndex, iAlign); m_pMainWindow->UpdateHistory("change pin label alignment", objId); m_pMainWindow->RepaintSkipRouting(); } if ( strLabel != "L" && strLabel != "R" && strLabel != "C" ) Update(); // Enforce L,R,C in GUI } } void PinDialog::Update() { const bool& bCompEdit = m_pMainWindow->m_board.GetCompEdit(); CompDefiner* pDef = bCompEdit ? &m_pMainWindow->m_board.GetCompDefiner() : nullptr; Component* pComp = bCompEdit ? nullptr : GetUserComp(); const size_t numPins = pDef ? pDef->GetNumPins() : pComp ? pComp->GetNumPins() : 0; assert(pDef != nullptr || pComp != nullptr || numPins == 0); // Set up the table ui->tableWidget->clear(); ui->tableWidget->setRowCount(static_cast(numPins)); ui->tableWidget->setColumnCount(3); ui->tableWidget->setColumnWidth(0,40); ui->tableWidget->setColumnWidth(1,105); ui->tableWidget->setColumnWidth(2,65); // Allow for vertical scroll bar m_tableHeader << "Pin" << "Label" << "Align"; ui->tableWidget->setHorizontalHeaderLabels(m_tableHeader); ui->tableWidget->verticalHeader()->setVisible(false); ui->tableWidget->setEditTriggers(QAbstractItemView::AllEditTriggers); ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); ui->tableWidget->setSelectionMode(QAbstractItemView::NoSelection); ui->tableWidget->setShowGrid(true); // Populate the table with data for (size_t iPinIndex = 0; iPinIndex < numPins; iPinIndex++) { const int& iAlign = pDef ? pDef->GetPinAlign(iPinIndex) : pComp->GetPinAlign(iPinIndex); for (int iCol = 0; iCol < 3; iCol++) { std::string str; switch( iCol ) { case 0: str = CompTypes::GetDefaultPinLabel(iPinIndex); break; case 1: str = pDef ? pDef->GetPinLabel(iPinIndex) : pComp->GetPinLabel(iPinIndex); break; case 2: str = ( iAlign == Qt::AlignLeft ) ? "L" : ( iAlign == Qt::AlignRight ) ? "R" :"C"; break; } auto pItem = new QTableWidgetItem(QString::fromStdString(str)); if ( iCol != 1 ) pItem->setData(Qt::TextAlignmentRole, Qt::AlignCenter); if ( iCol == 0 ) pItem->setFlags(Qt::NoItemFlags); else pItem->setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled); ui->tableWidget->setItem(static_cast(iPinIndex), iCol, pItem); } } } void PinDialog::keyPressEvent(QKeyEvent* event) { #ifndef VEROROUTE_ANDROID m_pMainWindow->specialKeyPressEvent(event); #endif QWidget::keyPressEvent(event); event->accept(); } void PinDialog::keyReleaseEvent(QKeyEvent* event) { #ifdef VEROROUTE_ANDROID if ( event->key() == Qt::Key_Back ) return m_pMainWindow->keyReleaseEvent(event); // Try Undo operation #else m_pMainWindow->commonKeyReleaseEvent(event); #endif QWidget::keyReleaseEvent(event); event->accept(); } VeroRoute/tutorials/tutorial_22.vrt000644 001750 001750 00000453163 14433662562 017714 0ustar00alexalex000000 000000 : TUTORIAL 22 - GROUND-FILLS This tutorial shows how to create a PCB mask with a ground-fill. Ground-fills are only enabled when tracks are displayed in Mono" or "PCB" mode, and they do not apply to Vero  track styles. You need to tell the program which net represents "ground" by clicking on the relevant track. That has already been done in this example, and all ground tracks are shown highlighted in grey. To ground-fill with the highlighted net, simply select the "Track Style -> Ground Fill" menu item or click the corresponding button in the toolbar. Try that now. Note that the selected tracks remain highlighted in grey, and that they run through the filled black area. If you double-click on another track (to choose a different netlist ID) then the ground track will disappear in the black. You can reselect the track if you can remember where it was and double-click in the correct place. If you want to fill using a different net, then deselect the "Fill" button, select the desired net, and then press the "Fill" button again. Give that a try. If no track is highlighted in grey when you press the "Fill" button, then the filled area will not be connected to any of the tracks. If you have two board layers, then a different net can be used for the fill in each layer. Just view the relevant layer on screen and set the net used for the fill in that layer using the above procedure. Note that tracks can still be manipulated with ground-fill turned on, just as they can with it turned off. With ground-fill turned on, the "Gap", "Thermal" and "Ground Fill Perimeter" controls become enabled in the the Rendering Options Dialog. Try them out. The "Gap" control sets the size of the white gap that separates tracks from the ground fill. The "Thermal" control sets the width of the thermal relief tags that join the ground pads to the ground fill. If you check the "Thermal X-pattern" box, then all thermal reliefs will use an X-shaped pattern of tags and the ground tracks will not be drawn to the screen. The "Ground Fill Perimeter" expands the board size by the specified amount to help the fill totally surround the layout. Finally, note that the ground-fill does not change any of the connectivity logic in the program. To demonstrate that, re-run this tutorial but before performing the first ground fill, put a break in one of the ground tracks so that the number "1" appears in the "Broken Nets" list. Then do the fill. The net will still be broken, and you will see disjoint grey track sections buried in the black fill. So you may actually have a fully connected ground on the PCB mask even though the program says that you have a broken ground track. џџџџџџџџџџџ@(" 2d '!џџџџџџџџџџ@ЉџџџџџџџџџџџџџџџЛ@ЉџџџџџџџџџџџџџџџџџџџџџџџџџџDаџџџџџџџџџџD‘џџџџџџџџџџD1џџџџџџџџџџDAџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРџџџџџБџџџџџџБџџџџџџџџџџБџџџџџџџџџџБџџџџџџџџџџБџџџџџџџџџџБџџџџџџџџџџБ1џџџџџџџџџџБQџџџџџџџџџџБ‘џџџџџџџџџџБџџџџџџџџџБбџџџџџџБ1џџџџџџџџџџБAџџџџџџџџџбџџџџџџџџџџџџџџџџџџџџџџџџџџ1џџџџџџџџџџAџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџФВџџџџџџџџџџџџџџџџЛDџџџџџџџџџDВџџџџџџDџџџџџџџџџ D  џџџџџџџџџџџџџџџ Г@ˆџџџџџ Dˆџџџџџ M@ˆџџџџџ 8ˆџџџџџ EŠџџџџџ M@Šџџџџџ GPŠџџџџџ GŠџџџџџ C@Šџџџџџ B@Šџџџџџ C@Šџџџџџ B@ŠџџџџџџБNџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџџџџџџџБFџџџџџџџџџ‚@џџџџџџџџџџџџџџџџџџџџџџџџџ ‡РџџџџџџFџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџXџџџџџџџџџ…џџџџџџџџџџџџџџџџЛDџџџџџџџџџГ`џџџџџД#џџџџџ Д џџџџџџџџџџџџџџџџГ„џџџџџџџџџџџџџџџџџџџMТџџџџџџџџџџџџџџџџFџџџџџџџџџMDТџџџџџџGLџџџџџџџџџџџџџџџџџџџCDСџџџџџџBdџџџџџџџџџCСџџџџџџBФџџџџџџџџџБDџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџƒ@џџџџџџБDџџџџџџџџџџ‚Dџџџџџџџџџ‡џџџџџџ‡џџџџџџџџџ ‡џџџџџџdџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџLџџџџџџџџџК §џџџџџџџџџџџџџџџџЛDџџџџџџџџџџГџџџџџџџџџџГџџџџџџџџџ Г џџџџџџГ џџџџџџџџџџџџџџџџџџџC@љџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџMDџџџџџџџџџџGdџџџџџџџџџџџџџџџџџџџCљџџџџџџBTџџџџџџџџџџB›џџџџџџџџџџBџџџџџџџџџџБфџџџџџџџџџџџџџџџџџџџ „ џџџџџ џџџџџ ƒџџџџџБDЫџџџџџџ‚dџџџџџџџџџ Ыџџџџџџџџџџџџџџџ @џџџџџџTџџџџџџџџџƒПџџџџџˆ@LџџџџџџDџџџџџџџџџџџџџџџџџџџКBГџџџџџџЛDџџџџџџџџџДГџџџџџД!#џџџџџџџџџџџџџџџџџџџџџџџџџ Б@ˆџџџџџ Cˆџџџџџ ­@ˆџџџџџ E@ˆџџџџџ dŠџџџџџ MŠџџџџџ GŠџџџџџ GŠџџџџџ @Šџџџџџ B Šџџџџџ A€Šџџџџџ БXŠџџџџџџБЕџџџџџџџџџБc†џџџџџџџџџџџџџџџ„B†џџџџџ@НџџџџџџБDџџџџџџџџџџ‚4џџџџџџџџџџ‚CџџџџџџџџџBНџџџџџџDџџџџџџџџџџLџџџџџџџџџџџџџџџџџџџџˆDџџџџџџџџџџdџџџџџџџџџџџџџџџџџџџџКDџџџџџџџџџЛDАџџџџџџџџџџџџџџџџџџџџџџџџџДАџџџџџџџџџџџџџџџБDюџџџџџџџџџџџџџџџ­DюџџџџџEDŒџџџџџџTџџџџџџџџџџ“џџџџџџџџџŒџџџџџ Кџџџџџ Кџџџџџ AHКџџџџџ †@Кџџџџџ БLКџџџџџ A@Кџџџџџ БКџџџџџ Бќџџџџџ „Фќџџџџџ ќџџџџџ Бќџџџџџ†€§џџџџџ‚ћџџџџџ‚џџџџџФAџџџџџџDџџџџџџџџџџџџџџџџџџџˆDAџџџџџџ4џџџџџџџџџC§џџџџџ КDќџџџџџ Лќџџџџџ –@ќџџџџџџџџџџџџџџџџџџџџџџџџџО@пџџџџџџБDџџџџџџџџџџџџџџџџџџџ­DпџџџџџED‹џџџџџџLџџџџџџџџџџџџџџџџџџџБ`‹џџџџџџџџџџџџџџџџџџџџџџџџџAџџџџџџ†DџџџџџџџџџџБDџџџџџџџџџAџџџџџџџџџџџџџџџ „џџџџџџ „џџџџџџџџџџ џџџџџџџџџ †ˆџџџџџџџџџџџџџџџџџџџџџџџџџџ˜џџџџџџџџџџџџџџџџџџџџФџџџџџџџџџџџџџџџџџџџџˆDџџџџџџџџџО@ѕџџџџџџFџџџџџџџџџџКDџџџџџџџџџџџџџџџџџџџџ–DџџџџџџџџџџџџџџџџџџџџџџџџџџџџџОѕџџџџџџБ$џџџџџџџџџџџџџџџџџџџ­џџџџџџEDџџџџџџџџџџDџџџџџџџџџМ@џџџџџџБTџџџџџџџџџџБ“џџџџџџџџџџБ1џџџџџџџџџџБaџџџџџџџџџ† џџџџџџБфџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ†H џџџџџџџџџџџџџџџџџџџџџџџџџџШџџџџџџџџџџџџџџџџџџџ8iџџџџџџEџџџџџџџџџџџџџџџџџџџˆФiџџџџџџОDџџџџџџџџџџdџџџџџџџџџКџџџџџџџџџџџџџџџџ–Dџџџџџџџџџ ˜@Kџџџџџ —PKџџџџџ —KџџџџџџџџџџџџџџџџБ2џџџџџџџџџБAџџџџџџEDџџџџџџџџџџDџџџџџџџџџџМDџџџџџџџџџБLџџџџџ СКџџџџџ ТКџџџџџ Б6Кџџџџџ Б[Кџџџџџ Б•Кџџџџџ Б3Кџџџџџ БAКџџџџџ pќџџџџџ сќџџџџџ †ќџџџџџ аќџџџџџ™§џџџџџћџџџџџ‘@‚џџџџџџџџџџџџџџџFсџџџџџˆ8сџџџџџџˆEџџџџџџџџџџОDџџџџџџџџџџTџџџџџџџџџџГџџџџџџџџџAQџџџџџџ–Dџџџџџџџџџ˜Sџџџџџџ—LџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџБџџџџџEџџџџџџDџџџџџџџџџМDыџџџџџџБdџџџџџџџџџџџџџџџџџџџМ@ыџџџџџџџџџџџџџџџџ БNџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџБмџџџџџммџџџџџџ—џџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‘„џџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџџ џџџџџџџџџџˆЦџџџџџџџџџџОDџџџџџџџџџџLџџџџџџџџџ@џџџџџџFџџџџџџџџџџ–Dџџџџџџџџџ“@Vџџџџџџ—Dџџџџџџџџџ@Vџџџџџz@Uџџџџџџџџџџџџџџџ`Рџџџџџџџџџџџџџџџ dўџџџџџ Мўџџџџџ Бўџџџџџ Бџџџџџ Мџџџџџџџџџџџџџџџ БЖџџџџџ аЖџџџџџџ‘џџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ‘џџџџџџџџџџ‘џџџџџџџџџџ‘џџџџџџџџџџ‘џџџџџџџџџџ‘ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџ dhџџџџџ ˆ8hџџџџџџˆEџџџџџџџџџџОDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџJџџџџџџ–Dџџџџџџџџџџ“Dџџџџџџџџџ—DJџџџџџџDџџџџџџџџџџzDџџџџџџџџџџџџџџџџџџџ 45џџџџџџcџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ  џџџџџџџџџџџџџџџџџџџџ‘џџџџџџџџџџ‘ џџџџџџџџџџџџџџџџџџџŠ€џџџџџџџџџџџџџџџџџџџџџџџџџР`џџџџџџџџџџџџџџџџџџџџџџџџџџ 4џџџџџџџџџџ CџџџџџџџџџџˆFџџџџџџџџџџОDџџџџџџџџџџDџџџџџџџџџDLџџџџџџџџџџџџџџџџ–Dџџџџџџџџџ“DLџџџџџ—DџџџџџџDџџџџџџџџџzџџџџџџџџџџџџџџџ  `5џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ1џџџџџџџџџџaџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‘HџџџџџџџџџџџџџџџџџџџŠPџџџџџџЉџџџџџџџџџџџџџџџџџџџ‰`џџџџџџџџџџџџџџџР4џџџџџџРCџџџџџџџџџ$Pџџџџџ$MџџџџџџFџџџџџџџџџџˆDџџџџџџџџџџОDџџџџџџџџџџDџџџџџџџџџ8џџџџџџџџџџџџџџџ –DIџџџџџ “DIџџџџџ —Iџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ tџџџџџ Уџџџџџџџџџџџџџџџџџџџџџџџџџ0џџџџџџAџџџџџџџџџ 6&џџџџџ C&џџџџџ @&џџџџџџџџџџџџџџџџ‘DџџџџџџџџџџџџџџџџџџџŠLџџџџџџџџџџџџџџџџџџџџџџџџџ‰Tџџџџџџ‰“џџџџџџџџџ‰џџџџџџРFџџџџџџџџџџ$Lџџџџџџџџџ(@џџџџџџDџџџџџџџџџџˆDџџџџџџџџџџОDџџџџџџџџџџDџџџџџџџџџ•@Mџџџџџџџџџџџџџџџџ–Dџџџџџџџџџ“MџџџџџџџџџџџџџџџИ@uџџџџџџџџџџџџџџџџџџџџџџџџџ мuџџџџџ ‡ џџџџџџџџџџџџџџџџџџџџџџџџџ @ џџџџџџFџџџџџџџџџџџџџџџџџџџџFџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџ‘Dџџџџџџџџџ›@!џџџџџџŠDџџџџџџџџџџџџџџџџџџџ@!џџџџџџ‰Lџџџџџџџџџџџџџџџџџџџ#РџџџџџџРDџџџџџџџџџџ$Dџџџџџџџџџ(DџџџџџџDџџџџџџџџџџˆDџџџџџџџџџџОDџџџџџџџџџџDџџџџџџџџџ•;џџџџџџџџџџџџџџџџ–DџџџџџџџџџџџџџџџџџџџЗР№џџџџџИёџџџџџџ Pџџџџџџџџџџ Йџџџџџџџџџџ Mџџџџџџџџџ  џџџџџџџџџџџџџџџџџџџџџџџџџ D џџџџџџDџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџ џџџџџџџџџџџџџџџџ‘Фџџџџџџџџџ›D џџџџџŠD џџџџџџџџџџџџџџџџФџџџџџџџџџ‰D џџџџџ#8џџџџџџ#EџџџџџџџџџџРDџџџџџџџџџ$Dџџџџџџ(DџџџџџџџџџџDџџџџџџџџџџˆDџџџџџџџџџџОDџџџџџџџџџџDџџџџџџџџџ”@7џџџџџџџџџџџџџџџџ–dџџџџџџџџџЗ87џџџџџЗEjџџџџџ”@jџџџџџџ Lџџџџџџџџџ @ џџџџџџ Fџџџџџџџџџџџџџџџџџџџ " џџџџџџџџџџџџџџџџ DџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџ š@џџџџџ ‘8џџџџџ ‘Eџџџџџ ›џџџџџџŠdџџџџџџџџџ .џџџџџ .џџџџџ ‰.џџџџџ  .џџџџџ #.џџџџџ Р.џџџџџ $.џџџџџџ(DџџџџџџџџџџDџџџџџџџџџџˆDџџџџџџџџџџОDџџџџџџџџџџDџџџџџџџџџ”$6џџџџџџџџџџџџџџџџ–Tџџџџџџџџџ –ƒџџџџџ Зџџџџџ ”Dџџџџџ  џџџџџџ Dџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџ –€.џџџџџ  .џџџџџ  .џџџџџ $.џџџџџџџџџџџџџџџџDџџџџџџџџџџšDџџџџџџџџџџџџџџџџџџџџ‘Fџџџџџџџџџ@џџџџџџŠџџџџџџџџџџŠ3џџџџџџџџџџŠQџџџџџџџџџџŠБџџџџџџџџџџŠaџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ(„џџџџџџџџџDџџџџџџˆDџџџџџџџџџџОDџџџџџџџџџџdџџџџџџџџџџџџџџџџџџџ”хџџџџџџ–Lџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ”хџџџџџџџџџџџџџџџџ Dџџџџџџџџџџ Dџџџџџџџџџџ–HџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџBџџџџџџџџџџDџџџџџџџџџšєџџџџџџџџџџџџџџџџ‘DџџџџџџџџџџDџџџџџџџџџšPєџџџџџš<џџџџџџŠЮџџџџџџџџџš <џџџџџџŠ6џџџџџџџџџџŠCџџџџџџџџџџџџџџџџџџџџ(HџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџˆDџџџџџџџџџџОDџџџџџџџџџџTџџџџџџџџџџ“џџџџџџџџџфџџџџџџ–Dџџџџџџџџџфџџџџџџџџџџџџџџџџ1џџџџџџџџџAџџџџџџ Dџџџџџџџџџџ Dџџџџџџџџџџ–Dџџџџџџџџџџџџџџџџџџџџџџџџџ1џџџџџџџџџA џџџџџџDџџџџџџџџџD џџџџџ €@џџџџџ -@џџџџџ ‘џџџџџ DџџџџџџšLџџџџџџџџџ Š.џџџџџ Š.џџџџџ Œ@.џџџџџ šB.џџџџџ Š.џџџџџ &€.џџџџџ (D.џџџџџ%@NџџџџџџDџџџџџџџџџџˆDџџџџџџџџџџОDџџџџџџџџџџLџџџџџџџџџx@6џџџџџџџџџџџџџџџџ–Dџџџџџџџџџ n@џџџџџ  @џџџџџ  @џџџџџ Fџџџџџџ Dџџџџџџџџџџ Dџџџџџџџџџџ–Dџџџџџџџџџ 0.џџџџџ A.џџџџџ @.џџџџџ F.џџџџџџDџџџџџџџџџDџџџџџџ€Dџџџџџџџџџџ-dџџџџџџџџџџџџџџџџџџџDџџџџџšD!џџџџџџџџџџџџџџџџџџџџџџџџџŒФ!џџџџџџšDџџџџџџџџџ&Hџџџџџџџџџџџџџџџџ(Dџџџџџџџџџ%џџџџџџDџџџџџџџџџџˆDџџџџџџџџџџОDџџџџџџџџџџDџџџџџџџџџxDяџџџџџn@џџџџџџ–Dџџџџџџџџџnџџџџџ Ф џџџџџџ DџџџџџџџџџџDџџџџџџџџџ D џџџџџ Dџџџџџџ–dџџџџџџџџџџџџџџџџџџџџџџџџD!џџџџџџDџџџџџџџџџџDџџџџџџџџџD!џџџџџ€DPџџџџџ-Oџџџџџ-(џџџџџD*џџџџџš)џџџџџŒ"џџџџџџŒџџџџџџџџџ Œ#џџџџџџšDџџџџџџџџџ &6џџџџџџџџџџџџџџџ (7џџџџџџџџџџџџџџџџDџџџџџџџџџџˆDџџџџџџџџџОџџџџџџDџџџџџџџџџxџџџџџnD.џџџџџџ–Dџџџџџџџџџ 8.џџџџџџ Eџџџџџџџџџ D џџџџџџDџџџџџџџџџџ Dџџџџџџџџџ  џџџџџ–4"џџџџџџ–Cџџџџџџџџџџџџџџџџџџџ"џџџџџџDџџџџџџџџџџDџџџџџџџџџџ Dџџџџџџџџџџ €$џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџdџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ @#џџџџџџšdџџџџџџџџџ '6џџџџџџ'џџџџџџџџџ '7џџџџџџџџџџџџџџџџDџџџџџџџџџџˆDџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџnDџџџџџџ–Dџџџџџџџџџџџџџџџџџџџ Fџџџџџџ DџџџџџџџџџDџџџџџџ Dџџџџџџџџџџџџџџџџџџџ€џџџџџџ–FџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџ Dиџџџџџ –@иџџџџџџ€Bџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ3џџџџџџџџџџaџџџџџџџџџџџџџџџџџџџџ Фџџџџџџџџџџ šTџџџџџџџџџџš“џџџџџџџџџџš1џџџџџџџџџšArџџџџџџџџџџџџџџџџФџџџџџџџџџˆDrџџџџџn@џџџџџџDџџџџџџџџџЙ@џџџџџџnDџџџџџџџџџџ–Dџџџџџџџџџ@-џџџџџџ dџџџџџџџџџ -џџџџџџџџџџџ DџџџџџџџџџHTџџџџџџџџџџџџџџџџ–Dџџџџџџџџџ`nџџџџџџџџџџџџџџџnџџџџџџDџџџџџџџџџџ Dџџџџџџџџџџ –Dџџџџџџџџџџ€$џџџџџџџџџ(џџџџџ*џџџџџ)џџџџџ"џџџџџџџџџџџџџџџ qџџџџџ š qџџџџџџџџџџџџџџџџџџџџџџџџџšйџџџџџ8йџџџџџџEџџџџџџџџџџˆDџџџџџџџџџnDџџџџџџDџџџџџџџџџџЙDџџџџџџџџџnџџџџџџ–dџџџџџџџџџRџџџџџџ џџџџџџџџџ ,џџџџџџџџџџџџџџџ ,џџџџџџџџџџџџџџџџџџџџџ–фџџџџџџџџџџџџџџ+џџџџџџџџџџџџџџџ+џџџџџцџџџџџ–фцџџџџџџџџџџџџџџџџ€џџџџџџџџџџ€џџџџџџџџџџ€џџџџџџџџџџ€џџџџџџџџџџ€џџџџџџџџџџ €џџџџџџџџџџ €џџџџџџџџџџ€џџџџџџџџџџ€џџџџџџџџџџ€1џџџџџџџџџџ€AџџџџџџџџџџFџџџџџџџџџџˆDџџџџџџџџџnџџџџџџDџџџџџџџџџџЙDџџџџџџџџџџџџџџџџџџџџ–”џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџ–кџџџџџџ€FџџџџџџџџџџDџџџџџџџџџˆDкџџџџџџџџџџџџџџџџDџџџџџџџџџџЙDџџџџџџџџџџ–Hџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџаџџџџџџџџџџ‘џџџџџџџџџџ1џџџџџџџџџџAџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЋРџџџџџВџџџџџџВџџџџџџџџџџВџџџџџџџџџџВџџџџџџџџџџВџџџџџџџџџџВџџџџџџџџџџВ1џџџџџџџџџџВQџџџџџџџџџџВ‘џџџџџџџџџџВџџџџџџџџџВЯџџџџџџВ1џџџџџџџџџџВAџџџџџџџџџЯџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџ€Dџџџџџџџџџ џџџџџџˆDџџџџџџџџџП@џџџџџDџџџџџџЙDџџџџџџџџџџ–Dџџџџџџџџџџџџџџџџџџџџџџџџ  џџџџџџџџџџџџџџџ Е@џџџџџ џџџџџ @џџџџџ Ћ8џџџџџ ЋEџџџџџ @џџџџџ 9Pџџџџџ 9џџџџџ @џџџџџ 8@џџџџџ @џџџџџ 8@џџџџџџВNџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ0@%џџџџџџџџџџџџџџџџВFџџџџџџџџџ1@%џџџџџџџџџџџџџџџџџџџџџџџџџ 2РEџџџџџџ€DџџџџџџџџџџџџџџџџџџџџˆDџџџџџџџџџџПDџџџџџџџџџDџџџџџџЙDџџџџџџџџџџ–DџџџџџџџџџЕ`џџџџџW$џџџџџ WџџџџџџџџџџџџџџџџЕ„џџџџџџџџџџџџџџџџџџџVџџџџџџџџџџџџџџџџЋFџџџџџџџџџDVџџџџџџ9LџџџџџџџџџџџџџџџџџџџD_џџџџџџ8dџџџџџџџџџ_џџџџџџ8ФџџџџџџџџџВD$џџџџџџџџџџџџџџџџџџџџџџџџџ0D$џџџџџ3@&џџџџџџВDџџџџџџџџџџ1Dџџџџџџџџџ2&џџџџџџ2џџџџџџџџџ 2Eџџџџџџ€DџџџџџџџџџџџџџџџџџџџџˆDџџџџџџџџџџПDџџџџџџџџџџDџџџџџџџџџџЙDџџџџџџџџџџ–$џџџџџџџџџџЕџџџџџџџџџџЕџџџџџџџџџ ЕџџџџџџЕ џџџџџџџџџџџџџџџџџџџ@fџџџџџџџџџџџџџџџџџџџџџџџџџџЋDџџџџџџџџџџDџџџџџџџџџџ9dџџџџџџџџџџџџџџџџџџџfџџџџџџ8Tџџџџџџџџџџ8›џџџџџџџџџџ8џџџџџџџџџџВфџџџџџџџџџџџџџџџџџџџ 4 Bџџџџџ 0Bџџџџџ 3BџџџџџВDЬџџџџџџ1dџџџџџџџџџž Ьџџџџџџџџџџџџџџџ Ћ@Eџџџџџџ€DџџџџџџџџџџџџџџџџџџџџˆDџџџџџџџџџџПDџџџџџџџџџџDџџџџџџџџџџЙDџџџџџџџџџџџџџџџџџџџџ–BџџџџџџџџџW`$џџџџџџџџџџџџџџџџџџџџџџџџџ В@џџџџџ џџџџџ Ў@џџџџџ _@џџџџџ Ћdџџџџџ џџџџџ 9џџџџџ 9џџџџџ 6@џџџџџ 8 џџџџџ 7€џџџџџ ВXџџџџџџВЕџџџџџџџџџВc„џџџџџџџџџџџџџџџ4B„џџџџџž@FџџџџџџВDџџџџџџџџџџ14џџџџџџџџџџ1CџџџџџџџџџžBFџџџџџџЋDџџџџџџџџџџ€DџџџџџџџџџџџџџџџџџџџџˆDџџџџџџџџџџПDџџџџџџџџџџDџџџџџџџџџџЙDџџџџџџџџџ@џџџџџџ–DџџџџџџџџџџWTџџџџџџџџџWƒџџџџџџџџџџџџџџџВDэџџџџџџџџџџџџџџџЎDэџџџџџ_DШџџџџџџЋTџџџџџџџџџџЋ“џџџџџџџџџЋШџџџџџ Ћџџџџџ 6џџџџџ 7Hџџџџџ Ќ@џџџџџ ВLџџџџџ 7@џџџџџ Вџџџџџ Вџџџџџ 4Фџџџџџ žџџџџџ ВџџџџџЌ€'џџџџџ1>џџџџџžƒџџџџџЋФИџџџџџџ€DџџџџџџџџџџџџџџџџџџџˆИџџџџџџПDџџџџџџџџџџDџџџџџџџџџ ЙDњџџџџџ Dњџџџџџ –њџџџџџџWLџџџџџџџџџџџџџџџџџџџП@оџџџџџџВDџџџџџџџџџџџџџџџџџџџЎDоџџџџџ_DЧџџџџџџЋLџџџџџџџџџџџџџџџџџџџВ`Чџџџџџџџџџџџџџџџџџџџџџџџџџ7ЊџџџџџџЌDџџџџџџџџџџВDџџџџџџџџџ7Њџџџџџџџџџџџџџџџ 4?џџџџџџ 4џџџџџџџџџџ џџџџџџџџџ Ќˆ?џџџџџџџџџџџџџџџџџџџџџџџџџџЋ˜џџџџџџџџџџЋџџџџџџџџџџ€„џџџџџџџџџџџџџџџџџџџџџџџџџџџџџПіџџџџџџDџџџџџџџџџџЙDџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџW„џџџџџџџџџџџџџџџџџџџПіџџџџџџВ$џџџџџџџџџџџџџџџџџџџЎџџџџџџ_DџџџџџџџџџџЋDџџџџџџџџџН@џџџџџџВTџџџџџџџџџџВ“џџџџџџџџџџВ1џџџџџџџџџџВaџџџџџџџџџЌ1џџџџџџВфџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЌH1џџџџџџџџџџџџџџџџџџџџџџџџџџЋШџџџџџџџџџџџџџџџџџџџџ€ˆџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџЙDИџџџџџџDџџџџџџџџџWИџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџВ2џџџџџџџџџВAџџџџџџ_DџџџџџџџџџџЋDџџџџџџџџџџНDџџџџџџџџџВLџџџџџ Уџџџџџ Фџџџџџ В6џџџџџ В[џџџџџ В•џџџџџ В3џџџџџ ВAџџџџџ Ћpџџџџџ Ћсџџџџџ Ќџџџџџ ЋаџџџџџЋ™'џџџџџЋ>џџџџџ€ƒџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџЙћџџџџџџDџџџџџџџџџџџџџџџџџџџ@ћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџВ џџџџџ_ џџџџџџЋDџџџџџџџџџНDьџџџџџџВdџџџџџџџџџџџџџџџџџџџН@ьџџџџџџџџџџџџџџџџ ВNџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџВнџџџџџЋмнџџџџџџЋ—џџџџџџџџџџЋџџџџџџџџџџЋ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџdџџџџџџџџџџџџџџџџџџџЋџџџџџџџџџџџџџџџФЋџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Ћdџџџџџџ Нџџџџџџ Вџџџџџџ Вџџџџџ Нџџџџџџџџџџџџџџџ ВZџџџџџ ЋаZџџџџџџЋ‘џџџџџџџџџџЋџџџџџџџџџџЋ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЋџџџџџџџџџџЋџџџџџџџџџџЋџџџџџџџџџџЋџџџџџџџџџџЋџџџџџџџџџџЋџџџџџџџџџџ Ћџџџџџџџџџџ Ћ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџНџШ<W41W41WireWireWF(šš1šš2П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџџџ,§R2910kRResistorRESISTORNF(К12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєVC1747nCCeramicCAP_CERAMIC WF(“12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,R4010kRResistorRESISTOR WF(Š1Р2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   6C2133uC(Electrolytic 200 milCAP_ELECTRO_200NF(&1'2П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠф       џџџџџџџџџџџџџџ       @IC8CD4013BICDIPDIP WF(У1Ф2В3В4В5В6В7В879В10Ќ11712613Ћ14Р ЬЬЬЬЬЭ@ ЬЬЬЬЬЭП§™™™™™š?§™™™™™š@V€   Р ЬЬЬЬЬЭР ЬЬЬЬЬЭП§™™™™™šПа@V€   Р ЬЬЬЬЬЭР ЬЬЬЬЬЭ?а?§™™™™™š@V€   Р ЬЬЬЬЬЭ@ ЬЬЬЬЬЭ?§™™™™™š?§™™™™™š@V€   @ ЬЬЬЬЬЭР ЬЬЬЬЬЭП§™™™™™šП§™™™™™š@V€   @ ЬЬЬЬЬЭ@ ЬЬЬЬЬЭ?§™™™™™šП§™™™™™š@V€   Р ЬЬЬЬЬЭРЬЬЬЬЬЭПа?аРV€@V€   џџШW24W24WireWireWF(nn1nn2Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџџџџџџџШfW17W17WireWire WF(12Р @ ПЙ™™™™™š?Й™™™™™š@V€пџџР @ ПЙ™™™™™š?Й™™™™™š@V€пџџџџШW30W30WireWireWF(12Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџџєЬC24100nCCeramicCAP_CERAMICWF(В1ž2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ P        џџџџџџџџџџџџџџџџ        @IC9CD4049BICDIPDIP WF(Ћ129394658677В889108111291391415Ћ16РЬЬЬЬЬЭ@ЬЬЬЬЬЭП§™™™™™š?§™™™™™š@V€   РЬЬЬЬЬЭРЬЬЬЬЬЭП§™™™™™šПа@V€   РЬЬЬЬЬЭРЬЬЬЬЬЭ?а?§™™™™™š@V€   РЬЬЬЬЬЭ@ЬЬЬЬЬЭ?§™™™™™š?§™™™™™š@V€   @ЬЬЬЬЬЭРЬЬЬЬЬЭП§™™™™™šП§™™™™™š@V€   @ЬЬЬЬЬЭ@ЬЬЬЬЬЭ?§™™™™™šП§™™™™™š@V€   РffffffР ЬЬЬЬЬЭПа?аРV€@V€   џџ,6R1910kRResistorRESISTORNF(”1x2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   LQ5 2N5087QTO92TO92EF(ƒ12„3Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џџ,ВR24100kRResistorRESISTORWF(1D2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџџџџџШѕW21W21WireWireWF(ОО1ОО2Р @ ПЙ™™™™™š?Й™™™™™š@V€пџџР @ ПЙ™™™™™š?Й™™™™™š@V€пџџdS Regen3 Regen3PadPadPAD џџџшEF(˜1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R85k6RResistorRESISTOREF( 1n2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџџШW26W26WireWire WF(ББ1ББ2Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџџџШW29W29WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџџ,R13100kRResistorRESISTOREF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R553k9RResistorRESISTOREF(‡1ƒ2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєnC1100pCCeramicCAP_CERAMIC EF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџє+C210nCCeramicCAP_CERAMICWF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,ŒR221kRResistorRESISTOR EF(1E2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,ЯR6210RRResistorRESISTOREF(1В2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џє-C52n2CCeramicCAP_CERAMICEF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,R581kRResistorRESISTOR EF(1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§єC39100nCCeramicCAP_CERAMIC WF(1Б2ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ Pџџ,кR5910RRResistorRESISTORWF(–1ˆ2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,(R472k2RResistorRESISTORSF(1-2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ, R4210kRResistorRESISTOREF(‰1Š2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§єсC29100nCCeramicCAP_CERAMICEF(ˆ12ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ P   АERT3 20k-BRTVerticalTRIM_VERTSF(Ћ12223Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§џџ,ƒR5110kRResistorRESISTOR NF(ž1€2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џ џ   џ џ „qC32470uC(Electrolytic 250 milCAP_ELECTRO_250EF(š12Пє?єПє?є@V€ŠŠф?юИQы…И?юИQы…ИПщ™™™™™š?щ™™™™™š@V€ŠŠфПє?єПє?є@V€ŠŠфџє.C41nCCeramicCAP_CERAMICEF( 1n2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ P   #C1910uC(Electrolytic 200 milCAP_ELECTRO_200NF(Œ12П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџШфW17W17WireWireWF(12П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџ   LBQ4 2N5087QTO92TO92EF(310243Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џџD6 1N4148D Diode DIODEWF(„1†2Пўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfD?ё™™™™™™?ё™™™™™™Пй™™™™™š?й™™™™™š@V€џfD?ђffffff?ђffffffПй™™™™™š?й™™™™™š@V€џfD?§™™™™™™?§™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfDџШСW18W18WireWireWF(CC1CC2П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџџџ, R6470RRResistorRESISTOR EF( 1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєC16220nCCeramicCAP_CERAMICNF(К12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,%R4862kRResistorRESISTORWF(0112ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џ џ   џ џ „hC28470uC(Electrolytic 250 milCAP_ELECTRO_250 EF(ˆ12Пє?єПє?є@V€ŠŠф?юИQы…И?юИQы…ИПщ™™™™™š?щ™™™™™š@V€ŠŠфПє?єПє?є@V€ŠŠфџџ,‹R2314kRResistorRESISTOR WF(E1Б2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   C4110uC(Electrolytic 200 milCAP_ELECTRO_200%EF(Н1В2П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџџ>D3 1N4001D Diode DIODE SF(Ћ112Пўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfD?ё™™™™™™?ё™™™™™™Пй™™™™™š?й™™™™™š@V€џfD?ђffffff?ђffffffПй™™™™™š?й™™™™™š@V€џfD?§™™™™™™?§™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfDџџ,ИR6110RRResistorRESISTOR EF(ˆ1Ћ2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§єнC35100nCCeramicCAP_CERAMIC$WF(В1Ћ2ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ P    џџџџџџџџ    @IC6 LM358ICDIPDIPWF(€1-2‘34›5‘6‘7š8П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€      LњQ1 2N3404QTO92TO92!WF(Й12–3Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   dO Depth1 Depth1PadPadPADNF(-1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdё55PadPadPADWF(И1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdUOutOutPadPadPAD WF(z1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R3810kRResistorRESISTORWF(#1(2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џШ#W31W31WireWireNF(ДД1ДД2П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџ    џџџџџџџџ    @.IC3 LM833NICDIPDIP WF(12345 6 7–8П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€   џџШыW20W20WireWire WF(ММ1ММ2Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџџџ,*R463k9RResistorRESISTORSF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,бR6410RRResistorRESISTOREF(1Б2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   5C2710uC(Electrolytic 200 milCAP_ELECTRO_200 SF( 12П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџџџШхW18W18WireWireWF(””1””2Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџd;11PadPadPADWF(•1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп   LќQ2 2N3904QTO92TO92WF(К1Л2–3Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џєЋC9330pCCeramicCAP_CERAMIC%WF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,!R4382kRResistorRESISTOREF(1›2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,JR3410kRResistorRESISTOR WF(1—2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џШ W27W27WireWireWF(12П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџџџ,ШR111kRResistorRESISTOR EF(Ћ1_2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R2100kRResistorRESISTOR WF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџџШНW19W19WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџ    џџџџџџџџ    @ќIC10 LM311NICDIPDIPEF(Б12„3Б456†78П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€   џџ,)R4527kRResistorRESISTORNF(š12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   А&RT2 10k-BRTVerticalTRIM_VERT WF(123Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§   7C2233uC(Electrolytic 200 milCAP_ELECTRO_200NF((1'2П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфєйC33100nCCeramicCAP_CERAMICWF(š12ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ P   АўRT8 50k-BRTVerticalTRIM_VERT WF(1М2Б3Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§џџ,R66100kRResistorRESISTOR EF(М1­2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџШVW1W1WireWire WF(12Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџ    џџџџџџџџ    @ˆIC2 BL3207ICDIPDIPWF(Б1C2­3E45M6D7Г8П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€   џєЫC26100nCCeramicCAP_CERAMICEF(1Б2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,7R2010kRResistorRESISTORWF(”1З2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R414k7RResistorRESISTOR EF((1‰2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,оR10100kRResistorRESISTOR!WF(П1Ў2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџD2 1N4148D Diode DIODE WF(Š1‰2Пўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfD?ё™™™™™™?ё™™™™™™Пй™™™™™š?й™™™™™š@V€џfD?ђffffff?ђffffffПй™™™™™š?й™™™™™š@V€џfD?§™™™™™™?§™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfDєцC31100nCCeramicCAP_CERAMICWF(1–2ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PdP Depth2 Depth2PadPadPADNF(€1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџШьW21W21WireWire$ WF(НН1НН2Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџєC13100nCCeramicCAP_CERAMIC WF(Б1E2ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ P    џџџџџџџџ    @IC4 BL3207ICDIPDIPWF(В12Ў3_4Ћ567Е8П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€   џєC40220nCCeramicCAP_CERAMICNF(n1П2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PdM Rate2 Rate2PadPadPAD WF($1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdПGGPadPadPADџџџ№WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп   АџRT6 50k-BRTVerticalTRIM_VERT% EF(В1Н2Ћ3Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§џџ,АR283k9RResistorRESISTOREF(Д1Л2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџћD5 1N4001D Diode DIODESF(1‚2Пўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfD?ё™™™™™™?ё™™™™™™Пй™™™™™š?й™™™™™š@V€џfD?ђffffff?ђffffffПй™™™™™š?й™™™™™š@V€џfD?§™™™™™™?§™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfDdя22PadPadPADWF(x1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп       џџџџџџџџџџџџџџ       @.IC5 LM324ICDIPDIPWF(Š1Š2Œ3š4Š5&6(7$8Р9#1011‰121314Р ЬЬЬЬЬЭ@ ЬЬЬЬЬЭП§™™™™™š?§™™™™™š@V€   Р ЬЬЬЬЬЭР ЬЬЬЬЬЭП§™™™™™šПа@V€   Р ЬЬЬЬЬЭР ЬЬЬЬЬЭ?а?§™™™™™š@V€   Р ЬЬЬЬЬЭ@ ЬЬЬЬЬЭ?§™™™™™š?§™™™™™š@V€   @ ЬЬЬЬЬЭР ЬЬЬЬЬЭП§™™™™™šП§™™™™™š@V€   @ ЬЬЬЬЬЭ@ ЬЬЬЬЬЭ?§™™™™™šП§™™™™™š@V€   Р ЬЬЬЬЬЭРЬЬЬЬЬЭПа?аРV€@V€   џџ,!R35120kRResistorRESISTORWF(š1Œ2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џє,C347nCCeramicCAP_CERAMICEF( 1 2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ P    џџџџџџџџ    @IC7 LM311NICDIPDIP EF(В1ž243В4Ћ5Ћ6Ќ7Ћ8П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€   џџџШFW40W40WireWireWF(žž1žž2Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџdQ Regen1 Regen1PadPadPAD џџџ№WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџШЊW36W36WireWire!WF(771772Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџџєэC6100pCCeramicCAP_CERAMIC WF(В1Ў2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџє„C2347pCCeramicCAP_CERAMICWF(В142Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,R25100kRResistorRESISTOREF(Г12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R3727kRResistorRESISTORWF(#1$2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,!R6856kRResistorRESISTORWF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,пR21100kRResistorRESISTORWF(О1­2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџD1 1N4148D Diode DIODE EF(‰1Š2Пўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfD?ё™™™™™™?ё™™™™™™Пй™™™™™š?й™™™™™š@V€џfD?ђffffff?ђffffffПй™™™™™š?й™™™™™š@V€џfD?§™™™™™™?§™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfD        џџџџџџџџџџџџџџџџ        @ŠIC12CD4049BICDIPDIP WF(1M2G3G45B6A7Б8B9C10B11C12G13G14M1516РЬЬЬЬЬЭ@ЬЬЬЬЬЭП§™™™™™š?§™™™™™š@V€   РЬЬЬЬЬЭРЬЬЬЬЬЭП§™™™™™šПа@V€   РЬЬЬЬЬЭРЬЬЬЬЬЭ?а?§™™™™™š@V€   РЬЬЬЬЬЭ@ЬЬЬЬЬЭ?§™™™™™š?§™™™™™š@V€   @ЬЬЬЬЬЭРЬЬЬЬЬЭП§™™™™™šП§™™™™™š@V€   @ЬЬЬЬЬЭ@ЬЬЬЬЬЭ?§™™™™™šП§™™™™™š@V€   РffffffР ЬЬЬЬЬЭПа?аРV€@V€   џџџШW27W27WireWire# WF(ВВ1ВВ2Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџџ,R65100kRResistorRESISTOR" WF(Ў1Н2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,AR6310RRResistorRESISTORWF(1ˆ2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dL9V9VPadPadPAD џџџ№WF(ˆ1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџєюC12100pCCeramicCAP_CERAMICWF(Б1­2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,§R5710kRResistorRESISTORSF(1†2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџџџџШ1W38W38WireWire"WF(ЌЌ1ЌЌ2Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџєC36100nCCeramicCAP_CERAMIC WF(Ћ1В2ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ Pџ џ   џ џ „иC30470uC(Electrolytic 250 milCAP_ELECTRO_250EF(–12Пє?єПє?є@V€ŠŠф?юИQы…И?юИQы…ИПщ™™™™™š?щ™™™™™š@V€ŠŠфПє?єПє?є@V€ŠŠфџџџШW31W31WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџ џ   џ џ „ZC34470uC(Electrolytic 250 milCAP_ELECTRO_250$EF(Ћ1В2Пє?єПє?є@V€ŠŠф?юИQы…И?юИQы…ИПщ™™™™™š?щ™™™™™š@V€ŠŠфПє?єПє?є@V€ŠŠф   C4310uC(Electrolytic 200 milCAP_ELECTRO_200 EF(М1Б2П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџШ_W10W10WireWireWF(12П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџџєИC810nCCeramicCAP_CERAMIC#WF(Й1W2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,ћR1810kRResistorRESISTOR$EF(1Й2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dGGPadPadPADWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџєC2022nCCeramicCAP_CERAMIC WF(Р1$2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,rR6010RRResistorRESISTOREF(ˆ1š2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dTInInPadPadPAD WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџєC10220nCCeramicCAP_CERAMICNF(x1Й2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ, R9100kRResistorRESISTORWF( 1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџџџџџШіW22W22WireWire"WF(ПП1ПП2Р @ ПЙ™™™™™š?Й™™™™™š@V€пџџР @ ПЙ™™™™™š?Й™™™™™š@V€пџџџєГC1410nCCeramicCAP_CERAMICWF(К1Д2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PємC38100nCCeramicCAP_CERAMIC EF(1Б2ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ Pd№33PadPadPADWF(З1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdN Rate3 Rate3PadPadPADWF(%1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ, R510kRResistorRESISTOR EF( 1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,LR3210kRResistorRESISTOR EF(“12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   А RT9 10k-BRTVerticalTRIM_VERTNF(D1Д2Г3Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§d844PadPadPAD WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџџџџџШљW22W22WireWire WF(CC1CC2Р @ ПЙ™™™™™š?Й™™™™™š@V€пџџР @ ПЙ™™™™™š?Й™™™™™š@V€пџџџџ,R541M2RResistorRESISTORWF(Б12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,'R5210kRResistorRESISTOR NF(Ќ1Ћ2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєЉC15330pCCeramicCAP_CERAMICEF(Л12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PєjC11820pCCeramicCAP_CERAMICEF(”1З2ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ Pџџ, R74k7RResistorRESISTOREF( 1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєC18220nCCeramicCAP_CERAMIC WF(—1z2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PџШW22W22WireWireWF(nn1nn2П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџ   АRT7 10k-BRTVerticalTRIM_VERTNF(1W2Е3Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§џџ, R42k7RResistorRESISTOR EF( 1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,MR3110kRResistorRESISTORWF(•1“2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџџШєW21W21WireWireWF(šš1šš2Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџdR Regen2 Regen2PadPadPAD WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,"R36100kRResistorRESISTORSF(1Œ2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dРGGPadPadPAD WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,"R6756kRResistorRESISTOR WF(–12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R393k9RResistorRESISTOREF(%1&2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,$R491M2RResistorRESISTOREF(01В2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§       џџџџџџџџџџџџџџ       @КIC11CD4013BICDIPDIPWF(С1Т2Б3Б4Б5Б6Б7Б8A9Б10†11A121314Р ЬЬЬЬЬЭ@ ЬЬЬЬЬЭП§™™™™™š?§™™™™™š@V€   Р ЬЬЬЬЬЭР ЬЬЬЬЬЭП§™™™™™šПа@V€   Р ЬЬЬЬЬЭР ЬЬЬЬЬЭ?а?§™™™™™š@V€   Р ЬЬЬЬЬЭ@ ЬЬЬЬЬЭ?§™™™™™š?§™™™™™š@V€   @ ЬЬЬЬЬЭР ЬЬЬЬЬЭП§™™™™™šП§™™™™™š@V€   @ ЬЬЬЬЬЭ@ ЬЬЬЬЬЭ?§™™™™™šП§™™™™™š@V€   Р ЬЬЬЬЬЭРЬЬЬЬЬЭПа?аРV€@V€   џџ?D4 1N4148D Diode DIODE!WF(41Ќ2Пўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfD?ё™™™™™™?ё™™™™™™Пй™™™™™š?й™™™™™š@V€џfD?ђffffff?ђffffffПй™™™™™š?й™™™™™š@V€џfD?§™™™™™™?§™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfDџџ,‚R5610kRResistorRESISTORNF(1‘2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§є C7100nCCeramicCAP_CERAMIC$ WF(В1_2ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PџџџџџШW29W29WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџџ,R14100kRResistorRESISTOREF(Е12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   АRT4 20k-BRTVerticalTRIM_VERTSF(1‡2‡3Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§џџ,R173k9RResistorRESISTOR WF(1W2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џ џ   џ џ „ЖC37470uC(Electrolytic 250 milCAP_ELECTRO_250 EF(1Б2Пє?єПє?є@V€ŠŠф?юИQы…И?юИQы…ИПщ™™™™™š?щ™™™™™š@V€ŠŠфПє?єПє?є@V€ŠŠфџџ,R31MRResistorRESISTOR EF(1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   АKRT1 200k-BRTVerticalTRIM_VERTEF(—1—2˜3Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§џџџџџШ W28W28WireWireWF(††1††2Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџє†C2547pCCeramicCAP_CERAMICWF(Б1„2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PџџiD7Zener_9.1VD Diode DIODEWF(1ˆ2Пўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfD?ё™™™™™™?ё™™™™™™Пй™™™™™š?й™™™™™š@V€џfD?ђffffff?ђffffffПй™™™™™š?й™™™™™š@V€џfD?§™™™™™™?§™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfDџџ,&R503k9RResistorRESISTOREF(2132ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R5362kRResistorRESISTOREF(‚12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџШТW19W19WireWire WF(MM1MM2Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџџџ, R4433kRResistorRESISTOREF(›12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џШ$W32W32WireWireNF(WW1WW2П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџџџ,uR3010kRResistorRESISTOREF( 1И2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R33470RRResistorRESISTOR EF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџШW32W32WireWireWF(AA1AA2Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџџєC42220nCCeramicCAP_CERAMICSF(n1О2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ P    џџџџџџџџ    @IC1 LM833NICDIPDIPWF(n1 2 34 5”6З7–8П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€   џШ W26W26WireWireWF(12П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџ   LIQ3 2N3904QTO92TO92 EF(—1“2–3Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џџ,R12M2RResistorRESISTOREF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,ЧR1214kRResistorRESISTOR! WF(_1В2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§B@џџџўINVALID TracksWF(џџџџџџџџџџџ€џџџ€џџџ€џџџ€џџџџџџџџF#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Р@Р@@V€џVeroRoute/libraries/gEDA/veroroute_transistor/NPN_2N5089.sym000644 001750 001750 00000001563 13515171161 024052 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=3 T 400 850 5 6 0 0 0 0 1 pinseq=3 T 400 850 5 6 0 0 0 0 1 pinlabel=3 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=1 T 400 50 5 6 0 0 0 0 1 pinseq=1 T 400 50 5 6 0 0 0 0 1 pinlabel=1 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 403,209 L 501,200 L 431,273 L 425,240 z T 600 700 5 10 1 1 0 0 1 device=2N5089 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=NPN Transistor VeroRoute/Src/veroroute.qrc000644 001750 001750 00000003635 14561223403 016233 0ustar00alexalex000000 000000 images/bold.png images/italic.png images/underline.png images/left.png images/center.png images/right.png images/justify.png images/top.png images/mid.png images/bot.png images/grid.png images/text.png images/pinlabels.png images/fliph.png images/flipv.png images/fat.png images/thin.png images/curved.png images/verov.png images/veroh.png images/diagsmin.png images/diagsmax.png images/fill.png images/area.png images/undo.png images/redo.png images/zoomin.png images/zoomout.png images/layerbot.png images/layertop.png images/layerpref.png images/editor.png images/addline.png images/addrect.png images/addroundedrect.png images/addellipse.png images/addarc.png images/addchord.png images/erasegrid.png images/erasepins.png images/paintflood.png images/paintgrid.png images/paintpins.png images/pineditor.png images/templates.png images/render.png images/delete.png images/copy.png VeroRoute/Src/images/grid.png000644 001750 001750 00000000261 13734457550 016377 0ustar00alexalex000000 000000 ‰PNG  IHDR йsВbKGDЊ#2 pHYsФФ•+tIMEф  0’C~†BIDATHЧэ’1 ФŠсџ_ЦХнT&ЭнжЅЄPœAD‚С)ћА1[ЗЙU_( |=nјёЉu д:јЊƒИћ@%ї;„wIENDЎB`‚VeroRoute/Src/FootPrint.h000644 001750 001750 00000023000 14427326765 015573 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include "Grid.h" // For CompElementGrid class CompManager; class RectManager; // The representation of a component's pin layout and surface occupancy and track pattern class FootPrint : public CompElementGrid { public: FootPrint() : CompElementGrid(), m_type(COMP::INVALID) {} FootPrint(const FootPrint& o) : CompElementGrid(o), m_type(o.m_type) {} FootPrint& operator=(const FootPrint& o) { CompElementGrid::operator=(o); // Call operator= in base class m_type = o.m_type; return *this; } bool operator==(const FootPrint& o) const // Compare persisted info { return CompElementGrid::operator==(o) && m_type == o.m_type; } bool operator!=(const FootPrint& o) const { return !(*this == o); } virtual ~FootPrint() override {} void SetType(COMP type) { m_type = type; } const COMP& GetType() const { return m_type; } void BuildDefault(COMP type); void BuildTrax(CompManager* pCompMgr, const RectManager& rectMgr, const ElementGrid& o, int nLyr, int nRowMin, int nRowMax, int nColMin, int nColMax); bool CanStretch(bool bGrow) const { switch( m_type ) { case COMP::VERO_NUMBER: case COMP::VERO_LETTER: case COMP::WIRE: case COMP::DIODE: case COMP::RESISTOR: case COMP::INDUCTOR: case COMP::CAP_CERAMIC: case COMP::CAP_FILM: case COMP::CAP_FILM_WIDE: case COMP::SIP: case COMP::DIP: case COMP::STRIP_100: case COMP::BLOCK_100: case COMP::BLOCK_200: case COMP::SWITCH_ST: case COMP::SWITCH_DT: case COMP::SWITCH_ST_DIP: return ( bGrow && GetCols() < CompTypes::GetMaxLength(m_type) ) || ( !bGrow && GetCols() > CompTypes::GetMinLength(m_type) ); default: return false; } } bool CanStretchWidth(bool bGrow) const { const int& width = GetRows(); switch( m_type ) { case COMP::DIP: return ( bGrow && width < 16 ) || ( !bGrow && width > 2 ); // Widths can be 2,...,16 default: return false; } } void Stretch(bool bGrow) { assert( CanStretch(bGrow) ); // Sanity check. We should have already checked that we can stretch const bool bPlug = CompTypes::IsPlug(m_type); CompElement initVal; assert( initVal.GetPinIndex() == BAD_PININDEX ); assert( initVal.GetHoleUse() == HOLE_FREE ); initVal.SetSurface(bPlug ? SURFACE_PLUG : SURFACE_FULL); switch( m_type ) { case COMP::VERO_NUMBER: case COMP::VERO_LETTER: StretchComplex(m_type, bGrow); return SetupOccupanciesTH(); case COMP::WIRE: case COMP::DIODE: case COMP::RESISTOR: case COMP::INDUCTOR: case COMP::CAP_CERAMIC: case COMP::CAP_FILM: StretchSimple(bGrow, initVal); return SetupOccupanciesTH(); case COMP::CAP_FILM_WIDE: StretchComplex(m_type, bGrow); for (int iRow = 0, rows = GetRows(); iRow < rows; iRow++) for (int iCol = 0, cols = GetCols(); iCol < cols; iCol++) { CompElement* p = Get(iRow,iCol); p->SetPinIndex( ( iRow == 1 && iCol == 0 ) ? 0 : ( iRow == 1 && iCol == GetCols()-1 ) ? 1 : BAD_PININDEX ); p->SetSurface( SURFACE_FULL ); } return SetupOccupanciesTH(); case COMP::SIP: StretchComplex(m_type, bGrow); for (int i = 0; i < GetSize(); i++) { CompElement* p = GetAt(i); p->SetPinIndex( static_cast(i) ); p->SetSurface( SURFACE_FULL ); } return SetupOccupanciesTH(); case COMP::DIP: StretchComplex(m_type, bGrow); for (int iRow = 0, rows = GetRows(); iRow < rows; iRow++) for (int iCol = 0, cols = GetCols(); iCol < cols; iCol++) { CompElement* p = Get(iRow,iCol); p->SetPinIndex( ( iRow == 0 ) ? static_cast(2*GetCols()-1-iCol) : ( iRow == GetRows()-1 ) ? static_cast(iCol) : BAD_PININDEX ); p->SetSurface( p->GetIsPin() ? SURFACE_FULL : SURFACE_GAP ); } return SetupOccupanciesTH(); case COMP::STRIP_100: StretchComplex(m_type, bGrow); for (int i = 0, iSize = GetSize(); i < iSize; i++) { CompElement* p = GetAt(i); p->SetPinIndex( static_cast(i) ); p->SetSurface( SURFACE_FULL ); } return SetupOccupanciesTH(); case COMP::BLOCK_100: StretchComplex(m_type, bGrow); for (int iRow = 0, rows = GetRows(); iRow < rows; iRow++) for (int iCol = 0, cols = GetCols(); iCol < cols; iCol++) { CompElement* p = Get(iRow,iCol); p->SetPinIndex( ( iRow == 1 ) ? static_cast(iCol) : BAD_PININDEX ); p->SetSurface( SURFACE_FULL ); } return SetupOccupanciesTH(); case COMP::BLOCK_200: StretchComplex(m_type, bGrow); for (int iRow = 0, rows = GetRows(); iRow < rows; iRow++) for (int iCol = 0, cols = GetCols(); iCol < cols; iCol++) { CompElement* p = Get(iRow,iCol); p->SetPinIndex( ( iRow == 1 && iCol % 2 == 1 ) ? static_cast(( iCol - 1 ) / 2) : BAD_PININDEX ); p->SetSurface( ( iCol == 0 || iCol == GetCols()-1 ) ? SURFACE_FREE : SURFACE_FULL ); } return SetupOccupanciesTH(); case COMP::SWITCH_ST: case COMP::SWITCH_DT: StretchComplex(m_type, bGrow); for (int iRow = 0, rows = GetRows(); iRow < rows; iRow++) for (int iCol = 0, cols = GetCols(); iCol < cols; iCol++) { CompElement* p = Get(iRow,iCol); p->SetPinIndex( ( iCol % 2 == 0 && iRow % 2 == 0 ) ? static_cast(iCol/2 + (iRow/2)*((1 + GetCols())/2)) : BAD_PININDEX ); p->SetSurface( SURFACE_FULL ); } return SetupOccupanciesTH(); case COMP::SWITCH_ST_DIP: assert( GetRows() == 4 ); // DIPs should have 4 rows on construction StretchComplex(m_type, bGrow); for (int iRow = 0, rows = GetRows(); iRow < rows; iRow++) for (int iCol = 0, cols = GetCols(); iCol < cols; iCol++) { CompElement* p = Get(iRow,iCol); p->SetPinIndex( ( iRow == 0 ) ? static_cast(iCol) : ( iRow == 3 ) ? static_cast(iCol + GetCols()) : BAD_PININDEX ); p->SetSurface( SURFACE_FULL ); } return SetupOccupanciesTH(); default: assert(0); // Unhandled m_type } } void StretchWidth(bool bGrow) { assert( CanStretchWidth(bGrow) ); // Sanity check. We should have already checked that we can stretch the width StretchWidthIC(bGrow); for (int iRow = 0, rows = GetRows(); iRow < rows; iRow++) for (int iCol = 0, cols = GetCols(); iCol < cols; iCol++) { CompElement* p = Get(iRow,iCol); p->SetPinIndex( ( iRow == 0 ) ? static_cast(2*GetCols()-1-iCol) : ( iRow == GetRows()-1 ) ? static_cast(iCol) : BAD_PININDEX ); p->SetSurface( ( iRow == 0 || iRow == GetRows()-1 ) ? SURFACE_FULL : SURFACE_GAP ); } return SetupOccupanciesTH(); } void SetupOccupanciesTH() { const bool bWire = ( m_type == COMP::WIRE ); assert( !bWire || (GetRows() == 1 && GetCols() > 1) ); for (int i = 0, iSize = GetSize(); i < iSize; i++) GetAt(i)->SetOccupancyTH(bWire); } void SetupOccupanciesSOIC() { bool bSpecialCase(false); switch(m_type) { case COMP::SOIC14: case COMP::SOIC14W: bSpecialCase = true; break; default: break; } for (int i = 0, iSize = GetSize(); i < iSize; i++) { GetAt(i)->SetOccupancySOIC(); if (bSpecialCase) { const size_t iPinIndex = GetAt(i)->GetPinIndex(); if ( iPinIndex == 0 || iPinIndex == 6 || iPinIndex == 7 || iPinIndex == 13 ) GetAt(i)->SetSurface(SURFACE_FULL); // Prevent TH sharing at these pins as they are close to their pads } } #ifdef _TEST_SOIC if ( !CompTypes::GetIsSOIC(m_type) ) { // Set SetSoicChar based on pin type and surface type for (int i = 0, iSize = GetSize(); i < iSize; i++) { Pin* p = GetAt(i); if ( !p->GetIsPin() ) p->SetSoicChar( p->GetSurface() == SURFACE_FULL ? SOIC_TRACKS_TOP : SOIC_FREE ); } // Apply corrections for different test parts ... if ( GetRows() == 5 ) { for (int iRow = 0, rows = GetRows(); iRow < rows; iRow++) { if ( iRow < 1 || iRow > 4 ) continue; for (int iCol = 0, cols = GetCols(); iCol < cols; iCol++) { if ( iRow == 1 || iRow == 4 ) { if ( iCol == 0 || iCol == cols-1 ) Get(iRow, iCol)->SetSoicChar(SOIC_FREE); } else Get(iRow, iCol)->SetSoicChar(SOIC_FREE); } } } if ( GetRows() == 8 || GetRows() == 9 ) { for (int iRow = 0, rows = GetRows(); iRow < rows; iRow++) { if ( iRow < 3 || iRow > rows-4 ) continue; for (int iCol = 0, cols = GetCols(); iCol < cols; iCol++) Get(iRow, iCol)->SetSoicChar(SOIC_FREE); } } } #endif } // Persist interface functions virtual void Load(DataStream& inStream) override { CompElementGrid::Load(inStream); // Load() base class int type(0); inStream.Load(type); m_type = static_cast (type); if ( inStream.GetVersion() < VRT_VERSION_26 ) SetupOccupanciesTH(); } virtual void Save(DataStream& outStream) override { CompElementGrid::Save(outStream); // Save() base class outStream.Save(static_cast(m_type)); } private: COMP m_type; // Type }; VeroRoute/Src/images/curved.png000644 001750 001750 00000000556 13661712157 016745 0ustar00alexalex000000 000000 ‰PNG  IHDR szzєbKGD…ЌJ1J pHYsФФ•+tIMEу№КRUћIDATXУнV1У04ШЩмЅ^ћ‹Ю}Yцў"ЋЛtюkк­Š\А˜8*R–‡;8  ЛžŸяРи§q‚ай@иhƒї5чМLСл€bOО]^.YјPcMи &іJхšˆ jj.е„Fд(MБФož —€@)K { ˆъE4/ИZ+'LьUskЂх0їНxLCюдљИЧШ憇@•іОxЪRУˆрkефœПеZ ИРœЅ”DьЅK‹9жд{дА—ј‡ЗЁvЉщ@Лд Ddџ!nBЭRRСŘ[—šшю–&ўgX—š…-?( ™IENDЎB`‚VeroRoute/Src/compdialog.ui000644 001750 001750 00000066044 14400220543 016144 0ustar00alexalex000000 000000 CompDialog 0 0 270 630 270 630 270 630 Component Definition 70 80 195 27 true Qt::StrongFocus 70 20 195 27 true Qt::StrongFocus 70 50 195 27 true Qt::StrongFocus 70 110 195 27 true Qt::StrongFocus 5 80 65 27 Prefix 5 50 65 27 Value 5 20 65 27 Type 5 110 65 27 Import 5 600 260 27 Qt::TabFocus Add To Parts Library 170 390 61 27 x100 mil Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 180 148 81 27 false Qt::TabFocus Labels 70 148 104 27 8 5 148 65 27 true Pin Type 204 235 61 27 Qt::StrongFocus 1 255 1 140 235 64 27 Height Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 10 235 64 27 Width Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 74 235 61 27 Qt::StrongFocus 1 255 1 5 210 255 25 true Footprint Size (x100 mil) 5 268 251 25 true Footprint Point Info 10 293 61 27 Pin # Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 74 293 61 27 Mouse wheel for small change. CTRL + mouse wheel for large change 0 255 0 210 360 55 27 Qt::TabFocus Choose fill color RGB 5 330 85 27 true Shape Info 170 570 61 27 degrees Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 170 450 61 27 x100 mil Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 10 420 71 27 Centre Y Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 150 330 51 27 Qt::TabFocus Fill shape with color Fill 10 390 71 27 Centre X Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 90 330 51 27 Qt::TabFocus Draw shape outline (black) Line 24 24 80 420 81 27 Mouse wheel for small change. CTRL + mouse wheel for large change 2 -100.000000000000000 100.000000000000000 0.010000000000000 80 510 81 27 Mouse wheel for small change. CTRL + mouse wheel for large change 0 -360.000000000000000 360.000000000000000 1.000000000000000 10 570 71 27 Rotate Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 10 450 71 27 Width Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 10 540 71 27 Angle B Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 80 540 81 27 Mouse wheel for small change. CTRL + mouse wheel for large change 0 -360.000000000000000 360.000000000000000 1.000000000000000 80 450 81 27 Mouse wheel for small change. CTRL + mouse wheel for large change 2 -100.000000000000000 100.000000000000000 0.010000000000000 60 360 141 27 8 10 510 71 27 Angle A Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 10 360 71 27 Shape Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 170 420 61 27 x100 mil Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 10 480 71 27 Height Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 170 480 61 27 x100 mil Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 80 480 81 27 Mouse wheel for small change. CTRL + mouse wheel for large change 2 -100.000000000000000 100.000000000000000 0.010000000000000 170 540 61 27 degrees Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 170 510 61 27 degrees Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 80 390 81 27 Mouse wheel for small change. CTRL + mouse wheel for large change 2 -100.000000000000000 100.000000000000000 0.010000000000000 80 570 81 27 Mouse wheel for small change. CTRL + mouse wheel for large change 0 -360.000000000000000 360.000000000000000 1.000000000000000 204 330 27 27 Qt::TabFocus Move shape towards front U 238 330 27 27 Qt::TabFocus Move shape towards back D 214 178 51 27 Custom hole width (mil) 20 100 1 35 173 178 41 27 Hole Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 5 178 91 27 false Qt::TabFocus Use custom pad and hole size Custom 123 178 51 27 Custom pad width (mil) 50 130 1 70 83 178 41 27 Pad Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 204 293 61 27 8 140 293 64 27 Surface Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 5 0 261 20 true Component Definition 0 142 271 2 QFrame::Sunken 1 Qt::Horizontal 0 210 271 2 QFrame::Sunken 1 Qt::Horizontal 0 268 271 2 QFrame::Sunken 1 Qt::Horizontal 0 326 271 2 QFrame::Sunken 1 Qt::Horizontal lineEdit_Type lineEdit_Value lineEdit_Prefix lineEdit_Import comboBox_PinShape checkBox_PinLabels custom padWidth holeWidth spinBox_Width spinBox_Height spinBox_PinNumber comboBox_Surface checkBox_Line checkBox_Fill pushButtonU pushButtonD comboBox_Shape pushButtonRGB doubleSpinBox_CX doubleSpinBox_CY doubleSpinBox_DX doubleSpinBox_DY doubleSpinBox_A1 doubleSpinBox_A2 doubleSpinBox_A3 pushButton_Build VeroRoute/libraries/TinyCAD/VeroRoute_ElectroMechanical.TCLib000644 001750 001750 00000154000 13515171160 024376 0ustar00alexalex000000 000000 SQLite format 3@ >ћћ.!%%‚tableSymbolSymbolCREATE TABLE [Symbol] ([SymbolID] INTEGER PRIMARY KEY,[Data] TEXT)ƒ8!†9tableNameNameCREATE TABLE [Name] ([NameID] INTEGER PRIMARY KEY,[Name] TEXT,[SymbolID] INTEGER,[Type] INTEGER,[Reference] TEXT,[ppp] INTEGER,[Description] TEXT,[ShowName] INTEGER,[ShowRef] INTEGER,[DefRotate] INTEGE їАИq*dio5 --RESISTORR?Resistor- -CAP-FILMC?Film$ UїЂ!q10k-B*RV?Potentiometer (Off-boarS* !q10k-A,RV?Potentiometer (Off-board)E) !U20k-B+RT?Trimpot (On-board)E" )MSW-3PDT$SW?3PDT (Off-Board)Џ3)ESW-SPST#SW?Off-BoarE& )MSW-SPST(SW?SPST (Off-Board)E% )MSW-SPDT'SW?SPDT (Off-Board)c$ 9ySW-DPST-DIP&SW?DPST DIP Package (On-Board)E# )MSW-DPDT%SW?DPDT (Off-Board)I' )YSPEAKER)S?Speaker (Off-board)QqPOTRV?Potentiometer (Off-board)Е4ћіёьчтнигЮЩФПКЕВŠb -10 0 400 -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0%‰’" -10 0 400 i$$SPICE_EPILOG_PRIORITY58=i$$SPICE_PROLOG_PRIORITY581i$$SPICE_PROLOG_PRIORITY582i$$SPICE_EPILOG_PRIORITY5 3)!PackagePADS284i$$SPICE_PROLOG_PRIORITY585i$$SPICE_EPILOG_PRIORITY5 6)!PackagePADS287i$$SPICE_PROLOG_PRIORITY588i$$SPICE_EPILOG_PRIORITY5(9)1PackageTRIM_VERT8:i$$SPICE_PROLOG_PRIORITY58;i$$SPICE_EPILOG_PRIORITY5 <)!PackagePAD m ””OЫƒ8!†9tableNameNameCREATE TABLE [Name] ([NameID] INTEGER PRIMARY KEY,[Name] TEXT,[SymbolID] INTEGER,[Type] INTEGER,[Reference] TEXT,[ppp] INTEGER,[Descriptƒ8!†9tableNameNameCREATE TABLE [Name] ([NameID] INTEGER PRIMARY KEY,[Name] TEXT,[SymbolID] INTEGER,[Type] INTEGER,[Reference] TEXT,[ppp] INTEGER,[Description] TEXT,[ShowName] INTEGER,[ShowRef] INTEGER,[DefRotate] INTEGER).!%%‚tableSymbolSymbolCREATE TABLE [Symbol] ([SymbolID] INTEGER PRIMARY KEY,[Data] TEXT) (М" ўјђьцркдЮШТМштмжаЪІІІ˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜Ю<Ю ;Ю:(N( M(L'u't's&r&q&p%o%n%m$l$k$j#i#h#g"f"e"dюЂ!cІT!bІN!aІH `ІB _І< ^І6]І0\І*[І$ZІYІXІWІ VІUˆTІ SІRšQfP`OZKTJNIHHBG<F*~*}*|){)z)y(x (w(v &&[‚2!11„tableAttributeAttributeCREATE TABLE [Attribute] ([AttributeID] INTEGER PRIMARY KEY,[NameID] INTEGER,[AttName] TEXT,[AttValue] TEXT,[ShowAtt] INTEGER)"!51aindexidx_NameIDAttributeCREATE INDEX [idx_NameID] ON [Attribute] ( [NameID] ) жжЬff 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 -10 0 400 0 0 <”iЉV -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 000000 1 -1 000000 C>0 0 0 0 Arial 000000 1 -1 000000 C>0 0 0 0 Arial 000000 1 -1 000000 0,24.00000' b='31.60000,25.00000' style='2' fill='0'/> 28.00000,20.00000' which='0' elec='4' direction='1' part='0' number='1' show='2' length='20' number_pos='0' centre_name='0'> ii6pЊЬ@jЄоЦЦЦЦff,:i $$SPICE_PROLOG_PRIORITY5 ž -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 000000 1 -1 000000 Speaker ))ЭќЃмdЏ‡T, -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 C>0 0 0 0 Arial 000000 1 -1 000000 0000,24.00000' style='2' fill='0'> 000000 1 -1 000000 28.00000,20.00000' which='0' elec='4' direction='1' part='0' number='1' show='2' length='20' number_pos='0' centre_name='0'> ee22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'> -10 0 400 0 0 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 …/Šb ”iЉV -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 000000 1 -1 000000 0000,24.00000' style='2' fill='0'> 36.00000,20.00000' which='0' elec='4' direction='1' part='0' number='2' show='2' length='20' number_pos='0' centre_name='0'> 0000,24.00000' style='2' fill='0'> ))р‡T#, -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 ii”?єЃ ž -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 000000 1 -1 -10 0 400 0 0 0 0‰’" -10 0 400 -10 0 400 -10 0 400 -10 0 400 & Arial 000000 1 -1 000000 Speaker Dт>xВдHЈnDЦŒjоЄ T)! `)! PackagePADS38_i $$SPICE_ x)!(PackagePADS38wi($$SPICE_EPILOG_PRIORITY58vi($({)1)PackageTRIM_VERT8zi)$$SPICE_EPILOG_PRIORITY58yi)$$SPICE_PROLOG_PRIORITY58ni%$$SPICE_EPILOG_PRIORITY5 o)!%PackagePADS38pi&$$SPICE_PROLOG_PRIORITY58qi&$$SPICE_EPILOG_PRIORITY5 r)!&PackagePADS28si'$$SPICE_PROLOG_PRIORITY58ti'$$SPICE_EPILOG_PRIORITY5 u)!'PackagePADS2 ~)!*PackagePADS38}i*$$SPICE_EPILOG_PRIORITY58|i*$$SPICE_PROLOG_PRIORITY5C>0 0 0 0 Arial 000000 1 -1 000000 C>0 0 0 0 Arial 000000 1 -1 000000 ˆˆ”i$ЉV -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 ii %ž -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 ee‰/'’b -10 0 400 0 0 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 000000 1 -1 000000 ))‡T(, -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 >>7)žr -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 Speaker 1C>0 0 0 0 Arial 000000 1 -1 000000 2fЬ2‰,’" -10 0 400 -10 0 400 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 C>0 0 0 0 Arial 000000 1 -1 000000 VeroRoute/libraries/gEDA/veroroute_diode/Generic.sym000644 001750 001750 00000001364 13515171160 022760 0ustar00alexalex000000 000000 v 20130925 2 T 300 700 8 10 0 0 0 0 1 numslots=0 P 300 700 500 700 1 0 0 { T 405 745 5 8 0 1 0 6 1 pinnumber=1 T 400 745 5 8 0 0 0 6 1 pinseq=1 T 400 745 9 8 0 0 0 6 1 pinlabel=1 T 400 745 5 8 0 0 0 6 1 pintype=pas } P 1200 700 1000 700 1 0 0 { T 1095 745 5 8 0 1 0 0 1 pinnumber=2 T 1095 745 5 8 0 0 0 0 1 pinseq=2 T 1095 745 9 8 0 0 0 0 1 pinlabel=2 T 1095 745 5 8 0 0 0 0 1 pintype=pas } L 600 900 600 500 3 0 0 0 -1 -1 L 600 900 900 700 3 0 0 0 -1 -1 L 900 700 600 500 3 0 0 0 -1 -1 L 1000 700 900 700 3 0 0 0 -1 -1 L 600 700 500 700 3 0 0 0 -1 -1 L 900 900 900 500 3 0 0 0 -1 -1 T 1100 400 5 10 1 1 180 0 1 device=1N4148 T 900 1100 8 10 1 1 180 0 1 refdes=D? T 400 400 8 10 0 0 0 0 1 footprint=DIODE T 400 400 8 10 0 0 0 0 1 description=Generic Diode VeroRoute/libraries/gEDA/veroroute_linear/Generic_DIP10.sym000644 001750 001750 00000004001 13515171161 023773 0ustar00alexalex000000 000000 v 20130925 2 T 300 0 8 10 0 0 0 0 1 numslots=0 B 300 0 1400 2000 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 P 0 1800 300 1800 1 0 0 { T 205 1845 5 10 1 1 0 6 1 pinnumber=1 T 200 1800 5 10 0 1 0 0 1 pinseq=1 T 355 1795 5 10 0 1 0 0 1 pinlabel=1 T 200 1800 5 10 0 1 0 0 1 pintype=pas } P 0 1400 300 1400 1 0 0 { T 205 1445 5 10 1 1 0 6 1 pinnumber=2 T 200 1400 5 10 0 1 0 0 1 pinseq=2 T 355 1345 5 10 0 1 0 0 1 pinlabel=2 T 200 1400 5 10 0 1 0 0 1 pintype=pas } P 0 1000 300 1000 1 0 0 { T 205 1045 5 10 1 1 0 6 1 pinnumber=3 T 200 1000 5 10 0 1 0 0 1 pinseq=3 T 355 945 5 10 0 1 0 0 1 pinlabel=3 T 200 1000 5 10 0 1 0 0 1 pintype=pas } P 0 600 300 600 1 0 0 { T 205 645 5 10 1 1 0 6 1 pinnumber=4 T 200 600 5 10 0 1 0 0 1 pinseq=4 T 355 545 5 10 0 1 0 0 1 pinlabel=4 T 200 600 5 10 0 1 0 0 1 pintype=pas } P 0 200 300 200 1 0 0 { T 205 245 5 10 1 1 0 6 1 pinnumber=5 T 200 200 5 10 0 1 0 0 1 pinseq=5 T 355 145 5 10 0 1 0 0 1 pinlabel=5 T 200 200 5 10 0 1 0 0 1 pintype=pas } P 2000 1800 1700 1800 1 0 0 { T 1795 1845 5 10 1 1 0 0 1 pinnumber=10 T 1800 1800 5 10 0 1 0 6 1 pinseq=10 T 1645 1795 5 10 0 1 0 6 1 pinlabel=10 T 1800 1800 5 10 0 1 0 6 1 pintype=pas } P 2000 1400 1700 1400 1 0 0 { T 1795 1445 5 10 1 1 0 0 1 pinnumber=9 T 1800 1400 5 10 0 1 0 6 1 pinseq=9 T 1645 1395 5 10 0 1 0 6 1 pinlabel=9 T 1800 1400 5 10 0 1 0 6 1 pintype=pas } P 2000 1000 1700 1000 1 0 0 { T 1795 1045 5 10 1 1 0 0 1 pinnumber=8 T 1800 1000 5 10 0 1 0 6 1 pinseq=8 T 1645 995 5 10 0 1 0 6 1 pinlabel=8 T 1800 1000 5 10 0 1 0 6 1 pintype=pas } P 2000 600 1700 600 1 0 0 { T 1795 645 5 10 1 1 0 0 1 pinnumber=7 T 1800 600 5 10 0 1 0 6 1 pinseq=7 T 1645 595 5 10 0 1 0 6 1 pinlabel=7 T 1800 600 5 10 0 1 0 6 1 pintype=pas } P 2000 200 1700 200 1 0 0 { T 1795 245 5 10 1 1 0 0 1 pinnumber=6 T 1800 200 5 10 0 1 0 6 1 pinseq=6 T 1645 195 5 10 0 1 0 6 1 pinlabel=6 T 1800 200 5 10 0 1 0 6 1 pintype=pas } T 1200 2155 5 10 1 1 0 0 1 device=Name T 300 2155 8 10 1 1 0 0 1 refdes=U? T 1600 2055 8 10 0 1 0 0 1 footprint=DIP10 T 1900 1845 8 10 0 1 0 0 1 description=Generic 10 Pin DIP VeroRoute/libraries/gEDA/veroroute_transistor/PNP_BC640.sym000644 001750 001750 00000001562 13515171161 023764 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=3 T 100 550 5 6 0 0 0 0 1 pinseq=3 T 100 550 5 6 0 0 0 0 1 pinlabel=3 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=2 T 400 850 5 6 0 0 0 0 1 pinseq=2 T 400 850 5 6 0 0 0 0 1 pinlabel=2 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=1 T 400 50 5 6 0 0 0 0 1 pinseq=1 T 400 50 5 6 0 0 0 0 1 pinlabel=1 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 297,341 L 199,350 L 269,277 L 275,310 z T 600 700 5 10 1 1 0 0 1 device=BC640 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=PNP Transistor VeroRoute/libraries/gEDA/veroroute_electromechanical/Switch_Offboard_DPST.sym000644 001750 001750 00000001720 13515171160 027653 0ustar00alexalex000000 000000 v 20130925 2 T 300 1000 8 10 0 0 0 0 1 numslots=0 P 300 1000 0 1000 1 0 1 { T 150 1050 5 10 1 1 0 0 1 pinnumber=3 T 150 1050 5 10 0 0 0 0 1 pinseq=3 T 150 1050 5 10 0 0 0 0 1 pinlabel=3 T 150 1050 5 10 0 0 0 0 1 pintype=pas } P 600 1000 900 1000 1 0 1 { T 750 1050 5 10 1 1 0 0 1 pinnumber=1 T 750 1050 5 10 0 0 0 0 1 pinseq=1 T 750 1050 5 10 0 0 0 0 1 pinlabel=1 T 750 1050 5 10 0 0 0 0 1 pintype=pas } P 300 500 0 500 1 0 1 { T 150 550 5 10 1 1 0 0 1 pinnumber=4 T 150 550 5 10 0 0 0 0 1 pinseq=4 T 150 550 5 10 0 0 0 0 1 pinlabel=4 T 150 550 5 10 0 0 0 0 1 pintype=pas } P 600 500 900 500 1 0 1 { T 750 550 5 10 1 1 0 0 1 pinnumber=2 T 750 550 5 10 0 0 0 0 1 pinseq=2 T 750 550 5 10 0 0 0 0 1 pinlabel=2 T 750 550 5 10 0 0 0 0 1 pintype=pas } L 300 1000 600 1200 3 0 0 0 -1 -1 L 300 500 600 700 3 0 0 0 -1 -1 T 200 0 5 10 1 1 0 0 1 device=Name T 300 200 8 10 1 1 0 0 1 refdes=S? T 495 493 8 10 0 0 0 0 1 footprint=PADS4 T 495 493 8 10 0 0 0 0 1 description=Offboard Switch VeroRoute/libraries/gEDA/veroroute_linear/OTA_LM13600.sym000644 001750 001750 00000006561 13515171161 023204 0ustar00alexalex000000 000000 v 20130925 2 T 200 1100 5 10 0 0 0 0 1 slot=1 T 200 1300 5 10 0 0 0 0 1 numslots=2 T 200 1500 5 10 0 0 0 0 1 slotdef=1:1,2,3,4,5,6,7,8,11 T 200 1700 5 10 0 0 0 0 1 slotdef=2:16,15,14,13,12,6,10,9,11 P 1400 1800 1400 2000 1 0 1 { T 1450 1850 5 8 1 1 0 0 1 pinnumber=1 T 1450 1100 5 8 0 1 0 0 1 pinseq=1 T 1800 1050 9 8 0 1 0 5 1 pinlabel=AMP BIAS T 1450 1100 5 8 0 1 0 0 1 pintype=in } P 0 1000 200 1000 1 0 0 { T 150 1050 5 8 1 1 0 6 1 pinnumber=2 T 350 1050 5 8 0 1 0 0 1 pinseq=2 T 425 950 9 8 0 1 0 0 1 pinlabel=DIODE BIAS T 350 1050 5 8 0 1 0 0 1 pintype=in } P 0 1400 200 1400 1 0 0 { T 150 1450 5 8 1 1 0 6 1 pinnumber=3 T 350 1450 5 8 0 1 0 0 1 pinseq=3 T 450 1400 9 8 0 1 0 0 1 pinlabel=IN+ T 350 1450 5 8 0 1 0 0 1 pintype=in } P 0 600 200 600 1 0 0 { T 150 650 5 8 1 1 0 6 1 pinnumber=4 T 350 650 5 8 0 1 0 0 1 pinseq=4 T 450 600 9 8 0 1 0 0 1 pinlabel=IN- T 350 650 5 8 0 1 0 0 1 pintype=in } P 1600 200 1600 0 1 0 1 { T 1650 50 5 8 1 1 0 0 1 pinnumber=5 T 1650 500 5 8 0 1 0 0 1 pinseq=5 T 1550 600 9 8 0 1 0 3 1 pinlabel=5 T 1650 500 5 8 0 1 0 0 1 pintype=out } P 2000 200 2000 0 1 0 1 { T 2050 50 5 8 1 1 0 0 1 pinnumber=6 T 2050 400 5 8 0 1 0 0 1 pinseq=6 T 2000 250 9 8 1 1 0 3 1 pinlabel=V- T 2050 400 5 8 0 1 0 0 1 pintype=pwr } P 2400 200 2400 0 1 0 1 { T 2450 50 5 8 1 1 0 0 1 pinnumber=7 T 2450 500 5 8 0 1 0 0 1 pinseq=7 T 2350 600 9 8 0 1 0 3 1 pinlabel=7 T 2450 500 5 8 0 0 0 0 1 pintype=in } P 3000 200 3000 0 1 0 1 { T 3050 50 5 8 1 1 0 0 1 pinnumber=8 T 3050 500 5 8 0 1 0 0 1 pinseq=8 T 2950 600 9 8 0 1 0 3 1 pinlabel=8 T 3050 500 5 8 0 1 0 0 1 pintype=out } P 2000 1800 2000 2000 1 0 1 { T 2050 1850 5 8 1 1 0 0 1 pinnumber=11 T 2150 1400 5 8 0 1 0 0 1 pinseq=9 T 1875 1675 9 8 1 1 0 5 1 pinlabel=V+ T 2150 1400 5 8 0 1 0 0 1 pintype=pwr } B 200 200 3000 1600 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 V 1350 1000 100 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 V 1450 1000 100 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 L 3000 1300 3000 200 3 0 0 0 -1 -1 L 2000 1800 2000 800 3 0 0 0 -1 -1 L 2200 800 2000 800 3 0 0 0 -1 -1 L 2300 600 2200 800 3 0 0 0 -1 -1 L 2400 600 2400 200 3 0 0 0 -1 -1 L 2200 600 2600 600 3 0 0 0 -1 -1 L 2500 600 2600 800 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 2591,703 L 2600,801 L 2527,731 L 2560,725 z L 2400 1100 2800 1100 3 0 0 0 -1 -1 L 2600 800 2600 1100 3 0 0 0 -1 -1 L 2700 1100 2800 1300 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 2791,1203 L 2800,1301 L 2727,1231 L 2760,1225 z L 2500 1100 2400 1300 3 0 0 0 -1 -1 L 2400 1300 2000 1300 3 0 0 0 -1 -1 L 2800 1300 3000 1300 3 0 0 0 -1 -1 L 1600 1000 1550 1000 3 0 0 0 -1 -1 L 1600 200 1600 1000 3 0 0 0 -1 -1 L 350 1150 400 1250 3 0 0 0 -1 -1 L 450 1150 400 1250 3 0 0 0 -1 -1 L 350 1250 450 1250 3 0 0 0 -1 -1 L 350 1150 450 1150 3 0 0 0 -1 -1 L 350 850 450 850 3 0 0 0 -1 -1 L 350 750 450 750 3 0 0 0 -1 -1 L 400 750 450 850 3 0 0 0 -1 -1 L 400 750 350 850 3 0 0 0 -1 -1 L 400 1600 400 1250 3 0 0 0 -1 -1 L 400 1150 400 850 3 0 0 0 -1 -1 L 1400 1800 1400 1100 3 0 0 0 -1 -1 L 400 1400 200 1400 3 0 0 0 -1 -1 L 400 600 200 600 3 0 0 0 -1 -1 L 400 1000 200 1000 3 0 0 0 -1 -1 L 400 750 400 400 3 0 0 0 -1 -1 L 400 1600 1250 1000 3 0 0 0 -1 -1 L 1250 1000 400 400 3 0 0 0 -1 -1 L 500 1450 500 1350 3 0 0 0 -1 -1 L 450 1400 550 1400 3 0 0 0 -1 -1 L 450 600 550 600 3 0 0 0 -1 -1 T 200 2000 5 10 1 1 0 0 1 device=LM13600 T 200 2200 8 10 1 1 0 0 1 refdes=U? T 200 1100 8 10 0 0 0 0 1 footprint=DIP16 T 200 1100 8 10 0 0 0 0 1 description=Dual OTA VeroRoute/libraries/gEDA/veroroute_transistor/NPN_2N3903.sym000644 001750 001750 00000001563 13515171161 024043 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=3 T 400 850 5 6 0 0 0 0 1 pinseq=3 T 400 850 5 6 0 0 0 0 1 pinlabel=3 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=1 T 400 50 5 6 0 0 0 0 1 pinseq=1 T 400 50 5 6 0 0 0 0 1 pinlabel=1 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 403,209 L 501,200 L 431,273 L 425,240 z T 600 700 5 10 1 1 0 0 1 device=2N3903 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=NPN Transistor VeroRoute/libraries/gEDA/veroroute_regulator/LM78xx.sym000644 001750 001750 00000001440 13515171161 023367 0ustar00alexalex000000 000000 v 20130925 2 T 1700 800 5 10 0 0 0 0 1 numslots=0 P 1700 800 2000 800 1 0 1 { T 1800 900 5 10 1 1 0 0 1 pinnumber=3 T 1800 900 5 10 0 0 0 0 1 pinseq=3 T 1600 700 9 10 1 1 0 6 1 pinlabel=Out T 1800 900 5 10 0 0 0 0 1 pintype=pas } P 0 800 300 800 1 0 0 { T 200 900 5 10 1 1 0 6 1 pinnumber=1 T 200 900 5 10 0 0 0 0 1 pinseq=1 T 400 700 9 10 1 1 0 0 1 pinlabel=In T 200 900 5 10 0 0 0 0 1 pintype=pas } P 1000 0 1000 300 1 0 0 { T 1100 100 5 10 1 1 0 0 1 pinnumber=2 T 1100 100 5 10 0 0 0 0 1 pinseq=2 T 1100 100 5 10 0 0 0 0 1 pinlabel=2 T 1100 100 5 10 0 0 0 0 1 pintype=pas } B 300 300 1400 1000 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 T 700 1100 5 10 1 1 0 0 1 device=LM78xx T 1100 1400 8 10 1 1 0 6 1 refdes=U? T 1800 1400 8 10 0 0 0 6 1 footprint=TO220 T 1800 1400 8 10 0 0 0 6 1 description=Regulator 1A VeroRoute/libraries/gEDA/veroroute_transistor/NPN_BC213.sym000644 001750 001750 00000001562 13515171161 023756 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=3 T 400 850 5 6 0 0 0 0 1 pinseq=3 T 400 850 5 6 0 0 0 0 1 pinlabel=3 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=1 T 400 50 5 6 0 0 0 0 1 pinseq=1 T 400 50 5 6 0 0 0 0 1 pinlabel=1 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 403,209 L 501,200 L 431,273 L 425,240 z T 600 700 5 10 1 1 0 0 1 device=BC213 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=NPN Transistor VeroRoute/Src/mainwindow.cpp000644 001750 001750 00000352147 14565667757 016413 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #include "Version.h" #include "mainwindow.h" #include "ui_mainwindow.h" #include "controldialog.h" #include "compdialog.h" #include "renderingdialog.h" #include "templatesdialog.h" #include "infodialog.h" #include "pindialog.h" #include "wiredialog.h" #include "bomdialog.h" #include "aliasdialog.h" #include "textdialog.h" #include "finddialog.h" #include "hotkeysdialog.h" #include "padoffsetdialog.h" #include "PolygonHelper.h" #define AUTO_OPEN_GERBERS MainWindow::MainWindow(const QString& localDataPathStr, const QString& tutorialsPathStr, QWidget* parent) : QMainWindow(parent) , ui(new Ui::MainWindow) , m_localDataPathStr(localDataPathStr.toStdString()) , m_tutorialsPathStr(tutorialsPathStr.toStdString()) { setContextMenuPolicy(Qt::NoContextMenu); // Prevent show/hide of docked widgets and toolbars via right mouse click m_historyMgr.SetPathStr(m_localDataPathStr); m_templateMgr.SetPathStr(m_localDataPathStr); CompTypes::InitMapsCompTypeToStr(); // Put all comp types into a list ... GetTemplateManager().AddDefaults(); // .. and create default templates ui->setupUi(this); // Install event filter on ui's QMenu objects so that the Android "back" // button does not affect them while they are showing their contents #ifdef VEROROUTE_ANDROID ui->menuFile->installEventFilter(this); ui->menuImport->installEventFilter(this); ui->menuExport_as_Gerber_1_Layer->installEventFilter(this); ui->menuExport_as_Gerber_2_Layer->installEventFilter(this); ui->menuEdit->installEventFilter(this); ui->menuAdd->installEventFilter(this); ui->menuCapacitor->installEventFilter(this); ui->menuTrimpot->installEventFilter(this); ui->menuSwitch->installEventFilter(this); ui->menuConnector->installEventFilter(this); ui->menuView->installEventFilter(this); ui->menuPaint->installEventFilter(this); ui->menuTrack_Style->installEventFilter(this); ui->menuWindow->installEventFilter(this); ui->menuLayers->installEventFilter(this); ui->menuHelp->installEventFilter(this); #endif // Create menu actions for recent files for (size_t i = 0; i < MAX_RECENT_FILES; ++i) { m_recentFileAction[i] = new QAction(this); m_recentFileAction[i]->setVisible(false); connect(m_recentFileAction[i], SIGNAL(triggered()), this, SLOT(OpenRecent())); ui->menuFile->insertAction(ui->actionQuit, m_recentFileAction[i]); // Insert before the Quit action } m_separator = ui->menuFile->insertSeparator(ui->actionQuit); // Insert separator before the Quit action UpdateRecentFiles(nullptr, false); // nullptr ==> read list without updating it const std::string iconStr = m_tutorialsPathStr + "/veroroute.png"; setWindowIcon(QIcon( iconStr.c_str() )); // Create the scrollable area and make it occupy the main window area m_label = new QLabel(this); m_scrollArea = new MyScrollArea(this); m_label->setBackgroundRole(QPalette::Base); m_label->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); m_label->setScaledContents(true); m_scrollArea->setBackgroundRole(QPalette::Dark); m_scrollArea->setWidget(m_label); #ifdef VEROROUTE_ANDROID m_scrollArea->verticalScrollBar()->setStyleSheet( ANDROID_VSCROLL_WIDTH ); m_scrollArea->horizontalScrollBar()->setStyleSheet( ANDROID_HSCROLL_HEIGHT ); #endif setCentralWidget(m_scrollArea); // First create dialogs that do not dock m_wireDlg = new WireDialog(this); m_hotkeysDlg = new HotkeysDialog(this); m_textDlg = new TextDialog(this); m_bomDlg = new BomDialog(this); m_aliasDlg = new AliasDialog(this); m_padOffsetDlg = new PadOffsetDialog(this); m_findDlg = new FindDialog(this); // Control dialog goes on right m_dockControlDlg = new QDockWidget("",this); m_dockControlDlg->setAllowedAreas(Qt::RightDockWidgetArea); //m_dockControlDlg->setStyleSheet("QDockWidget { font: bold }"); m_controlDlg = new ControlDialog(m_dockControlDlg); m_dockControlDlg->setWidget(m_controlDlg); m_dockControlDlg->setTitleBarWidget( new QWidget(this) ); // Hide the title bar addDockWidget(Qt::RightDockWidgetArea, m_dockControlDlg); m_controlDlg->SetMainWindow(this); // Component editor dialog goes on right m_dockCompDlg = new QDockWidget("",this); m_dockCompDlg->setAllowedAreas(Qt::RightDockWidgetArea); m_compDlg = new CompDialog(m_dockCompDlg); m_compDlg->SetMainWindow(this); m_dockCompDlg->setWidget(m_compDlg); m_dockCompDlg->setTitleBarWidget( new QWidget(this) ); // Hide the title bar addDockWidget(Qt::RightDockWidgetArea, m_dockCompDlg); // Templates dialog goes on right m_dockTemplatesDlg = new QDockWidget("",this); m_dockTemplatesDlg->setAllowedAreas(Qt::RightDockWidgetArea); m_templatesDlg = new TemplatesDialog(m_dockTemplatesDlg); m_templatesDlg->SetMainWindow(this); m_dockTemplatesDlg->setWidget(m_templatesDlg); m_dockTemplatesDlg->setTitleBarWidget( new QWidget(this) ); // Hide the title bar addDockWidget(Qt::RightDockWidgetArea, m_dockTemplatesDlg); // Rendering dialog goes on right m_dockRenderingDlg = new QDockWidget("",this); m_dockRenderingDlg->setAllowedAreas(Qt::RightDockWidgetArea); m_renderingDlg = new RenderingDialog(m_dockRenderingDlg); m_renderingDlg->SetMainWindow(this); m_dockRenderingDlg->setWidget(m_renderingDlg); m_dockRenderingDlg->setTitleBarWidget( new QWidget(this) ); // Hide the title bar addDockWidget(Qt::RightDockWidgetArea, m_dockRenderingDlg); // Info dialog goes on left m_dockInfoDlg = new QDockWidget("",this); m_dockInfoDlg->setAllowedAreas(Qt::LeftDockWidgetArea); m_infoDlg = new InfoDialog(m_dockCompDlg); m_infoDlg->SetMainWindow(this); m_dockInfoDlg->setWidget(m_infoDlg); m_dockInfoDlg->setTitleBarWidget( new QWidget(this) ); // Hide the title bar addDockWidget(Qt::LeftDockWidgetArea, m_dockInfoDlg); // Pin dialog goes on left m_dockPinDlg = new QDockWidget("",this); m_dockPinDlg->setAllowedAreas(Qt::LeftDockWidgetArea); m_pinDlg = new PinDialog(m_dockCompDlg); m_pinDlg->SetMainWindow(this); m_dockPinDlg->setWidget(m_pinDlg); m_dockPinDlg->setTitleBarWidget( new QWidget(this) ); // Hide the title bar addDockWidget(Qt::LeftDockWidgetArea, m_dockPinDlg); ui->toolBar_2->setIconSize(QSize(32,32)); // 32x32 instead of 24x24 ui->toolBar_2->setMovable(false); // Keep docked ui->toolBar_3->setIconSize(QSize(32,32)); // 32x32 instead of 24x24 ui->toolBar_3->setMovable(false); // Keep docked ui->toolBar->setIconSize(QSize(32,32)); // 32x32 instead of 24x24 ui->toolBar->setMovable(false); // Keep docked #ifdef VEROROUTE_ANDROID ui->menuBar->setNativeMenuBar(false); ui->actionHotkeysDlg->setVisible(false); // Hide dialog listing key/mouse actions ui->actionUpdateCheck->setVisible(false); // Hide update check (until SSL support added) // Remove keyboard shortcuts for actions ui->actionNew->setShortcut(QKeySequence()); ui->actionOpen->setShortcut(QKeySequence()); ui->actionSave->setShortcut(QKeySequence()); ui->actionSave_As->setShortcut(QKeySequence()); ui->actionMerge->setShortcut(QKeySequence()); ui->actionQuit->setShortcut(QKeySequence()); ui->actionZoom_In->setShortcut(QKeySequence()); ui->actionZoom_Out->setShortcut(QKeySequence()); ui->actionUndo->setShortcut(QKeySequence()); ui->actionRedo->setShortcut(QKeySequence()); ui->actionFind->setShortcut(QKeySequence()); ui->actionCopy->setShortcut(QKeySequence()); ui->actionGroup->setShortcut(QKeySequence()); ui->actionUngroup->setShortcut(QKeySequence()); ui->actionSelectAll->setShortcut(QKeySequence()); ui->actionDelete->setShortcut(QKeySequence()); ui->actionSwitchLayer->setShortcut(QKeySequence()); ui->toolBar->insertSeparator(ui->actionFat); #else move(50,50); ui->menuPaint->menuAction()->setVisible(false); ui->actionPaintGrid->setVisible(false); ui->actionEraseGrid->setVisible(false); ui->actionPaintPins->setVisible(false); ui->actionErasePins->setVisible(false); ui->actionPaintFlood->setVisible(false); #endif // Do multipart status bar m_labelInfo = new QLabel("Size", this); m_labelInfo->setFrameStyle(QFrame::NoFrame); ui->statusBar->insertPermanentWidget(0, m_labelInfo, 0); m_labelStatus = new QLabel("Layer", this); m_labelStatus->setFrameStyle(QFrame::NoFrame); ui->statusBar->insertPermanentWidget(1, m_labelStatus, 0); #ifdef VEROROUTE_DEBUG m_labelDebug = new QLabel("Debug", this); m_labelDebug->setFrameStyle(QFrame::NoFrame); ui->statusBar->insertPermanentWidget(2, m_labelDebug, 0); #endif m_rulerPen = QPen(QColor(255,255,0,192), 0, Qt::SolidLine, Qt::FlatCap); // using alpha m_backgroundPen = QPen(Qt::white, 0, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); m_greyPen = QPen(QColor(140,140,140,255), 0, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); m_blackPen = QPen(Qt::black, 0, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); m_whitePen = QPen(Qt::white, 0, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); m_redPen = QPen(Qt::red, 0, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); m_orangePen = QPen(QColor(255,128,0,255), 0, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); m_yellowPen = QPen(QColor(255,255,0,255), 0, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); m_lightBluePen = QPen(QColor(96, 96, 255, 255), 0, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); m_varPen = QPen(Qt::black, 0, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); m_dotPen = QPen(QColor(96,96,96,255), 0, Qt::DotLine, Qt::RoundCap, Qt::RoundJoin); m_dashPen = QPen(QColor(96,96,96,255), 0, Qt::DashLine, Qt::RoundCap, Qt::RoundJoin); m_backgroundBrush = QBrush(Qt::white, Qt::SolidPattern); m_darkBrush = QBrush(QColor(0,0,0,150), Qt::SolidPattern); // using alpha m_varBrush = QBrush(QColor(255,255,255,0), Qt::SolidPattern); // File menu actions QObject::connect(ui->actionNew, SIGNAL(triggered()), this, SLOT(New())); QObject::connect(ui->actionOpen, SIGNAL(triggered()), this, SLOT(Open())); QObject::connect(ui->actionMerge, SIGNAL(triggered()), this, SLOT(Merge())); QObject::connect(ui->actionSave, SIGNAL(triggered()), this, SLOT(Save())); QObject::connect(ui->actionSave_As, SIGNAL(triggered()), this, SLOT(SaveAs())); QObject::connect(ui->actionImportTango, SIGNAL(triggered()), this, SLOT(ImportTango())); QObject::connect(ui->actionImportOrcad, SIGNAL(triggered()), this, SLOT(ImportOrcad())); QObject::connect(ui->actionWrite_PDF, SIGNAL(triggered()), this, SLOT(WritePDF())); QObject::connect(ui->actionWrite_PNG, SIGNAL(triggered()), this, SLOT(WritePNG())); QObject::connect(ui->actionWrite_Gerber1_in, SIGNAL(triggered()), this, SLOT(WriteGerber1in())); QObject::connect(ui->actionWrite_Gerber1_mm, SIGNAL(triggered()), this, SLOT(WriteGerber1mm())); QObject::connect(ui->actionWrite_Gerber2_in, SIGNAL(triggered()), this, SLOT(WriteGerber2in())); QObject::connect(ui->actionWrite_Gerber2_mm, SIGNAL(triggered()), this, SLOT(WriteGerber2mm())); QObject::connect(ui->actionClearRecent, SIGNAL(triggered()), this, SLOT(ClearRecentFiles())); QObject::connect(ui->actionQuit, SIGNAL(triggered()), this, SLOT(Quit())); // Edit menu actions QObject::connect(ui->actionUndo, SIGNAL(triggered()), this, SLOT(Undo())); QObject::connect(ui->actionRedo, SIGNAL(triggered()), this, SLOT(Redo())); QObject::connect(ui->actionSelectArea, SIGNAL(triggered()), this, SLOT(ToggleSelectArea())); QObject::connect(ui->actionSelectAll, SIGNAL(triggered()), this, SLOT(SelectAll())); QObject::connect(ui->actionGroup, SIGNAL(triggered()), this, SLOT(Group())); QObject::connect(ui->actionUngroup, SIGNAL(triggered()), this, SLOT(Ungroup())); QObject::connect(ui->actionCopy, SIGNAL(triggered()), this, SLOT(Copy())); QObject::connect(ui->actionDelete, SIGNAL(triggered()), this, SLOT(Delete())); QObject::connect(ui->actionFind, SIGNAL(triggered()), this, SLOT(ShowFindDialog())); QObject::connect(ui->actionSmartPan, SIGNAL(triggered()), this, SLOT(SmartPanOn())); // Add menu actions QObject::connect(ui->actionPad, SIGNAL(triggered()), this, SLOT(AddPad())); QObject::connect(ui->actionPad_FlyWire, SIGNAL(triggered()), this, SLOT(AddPadFlyWire())); QObject::connect(ui->actionWire, SIGNAL(triggered()), this, SLOT(AddWire())); QObject::connect(ui->actionResistor, SIGNAL(triggered()), this, SLOT(AddResistor())); QObject::connect(ui->actionInductor, SIGNAL(triggered()), this, SLOT(AddInductor())); QObject::connect(ui->actionCapCeramic, SIGNAL(triggered()), this, SLOT(AddCapCeramic())); QObject::connect(ui->actionCapFilm, SIGNAL(triggered()), this, SLOT(AddCapFilm())); QObject::connect(ui->actionCapFilmWide, SIGNAL(triggered()), this, SLOT(AddCapFilmWide())); QObject::connect(ui->actionCapElectro200, SIGNAL(triggered()), this, SLOT(AddCapElectro200())); QObject::connect(ui->actionCapElectro250, SIGNAL(triggered()), this, SLOT(AddCapElectro250())); QObject::connect(ui->actionCapElectro300, SIGNAL(triggered()), this, SLOT(AddCapElectro300())); QObject::connect(ui->actionCapElectro400, SIGNAL(triggered()), this, SLOT(AddCapElectro400())); QObject::connect(ui->actionCapElectro500, SIGNAL(triggered()), this, SLOT(AddCapElectro500())); QObject::connect(ui->actionCapElectro600, SIGNAL(triggered()), this, SLOT(AddCapElectro600())); QObject::connect(ui->actionCapElectro200NP, SIGNAL(triggered()), this, SLOT(AddCapElectro200NP())); QObject::connect(ui->actionCapElectro250NP, SIGNAL(triggered()), this, SLOT(AddCapElectro250NP())); QObject::connect(ui->actionCapElectro300NP, SIGNAL(triggered()), this, SLOT(AddCapElectro300NP())); QObject::connect(ui->actionCapElectro400NP, SIGNAL(triggered()), this, SLOT(AddCapElectro400NP())); QObject::connect(ui->actionCapElectro500NP, SIGNAL(triggered()), this, SLOT(AddCapElectro500NP())); QObject::connect(ui->actionCapElectro600NP, SIGNAL(triggered()), this, SLOT(AddCapElectro600NP())); QObject::connect(ui->actionTrimVertical, SIGNAL(triggered()), this, SLOT(AddTrimVert())); QObject::connect(ui->actionTrimVerticalOffset, SIGNAL(triggered()), this, SLOT(AddTrimVertOffset())); QObject::connect(ui->actionTrimVerticalOffsetWide, SIGNAL(triggered()), this, SLOT(AddTrimVertOffsetWide())); QObject::connect(ui->actionTrimFlat, SIGNAL(triggered()), this, SLOT(AddTrimFlat())); QObject::connect(ui->actionTrimFlatWide, SIGNAL(triggered()), this, SLOT(AddTrimFlatWide())); QObject::connect(ui->actionCrystal, SIGNAL(triggered()), this, SLOT(AddCrystal())); QObject::connect(ui->actionDiode, SIGNAL(triggered()), this, SLOT(AddDiode())); QObject::connect(ui->actionLED, SIGNAL(triggered()), this, SLOT(AddLED())); QObject::connect(ui->actionTO92, SIGNAL(triggered()), this, SLOT(AddTO92())); QObject::connect(ui->actionTO18, SIGNAL(triggered()), this, SLOT(AddTO18())); QObject::connect(ui->actionTO39, SIGNAL(triggered()), this, SLOT(AddTO39())); QObject::connect(ui->actionTO220, SIGNAL(triggered()), this, SLOT(AddTO220())); QObject::connect(ui->actionSOIC8, SIGNAL(triggered()), this, SLOT(AddSOIC8())); QObject::connect(ui->actionSOIC14, SIGNAL(triggered()), this, SLOT(AddSOIC14())); QObject::connect(ui->actionSOIC16, SIGNAL(triggered()), this, SLOT(AddSOIC16())); QObject::connect(ui->actionSOIC14W, SIGNAL(triggered()), this, SLOT(AddSOIC14W())); QObject::connect(ui->actionSOIC16W, SIGNAL(triggered()), this, SLOT(AddSOIC16W())); QObject::connect(ui->actionSOIC20W, SIGNAL(triggered()), this, SLOT(AddSOIC20W())); QObject::connect(ui->actionSOIC24W, SIGNAL(triggered()), this, SLOT(AddSOIC24W())); QObject::connect(ui->actionSOIC28W, SIGNAL(triggered()), this, SLOT(AddSOIC28W())); QObject::connect(ui->actionDIP, SIGNAL(triggered()), this, SLOT(AddDIP())); QObject::connect(ui->actionSIP, SIGNAL(triggered()), this, SLOT(AddSIP())); QObject::connect(ui->actionStrip100, SIGNAL(triggered()), this, SLOT(AddStrip100())); QObject::connect(ui->actionBlock100, SIGNAL(triggered()), this, SLOT(AddBlock100())); QObject::connect(ui->actionBlock200, SIGNAL(triggered()), this, SLOT(AddBlock200())); QObject::connect(ui->actionSwitchST, SIGNAL(triggered()), this, SLOT(AddSwitchST())); QObject::connect(ui->actionSwitchDT, SIGNAL(triggered()), this, SLOT(AddSwitchDT())); QObject::connect(ui->actionSwitchST_DIP, SIGNAL(triggered()), this, SLOT(AddSwitchST_DIP())); QObject::connect(ui->actionMarker, SIGNAL(triggered()), this, SLOT(AddMarker())); QObject::connect(ui->actionTextBox, SIGNAL(triggered()), this, SLOT(AddTextBox())); QObject::connect(ui->actionVeroNumbers, SIGNAL(triggered()), this, SLOT(AddVeroNumbers())); QObject::connect(ui->actionVeroLetters, SIGNAL(triggered()), this, SLOT(AddVeroLetters())); // View menu actions QObject::connect(ui->actionZoom_In, SIGNAL(triggered()), this, SLOT(ZoomIn())); QObject::connect(ui->actionZoom_Out, SIGNAL(triggered()), this, SLOT(ZoomOut())); QObject::connect(ui->actionCrop, SIGNAL(triggered()), this, SLOT(Crop())); QObject::connect(ui->actionToggleGrid, SIGNAL(triggered()), this, SLOT(ToggleGrid())); QObject::connect(ui->actionToggleText, SIGNAL(triggered()), this, SLOT(ToggleText())); QObject::connect(ui->actionTogglePinLabels, SIGNAL(triggered()), this, SLOT(TogglePinLabels())); QObject::connect(ui->actionToggleFlyWires, SIGNAL(triggered()), this, SLOT(ToggleFlyWires())); QObject::connect(ui->actionToggleRuler, SIGNAL(triggered()), this, SLOT(ToggleRuler())); QObject::connect(ui->actionToggleFlipH, SIGNAL(triggered()), this, SLOT(ToggleFlipH())); QObject::connect(ui->actionToggleFlipV, SIGNAL(triggered()), this, SLOT(ToggleFlipV())); QObject::connect(ui->actionToggleInverseMono, SIGNAL(triggered()), this, SLOT(ToggleInverseMono())); QObject::connect(ui->actionToggleColoredMono, SIGNAL(triggered()), this, SLOT(ToggleColoredMono())); // Paint menu actions QObject::connect(ui->actionPaintGrid, SIGNAL(triggered()), this, SLOT(TogglePaintGrid())); QObject::connect(ui->actionEraseGrid, SIGNAL(triggered()), this, SLOT(ToggleEraseGrid())); QObject::connect(ui->actionPaintPins, SIGNAL(triggered()), this, SLOT(TogglePaintPins())); QObject::connect(ui->actionErasePins, SIGNAL(triggered()), this, SLOT(ToggleErasePins())); QObject::connect(ui->actionPaintFlood, SIGNAL(triggered()), this, SLOT(TogglePaintFlood())); QObject::connect(ui->actionEditLayerPrefs, SIGNAL(triggered()), this, SLOT(ToggleEditLayerPrefs())); // Track Style menu actions QObject::connect(ui->actionFat, SIGNAL(triggered()), this, SLOT(Fat())); QObject::connect(ui->actionThin, SIGNAL(triggered()), this, SLOT(Thin())); QObject::connect(ui->actionCurved, SIGNAL(triggered()), this, SLOT(Curved())); QObject::connect(ui->actionVeroV, SIGNAL(triggered()), this, SLOT(VeroV())); QObject::connect(ui->actionVeroH, SIGNAL(triggered()), this, SLOT(VeroH())); QObject::connect(ui->actionDiagsMin, SIGNAL(triggered()), this, SLOT(ToggleDiagsMin())); QObject::connect(ui->actionDiagsMax, SIGNAL(triggered()), this, SLOT(ToggleDiagsMax())); QObject::connect(ui->actionFill, SIGNAL(triggered()), this, SLOT(ToggleFill())); // Windows menu actions QObject::connect(ui->actionControlDlg, SIGNAL(triggered()), this, SLOT(ToggleControlDialog())); QObject::connect(ui->actionTemplatesDlg, SIGNAL(triggered()), this, SLOT(ToggleTemplatesDialog())); QObject::connect(ui->actionInfoDlg, SIGNAL(triggered()), this, SLOT(ToggleInfoDialog())); QObject::connect(ui->actionRenderingDlg, SIGNAL(triggered()), this, SLOT(ToggleRenderingDialog())); QObject::connect(ui->actionWireDlg, SIGNAL(triggered()), this, SLOT(ShowWireDialog())); QObject::connect(ui->actionBomDlg, SIGNAL(triggered()), this, SLOT(ShowBomDialog())); QObject::connect(ui->actionAliasDlg, SIGNAL(triggered()), this, SLOT(ShowAliasDialog_NoFile())); QObject::connect(ui->actionPinDlg, SIGNAL(triggered()), this, SLOT(TogglePinDialog())); QObject::connect(ui->actionCompDlg, SIGNAL(triggered()), this, SLOT(ToggleCompDialog())); // Layers menu actions QObject::connect(ui->actionAddLayer, SIGNAL(triggered()), this, SLOT(AddLayer())); QObject::connect(ui->actionRemoveLayer, SIGNAL(triggered()), this, SLOT(RemoveLayer())); QObject::connect(ui->actionSwitchLayer, SIGNAL(triggered()), this, SLOT(SwitchLayer())); QObject::connect(ui->actionToggleVias, SIGNAL(triggered()), this, SLOT(ToggleVias())); QObject::connect(ui->actionResetLayerPrefs, SIGNAL(triggered()), this, SLOT(ResetLayerPrefs())); QObject::connect(ui->actionAutosetLayerPrefs, SIGNAL(triggered()), this, SLOT(AutosetLayerPrefs())); // Help menu actions QObject::connect(ui->actionAbout, SIGNAL(triggered()), this, SLOT(ShowAbout())); QObject::connect(ui->actionSupport, SIGNAL(triggered()), this, SLOT(ShowSupport())); QObject::connect(ui->actionHotkeysDlg, SIGNAL(triggered()), this, SLOT(ShowHotkeysDialog())); QObject::connect(ui->actionTutorial, SIGNAL(triggered()), this, SLOT(LoadFirstTutorial())); QObject::connect(ui->actionUpdateCheck, SIGNAL(triggered()), this, SLOT(UpdateCheck())); // Component Editor Toolbar actions QObject::connect(ui->actionEditor, SIGNAL(triggered()), this, SLOT(DefinerToggleEditor())); QObject::connect(ui->actionAddLine, SIGNAL(triggered()), this, SLOT(DefinerAddLine())); QObject::connect(ui->actionAddRect, SIGNAL(triggered()), this, SLOT(DefinerAddRect())); QObject::connect(ui->actionAddRoundedRect, SIGNAL(triggered()), this, SLOT(DefinerAddRoundedRect())); QObject::connect(ui->actionAddEllipse, SIGNAL(triggered()), this, SLOT(DefinerAddEllipse())); QObject::connect(ui->actionAddArc, SIGNAL(triggered()), this, SLOT(DefinerAddArc())); QObject::connect(ui->actionAddChord, SIGNAL(triggered()), this, SLOT(DefinerAddChord())); QObject::connect(&m_networkMgr, SIGNAL(finished(QNetworkReply*)), this, SLOT(HandleNetworkReply(QNetworkReply*))); CheckFolders(); CheckHistory(); setAcceptDrops(true); QTimer::singleShot(0, this, SLOT(Startup())); } MainWindow::~MainWindow() { delete m_dockCompDlg; delete m_dockControlDlg; delete m_dockTemplatesDlg; delete m_dockRenderingDlg; delete m_dockInfoDlg; delete m_dockPinDlg; delete m_wireDlg; delete m_bomDlg; delete m_textDlg; delete m_findDlg; delete m_padOffsetDlg; #ifdef VEROROUTE_DEBUG delete m_labelDebug; #endif delete m_labelStatus; delete m_labelInfo; delete m_label; delete m_scrollArea; delete m_hotkeysDlg; delete ui; } void MainWindow::CheckFolders() { // Check for "history" folder m_bHistoryDir = false; const std::string historyFolder = m_localDataPathStr + "/history"; std::string testStr = historyFolder + "/TEST\0"; DataStream outStream(DataStream::WRITE); if ( outStream.Open( testStr.c_str() ) ) { outStream.Close(); remove( testStr.c_str() ); m_bHistoryDir = true; } else { std::string messageStr; if ( QDir( historyFolder.c_str() ).exists() ) messageStr += "Cannot write to the folder " + historyFolder; else messageStr += "Cannot find the folder " + historyFolder; messageStr += "\n\nUndo/Redo and other functionality will not work."; QMessageBox::warning(this, tr("History folder is not available "), tr(messageStr.c_str())); ui->actionUndo->setDisabled(true); ui->actionRedo->setDisabled(true); } // Check for "tutorials" folder const std::string tutorialsFolder = m_tutorialsPathStr + "/tutorials"; testStr = tutorialsFolder + "/tutorial_0.vrt\0"; DataStream inStream(DataStream::READ); if ( !inStream.Open( testStr.c_str() ) ) { std::string messageStr; if ( QDir( tutorialsFolder.c_str() ).exists() ) messageStr += "Cannot find tutorial_0.vrt in the folder " + tutorialsFolder; else messageStr += "Cannot find the folder " + tutorialsFolder; messageStr += "\n\nTutorials will be disabled."; QMessageBox::information(this, tr("Tutorials folder is not available"), tr(messageStr.c_str())); ui->actionTutorial->setDisabled(true); } // Check for "templates" folder m_bTemplatesDir = false; const std::string templatesFolder = m_localDataPathStr + "/templates"; testStr = templatesFolder + "/TEST\0"; if ( outStream.Open( testStr.c_str() ) ) { outStream.Close(); remove( testStr.c_str() ); m_bTemplatesDir = true; } else { std::string messageStr; if ( QDir( templatesFolder.c_str() ).exists() ) messageStr += "Cannot write to the folder " + templatesFolder; else messageStr += "Cannot find the folder " + templatesFolder; messageStr += "\n\nAny parts you create will not be saved to the parts library."; QMessageBox::warning(this, tr("Templates folder is not available "), tr(messageStr.c_str())); } // Check for "aliases" folder m_bAliasesDir = false; const std::string aliasesFolder = m_localDataPathStr + "/aliases"; testStr = aliasesFolder + "/TEST\0"; if ( outStream.Open( testStr.c_str() ) ) { outStream.Close(); remove( testStr.c_str() ); m_bAliasesDir = true; } else { std::string messageStr; if ( QDir( aliasesFolder.c_str() ).exists() ) messageStr += "Cannot write to the folder " + aliasesFolder; else messageStr += "Cannot find the folder " + aliasesFolder; messageStr += "\n\nAliases for part types will not be saved between sessions."; QMessageBox::warning(this, tr("Aliases folder is not available "), tr(messageStr.c_str())); } } void MainWindow::CheckHistory() { #ifdef VEROROUTE_ANDROID m_historyMgr.SetInstanceID(1); // Android should only have a single VeroRoute instance (with ID == 1). const QString strLastHistoryFile = m_historyMgr.GetLastHistoryFile(); // e.g. "history/history_1_78.vrt" if ( !strLastHistoryFile.isEmpty() ) // If VeroRoute did not close properly ... { // If showing a message box then tidy the screen before showing it ... /* HideAllDockedDlgs(); HideAllNonDockedDlgs(); activateWindow(); // Select mainwindow rather than child dialogs const bool bDoRecover = QMessageBox::question(this, tr("!!! VeroRoute was closed unexpectedly !!!"), tr("Recover using Undo/Redo history ?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes; */ const bool bDoRecover(true); if ( bDoRecover ) { OpenVrt(strLastHistoryFile, false, bDoRecover); // Restore the last board state m_historyMgr.LoadEntriesFile(); // Restore the old Undo/Redo log m_historyMgr.LoadCircuitFile(m_fileName, m_iTutorialNumber); // Restore the old filename and tutorial number return; // Done } else m_historyMgr.Clear(); // Tidy up. (Wipe all history/log files for the instance) } #endif m_historyMgr.SetInstanceID(0); // Set an instance ID of 0 to stop ResetHistory() wiping other instance histories ResetHistory("Empty"); // Begin a new history ... } void MainWindow::Startup() { ResetView(MOUSE_MODE::SELECT, m_iTutorialNumber >= 0); } void MainWindow::ResetView(MOUSE_MODE eMouseMode, bool bTutorial) { m_mousePos = m_clickedPos = QPoint(0,0); m_bMouseClick = m_bLeftClick = m_bRightClick = m_bCtrlKeyDown = m_bShiftKeyDown = false; m_eMouseMode = eMouseMode; m_bWritePDF = m_bWriteGerber = m_bTwoLayerGerber = false; m_XGRIDOFFSET = m_YGRIDOFFSET = m_XCORRECTION = m_YCORRECTION = 0; // Try to set m_gridRow, m_gridCol to match the current NodeId in the board m_gridRow = m_gridCol = 0; ResetRuler(); // Reset the ruler bool bOK(false); // true ==> found const int k = m_board.GetCurrentLayer(); for (int j = 0, jMax = m_board.GetRows(); j < jMax && !bOK; j++) for (int i = 0, iMax = m_board.GetCols(); i < iMax && !bOK; i++) { const Element* pC = m_board.Get(k,j,i); bOK = ( pC->GetNodeId() == m_board.GetCurrentNodeId() ); if ( bOK ) { m_gridRow = j; m_gridCol = i; } } ClearFind(); const bool bUndoRedo = m_historyMgr.GetIsLocked(); // The history manager is locked for Undo/Redo if ( !bUndoRedo ) HideAllDockedDlgs(); if ( !bUndoRedo ) HideAllNonDockedDlgs(); m_infoDlg->Update(); m_infoDlg->SetReadOnly(bTutorial); m_infoDlg->ShowButtons(bTutorial); m_infoDlg->EnablePrev(bTutorial && m_iTutorialNumber > 0); // Tutorials go to 0 to 26 m_infoDlg->EnableNext(bTutorial && m_iTutorialNumber < 26); // Tutorials go to 0 to 26 if ( !bTutorial ) m_iTutorialNumber = -1; // Cancel tutorial mode UpdateControls(); UpdateBOM(); if ( !bUndoRedo ) UpdateTemplatesDialog(); // For Undo/Redo, don't update the Templates dialog UpdateCompDialog(); UpdateWindowTitle(); if ( !bUndoRedo ) { if ( m_board.GetCompEdit() ) ShowCompDialog(); else ShowControlDialog(); if ( bTutorial ) ShowInfoDialog(); // Always show Info dialog in Tutorial Mode } UpdateUndoRedoControls(); activateWindow(); // Select mainwindow rather than child dialogs if ( !bUndoRedo && !m_board.GetCompEdit() ) m_scrollArea->SetRequestTopLeftView(true); RepaintWithListNodes(); } void MainWindow::HandleRouting(const bool bSingleRoute) { if ( m_board.GetTrackMode() == TRACKMODE::OFF ) return; if ( m_board.GetRoutingEnabled() ) { grabMouse(Qt::WaitCursor); m_board.Route(true); // true ==> Use minimal routing releaseMouse(); } m_board.UpdateVias(); // Needed before m_renderingDlg->UpdateControls() for via info and track separation m_renderingDlg->UpdateControls(); if ( GetCurrentNodeId() != BAD_NODEID ) { grabMouse(Qt::WaitCursor); const int k = m_board.GetCurrentLayer(); Element* pC = m_board.Get(k, m_gridRow, m_gridCol); bool bOK = ( pC->GetNodeId() == GetCurrentNodeId() ); if ( !bOK ) // If current element has wrong NodeID ... { pC = m_board.GetConnPin();// ... try to use a connected pin from the last call of Manhatten() bOK = ( pC && pC->GetNodeId() == GetCurrentNodeId() ); } // ... and if still not OK, then search the grid for the first element with the correct NodeID for (int i = 0, iSize = m_board.GetSize(); i < iSize && !bOK; i++) { pC = m_board.GetAt(i); bOK = ( pC->GetNodeId() == GetCurrentNodeId() ); } if ( bOK ) m_board.Manhatten(pC, bSingleRoute); // Only calc MH over relevant elements releaseMouse(); } } void MainWindow::RepaintWithListNodes(bool bNow) { UpdateWindowTitle(); HandleRouting(); ListNodes(); // Slow due lots of MH calcs m_bRepaint = true; if ( bNow ) repaint(); else update(); UpdateRulerInfo(); UpdatePadInfo(); } void MainWindow::RepaintWithRouting(bool bNow) { UpdateWindowTitle(); HandleRouting(); m_bRepaint = true; if ( bNow ) repaint(); else update(); UpdateRulerInfo(); UpdatePadInfo(); } void MainWindow::RepaintSkipRouting(bool bNow) { UpdateWindowTitle(); m_bRepaint = true; if ( bNow ) repaint(); else update(); UpdateRulerInfo(); UpdatePadInfo(); } void MainWindow::ShowCurrentRectSize() { const auto& rect = m_board.GetRectMgr().GetCurrent(); char buffer[256] = {'\0'}; sprintf(buffer,"Current rectangle = (%.1fin x %.1fin), (%.2fmm x %.2fmm)", rect.GetCols()*0.1, rect.GetRows()*0.1, rect.GetCols()*2.54, rect.GetRows()*2.54); ui->statusBar->showMessage(QString(buffer), 1500); } void MainWindow::OpenVrt(const QString& fileName, bool bMerge, bool bCrashRecovery) // Helper for opening a vrt using Open(), Merge(), dropEvent(), or the command line { QFileInfo info(fileName); bool bOK = ( info.suffix() == QString("vrt") ); if ( !bOK ) { QMessageBox::information(this, tr("File does not have .vrt suffix"), fileName); return UpdateRecentFiles(&fileName, false); // Remove file from list } DataStream inStream(DataStream::READ); const std::string fileNameStr = fileName.toStdString(); bOK = inStream.Open( fileNameStr.c_str() ); if ( bOK ) { ui->statusBar->showMessage( bMerge ? tr("Merging...") : tr("Opening..."), 500 ); Board tmp; // Load using a temporary board in case there is a problem with the file tmp.Load(inStream); inStream.Close(); bOK = inStream.GetOK(); if ( bOK ) // If it loaded OK ... { if ( bMerge ) m_board.Merge(tmp); // ... merge in the temporary board else m_board = tmp; // ... copy the temporary board if ( !bCrashRecovery ) { if ( bMerge ) UpdateHistory("File->Open (merge into current)"); else { m_fileName = fileName; // Only a regular open (not a merge) should update the filename m_iTutorialNumber = -1; ResetHistory("File->Open"); } ResetView(); } } else QMessageBox::information(this, tr("Unsupported VRT version"), fileName); } else QMessageBox::information(this, tr("Unable to open file"), fileName); if ( !bCrashRecovery && !(bMerge && bOK) ) // A successful merge should not add the merged-in file to the recent files list UpdateRecentFiles(&fileName, bOK); // Remove file from list if bOK == false } // File menu items void MainWindow::New() { SetCtrlKeyDown(false); // May have just done a Ctrl+N. Clear flag since key release can get missed. if ( GetIsModified() ) { if ( QMessageBox::question(this, tr("Confirm New"), tr("Your layout is not saved. You will lose changes if you make a new one. Continue?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No ) return; } m_board.Reset(); m_fileName.clear(); m_iTutorialNumber = -1; ResetHistory("File->New"); ResetView(); } void MainWindow::Open() { SetCtrlKeyDown(false); // May have just done a Ctrl+O. Clear flag since key release can get missed. if ( GetIsModified() ) { if ( QMessageBox::question(this, tr("Confirm Open"), tr("Your layout is not saved. You will lose changes if you open a new one. Continue?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No ) return; } QString fileName = QFileDialog::getOpenFileName(this, tr("Open file"), ""/*directory*/, tr("VeroRoute (*.vrt);;All Files (*)")); if ( !fileName.isEmpty() ) OpenVrt(fileName, false); } void MainWindow::OpenRecent() { if ( GetIsModified() ) { if ( QMessageBox::question(this, tr("Confirm Open"), tr("Your layout is not saved. You will lose changes if you open a new one. Continue?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No ) return; } QAction* pAction = qobject_cast( sender() ); if ( pAction ) { QString fileName = pAction->data().toString(); if ( !fileName.isEmpty() ) OpenVrt(fileName, false); } } void MainWindow::Merge() { SetCtrlKeyDown(false); // May have just done a Ctrl+M. Clear flag since key release can get missed. const Component& trax = m_board.GetCompMgr().GetTrax(); if ( trax.GetSize() > 0 && !trax.GetIsPlaced() ) { if ( QMessageBox::question(this, tr("Confirm merge into current"), tr("Some areas of the grid are highlighted and floating. You will lose the tracks there. Continue?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No ) return; } QString fileName = QFileDialog::getOpenFileName(this, tr("Merge file"), ""/*directory*/, tr("VeroRoute (*.vrt);;All Files (*)")); if ( !fileName.isEmpty() ) OpenVrt(fileName, true); } void MainWindow::Save() { SetCtrlKeyDown(false); // May have just done a Ctrl+S. Clear flag since key release can get missed. if ( m_fileName.isEmpty() ) return SaveAs(); #ifdef VEROROUTE_ANDROID QFileInfo info(m_fileName); if ( info.suffix() != QString("vrt") ) { QMessageBox::information(this, tr("FAILED: File has suffix") + QString(" \".") + info.suffix() + QString("\" ") + tr("instead of") + QString(" \".vrt\""), m_fileName); return; } #endif DataStream outStream(DataStream::WRITE); const std::string fileNameStr = m_fileName.toStdString(); if ( outStream.Open( fileNameStr.c_str() ) ) { ui->statusBar->showMessage( tr("Saving..."), 500 ); m_board.Save(outStream); outStream.Close(); m_infoDlg->Update(); // Don't need a ResetView() but MUST update the initial string for the info dialog } else { #ifdef VEROROUTE_ANDROID return SaveAs(); // Ask for explicit permission #else QMessageBox::information(this, tr("Unable to save file"), tr(fileNameStr.c_str())); #endif } } void MainWindow::SaveAs() { bool bOK(false); SetCtrlKeyDown(false); SetShiftKeyDown(false); // May have just done a Ctrl+Shift+S. Clear flags since key release can get missed. #ifdef VEROROUTE_ANDROID QMessageBox::information(this, tr("Information"), tr("You must now select or enter a filename ending in .vrt")); const QString fileName = GetSaveFileName(tr(""), tr("VeroRoute (*.vrt);;All Files (*)"), QString("vrt")); #else const QString fileName = GetSaveFileName(tr("Save file as"), tr("VeroRoute (*.vrt);;All Files (*)"), QString("vrt")); #endif if ( fileName.isEmpty() ) return; #ifdef VEROROUTE_ANDROID QFileInfo info(fileName); if ( info.suffix() != QString("vrt") ) { QMessageBox::information(this, tr("FAILED: File has suffix") + QString(" \".") + info.suffix() + QString("\" ") + tr("instead of") + QString(" \".vrt\""), fileName); return; } #endif DataStream outStream(DataStream::WRITE); const std::string fileNameStr = fileName.toStdString(); if ( outStream.Open( fileNameStr.c_str() ) ) { ui->statusBar->showMessage( tr("Saving..."), 500 ); m_board.Save(outStream); outStream.Close(); m_infoDlg->Update(); // Don't need a ResetView() but MUST update the initial string for the info dialog m_fileName = fileName; m_historyMgr.SaveCircuitFile(m_fileName, m_iTutorialNumber); // Must call this directly instead of calling ResetHistory() bOK = true; UpdateWindowTitle(); } else QMessageBox::information(this, tr("Unable to save file"), tr(fileNameStr.c_str())); UpdateRecentFiles(&fileName, bOK); // Remove file from list if bOK == false } void MainWindow::Import(bool bTango) { if ( GetIsModified() ) { if ( QMessageBox::question(this, tr("Confirm Import"), tr("Your layout is not saved. You will lose changes if you Import a new one. Continue?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No ) return; } QString fileName = QFileDialog::getOpenFileName(this, tr("Open file"), ""/*directory*/, tr("Protel Netlist (*.net);;All Files (*)")); if ( !fileName.isEmpty() ) { m_aliasDlg->Configure(fileName.toStdString(), bTango); std::list compStrList; if ( m_board.GetImportParts(fileName.toStdString(), compStrList, bTango) ) // Get all part info in the file { for (auto& compStrings : compStrList) { const std::string& importStr = compStrings.m_importStr; const std::string& validImportStr = m_templateMgr.GetImportStrFromAlias(importStr); // See if importStr is an alias for a valid import string if ( m_templateMgr.CheckPartOK(importStr) ) // If importStr is already a valid import string ... m_templateMgr.RemoveAlias(importStr); // ... remove it from the alias list (if it is listed as an alias). else if ( !m_templateMgr.CheckPartOK(validImportStr) ) m_templateMgr.AddAlias(importStr, ""); // Put it in the alias list with a blank import string } } ShowAliasDialog(); ReImport(); } } void MainWindow::ReImport() { ui->statusBar->showMessage( tr("Importing..."), 500 ); m_templateMgr.ClearInvalidAliases(); bool bPartTypeOK(false); const bool bOK = m_aliasDlg->Import(bPartTypeOK); if ( bOK ) HideAliasDialog(); else if ( !bPartTypeOK ) ShowAliasDialog(); m_fileName.clear(); m_iTutorialNumber = -1; ResetHistory("File->Import Netlist"); ResetView(); if ( !bOK ) QMessageBox::information(this, tr("Error Importing Netlist"), tr(m_aliasDlg->GetErrorStr().c_str())); } void MainWindow::WritePDF() { #ifdef VEROROUTE_ANDROID const QString name = m_fileName.isEmpty() ? QString("Circuit.vrt") : m_fileName; QString defaultName = StringHelper::ReplaceSuffix(name, QString("pdf")); // Replace vrt with pdf QFile fileTest(defaultName); if ( fileTest.exists() ) defaultName.clear(); else defaultName = StringHelper::GetTidyFileName(defaultName); QMessageBox::information(this, tr("Information"), tr("You must now select or enter a filename ending in .pdf")); m_pdfFileName = GetSaveFileName(defaultName, tr("PDF (*.pdf);;All Files (*)"), QString("pdf")); #else m_pdfFileName = GetSaveFileName(tr("Choose a PDF file"), tr("PDF (*.pdf);;All Files (*)"), QString("pdf")); #endif if ( m_pdfFileName.isEmpty() ) return; #ifdef VEROROUTE_ANDROID QFileInfo info(m_pdfFileName); if ( info.suffix() != QString("pdf") ) { QMessageBox::information(this, tr("FAILED: File has suffix") + QString(" \".") + info.suffix() + QString("\" ") + tr("instead of") + QString(" \".pdf\""), m_pdfFileName); return; } #endif ui->statusBar->showMessage( tr("Exporting to PDF..."), 500 ); const int oldGridPixels = m_board.GetGRIDPIXELS(); Q_DECL_CONSTEXPR static int pdfGridPixels = 120; // 1200 dpi Q_DECL_CONSTEXPR static int pdfHalfGridPixels = pdfGridPixels / 2; m_board.SetGRIDPIXELS(pdfGridPixels); const int iDelta = static_cast ( m_board.GetEdgeWidth() + m_board.GetFillWidth() ); // Need additional correction of 1.5 grid squares (i.e. 3 * pdfHalfGridPixels) to get the centering correct m_XGRIDOFFSET = ( (117 - 3) - m_board.GetCols() ) * pdfHalfGridPixels - iDelta; // A4 landscape is about 117 * 0.1 inches wide m_YGRIDOFFSET = ( (83 - 3) - m_board.GetRows() ) * pdfHalfGridPixels - iDelta; // A4 landscape is about 83 * 0.1 inches tall m_bWritePDF = true; // Makes paintEvent() write to PDF instead of pixmap RepaintSkipRouting(true); // true ==> force use of repaint() rather than update() m_bWritePDF = false; // Makes paintEvent() go back to writing to pixmap m_XGRIDOFFSET = m_YGRIDOFFSET = 0; // Restore zero offsets m_board.SetGRIDPIXELS(oldGridPixels); // Restore number of pixels per grid square QDesktopServices::openUrl(m_pdfFileName); // Ask the system to open the PDF file. } void MainWindow::WriteGerber(bool bTwoLayerGerber, bool bMetric) { m_bTwoLayerGerber = bTwoLayerGerber; m_board.SetHoleType(m_bTwoLayerGerber ? HOLETYPE::PTH : HOLETYPE::NPTH); if ( m_fileName.isEmpty() ) { QMessageBox::information(this, tr("Information"), tr("You must first Save your layout to a .vrt file")); return; } #ifdef VEROROUTE_ANDROID const QString name = StringHelper::ReplaceSuffix(m_fileName, QString("GKO")); // Replace "vrt" with "GKO" QFile file(name); const bool bNewGerbers = !file.exists(); // If the GKO file doesn't exist, assume we're doing a new export m_gerberFileName = StringHelper::RemoveDotSuffix(name); // Remove ".GKO" #else m_gerberFileName = GetSaveFileName(tr("Choose a Gerber file prefix"), tr("All Files (*)"), QString("")); #endif if ( !m_gerberFileName.isEmpty() ) { bool bConfirmEachFile(false); #ifdef VEROROUTE_ANDROID if ( bNewGerbers ) { bConfirmEachFile = true; QMessageBox::information(this, tr("Information"), tr("You must now confirm the Save for each Gerber file")); } #endif ui->statusBar->showMessage( tr("Exporting to Gerber..."), 500 ); const int oldGridPixels = m_board.GetGRIDPIXELS(); const int gerberGridPixels = 1000; // Gerber file had 4 decimal places per inch m_board.SetGRIDPIXELS(gerberGridPixels); m_bWriteGerber = true; // Makes paintEvent() write to Gerber file instead of pixmap HandleRouting(); // Update m_board.m_bHasVias BEFORE opening the Gerber files const bool bWireVias = m_bTwoLayerGerber && m_board.GetLyrs() == 1 && m_board.GetCompMgr().GetHavePlacedWires(); const bool bVias = m_board.GetHasVias() || bWireVias; const bool bSOIC = m_board.GetCompMgr().GetNumSOIC() > 0; const bool bSOIC16 = m_board.GetCompMgr().GetNumSOIC(16) > 0; if ( m_gWriter.Open(m_gerberFileName, m_board, bVias, bSOIC, bSOIC16, m_bTwoLayerGerber, bMetric, bConfirmEachFile) ) { const int origlayer = m_board.GetCurrentLayer(); for (int lyr = 0, lyrs = m_board.GetLyrs(); lyr < lyrs; lyr++) { m_board.SetCurrentLayer(lyr); RepaintSkipRouting(true); // true ==> force use of repaint() rather than update() } m_board.SetCurrentLayer(origlayer); m_gWriter.Close(); } m_bWriteGerber = false; // Makes paintEvent() go back to writing to pixmap m_board.SetGRIDPIXELS(oldGridPixels); // Restore number of pixels per grid square #ifndef VEROROUTE_ANDROID #ifdef AUTO_OPEN_GERBERS // Ask the system to open the Gerber files QDesktopServices::openUrl(m_gerberFileName + ".GKO"); QDesktopServices::openUrl(m_gerberFileName + ".GBL"); QDesktopServices::openUrl(m_gerberFileName + ".GBS"); // QDesktopServices::openUrl(m_gerberFileName + ".GBO"); if ( m_bTwoLayerGerber ) { QDesktopServices::openUrl(m_gerberFileName + ".GTL"); QDesktopServices::openUrl(m_gerberFileName + ".GTS"); } QDesktopServices::openUrl(m_gerberFileName + ".GTO"); QDesktopServices::openUrl(m_gerberFileName + ".DRL"); #endif #endif } } void MainWindow::ClearRecentFiles() { QSettings settings("veroroute","veroroute"); // Organisation = "veroroute", Application = "veroroute" settings.setValue("recentFiles", QStringList()); for (size_t i = 0; i < MAX_RECENT_FILES; i++) m_recentFileAction[i]->setVisible(false); ui->actionClearRecent->setEnabled(false); m_separator->setVisible(false); } void MainWindow::WritePNG() { #ifdef VEROROUTE_ANDROID const QString name = m_fileName.isEmpty() ? QString("Circuit.vrt") : m_fileName; QString defaultName = StringHelper::ReplaceSuffix(name, QString("png")); // Replace vrt with png QFile fileTest(defaultName); if ( fileTest.exists() ) defaultName.clear(); else defaultName = StringHelper::GetTidyFileName(defaultName); QMessageBox::information(this, tr("Information"), tr("You must now select or enter a filename ending in .png")); const QString pngFileName = GetSaveFileName(defaultName, tr("PNG (*.png);;All Files (*)"), QString("png")); #else const QString pngFileName = GetSaveFileName(tr("Choose a PNG file"), tr("PNG (*.png);;All Files (*)"), QString("png")); #endif if ( pngFileName.isEmpty() ) return; #ifdef VEROROUTE_ANDROID QFileInfo info(pngFileName); if ( info.suffix() != QString("png") ) { QMessageBox::information(this, tr("FAILED: File has suffix") + QString(" \".") + info.suffix() + QString("\" ") + tr("instead of") + QString(" \".png\""), pngFileName); return; } #endif ui->statusBar->showMessage( tr("Exporting to PNG..."), 500 ); QFile file(pngFileName); file.open(QIODevice::WriteOnly); m_mainPixmap.save(&file, "PNG"); QDesktopServices::openUrl(pngFileName); // Ask the system to open the PNG file. } void MainWindow::Quit() { SetCtrlKeyDown(false); // May have just done a Ctrl+Q. Clear flag since key release can get missed. if ( GetIsModified() ) { if ( QMessageBox::question(this, tr("Really Quit?"), tr("Your layout is not saved. You will lose changes if you quit. Continue?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No ) return; } QApplication::quit(); } // View menu items void MainWindow::ZoomIn() { if ( !CanZoomIn() ) return; // Need this check for wheel zoom const int& W = m_board.GetGRIDPIXELS(); int delta(2); // Change in GRIDPIXELS if ( W >= 64 ) delta *= 2; if ( W >= 96 ) delta *= 2; if ( W >= 128 ) delta *= 2; ZoomHelper(delta); } void MainWindow::ZoomOut() { if ( !CanZoomOut() ) return; // Need this check for wheel zoom const int& W = m_board.GetGRIDPIXELS(); int delta(-2); // Change in GRIDPIXELS if ( W > 64 ) delta *= 2; if ( W > 96 ) delta *= 2; if ( W > 128 ) delta *= 2; ZoomHelper(delta); } void MainWindow::ZoomHelper(int delta) // delta == change in GRIDPIXELS { int X, Y; GetPixMapXY(m_mousePos, X, Y); auto* pH = m_scrollArea->horizontalScrollBar(); auto* pV = m_scrollArea->verticalScrollBar(); const int L = pH->value(); // Left of visible area (measured in pixmap pixels) const int T = pV->value(); // Top of visible area (measured in pixmap pixels) const int W = m_board.GetGRIDPIXELS(); // Current scale m_board.SetGRIDPIXELS(W + delta); // Change scale UpdateControls(); RepaintSkipRouting(true); // Try to have same grid position under mouse after zoom pH->setValue(static_cast(L + X * delta * 1.0 / W)); pV->setValue(static_cast(T + Y * delta * 1.0 / W)); UpdateHistory("zoom", 0); } // Edit menu items void MainWindow::Undo() { m_historyMgr.Lock(); if ( m_historyMgr.Undo(m_board) ) { const bool bCtrlKeyDown = GetCtrlKeyDown(); const bool bShiftKeyDown = GetShiftKeyDown(); ResetView(m_eMouseMode, m_iTutorialNumber >= 0); // This resets ctrl and shift key down SetCtrlKeyDown(bCtrlKeyDown); SetShiftKeyDown(bShiftKeyDown); } m_historyMgr.UnLock(); } void MainWindow::Redo() { m_historyMgr.Lock(); if ( m_historyMgr.Redo(m_board) ) { const bool bCtrlKeyDown = GetCtrlKeyDown(); const bool bShiftKeyDown = GetShiftKeyDown(); ResetView(m_eMouseMode, m_iTutorialNumber >= 0); // This resets ctrl and shift key down SetCtrlKeyDown(bCtrlKeyDown); SetShiftKeyDown(bShiftKeyDown); } m_historyMgr.UnLock(); } void MainWindow::SmartPanOn() { SetSmartPan(true); } void MainWindow::Copy() { if ( m_board.GetCompEdit() && GetCurrentShapeId() != BAD_ID ) { SetCurrentShapeId( GetCompDefiner().CopyShape() ); UpdateHistory("copy shape"); RepaintSkipRouting(); } else if ( AllowCurrentTextId() ) { if ( StringHelper::IsEmptyStr( GetCurrentTextRect().GetStr() ) ) return; // Don't copy empty text boxes int iRow, iCol; GetFirstRowCol(iRow, iCol); m_board.AddTextBox(iRow, iCol); UpdateHistory("copy text box"); ShowTextDialog(); UpdateControls(); RepaintSkipRouting(); } else { m_board.CopyUserComps(); if ( m_board.GetGroupMgr().GetNumUserComps() > 1 ) UpdateHistory("copy parts"); else UpdateHistory("copy part"); UpdateControls(); UpdateBOM(); RepaintSkipRouting(); } } void MainWindow::Group() { GroupManager& groupMgr = m_board.GetGroupMgr(); groupMgr.Group(); UpdateHistory("group parts"); UpdateControls(); RepaintSkipRouting(); } void MainWindow::Ungroup() { GroupManager& groupMgr = m_board.GetGroupMgr(); groupMgr.UnGroup(GetCurrentCompId()); UpdateHistory("ungroup parts"); UpdateControls(); RepaintSkipRouting(); } void MainWindow::SelectAll() { GroupManager& groupMgr = m_board.GetGroupMgr(); // Clear current selection SetCurrentCompId(BAD_COMPID); groupMgr.ResetUserGroup( GetCurrentCompId() ); // Wipe user group const bool bRestrictToRects(false); m_board.SelectAllComps(bRestrictToRects); // Put components in user-group UpdateHistory("select all parts", 0); UpdateControls(); RepaintSkipRouting(); } void MainWindow::SelectAllInRects() { GroupManager& groupMgr = m_board.GetGroupMgr(); // Clear current selection SetCurrentCompId(BAD_COMPID); groupMgr.ResetUserGroup( GetCurrentCompId() ); // Wipe user group const bool bRestrictToRects(true); m_board.SelectAllComps(bRestrictToRects); // Put components in user-group UpdateControls(); } void MainWindow::Delete() { if ( m_board.GetCompEdit() && GetCurrentShapeId() != BAD_ID ) { SetCurrentShapeId( GetCompDefiner().DestroyShape() ); UpdateHistory("delete shape"); RepaintSkipRouting(); } else if ( AllowCurrentTextId() ) { m_board.GetTextMgr().DestroyRect(GetCurrentTextId()); SetCurrentTextId(BAD_TEXTID); SetResizingText(false); UpdateHistory("delete text box"); RepaintSkipRouting(); } else { const bool bPlural = ( m_board.GetGroupMgr().GetNumUserComps() > 1 ); // Ask for confirmation unless deleting only wires and markers if ( m_board.ConfirmDestroyUserComps() && QMessageBox::question(this, tr("Confirm Delete"), bPlural ? tr("Are you sure you want to delete the selected parts?") : tr("Are you sure you want to delete the selected part?") , QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No ) return; m_board.DestroyUserComps(); SetCurrentCompId(BAD_COMPID); UpdateHistory(bPlural ? "delete parts" : "delete part"); UpdateControls(); UpdateBOM(); RepaintWithListNodes(); } } // Windows menu items void MainWindow::ShowDlg(QWidget* p) { p->showNormal(); p->raise(); p->activateWindow(); UpdateControls(); } void MainWindow::HideDlg(QWidget* p) { p->hide(); UpdateControls(); } void MainWindow::ToggleControlDialog() { return m_dockControlDlg->isVisible() ? HideDlg(m_dockControlDlg) : ShowControlDialog(); } void MainWindow::ToggleCompDialog() { return m_dockCompDlg->isVisible() ? HideCompDialog() : ShowCompDialog(); } void MainWindow::ToggleRenderingDialog() { return m_dockRenderingDlg->isVisible() ? HideRenderingDialog() : ShowRenderingDialog(); } void MainWindow::ToggleInfoDialog() { return m_dockInfoDlg->isVisible() ? HideInfoDialog() : ShowInfoDialog(); } void MainWindow::ToggleTemplatesDialog() { return m_dockTemplatesDlg->isVisible() ? HideTemplatesDialog() : ShowTemplatesDialog(); } void MainWindow::TogglePinDialog() { return m_dockPinDlg->isVisible() ? HidePinDialog() : ShowPinDialog(); } void MainWindow::HideAllDockedDlgs() { m_dockControlDlg->hide(); m_dockCompDlg->hide(); m_dockRenderingDlg->hide(); m_dockTemplatesDlg->hide(); m_dockPinDlg->hide(); m_dockInfoDlg->hide(); } void MainWindow::HideAllNonDockedDlgs() { m_bomDlg->hide(); m_wireDlg->hide(); m_findDlg->hide(); m_textDlg->hide(); } void MainWindow::ShowControlDialog() { HideAllNonDockedDlgs(); // (m_bomDlg, m_wireDlg, m_findDlg, m_textDlg) // (m_dockCompDlg, m_dockControlDlg, m_dockRenderingDlg, m_dockTemplatesDlg) are mutually exclusive m_dockCompDlg->hide(); m_dockTemplatesDlg->hide(); m_dockRenderingDlg->hide(); m_dockPinDlg->hide(); // Always hide the pin dialog when toggling to control dialog ShowDlg(m_dockControlDlg); } void MainWindow::ShowCompDialog() { HideAllNonDockedDlgs(); // (m_bomDlg, m_wireDlg, m_findDlg, m_textDlg) HidePadOffsetDialog(); // (m_dockCompDlg, m_dockControlDlg, m_dockRenderingDlg, m_dockTemplatesDlg) are mutually exclusive m_dockControlDlg->hide(); m_dockTemplatesDlg->hide(); m_dockRenderingDlg->hide(); ShowDlg(m_dockCompDlg); ShowPinDialog(); // Always show the pin dialog when toggling to component editor (if not in tutorial mode) m_scrollArea->SetRequestCentreView(true); RepaintSkipRouting(); } void MainWindow::HideCompDialog() { m_scrollArea->SetRequestCentreView( m_board.GetCompEdit() ); // Set BEFORE hide/show dialogs HideDlg(m_dockCompDlg); } void MainWindow::ShowRenderingDialog() { HideAllNonDockedDlgs(); // (m_bomDlg, m_wireDlg, m_findDlg, m_textDlg) // (m_dockCompDlg, m_dockControlDlg, m_dockRenderingDlg, m_dockTemplatesDlg) are mutually exclusive m_dockCompDlg->hide(); m_dockControlDlg->hide(); m_dockTemplatesDlg->hide(); ShowDlg(m_dockRenderingDlg); } void MainWindow::HideRenderingDialog() { HideDlg(m_dockRenderingDlg); if ( !m_board.GetCompEdit() ) ShowDlg(m_dockControlDlg); } void MainWindow::ShowHotkeysDialog() { HideAllNonDockedDlgs(); // (m_bomDlg, m_wireDlg, m_findDlg, m_textDlg) ShowDlg(m_hotkeysDlg); } void MainWindow::ShowInfoDialog() { m_scrollArea->SetRequestCentreView( m_board.GetCompEdit() ); // Set BEFORE hide/show dialogs HideAllNonDockedDlgs(); // (m_bomDlg, m_wireDlg, m_findDlg, m_textDlg) // m_dockPinDlg and m_dockInfoDlg are mutually exclusive m_dockPinDlg->hide(); ShowDlg(m_dockInfoDlg); } void MainWindow::HideInfoDialog() { m_scrollArea->SetRequestCentreView( m_board.GetCompEdit() ); // Set BEFORE hide/show dialogs HideDlg(m_dockInfoDlg); } void MainWindow::ShowTemplatesDialog() { m_scrollArea->SetRequestCentreView( m_board.GetCompEdit() ); // Set BEFORE hide/show dialogs HideAllNonDockedDlgs(); // (m_bomDlg, m_wireDlg, m_findDlg, m_textDlg) // (m_dockCompDlg, m_dockControlDlg, m_dockRenderingDlg, m_dockTemplatesDlg) are mutually exclusive m_dockCompDlg->hide(); m_dockControlDlg->hide(); m_dockRenderingDlg->hide(); UpdateTemplatesDialog(); ShowDlg(m_dockTemplatesDlg); } void MainWindow::HideTemplatesDialog() { m_scrollArea->SetRequestCentreView( m_board.GetCompEdit() ); // Set BEFORE hide/show dialogs HideDlg(m_dockTemplatesDlg); return m_board.GetCompEdit() ? ShowDlg(m_dockCompDlg) : ShowDlg(m_dockControlDlg); } void MainWindow::ShowPinDialog() { m_scrollArea->SetRequestCentreView( m_board.GetCompEdit() ); // Set BEFORE hide/show dialogs if ( m_iTutorialNumber < 0 ) // Don't show pin labels dialog in tutorial mode { HideAllNonDockedDlgs(); // (m_bomDlg, m_wireDlg, m_findDlg, m_textDlg) // (m_dockPinDlg, m_dockInfoDlg) are mutually exclusive m_dockInfoDlg->hide(); m_pinDlg->Update(); ShowDlg(m_dockPinDlg); } } void MainWindow::HidePinDialog() { m_scrollArea->SetRequestCentreView( m_board.GetCompEdit() ); // Set BEFORE hide/show dialogs HideDlg( m_dockPinDlg ); } void MainWindow::ShowPadOffsetDialog() { ShowDlg(m_padOffsetDlg); // Show the dialog (so we can get position info) ... // ... then try to it centre it in the status bar !!! QRect R = geometry(); QRect r = ui->statusBar->geometry(); QRect d = m_padOffsetDlg->geometry(); const int titleBarHeight = d.top() - m_padOffsetDlg->pos().y(); // Can be 0 on Android m_padOffsetDlg->move(R.left() + r.left() + 450, R.top() + r.top() - titleBarHeight - 2); UpdatePadInfo(); } void MainWindow::HidePadOffsetDialog(bool bForce) { if ( !bForce && !m_padOffsetDlg->isVisible() ) return; ui->statusBar->showMessage(QString("")); UpdateHistory("change pad offsets"); HideDlg(m_padOffsetDlg); if ( bForce ) RepaintSkipRouting(true); } void MainWindow::ShowBomDialog() { // (m_bomDlg, m_aliasDlg, m_wireDlg, m_findDlg, m_textDlg) are mutually exclusive m_aliasDlg->hide(); m_wireDlg->hide(); m_findDlg->hide(); m_textDlg->hide(); ResetMouseMode(); UpdateBOM(); ShowDlg(m_bomDlg); } void MainWindow::HideBomDialog() { HideDlg(m_bomDlg); } void MainWindow::ShowAliasDialog_NoFile() { m_aliasDlg->Configure("",true); // Clear filename so import will be disabled ShowAliasDialog(); } void MainWindow::ShowAliasDialog() { // (m_bomDlg, m_aliasDlg, m_wireDlg, m_findDlg, m_textDlg) are mutually exclusive m_bomDlg->hide(); m_wireDlg->hide(); m_findDlg->hide(); m_textDlg->hide(); ResetMouseMode(); UpdateAliasDialog(); ShowDlg(m_aliasDlg); } void MainWindow::HideAliasDialog() { HideDlg(m_aliasDlg); } void MainWindow::ShowWireDialog() { // (m_bomDlg, m_aliasDlg, m_wireDlg, m_findDlg, m_textDlg) are mutually exclusive m_bomDlg->hide(); m_aliasDlg->hide(); m_findDlg->hide(); m_textDlg->hide(); ResetMouseMode(); ShowDlg(m_wireDlg); } void MainWindow::HideWireDialog() { HideDlg(m_wireDlg); } void MainWindow::ShowFindDialog() { // (m_bomDlg, m_aliasDlg, m_wireDlg, m_findDlg, m_textDlg) are mutually exclusive m_bomDlg->hide(); m_aliasDlg->hide(); m_wireDlg->hide(); m_textDlg->hide(); ResetMouseMode(); ShowDlg(m_findDlg); } void MainWindow::HideFindDialog() { HideDlg(m_findDlg); } void MainWindow::ShowTextDialog() { // (m_bomDlg, m_aliasDlg, m_wireDlg, m_findDlg, m_textDlg) are mutually exclusive m_bomDlg->hide(); m_aliasDlg->hide(); m_wireDlg->hide(); m_findDlg->hide(); ResetMouseMode(); ShowDlg(m_textDlg); } // Layers menu items void MainWindow::AddLayer() { assert( m_board.GetLyrs() == 1 ); m_board.GrowThenPan(1, 0, 0, 0, 0); m_board.PlaceFloaters(); // We may have floating SOICs m_board.SetCurrentLayer(1); m_board.SetViasEnabled(true); UpdateHistory("add top layer"); UpdateControls(); RepaintWithListNodes(); } void MainWindow::RemoveLayer() { assert( m_board.GetLyrs() == 2 ); m_board.FloatAllCompsSOIC(); // SOICs need 2 layers m_board.GrowThenPan(-1, 0, 0, 0, 0); m_board.SetCurrentLayer(0); m_board.WipeSoicAreas(); UpdateHistory("remove top layer"); UpdateControls(); RepaintWithListNodes(); } void MainWindow::SwitchLayer() { assert( m_board.GetLyrs() == 2 ); m_board.SetCurrentLayer( ( m_board.GetCurrentLayer() + 1 ) % 2 ); UpdateHistory("switch layer", 0); UpdateControls(); RepaintWithRouting(); } void MainWindow::ToggleVias() { assert( m_board.GetLyrs() == 2 ); m_board.SetViasEnabled( !m_board.GetViasEnabled() ); UpdateHistory("enable/disable vias", 0); UpdateControls(); RepaintWithListNodes(); } void MainWindow::ResetLayerPrefs() { assert( m_board.GetLyrs() == 2 ); m_board.ResetPinLayerPrefs(false); UpdateHistory("reset pin layer preferences", 0); // UpdateControls(); // Not needed RepaintSkipRouting(); } void MainWindow::AutosetLayerPrefs() { assert( m_board.GetLyrs() == 2 ); m_board.ResetPinLayerPrefs(true); UpdateHistory("auto-set pin layer preferences", 0); // UpdateControls(); // Not needed RepaintSkipRouting(); } // Help menu items void MainWindow::ShowAbout() { std::string str = std::string("VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application.\n\n") + std::string("Version ") + std::string(szVEROROUTE_VERSION) + std::string("\n\n") + std::string("Copyright (C) 2017-2024 Alex Lawrow ( dralx@users.sourceforge.net )\n\n") + std::string("This program is free software: you can redistribute it and/or modify\n") + std::string("it under the terms of the GNU General Public License as published by\n") + std::string("the Free Software Foundation, either version 3 of the License, or\n") + std::string("(at your option) any later version.\n\n") + std::string("This program is distributed in the hope that it will be useful,\n") + std::string("but WITHOUT ANY WARRANTY; without even the implied warranty of\n") + std::string("MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n") + std::string("See the GNU General Public License for more details.\n\n") + std::string("You should have received a copy of the GNU General Public License\n") + std::string("along with this program. If not, see ."); QMessageBox::information(this, tr("About"), tr(str.c_str())); } void MainWindow::ShowSupport() { QDesktopServices::openUrl(QString("https://sourceforge.net/p/veroroute/discussion/")); } void MainWindow::LoadFirstTutorial() { if ( GetIsModified() ) { if ( QMessageBox::question(this, tr("Confirm Load Tutorials"), tr("Your layout is not saved. You will lose changes if you load the tutorials. Continue?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No ) return; } m_iTutorialNumber = 0; LoadTutorial(); } void MainWindow::LoadPrevTutorial() { m_iTutorialNumber--; LoadTutorial(); } void MainWindow::LoadNextTutorial() { m_iTutorialNumber++; LoadTutorial(); } void MainWindow::LoadTutorial() { char fileName[256] = {'\0'}; sprintf(fileName, "%s/tutorials/tutorial_%d.vrt", m_tutorialsPathStr.c_str(), m_iTutorialNumber); DataStream inStream(DataStream::READ); if ( inStream.Open( fileName ) ) { m_board.Load(inStream); inStream.Close(); if ( inStream.GetOK() ) { m_fileName = fileName; ResetHistory("File->Open"); ResetView(MOUSE_MODE::SELECT, true); // true ==> tutorial mode } else QMessageBox::information(this, tr("Unsupported VRT version"), tr(fileName)); } else QMessageBox::information(this, tr("Unable to open tutorial file"), tr(fileName)); } // Check version against Sourceforge void MainWindow::UpdateCheck() { m_networkMgr.get(QNetworkRequest(QUrl("https://sourceforge.net/projects/veroroute/files/"))); } void MainWindow::HandleNetworkReply(QNetworkReply* pReply) { pReply->deleteLater(); if ( pReply->error() == QNetworkReply::UnknownNetworkError ) { QMessageBox::information(this, tr("Check failed"), tr("There was a network error.\nRead the file OpenSSL.txt provided with VeroRoute.")); return; } else if ( pReply->error() != QNetworkReply::NoError ) { QMessageBox::information(this, tr("Check failed"), tr("There was a network error.")); return; } const QString contentType = pReply->header(QNetworkRequest::ContentTypeHeader).toString(); if ( !contentType.contains("charset=utf-8") ) { QMessageBox::information(this, tr("Check failed"), tr("Unsupported character set.")); return; // Content charsets other than utf-8 are not implemented yet } const QString qstrHtml = QString::fromUtf8(pReply->readAll()); const std::string strHtml = qstrHtml.toStdString(); const auto pos = strHtml.find("Version "); // Search for the text "Version " on the page if ( pos == std::string::npos ) { QMessageBox::information(this, tr("Check failed"), tr("Could not find Version number on Sourceforge.")); return; } const std::string versionStr = strHtml.substr(pos+8, 4); // Should be something like "1.23" const double dSiteVersion = atof(versionStr.c_str()) ; const double dThisVersion = atof(szVEROROUTE_VERSION); static char bufferThis[8]; sprintf(bufferThis, "V%s", szVEROROUTE_VERSION); static char bufferOther[128]; sprintf(bufferOther, "A new version is available!\nV%s can be downloaded from\nhttps://sourceforge.net/projects/veroroute/files/", versionStr.c_str()); if ( dSiteVersion > dThisVersion ) QMessageBox::information(this, tr(bufferThis), tr(bufferOther)); else if ( dSiteVersion - dThisVersion == 0.0 ) QMessageBox::information(this, tr(bufferThis), tr("You have the latest version.")); else QMessageBox::information(this, tr(bufferThis), tr("You have a newer version than Sourceforge.")); } // View controls (Update history BEFORE calling UpdateControls() since that triggers more history writes) void MainWindow::TrackSliderChanged(int i) { if ( m_board.SetTrackSliderValue(i) ) { UpdateHistory("toggle Mono/Color/PCB", 0); SetEditLayerPref(false); m_board.CustomPCBshapes(); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::CheckBoxMonoChanged(bool b) { if ( b != (m_board.GetTrackSliderValue() == 1) ) TrackSliderChanged(b ? 1 : 0); } void MainWindow::CheckBoxColorChanged(bool b) { if ( b != (m_board.GetTrackSliderValue() == 2) ) TrackSliderChanged(b ? 2 : 0); } void MainWindow::CheckBoxPcbChanged(bool b) { if ( b != (m_board.GetTrackSliderValue() == 3) ) TrackSliderChanged(b ? 3 : 0); } void MainWindow::SaturationSliderChanged(int i) { if ( m_board.SetSaturation(i) ) { UpdateHistory("change saturation", 0); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::CompSliderChanged(int i) { if ( m_board.SetCompSliderValue(i) ) { UpdateHistory("toggle Line/Name/Value", 0); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::CheckBoxLineChanged(bool b) { if ( b != (m_board.GetCompSliderValue() == 1) ) CompSliderChanged(b ? 1 : 0); } void MainWindow::CheckBoxNameChanged(bool b) { if ( b != (m_board.GetCompSliderValue() == 2) ) CompSliderChanged(b ? 2 : 0); } void MainWindow::CheckBoxValueChanged(bool b) { if ( b != (m_board.GetCompSliderValue() == 3) ) CompSliderChanged(b ? 3 : 0); } void MainWindow::FillSliderChanged(int i) { if ( m_board.SetFillSaturation(i) ) { UpdateHistory("change fill opacity", 0); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::SetShowGrid(bool b) { if ( m_board.SetShowGrid(b) ) { UpdateHistory("toggle grid", 0); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::SetShowText(bool b) { if ( m_board.SetShowText(b) ) { UpdateHistory("toggle show text", 0); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::SetFlipH(bool b) { if ( m_board.SetFlipH(b) ) { UpdateHistory("flip horizontal", 0); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::SetFlipV(bool b) { if ( m_board.SetFlipV(b) ) { UpdateHistory("flip vertical", 0); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::SetShowPinLabels(bool b) { if ( m_board.SetShowPinLabels(b) ) { UpdateHistory("toggle show pin labels", 0); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::SetShowFlyWires(bool b) { if ( m_board.SetShowFlyWires(b) ) { UpdateHistory("toggle show flying wires", 0); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::SetInverseMono(bool b) { if ( m_board.SetInverseMono(b) ) { UpdateHistory("toggle inverse Mono", 0); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::SetColoredMono(bool b) { if ( m_board.SetColoredMono(b) ) { UpdateHistory("toggle colored Mono", 0); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::SetFill(bool b) { if ( m_board.SetGroundFill(b) ) { if ( b ) m_board.SetGroundNodeId(); UpdateHistory("toggle ground-fill", 0); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::Crop() { if ( m_board.Crop() ) { UpdateHistory("auto-crop", 0); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::MarginChanged(int i) { if ( m_board.SetCropMargin(i) && m_board.Crop() ) { UpdateHistory("margin change", 0); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::ToggleGrid() { SetShowGrid( !m_board.GetShowGrid() ); } void MainWindow::ToggleText() { SetShowText( !m_board.GetShowText() ); if ( !m_board.GetShowText() ) SetCurrentTextId(BAD_TEXTID); } void MainWindow::ToggleFlipH() { SetFlipH( !m_board.GetFlipH() ); } void MainWindow::ToggleFlipV() { SetFlipV( !m_board.GetFlipV() ); } void MainWindow::TogglePinLabels() { SetShowPinLabels( !m_board.GetShowPinLabels() ); } void MainWindow::ToggleFlyWires() { SetShowFlyWires( !m_board.GetShowFlyWires() ); } void MainWindow::ToggleInverseMono() { SetInverseMono( !m_board.GetInverseMono() ); } void MainWindow::ToggleColoredMono() { SetColoredMono( !m_board.GetColoredMono() ); } void MainWindow::ToggleRuler() { m_bRuler = !m_bRuler; if ( !m_bRuler ) ResetRuler(); if ( m_bRuler ) HidePadOffsetDialog(); UpdateControls(); RepaintSkipRouting(); } void MainWindow::ResetRuler() { m_bRuler = m_bModifyRulerA = false; int X(m_board.GetCols()/3), Y(m_board.GetRows() / 2); m_rulerA = QPoint(X,Y); m_rulerB = QPoint(2*X,Y); } // Toolbar items void MainWindow::VeroV() { SetTracksVeroV(true); } void MainWindow::VeroH() { SetTracksVeroH(true); } void MainWindow::Fat() { SetTracksFat(true);} void MainWindow::Thin() { SetTracksThin(true); } void MainWindow::Curved() { SetTracksCurved(true); } void MainWindow::ToggleDiagsMin() { if ( m_board.GetDiagsMode() == DIAGSMODE::MIN ) SetDiagonalsOff(true); else SetDiagonalsMin(true); } void MainWindow::ToggleDiagsMax() { if ( m_board.GetDiagsMode() == DIAGSMODE::MAX ) SetDiagonalsOff(true); else SetDiagonalsMax(true); } void MainWindow::ToggleFill() { SetFill( !m_board.GetGroundFill() ); } void MainWindow::ToggleSelectArea() { SetDefiningRect( !GetDefiningRect() ); } void MainWindow::TogglePaintGrid() { SetPaintBoard( !GetPaintBoard() ); if ( !GetPaintBoard() ) SetCurrentNodeId(BAD_NODEID); // If we've stopped painting, clear current nodeId m_board.GetRectMgr().Clear(); UpdateControls(); if ( !GetPaintBoard() ) RepaintSkipRouting(); } void MainWindow::ToggleEraseGrid() { SetEraseBoard( !GetEraseBoard() ); m_board.GetRectMgr().Clear(); UpdateControls(); } void MainWindow::TogglePaintPins() { SetPaintPins( !GetPaintPins() ); if ( !GetPaintPins() ) SetCurrentNodeId(BAD_NODEID); // If we've stopped painting, clear current nodeId m_board.GetRectMgr().Clear(); UpdateControls(); if ( !GetPaintPins() ) RepaintSkipRouting(); } void MainWindow::ToggleErasePins() { SetErasePins( !GetErasePins() ); m_board.GetRectMgr().Clear(); UpdateControls(); } void MainWindow::TogglePaintFlood() { SetPaintFlood( !GetPaintFlood() ); if ( !GetPaintFlood() ) SetCurrentNodeId(BAD_NODEID); // If we've stopped painting, clear current nodeId m_board.GetRectMgr().Clear(); UpdateControls(); if ( !GetPaintFlood() ) RepaintSkipRouting(); } void MainWindow::ToggleEditLayerPrefs() { if ( m_board.GetLyrs() == 1 ) SetEditLayerPref( false ); else SetEditLayerPref( !GetEditLayerPref() ); m_board.GetRectMgr().Clear(); UpdateControls(); if ( !GetEditLayerPref() ) RepaintSkipRouting(); } void MainWindow::ResetMouseMode() { m_eMouseMode = MOUSE_MODE::SELECT; m_board.GetRectMgr().Clear(); UpdateControls(); } // Part controls void MainWindow::SetCompName(const QString& str) { if ( m_board.GetGroupMgr().GetNumUserComps() != 1 ) return; Component& comp = m_board.GetUserComponent(); const std::string newStr = str.toStdString(); if ( newStr == comp.GetNameStr() ) return; // No change comp.SetNameStr(newStr); UpdateHistory("change part name", comp.GetId()); UpdateBOM(); RepaintSkipRouting(); } void MainWindow::SetCompValue(const QString& str) { if ( m_board.GetGroupMgr().GetNumUserComps() != 1 ) return; Component& comp = m_board.GetUserComponent(); const std::string newStr = str.toStdString(); if ( newStr == comp.GetValueStr() ) return; // No change comp.SetValueStr(newStr); UpdateHistory("change part value", comp.GetId()); UpdateBOM(); RepaintSkipRouting(); } void MainWindow::SetCompType(const QString& str) { if ( m_board.GetDisableChangeType() || str.isEmpty() ) return; if ( m_board.GetGroupMgr().GetNumUserComps() != 1 ) return; Component& comp = m_board.GetUserComponent(); const COMP eType = CompTypes::GetTypeFromTypeStr( str.toStdString() ); if ( eType == comp.GetType() ) return; // No change m_board.ChangeTypeUserComp(eType); UpdateHistory("change part type", comp.GetId()); UpdateControls(); RepaintWithListNodes(); } void MainWindow::SetCompCustomFlag(bool b) { if ( m_board.GetDisableChangeCustom() ) return; if ( m_board.GetGroupMgr().GetNumUserComps() != 1 ) return; Component& comp = m_board.GetUserComponent(); if ( b == comp.GetCustomPads() ) return; // No change comp.SetCustomPads(b); UpdateHistory("change part custom flag", comp.GetId()); UpdateControls(); RepaintWithListNodes(); } void MainWindow::SetCompPadWidth(int i) { if ( m_board.GetDisableChangeCustom() ) return; if ( m_board.GetGroupMgr().GetNumUserComps() != 1 ) return; Component& comp = m_board.GetUserComponent(); if ( i == comp.GetPadWidth() ) return; // No change comp.SetPadWidth(i); if ( comp.GetHoleWidth() > i-8 ) comp.SetHoleWidth( i-8 ); // 8 ==> minimum annular ring = 4 mil UpdateHistory("change part custom pad size", comp.GetId()); UpdateControls(); RepaintWithListNodes(); } void MainWindow::SetCompHoleWidth(int i) { if ( m_board.GetDisableChangeCustom() ) return; if ( m_board.GetGroupMgr().GetNumUserComps() != 1 ) return; Component& comp = m_board.GetUserComponent(); if ( i == comp.GetHoleWidth() ) return; // No change comp.SetHoleWidth(i); if ( comp.GetPadWidth() < i+8 ) comp.SetPadWidth( i+8 ); // 8 ==> minimum annular ring = 4 mil UpdateHistory("change part custom hole size", comp.GetId()); UpdateControls(); RepaintWithListNodes(); } void MainWindow::CompRotate(bool bCW) { if ( m_board.GetDisableRotate() ) return; m_board.RotateUserComps(bCW); const bool bPlural = ( m_board.GetGroupMgr().GetNumUserComps() > 1 ); if ( bPlural ) UpdateHistory("rotate parts", 0); else UpdateHistory("rotate part", m_board.GetUserComponent().GetId()); UpdateControls(); RepaintWithListNodes(); } void MainWindow::CompStretch(bool bGrow) { if ( m_board.GetDisableStretch(bGrow) ) return; m_board.StretchUserComp(bGrow); UpdateHistory("change part length", m_board.GetUserComponent().GetId()); UpdateControls(); RepaintWithListNodes(); } void MainWindow::CompStretchWidth(bool bGrow) { if ( m_board.GetDisableStretchWidth(bGrow) ) return; m_board.StretchWidthUserComp(bGrow); UpdateHistory("change part width", m_board.GetUserComponent().GetId()); UpdateControls(); RepaintWithListNodes(); } void MainWindow::CompTextMove(int deltaRow, int deltaCol) { if ( m_board.GetDisableCompText() ) return; m_board.MoveUserCompText(deltaRow, deltaCol); UpdateHistory("move part label", m_board.GetUserComponent().GetId()); RepaintSkipRouting(); } void MainWindow::PadMove(int deltaRowMil, int deltaColMil) { // Pad offsets if ( m_board.GetVeroTracks() || m_board.GetCompEdit() ) return; const Element* pC = m_board.Get(0, m_gridRow, m_gridCol); if ( !pC->GetPinSupportsOffsetPads() ) return; size_t pinIndex; int compId; m_board.GetSlotInfoForTH(pC, pinIndex, compId); Component& comp = m_board.GetCompMgr().GetComponentById(compId); comp.IncCompPinOffsets(pinIndex, deltaColMil, deltaRowMil); return RepaintWithRouting(); } void MainWindow::UpdatePadInfo() { const Element* pC = m_board.Get(0, m_gridRow, m_gridCol); if ( !m_padOffsetDlg->isVisible() || !pC->GetPinSupportsOffsetPads() ) return; int padOffsetX(0), padOffsetY(0); m_board.GetPadOffsets(pC, padOffsetX, padOffsetY); // Get offsets in mil char buffer[256] = {'\0'}; sprintf(buffer,"(X, Y) pad offset = (%d, %d) mil, (%.4f, %.4f) mm", padOffsetX, padOffsetY, padOffsetX * 0.0254, padOffsetY * 0.0254); ui->statusBar->showMessage(QString(buffer)); } // Bad Nodes lists void MainWindow::SetNodeId(QListWidgetItem* item) { SetCurrentNodeId( atoi(item->text().toStdString().c_str()) ); RepaintWithRouting(); // Grab focus so we can accept keyboard/mouse input to paint the selected nodeId activateWindow(); setFocus(Qt::ActiveWindowFocusReason); } void MainWindow::ListNodes(bool bRebuild) { if ( bRebuild ) { const bool& bAutoRouting = m_board.GetRoutingEnabled(); // If auto-routing is enabled, then the routing costs will have been set // and we can check them instead of looking at "Complete" flags. // If auto-routing is disabled, we need to call CheckAllComplete() with a copy of // the board so that current routing results are not wiped (e.g. we may have a nodeId selected and showing connectivity). Board* pBoard = ( bAutoRouting ) ? &m_board : new Board(m_board, false); // false ==> fast copy without RebuildAdjacencies() if ( !bAutoRouting ) pBoard->CheckAllComplete(); // Slow !!! m_controlDlg->ClearList(); CompManager& compMgr = pBoard->GetCompMgr(); NodeInfoManager& nodeInfoMgr = pBoard->GetNodeInfoMgr(); for (size_t i = 0; i < nodeInfoMgr.GetSize(); i++) { NodeInfo* p = nodeInfoMgr.GetAt(i); if ( p->GetNodeId() == BAD_NODEID ) continue; const bool bFloating = p->GetHasFloatingComp(compMgr); const bool bComplete = ( bAutoRouting ) ? ( p->GetCost() == 0 ) : p->GetComplete(); const bool bBroken = bFloating || !bComplete; if ( bBroken ) m_controlDlg->AddListItem(p->GetNodeId(), bFloating); } if ( !bAutoRouting) delete pBoard; // If we made a copy of the board then delete it } m_controlDlg->SetListItem( GetCurrentNodeId() ); // Highlight current NodeId in the list } // Routing controls void MainWindow::EnableRouting(bool b) { if ( !m_board.SetRoutingEnabled(b) ) return; // Quit if no change if ( !b ) m_board.WipeAutoSetPoints(); UpdateHistory("toggle auto-routing", 0); UpdateControls(); RepaintWithListNodes(); } void MainWindow::EnableFastRouting(bool b) { const int iMethod = ( b ) ? 0 : 1; if ( !m_board.SetRoutingMethod(iMethod) ) return; // Quit if no change if ( !b ) m_board.WipeAutoSetPoints(); UpdateHistory("toggle fast auto-routing", 0); UpdateControls(); RepaintWithListNodes(); } void MainWindow::Paste() // On hitting the Paste button ... { if ( !m_board.GetRoutingEnabled() ) return; m_board.PasteTracks(false); // false ==> Don't wipe redundant track portions if ( m_board.GetVeroTracks() ) m_board.AutoFillVero(); UpdateHistory("paste auto-routed tracks", 0); ResetMouseMode(); UpdateControls(); RepaintWithListNodes(); } void MainWindow::Tidy() // On hitting the Paste+Tidy button ... { if ( m_board.GetRoutingEnabled() ) return; m_board.PasteTracks(true); // true ==> Wipe redundant track portions if ( m_board.GetVeroTracks() ) m_board.AutoFillVero(); UpdateHistory("tidy tracks", 0); ResetMouseMode(); UpdateControls(); RepaintWithListNodes(); } void MainWindow::WipeTracks() // On hitting the Wipe All button ... { if ( m_board.GetDisableWipe() ) return; m_board.WipeTracks(); UpdateHistory("wipe tracks", 0); ResetMouseMode(); UpdateControls(); RepaintWithListNodes(); } // Node color void MainWindow::AutoColor(bool b) { if ( b ) m_board.GetColorMgr().Unfix( GetCurrentNodeId() ); else m_board.GetColorMgr().Fix( GetCurrentNodeId() ); UpdateHistory("toggle auto-color net", GetCurrentNodeId()); UpdateControls(); RepaintSkipRouting(); } void MainWindow::SelectNodeColor() { ColorManager& mgr = m_board.GetColorMgr(); const QColor oldColor = mgr.GetColorFromNodeId(GetCurrentNodeId(), false); const QColor newColor = QColorDialog::getColor(oldColor, this); if ( newColor.isValid() && oldColor != newColor ) { mgr.SetNodeColor(GetCurrentNodeId(), newColor); const int objId = GetCurrentNodeId(); SetCurrentNodeId(BAD_NODEID); // Unselect nodeId so we can see the color in the view UpdateHistory("set net color", objId); UpdateControls(); RepaintSkipRouting(); } } // Track controls static DIAGSMODE oldDiagsMode(DIAGSMODE::OFF); void MainWindow::SetTracksVeroV(bool b) { if (!b) return; if ( m_board.GetVeroTracks() && m_board.GetVerticalStrips() ) return UpdateControls(); if ( !m_board.GetVeroTracks() ) oldDiagsMode = m_board.GetDiagsMode(); // Log old diag mode before setting DIAGSMODE::OFF const bool bDiagsModeChanged = m_board.SetDiagsMode(DIAGSMODE::OFF); m_board.SetVeroTracks(true); m_board.SetVerticalStrips(true); UpdateHistory("change track style", 0); UpdateControls(); if ( bDiagsModeChanged ) RepaintWithListNodes(); else RepaintSkipRouting(); } void MainWindow::SetTracksVeroH(bool b) { if (!b) return; if ( m_board.GetVeroTracks() && !m_board.GetVerticalStrips() ) return UpdateControls(); if ( !m_board.GetVeroTracks() ) oldDiagsMode = m_board.GetDiagsMode(); // Log old diag mode before setting DIAGSMODE::OFF const bool bDiagsModeChanged = m_board.SetDiagsMode(DIAGSMODE::OFF); m_board.SetVeroTracks(true); m_board.SetVerticalStrips(false); UpdateHistory("change track style", 0); UpdateControls(); if ( bDiagsModeChanged ) RepaintWithListNodes(); else RepaintSkipRouting(); } void MainWindow::SetTracksFat(bool b) { if (!b) return; if ( !m_board.GetCurvedTracks() && !m_board.GetVeroTracks() && m_board.GetFatTracks() ) return UpdateControls(); bool bDiagsModeChanged(false); if ( m_board.SetVeroTracks(false) ) // If changed from Vero style ... bDiagsModeChanged = m_board.SetDiagsMode(oldDiagsMode); // ... restore old diag mode m_board.SetCurvedTracks(false); m_board.SetFatTracks(true); UpdateHistory("change track style", 0); UpdateControls(); if ( bDiagsModeChanged ) RepaintWithListNodes(); else RepaintSkipRouting(); } void MainWindow::SetTracksThin(bool b) { if (!b) return; if ( !m_board.GetCurvedTracks() && !m_board.GetVeroTracks() && !m_board.GetFatTracks() ) return UpdateControls(); bool bDiagsModeChanged(false); if ( m_board.SetVeroTracks(false) ) // If changed from Vero style ... bDiagsModeChanged = m_board.SetDiagsMode(oldDiagsMode); // ... restore old diag mode m_board.SetCurvedTracks(false); m_board.SetFatTracks(false); UpdateHistory("change track style", 0); UpdateControls(); if ( bDiagsModeChanged ) RepaintWithListNodes(); else RepaintSkipRouting(); } void MainWindow::SetTracksCurved(bool b) { if (!b) return; if ( m_board.GetCurvedTracks() && !m_board.GetVeroTracks() ) return UpdateControls(); bool bDiagsModeChanged(false); if ( m_board.SetVeroTracks(false) ) // If changed from Vero style ... bDiagsModeChanged = m_board.SetDiagsMode(oldDiagsMode); // ... restore old diag mode m_board.SetCurvedTracks(true); UpdateHistory("change track style", 0); UpdateControls(); if ( bDiagsModeChanged ) RepaintWithListNodes(); else RepaintSkipRouting(); } void MainWindow::SetDiagonalsOff(bool b) { if ( b && m_board.SetDiagsMode(DIAGSMODE::OFF) ) { UpdateHistory("change diagonals mode", 0); UpdateControls(); RepaintWithListNodes();; } } void MainWindow::SetDiagonalsMin(bool b) { const bool bListNodes = ( m_board.GetDiagsMode() == DIAGSMODE::OFF ); // Only ListNodes() again if necessary if ( b && m_board.SetDiagsMode(DIAGSMODE::MIN) ) { UpdateHistory("change diagonals mode", 0); UpdateControls(); if ( bListNodes ) RepaintWithListNodes(); else RepaintWithRouting(); } } void MainWindow::SetDiagonalsMax(bool b) { const bool bListNodes = ( m_board.GetDiagsMode() == DIAGSMODE::OFF ); // Only ListNodes() again if necessary if ( b && m_board.SetDiagsMode(DIAGSMODE::MAX) ) { UpdateHistory("change diagonals mode", 0); UpdateControls(); if ( bListNodes ) RepaintWithListNodes(); else RepaintWithRouting(); } } // Rendering options void MainWindow::SetBrightness(int i) { const bool bNewFormat = ( i >= 0 && i <= 100 ); // Before VeroRoute V2.20, "Brightness" was stored as a grey level in the range [200,255]. const int ii = ( bNewFormat ) ? ( 155 + i ) : i; // From VeroRoute V2.20, "Brightness" is a percentage value [0,100] that is stored as a grey level in the range [155,255]. if ( m_board.SetBackgroundColor(MyRGB(ii,ii,ii)) ) { UpdateHistory("change background brightness", 0); RepaintSkipRouting(); } } void MainWindow::SetPadWidth(int i) { if ( m_board.SetPAD_MIL(i) ) { UpdateHistory("change pad width", 0); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::SetTrackWidth(int i) { if ( m_board.SetTRACK_MIL(i) ) { UpdateHistory("change track width", 0); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::SetTagWidth(int i) { if ( m_board.SetTAG_MIL(i) ) { UpdateHistory("change thermal width", 0); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::SetHoleWidth(int i) { if ( m_board.SetHOLE_MIL(i) ) { UpdateHistory("change hole width", 0); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::SetGapWidth(int i) { if ( m_board.SetGAP_MIL(i) ) { UpdateHistory("change gap width", 0); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::SetMaskWidth(int i) { if ( m_board.SetMASK_MIL(i) ) { UpdateHistory("change solder mask margin", 0); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::SetSilkWidth(int i) { if ( m_board.SetSILK_MIL(i) ) { UpdateHistory("change silkscreen line width", 0); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::SetEdgeWidth(int i) { if ( m_board.SetEDGE_MIL(i) ) { UpdateHistory("change board edge margin", 0); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::SetFillWidth(int i) { if ( m_board.SetFILL_MIL(i) ) { UpdateHistory("change ground fill perimeter", 0); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::SetViaPadWidth(int i) { if ( m_board.SetVIAPAD_MIL(i)) { UpdateHistory("change via pad width", 0); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::SetViaHoleWidth(int i) { if ( m_board.SetVIAHOLE_MIL(i)){ UpdateHistory("change via hole width", 0); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::SetTextSizeComp(int i) { if ( m_board.SetTextSizeComp(i) ) { UpdateHistory("change text size (component)", 0); RepaintSkipRouting(); } } void MainWindow::SetTextSizePins(int i) { if ( m_board.SetTextSizePins(i) ) { UpdateHistory("change text size (pins)", 0); RepaintSkipRouting(); } } void MainWindow::SetTargetRows(int i) { if ( m_board.SetTargetRows(i) ) { UpdateHistory("change target board height", 0); RepaintSkipRouting(); } } void MainWindow::SetTargetCols(int i) { if ( m_board.SetTargetCols(i) ) { UpdateHistory("change target board width", 0); RepaintSkipRouting(); } } void MainWindow::SetShowTarget(bool b) { if ( m_board.SetShowTarget(b) ) { UpdateHistory("toggle show target board area", 0); RepaintSkipRouting(); } } void MainWindow::SetXthermals(bool b) { if ( m_board.SetXthermals(b) ) { UpdateHistory("toggle X-pattern thermal relief", 0);UpdateControls(); RepaintSkipRouting(); } } void MainWindow::SetShowCloseTracks(bool b) { if ( m_board.SetShowCloseTracks(b) ) { UpdateHistory("toggle show closest tracks", 0); UpdateControls(); RepaintSkipRouting(); } } void MainWindow::SetAntialiasOff(bool b) { if ( b && m_board.SetRenderQuality(0) ) { UpdateHistory("toggle anti-alias", 0); RepaintSkipRouting(); } } void MainWindow::SetAntialiasOn(bool b) { if ( b && m_board.SetRenderQuality(1) ) { UpdateHistory("toggle anti-alias", 0); RepaintSkipRouting(); } } // Wire dialog void MainWindow::SetWireShare(bool b) { if ( m_board.SetWireShare(b) ) { UpdateHistory("toggle allow wires to share a hole", 0); RepaintSkipRouting(); } } void MainWindow::SetWireCross(bool b) { if ( m_board.SetWireCross(b) ) { UpdateHistory("toggle allow wires to cross", 0); RepaintSkipRouting(); } } // Find dialog void MainWindow::ClearFind() { m_board.GetCompMgr().ClearFind(); } void MainWindow::Find(const bool bUseName, const bool bExact, const QString& str) { m_board.GetCompMgr().Find(bUseName, bExact, str.toStdString()); RepaintSkipRouting(); } size_t MainWindow::GetNumFound() { return m_board.GetCompMgr().GetNumFound(); } // Text box dialog void MainWindow::SizeChanged(int i) { if ( GetCurrentTextId() != BAD_TEXTID && GetCurrentTextRect().SetSize(i) ) { UpdateTextDialog(); RepaintSkipRouting(); } } void MainWindow::ToggleBold() { if ( GetCurrentTextId() != BAD_TEXTID && GetCurrentTextRect().SetStyle(GetCurrentTextRect().GetStyle() ^ TEXT_BOLD ) ){ UpdateTextDialog(); RepaintSkipRouting(); } } void MainWindow::ToggleItalic() { if ( GetCurrentTextId() != BAD_TEXTID && GetCurrentTextRect().SetStyle(GetCurrentTextRect().GetStyle() ^ TEXT_ITALIC ) ){ UpdateTextDialog(); RepaintSkipRouting(); } } void MainWindow::ToggleUnderline() { if ( GetCurrentTextId() != BAD_TEXTID && GetCurrentTextRect().SetStyle(GetCurrentTextRect().GetStyle() ^ TEXT_UNDERLINE) ){ UpdateTextDialog(); RepaintSkipRouting(); } } void MainWindow::AlignL() { if ( GetCurrentTextId() != BAD_TEXTID && GetCurrentTextRect().SetFlagsH(Qt::AlignLeft) ) { UpdateTextDialog(); RepaintSkipRouting(); } } void MainWindow::AlignC() { if ( GetCurrentTextId() != BAD_TEXTID && GetCurrentTextRect().SetFlagsH(Qt::AlignHCenter) ) { UpdateTextDialog(); RepaintSkipRouting(); } } void MainWindow::AlignR() { if ( GetCurrentTextId() != BAD_TEXTID && GetCurrentTextRect().SetFlagsH(Qt::AlignRight) ) { UpdateTextDialog(); RepaintSkipRouting(); } } void MainWindow::AlignJ() { if ( GetCurrentTextId() != BAD_TEXTID && GetCurrentTextRect().SetFlagsH(Qt::AlignJustify) ) { UpdateTextDialog(); RepaintSkipRouting(); } } void MainWindow::AlignTop() { if ( GetCurrentTextId() != BAD_TEXTID && GetCurrentTextRect().SetFlagsV(Qt::AlignTop) ) { UpdateTextDialog(); RepaintSkipRouting(); } } void MainWindow::AlignMid() { if ( GetCurrentTextId() != BAD_TEXTID && GetCurrentTextRect().SetFlagsV(Qt::AlignVCenter) ) { UpdateTextDialog(); RepaintSkipRouting(); } } void MainWindow::AlignBot() { if ( GetCurrentTextId() != BAD_TEXTID && GetCurrentTextRect().SetFlagsV(Qt::AlignBottom) ) { UpdateTextDialog(); RepaintSkipRouting(); } } void MainWindow::SetText(const QString& s) { if ( GetCurrentTextId() != BAD_TEXTID && GetCurrentTextRect().SetStr(s.toStdString()) ) { UpdateTextDialog(); RepaintSkipRouting(); } } void MainWindow::ChooseTextColor() { if ( GetCurrentTextId() == BAD_TEXTID ) return; TextRect& rect = GetCurrentTextRect(); const QColor oldColor = rect.GetQColor(); QColor newColor = QColorDialog::getColor(oldColor, this); if ( newColor.isValid() && oldColor != newColor ) { int r(0), g(0), b(0); newColor.getRgb(&r,&g,&b); if ( rect.SetRGB(r,g,b) ) { UpdateTextDialog(); RepaintSkipRouting(); } } } // Component editor void MainWindow::DefinerSetValueStr(const QString& str) { if ( GetCompDefiner().SetValueStr(str.toStdString()) ) { UpdateHistory("edit value string", 0); EnableCompDialogControls(); } } void MainWindow::DefinerSetPrefixStr(const QString& str) { if ( GetCompDefiner().SetPrefixStr(str.toStdString()) ) { UpdateHistory("edit prefix string",0); EnableCompDialogControls(); } } void MainWindow::DefinerSetTypeStr(const QString& str) { if ( GetCompDefiner().SetTypeStr(str.toStdString()) ) { UpdateHistory("edit type string", 0); EnableCompDialogControls(); } } void MainWindow::DefinerSetImportStr(const QString& str) { if ( GetCompDefiner().SetImportStr(str.toStdString()) ) { UpdateHistory("edit import string",0); EnableCompDialogControls(); } } void MainWindow::DefinerSetPinShapeType(const QString& str) { if ( GetCompDefiner().SetPinType(str.toStdString()) ) { UpdateHistory("change pin type", 0); EnableCompDialogControls(); } } void MainWindow::DefinerSetShapeType(const QString& str) { if ( GetCompDefiner().SetType(str.toStdString()) ) { UpdateHistory("change shape type", GetCompDefiner().GetCurrentShapeId()); EnableCompDialogControls(); RepaintSkipRouting(); } } void MainWindow::DefinerToggledPinLabels(bool b) { CompDefiner& compDefiner = GetCompDefiner(); bool bChanged(false); if ( b ) bChanged = compDefiner.SetPinFlags( compDefiner.GetPinFlags() | PIN_LABELS ); else bChanged = compDefiner.SetPinFlags( compDefiner.GetPinFlags() & ~PIN_LABELS ); if ( bChanged ) { UpdateHistory("toggle allow pin labels", 0); EnableCompDialogControls(); } } void MainWindow::DefinerToggledCustomFlag(bool b) { CompDefiner& compDefiner = GetCompDefiner(); bool bChanged(false); if ( b ) bChanged = compDefiner.SetPinFlags( compDefiner.GetPinFlags() | PIN_CUSTOM ); else bChanged = compDefiner.SetPinFlags( compDefiner.GetPinFlags() & ~PIN_CUSTOM ); if ( bChanged ) { UpdateHistory("toggle custom pad/hole size", 0); EnableCompDialogControls(); } } void MainWindow::DefinerToggleShapeLine(bool b) { const bool bChanged = GetCompDefiner().SetLine(b); if ( bChanged ) { UpdateHistory("toggle shape has line", GetCurrentShapeId()); EnableCompDialogControls(); RepaintSkipRouting(); } } void MainWindow::DefinerToggleShapeFill(bool b) { const bool bChanged = GetCompDefiner().SetFill(b); if ( bChanged ) { UpdateHistory("toggle shape has fill", GetCurrentShapeId()); EnableCompDialogControls(); RepaintSkipRouting(); } } void MainWindow::DefinerWidthChanged(int i) { if ( GetCompDefiner().SetWidth(i) ) { UpdateHistory("change footprint size", 0); EnableCompDialogControls(); UpdateCompDialog(); RepaintSkipRouting(); } } void MainWindow::DefinerHeightChanged(int i) { if ( GetCompDefiner().SetHeight(i) ) { UpdateHistory("change footprint size", 0); EnableCompDialogControls(); UpdateCompDialog(); RepaintSkipRouting(); } } void MainWindow::DefinerPadWidthChanged(int i) { if ( GetCompDefiner().SetPadWidth(i) ) { UpdateHistory("change custom pad width", 0); EnableCompDialogControls(); UpdateCompDialog(); RepaintSkipRouting(); } } void MainWindow::DefinerHoleWidthChanged(int i) { if ( GetCompDefiner().SetHoleWidth(i) ) { UpdateHistory("change custom hole width", 0); EnableCompDialogControls(); UpdateCompDialog(); RepaintSkipRouting(); } } void MainWindow::DefinerSetPinNumber(int i) { if ( GetCompDefiner().SetPinNumber(i) ) { UpdateHistory("change pin number", GetCompDefiner().GetCurrentPinId()); EnableCompDialogControls(); UpdateCompDialog(); RepaintSkipRouting(); } } void MainWindow::DefinerIncPinNumber(bool b) { if ( GetCompDefiner().IncPinNumber(b) ) { UpdateHistory("change pin number", GetCompDefiner().GetCurrentPinId()); EnableCompDialogControls(); UpdateCompDialog(); RepaintSkipRouting(); } } // Called using mouse wheel in view void MainWindow::DefinerSetSurface(const QString& str) { if ( GetCompDefiner().SetSurface(str.toStdString()) ) { UpdateHistory("change surface type", GetCompDefiner().GetCurrentPinId()); EnableCompDialogControls(); UpdateCompDialog(); RepaintSkipRouting(); } } void MainWindow::DefinerSetCX(double d) { if ( GetCompDefiner().SetCX(d) ) { UpdateHistory("change shape centre", GetCurrentShapeId()); EnableCompDialogControls(); RepaintSkipRouting(); } } void MainWindow::DefinerSetCY(double d) { if ( GetCompDefiner().SetCY(-d) ) { UpdateHistory("change shape centre", GetCurrentShapeId()); EnableCompDialogControls(); RepaintSkipRouting(); } } // Control assumes CY goes up void MainWindow::DefinerSetDX(double d) { if ( GetCompDefiner().SetDX(d) ) { UpdateHistory("change shape width", GetCurrentShapeId()); EnableCompDialogControls(); RepaintSkipRouting(); } } void MainWindow::DefinerSetDY(double d) { if ( GetCompDefiner().SetDY(d) ) { UpdateHistory("change shape height", GetCurrentShapeId()); EnableCompDialogControls(); RepaintSkipRouting(); } } void MainWindow::DefinerSetA1(double d) { if ( GetCompDefiner().SetA1(d) ) { UpdateHistory("change shape angle A", GetCurrentShapeId()); EnableCompDialogControls(); RepaintSkipRouting(); } } void MainWindow::DefinerSetA2(double d) { if ( GetCompDefiner().SetA2(d) ) { UpdateHistory("change shape angle B", GetCurrentShapeId()); EnableCompDialogControls(); RepaintSkipRouting(); } } void MainWindow::DefinerSetA3(double d) { if ( GetCompDefiner().SetA3(d) ) { UpdateHistory("change shape rotate angle", GetCurrentShapeId()); EnableCompDialogControls(); RepaintSkipRouting(); } } void MainWindow::DefinerBuild() { assert( GetCompDefiner().GetIsValid( GetTemplateManager() ) ); const Component comp( GetTemplateManager(), GetCompDefiner() ); std::string errorStr; bool bAlreadyExists(false), bUsedImportStr(false); // Gets set true if template already exists, or import string is already in use bool bOK = GetTemplateManager().Add(false, comp, bAlreadyExists, bUsedImportStr, &errorStr); if ( !bOK && (bAlreadyExists || bUsedImportStr) ) { bool bOverWrite(false); if ( bAlreadyExists ) bOverWrite = QMessageBox::question(this, tr("Confirm Overwrite"), tr(errorStr.c_str()) + tr(" and will be overwritten. There is no undo for this operation. Continue?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes; else if ( bUsedImportStr ) bOverWrite = QMessageBox::question(this, tr("Confirm Overwrite"), tr(errorStr.c_str()) + tr(". It will be overwritten with (Value ='") + tr(comp.GetValueStr().c_str()) + tr("'). There is no undo for this operation. Continue?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes; if ( bOverWrite ) bOK = GetTemplateManager().Add(false, comp, bAlreadyExists, bUsedImportStr, &errorStr); // Repeat Add() with bAlreadyExists or bUsedImportStr set true to allow overwrite else return EnableCompDialogControls(); } if ( bOK ) UpdateAliasDialog(); else QMessageBox::warning(this, tr("Failed to add part to library"), tr(errorStr.c_str())); EnableCompDialogControls(); } void MainWindow::DefinerToggleEditor() { m_board.SetCompEdit( !m_board.GetCompEdit() ); if ( m_board.GetCompEdit() ) { const Component* pComp = ( m_dockTemplatesDlg->isVisible() ) ? m_templatesDlg->GetCurrentUserComp() : nullptr; if ( pComp == nullptr && m_board.GetGroupMgr().GetNumUserComps() == 1 ) pComp = &m_board.GetUserComponent(); if ( pComp && !pComp->GetShapes().empty() && !CompTypes::GetIsSOIC(pComp->GetType()) ) GetCompDefiner().Populate( *pComp ); UpdateHistory("enter component editor mode", 0); UpdateCompDialog(); ShowCompDialog(); // Show component definition dialog } else { UpdateHistory("leave component editor mode", 0); ShowControlDialog(); // Show control dialog } UpdateControls(); if ( m_board.GetCompEdit() ) RepaintSkipRouting(); else RepaintWithRouting(); activateWindow(); // Stop MS Windows showing the Menu greyed out } void MainWindow::DefinerAddLine() { const int id = GetCompDefiner().AddLine(); if ( id != BAD_ID ) { SetCurrentShapeId(id); UpdateHistory("add shape"); UpdateCompDialog(); RepaintSkipRouting(); } } void MainWindow::DefinerAddRect() { const int id = GetCompDefiner().AddRect(); if ( id != BAD_ID ) { SetCurrentShapeId(id); UpdateHistory("add shape"); UpdateCompDialog(); RepaintSkipRouting(); } } void MainWindow::DefinerAddRoundedRect(){ const int id = GetCompDefiner().AddRoundedRect(); if ( id != BAD_ID ) { SetCurrentShapeId(id); UpdateHistory("add shape"); UpdateCompDialog(); RepaintSkipRouting(); } } void MainWindow::DefinerAddEllipse() { const int id = GetCompDefiner().AddEllipse(); if ( id != BAD_ID ) { SetCurrentShapeId(id); UpdateHistory("add shape"); UpdateCompDialog(); RepaintSkipRouting(); } } void MainWindow::DefinerAddArc() { const int id = GetCompDefiner().AddArc(); if ( id != BAD_ID ) { SetCurrentShapeId(id); UpdateHistory("add shape"); UpdateCompDialog(); RepaintSkipRouting(); } } void MainWindow::DefinerAddChord() { const int id = GetCompDefiner().AddChord(); if ( id != BAD_ID ) { SetCurrentShapeId(id); UpdateHistory("add shape"); UpdateCompDialog(); RepaintSkipRouting(); } } void MainWindow::DefinerChooseColor() { auto& def = GetCompDefiner(); const int id = def.GetCurrentShapeId(); assert( id != BAD_ID ); if ( id == BAD_ID ) return; const QColor oldColor = def.GetCurrentShape().GetFillColor().GetQColor(); QColor newColor = QColorDialog::getColor(oldColor, this); if ( newColor.isValid() && oldColor != newColor ) { int r(0), g(0), b(0); newColor.getRgb(&r,&g,&b); if ( def.SetFillColor( MyRGB((r<<16) + (g<<8) + b) ) ) { UpdateHistory("change shape color", id); UpdateCompDialog(); RepaintSkipRouting(); } } } void MainWindow::DefinerRaise() { auto& def = GetCompDefiner(); const int id = def.GetCurrentShapeId(); assert( id != BAD_ID ); if ( def.Raise() ) { UpdateHistory("raise/lower shape", id); UpdateCompDialog(); RepaintSkipRouting(); } } void MainWindow::DefinerLower() { auto& def = GetCompDefiner(); const int id = def.GetCurrentShapeId(); assert( id != BAD_ID ); if ( def.Lower() ) { UpdateHistory("raise/lower shape", id); UpdateCompDialog(); RepaintSkipRouting(); } } // GUI update void MainWindow::UpdateRecentFiles(const QString* pFileName, bool bAdd) { QSettings settings("veroroute","veroroute"); // Organisation = "veroroute", Application = "veroroute" QStringList files = settings.value("recentFiles").toStringList(); if ( pFileName ) { const QString& fileName = *pFileName; files.removeAll(fileName); if ( bAdd ) files.prepend(fileName); while ( static_cast(files.size()) > MAX_RECENT_FILES ) files.removeLast(); settings.setValue("recentFiles", files); } const size_t numFiles = std::min(static_cast(files.size()), MAX_RECENT_FILES); for (size_t i = 0; i < numFiles; i++) { const QString& str = files[static_cast(i)]; // Filename including the path #ifdef VEROROUTE_ANDROID const QString fileName = StringHelper::GetTidyFileName(str); #else const QString fileName = str; #endif const QString text = tr("&%1 %2").arg( i + 1 ).arg( fileName ); m_recentFileAction[i]->setText(text); m_recentFileAction[i]->setData(str); m_recentFileAction[i]->setVisible(true); } for (size_t i = numFiles; i < MAX_RECENT_FILES; i++) m_recentFileAction[i]->setVisible(false); ui->actionClearRecent->setEnabled(numFiles > 0); m_separator->setVisible(numFiles > 0); } void MainWindow::UpdateWindowTitle() { const bool bCompEdit = m_board.GetCompEdit(); // true ==> Component Editor mode QString title = ( bCompEdit ) ? "Component Editor Mode" : ( m_fileName.isEmpty() ) ? "Untitled" : m_fileName; setWindowTitle(title); } void MainWindow::UpdateRulerInfo() { if ( m_bRuler && !m_bWriteGerber && !m_bMouseClick && !GetCtrlKeyDown() ) // Ctrl key ==> status bar might be displaying pad offsets { QPointF A,B; GetRulerExact(m_board, m_rulerA, A); GetRulerExact(m_board, m_rulerB, B); const qreal d_mil = PolygonHelper::Length(B-A) * 100; // mil const qreal d_mm = d_mil * 0.0254; char buffer[256] = {'\0'}; sprintf(buffer,"Distance = %.2f mil (%.4f mm)", d_mil, d_mm); ui->statusBar->showMessage(QString(buffer), 1500); } } void MainWindow::UpdateControls() { m_bUpdatingControls = true; GroupManager& groupMgr = m_board.GetGroupMgr(); CompManager& compMgr = m_board.GetCompMgr(); const bool bCompEdit = m_board.GetCompEdit(); const bool bCompActionsOK = !bCompEdit && !m_board.GetMirrored() && ( m_board.GetCompMode() != COMPSMODE::OFF ); const bool bTextActionsOK = !bCompEdit && !m_board.GetMirrored() && ( m_board.GetShowText() ); const bool bTextOK = bTextActionsOK && AllowCurrentTextId(); const int numUserComps = groupMgr.GetNumUserComps(); const bool bCompOK = bCompActionsOK && numUserComps; const bool bNoTracks = !bCompEdit && m_board.GetTrackMode() == TRACKMODE::OFF; const bool bMono = !bCompEdit && m_board.GetTrackMode() == TRACKMODE::MONO; const bool bColor = !bCompEdit && m_board.GetTrackMode() == TRACKMODE::COLOR; const bool bColoredMono = !bCompEdit && m_board.GetTrackMode() == TRACKMODE::MONO && m_board.GetColoredMono(); const bool bPCB = !bCompEdit && m_board.GetTrackMode() == TRACKMODE::PCB; const bool bTracks = bMono || bColor || bPCB; const bool bPaintGridOK = bTracks && !m_board.GetMirrored(); const bool bPaintPinsOK = ( bColor || bColoredMono ) && bCompActionsOK; const bool bVero = m_board.GetVeroTracks(); const bool bVeroV = bVero && m_board.GetVerticalStrips(); const bool bVeroH = bVero && !m_board.GetVerticalStrips(); const bool bFat = !bVero && !m_board.GetCurvedTracks() && m_board.GetFatTracks(); const bool bThin = !bVero && !m_board.GetCurvedTracks() && !m_board.GetFatTracks(); const bool bCurved = !bVero && m_board.GetCurvedTracks(); const bool bShapeOK = bCompEdit && ( GetCurrentShapeId() != BAD_ID ); const bool bTutorial = ( m_iTutorialNumber >= 0 ); const bool bSingleLayer = ( m_board.GetLyrs() == 1 ); const bool bEditLayerPrefOK = bPCB && !bSingleLayer && !m_board.GetMirrored(); ui->toolBar->setVisible( !bCompEdit ); ui->toolBar_3->setVisible( bCompEdit ); ui->menuExport_as_Gerber_1_Layer->setEnabled(bPCB && !bCompEdit && !m_board.GetMirrored() && !m_board.GetVeroTracks() && bSingleLayer); ui->menuExport_as_Gerber_2_Layer->setEnabled(bPCB && !bCompEdit && !m_board.GetMirrored() && !m_board.GetVeroTracks()); ui->actionSave->setEnabled( !bTutorial); ui->actionSave_As->setEnabled( !bTutorial ); ui->actionMerge->setEnabled( !bCompEdit && !bTutorial ); ui->actionWrite_PDF->setEnabled(!bPCB && !bCompEdit); ui->actionWrite_PNG->setEnabled( !bCompEdit ); ui->menuAdd->menuAction()->setVisible( !bCompEdit ); ui->menuAdd->setEnabled( bCompEdit || ( m_board.GetCompMode() != COMPSMODE::OFF && !m_board.GetMirrored() ) ); ui->menuAddShape->menuAction()->setVisible( bCompEdit ); ui->menuPaint->setEnabled( !bCompEdit ); ui->menuLayers->setEnabled( !bCompEdit ); ui->actionAddLayer->setEnabled( bSingleLayer ); ui->actionRemoveLayer->setEnabled( !bSingleLayer ); ui->actionToggleVias->setEnabled( !bSingleLayer ); ui->actionResetLayerPrefs->setEnabled( !bSingleLayer ); ui->actionAutosetLayerPrefs->setEnabled(!bSingleLayer ); ui->actionSwitchLayer->setEnabled( !bSingleLayer ); ui->actionToggleVias->setText( !bSingleLayer && m_board.GetViasEnabled() ? QString("Disable Vias") : QString("Enable Vias") ); ui->actionSwitchLayer->setText( m_board.GetCurrentLayer() == 0 ? QString("Switch to Top Layer") : QString("Switch to Bottom Layer") ); ui->actionSwitchLayer->setIcon( m_board.GetCurrentLayer() == 0 ? QIcon(":/images/layertop.png") : QIcon(":/images/layerbot.png")); if ( bCompEdit ) { m_labelInfo->hide(); m_labelStatus->hide(); } else { QString title; char buffer[256] = {'\0'}; sprintf(buffer, "Size = %.1fin x %.1fin (%.2fmm x %.2fmm)", m_board.GetCols()*0.1, m_board.GetRows()*0.1, m_board.GetCols()*2.54, m_board.GetRows()*2.54); title += buffer; m_labelInfo->setText( title ); m_labelInfo->show(); m_labelStatus->setText(m_board.GetCurrentLayer() == 0 ? QString(" Layer = Bottom ") : QString(" Layer = Top ")); m_labelStatus->show(); } ui->actionCopy->setEnabled( bTextOK || bCompOK || bShapeOK ); if ( bTextOK ) // Text Box takes precedence over comps ui->actionCopy->setText( QString("Copy Selected Text Box") ); else if ( bCompOK ) ui->actionCopy->setText(numUserComps > 1 ? QString("Copy Selected Parts") : QString("Copy Selected Part")); else if ( bCompEdit ) ui->actionCopy->setText( QString("Copy Selected Shape") ); else ui->actionCopy->setText( QString("Copy Selected Part(s) / Text Box") ); ui->actionGroup->setEnabled( bCompOK && groupMgr.CanGroup() ); ui->actionUngroup->setEnabled( bCompOK && groupMgr.CanUnGroup() ); ui->actionSelectAll->setEnabled( bCompActionsOK && !compMgr.GetMapIdToComp().empty() ); ui->actionDelete->setEnabled( bTextOK || bCompOK || bShapeOK ); if ( bTextOK ) // Text Box takes precedence over comps ui->actionDelete->setText( QString("Delete Selected Text Box") ); else if ( bCompOK ) ui->actionDelete->setText(numUserComps > 1 ? QString("Delete Selected Parts") : QString("Delete Selected Part")); else if ( bCompEdit ) ui->actionDelete->setText(QString("Delete Selected Shape")); else ui->actionDelete->setText( QString("Delete Selected Part(s) / Text Box") ); ui->actionCrop->setEnabled( !bCompEdit ); ui->actionTextBox->setEnabled( !bCompEdit && !bPCB && m_board.GetShowText() ); ui->actionZoom_In->setEnabled( CanZoomIn() ); ui->actionZoom_Out->setEnabled( CanZoomOut() ) ; ui->actionToggleGrid->setEnabled( !bPCB ); ui->actionToggleText->setEnabled( !bCompEdit && !bPCB ); ui->actionToggleFlipH->setEnabled( !bCompEdit ); ui->actionToggleFlipV->setEnabled( !bCompEdit ); const bool bPinLabels = m_board.GetCompMode() != COMPSMODE::OFF && ( bNoTracks || bColor ); // No pin labels in Mono/PCB mode ui->actionTogglePinLabels->setEnabled( bPinLabels ); const bool bFlyWires = m_board.GetCompMode() != COMPSMODE::OFF && ( bNoTracks || bColor ); // No flying wires in Mono/PCB mode ui->actionToggleFlyWires->setEnabled( bFlyWires ); ui->actionToggleInverseMono->setEnabled( bMono ); ui->actionToggleColoredMono->setEnabled( bMono ); ui->actionToggleRuler->setEnabled( !bCompEdit ); ui->actionFind->setEnabled( !bCompEdit ); ui->actionToggleGrid->setChecked( m_board.GetShowGrid() && !bPCB ); ui->actionToggleText->setChecked( m_board.GetShowText() && !bCompEdit && !bPCB ); ui->actionToggleFlipH->setChecked( m_board.GetFlipH() && !bCompEdit ); ui->actionToggleFlipV->setChecked( m_board.GetFlipV() && !bCompEdit ); ui->actionTogglePinLabels->setChecked( m_board.GetShowPinLabels() && bPinLabels ); ui->actionToggleFlyWires->setChecked( m_board.GetShowFlyWires() && bFlyWires ); ui->actionToggleFlyWires->setText( m_board.GetShowFlyWires() ? QString("Hide Flying Wires") : QString("Show Flying Wires") ); ui->actionToggleInverseMono->setChecked( m_board.GetInverseMono() && bMono ); ui->actionToggleInverseMono->setText( m_board.GetInverseMono() ? QString("Normal Mono Mode") : QString("Inverse Mono Mode") ); ui->actionToggleColoredMono->setChecked( m_board.GetColoredMono() && bMono ); ui->actionToggleColoredMono->setText( m_board.GetColoredMono() ? QString("Disable Track Colors in Mono Mode") : QString("Enable Track Colors in Mono Mode") ); ui->actionToggleRuler->setChecked( m_bRuler ); ui->actionToggleRuler->setText( m_bRuler ? QString("Hide Distance Tool") : QString("Show Distance Tool")); ui->actionCompDlg->setEnabled( bCompEdit ); ui->actionCompDlg->setVisible( bCompEdit ); ui->actionControlDlg->setEnabled( !bCompEdit ); ui->actionControlDlg->setVisible( !bCompEdit ); ui->actionRenderingDlg->setEnabled( !bCompEdit ); ui->actionRenderingDlg->setVisible( !bCompEdit ); ui->actionWireDlg->setEnabled( !bCompEdit ); ui->actionWireDlg->setVisible( !bCompEdit ); ui->actionBomDlg->setEnabled( !bCompEdit ); ui->actionBomDlg->setVisible( !bCompEdit ); ui->actionAliasDlg->setEnabled( !bCompEdit ); ui->actionAliasDlg->setVisible( !bCompEdit ); ui->menuTrack_Style->setEnabled( bTracks ); ui->actionVeroV->setEnabled( bTracks && (bNoTracks || bColor) ); // No Vero tracks in PCB or Mono mode ui->actionVeroH->setEnabled( bTracks && (bNoTracks || bColor) ); // No Vero tracks in PCB or Mono mode ui->actionFat->setEnabled( bTracks ); ui->actionThin->setEnabled( bTracks ); ui->actionCurved->setEnabled( bTracks ); ui->actionDiagsMin->setEnabled( bTracks && !bVero ); ui->actionDiagsMax->setEnabled( bTracks && !bVero ); ui->actionFill->setEnabled( ( bMono || bPCB ) && !m_board.GetVeroTracks() ); ui->actionSelectArea->setEnabled( !bCompEdit ); ui->actionVeroV->setChecked( bVeroV ); ui->actionVeroH->setChecked( bVeroH ); ui->actionFat->setChecked( bFat ); ui->actionThin->setChecked( bThin ); ui->actionCurved->setChecked( bCurved ); ui->actionDiagsMin->setChecked( m_board.GetDiagsMode() == DIAGSMODE::MIN ); ui->actionDiagsMax->setChecked( m_board.GetDiagsMode() == DIAGSMODE::MAX ); ui->actionFill->setChecked( m_board.GetGroundFill() ); ui->actionSelectArea->setChecked( !bCompEdit && GetDefiningRect() ); ui->actionSmartPan->setEnabled( !bCompEdit ); ui->actionEditor->setChecked( bCompEdit ); ui->actionAddLine->setEnabled( bCompEdit ); ui->actionAddRect->setEnabled( bCompEdit ); ui->actionAddRoundedRect->setEnabled( bCompEdit ); ui->actionAddEllipse->setEnabled( bCompEdit ); ui->actionAddArc->setEnabled( bCompEdit ); ui->actionAddChord->setEnabled( bCompEdit ); ui->actionPaintGrid->setEnabled( bPaintGridOK ); ui->actionEraseGrid->setEnabled( bPaintGridOK ); ui->actionPaintPins->setEnabled( bPaintPinsOK); ui->actionErasePins->setEnabled( bPaintPinsOK); ui->actionPaintFlood->setEnabled( bPaintPinsOK && !m_board.GetRoutingEnabled() ); ui->actionEditLayerPrefs->setEnabled( bEditLayerPrefOK ); ui->actionPaintPins->setChecked( m_eMouseMode == MOUSE_MODE::PAINT_PINS); ui->actionErasePins->setChecked( m_eMouseMode == MOUSE_MODE::ERASE_PINS); ui->actionPaintGrid->setChecked( m_eMouseMode == MOUSE_MODE::PAINT_GRID); ui->actionEraseGrid->setChecked( m_eMouseMode == MOUSE_MODE::ERASE_GRID); ui->actionPaintFlood->setChecked( m_eMouseMode == MOUSE_MODE::PAINT_FLOOD); ui->actionEditLayerPrefs->setChecked( m_eMouseMode == MOUSE_MODE::EDIT_LAYER_PREF); UpdateTextDialog(true); // true ==> full m_pinDlg->Update(); m_board.UpdateVias(); // Needed before m_renderingDlg->UpdateControls() for via info and track separation m_renderingDlg->UpdateControls(); m_wireDlg->UpdateControls(); m_controlDlg->UpdateCompControls(); m_controlDlg->UpdateControls(); ui->actionControlDlg->setText( m_dockControlDlg->isVisible() ? QString("(Hide) Control Dialog") : QString("Control Dialog")); ui->actionCompDlg->setText( m_dockCompDlg->isVisible() ? QString("(Hide) Component Definition") : QString("Component Definition")); ui->actionTemplatesDlg->setText(m_dockTemplatesDlg->isVisible() ? QString("(Hide) Parts Library") : QString("Parts Library")); ui->actionTemplatesDlg->setChecked( m_dockTemplatesDlg->isVisible() ); ui->actionInfoDlg->setText( m_dockInfoDlg->isVisible() ? QString("(Hide) Info") : QString("Info")); ui->actionRenderingDlg->setText(m_dockRenderingDlg->isVisible() ? QString("(Hide) Rendering Options") : QString("Rendering Options")); ui->actionRenderingDlg->setChecked( m_dockRenderingDlg->isVisible() ); ui->actionPinDlg->setEnabled( !bTutorial ); // Forbid pin dialog in tutorial mode as it will hide the info window ui->actionPinDlg->setText( m_dockPinDlg->isVisible() ? QString("(Hide) Pin Labels Editor") : QString("Pin Labels Editor")); ui->actionPinDlg->setChecked( m_dockPinDlg->isVisible() ); UpdateUndoRedoControls(); m_bUpdatingControls = false; } void MainWindow::UpdateCompDialog() { m_compDlg->Update(); m_pinDlg->Update(); } void MainWindow::EnableCompDialogControls() { m_compDlg->EnableControls(); } void MainWindow::UpdateBOM() { m_bomDlg->Update(); } void MainWindow::UpdateAliasDialog() { m_aliasDlg->Update(); } void MainWindow::UpdateTemplatesDialog() { m_templatesDlg->Update(); } void MainWindow::UpdateTextDialog(bool bFull) { if ( GetCurrentTextId() != BAD_TEXTID ) m_textDlg->Update( GetCurrentTextRect(), bFull ); else { m_textDlg->Clear(); m_textDlg->close(); } } // Helpers void MainWindow::SetQuality(QPainter& painter) { painter.setRenderHint(QPainter::Antialiasing, m_board.GetRenderQuality() != 0); } bool MainWindow::CanZoomIn() const { #ifdef VEROROUTE_ANDROID return m_board.GetGRIDPIXELS() < 50; // Large zoom will make the pixmap cache consume too much memory #else return m_board.GetGRIDPIXELS() < 256; // 256 == MAX_GRIDPIXELS #endif } bool MainWindow::CanZoomOut() const { #ifdef VEROROUTE_ANDROID return m_board.GetGRIDPIXELS() > 10; // Even this is too small to control on a touch interface #else return m_board.GetGRIDPIXELS() > 6; // 6 == MIN_GRIDPIXELS #endif } bool MainWindow::GetIsModified() const { if ( m_iTutorialNumber >= 0 ) return false; // Skip check if in tutorial mode if ( !m_fileName.isEmpty() ) return !GetMatchesVrtFile( m_fileName.toStdString() ); // If file doesn't exist, use the history instead if ( !m_bHistoryDir ) return true; // No history directory, so assume modified by default so Save() works if ( m_historyMgr.GetCanUndo() ) return true; // Something has changed since New() or Open() or Import() return m_infoDlg->GetIsModified(); // Info dialog changes are not tracked by the History } bool MainWindow::GetMatchesVrtFile(const std::string& fileName) const { bool bIsSame(false); if ( !fileName.empty() ) { DataStream inStream(DataStream::READ); if ( inStream.Open( fileName.c_str() ) ) { Board tempBoard; tempBoard.Load(inStream); inStream.Close(); bIsSame = inStream.GetOK() && ( m_board == tempBoard ); } } return bIsSame; } void MainWindow::ResetHistory(const std::string& str) { m_historyMgr.Reset(str, m_board, m_fileName, m_iTutorialNumber); UpdateUndoRedoControls(); } void MainWindow::UpdateHistory(const std::string& str, const int objId) { if ( str.empty() ) return; // Must have a string if ( m_bUpdatingControls || m_compDlg->GetUpdatingControls() ) return; if ( !m_bHistoryDir ) return; // No History folder if ( GetMatchesVrtFile( m_historyMgr.GetCurrentHistoryFilename() ) ) return; // No change m_historyMgr.Update(str, objId, m_board); UpdateUndoRedoControls(); } void MainWindow::UpdateUndoRedoControls() { const bool bCanUndo = m_bHistoryDir && m_historyMgr.GetCanUndo(); const bool bCanRedo = m_bHistoryDir && m_historyMgr.GetCanRedo(); QString undoText("Undo "); if ( bCanUndo ) undoText += QString::fromStdString(m_historyMgr.GetUndoText()); QString redoText("Redo "); if ( bCanRedo ) redoText += QString::fromStdString(m_historyMgr.GetRedoText()); ui->actionUndo->setText( undoText ); ui->actionRedo->setText( redoText ); ui->actionUndo->setEnabled( bCanUndo ); ui->actionRedo->setEnabled( bCanRedo ); } QString MainWindow::GetSaveFileName(const QString& caption, const QString& nameFilter, const QString& defaultSuffix) { QString fileName; QFileDialog fileDialog(this, caption); fileDialog.setAcceptMode(QFileDialog::AcceptSave); fileDialog.setNameFilter(nameFilter); fileDialog.setDefaultSuffix(defaultSuffix); if ( fileDialog.exec() ) { QStringList fileNames = fileDialog.selectedFiles(); if ( !fileNames.isEmpty() ) fileName = fileNames.at(0); } return fileName; } QColor MainWindow::GetBackgroundColor() const { return ( m_board.GetTrackMode() == TRACKMODE::PCB ) ? Qt::black : m_board.GetBackgroundColor().GetQColor(); // For screen only. PDF is always white. } VeroRoute/libraries/gEDA/veroroute_transistor/MOSFET_Pchannel_MTP2955.sym000644 001750 001750 00000002011 13515171161 026371 0ustar00alexalex000000 000000 v 20130925 2 T 0 200 5 10 0 0 0 0 1 numslots=0 P 0 200 200 200 1 0 0 { T 0 300 5 10 1 1 0 0 1 pinnumber=1 T 0 300 5 10 0 0 0 0 1 pinseq=1 T 0 300 5 10 0 0 0 0 1 pinlabel=1 T 0 300 5 10 0 0 0 0 1 pintype=pas } P 500 600 500 800 1 0 1 { T 300 700 5 10 1 1 0 0 1 pinnumber=2 T 300 700 5 10 0 0 0 0 1 pinseq=2 T 300 700 5 10 0 0 0 0 1 pinlabel=2 T 300 700 5 10 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 300 0 5 10 1 1 0 0 1 pinnumber=3 T 300 0 5 10 0 0 0 0 1 pinseq=3 T 300 0 5 10 0 0 0 0 1 pinlabel=3 T 300 0 5 10 0 0 0 0 1 pintype=pas } L 250 600 500 600 3 0 0 0 -1 -1 L 250 200 500 200 3 0 0 0 -1 -1 L 300 350 400 400 3 0 0 0 -1 -1 L 300 450 400 400 3 0 0 0 -1 -1 L 250 675 250 525 3 0 0 0 -1 -1 L 250 475 250 325 3 0 0 0 -1 -1 L 250 275 250 125 3 0 0 0 -1 -1 L 200 600 200 200 3 0 0 0 -1 -1 L 250 400 400 400 3 0 0 0 -1 -1 L 400 400 400 200 3 0 0 0 -1 -1 T 600 200 5 10 1 1 0 0 1 device=MTP2955 T 600 500 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO220 T 600 400 8 10 0 0 0 0 1 description=P-Channel MOSFET VeroRoute/libraries/gEDA/veroroute_transistor/NPN_MJE3055.sym000644 001750 001750 00000001565 13515171161 024177 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=1 T 100 550 5 6 0 0 0 0 1 pinseq=1 T 100 550 5 6 0 0 0 0 1 pinlabel=1 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=2 T 400 850 5 6 0 0 0 0 1 pinseq=2 T 400 850 5 6 0 0 0 0 1 pinlabel=2 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=3 T 400 50 5 6 0 0 0 0 1 pinseq=3 T 400 50 5 6 0 0 0 0 1 pinlabel=3 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 403,209 L 501,200 L 431,273 L 425,240 z T 600 700 5 10 1 1 0 0 1 device=MJE3055 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO220 T 600 400 8 10 0 0 0 0 1 description=NPN Transistor VeroRoute/veroroute.appdata.xml000644 001750 001750 00000003334 14562414640 017132 0ustar00alexalex000000 000000 veroroute.desktop CC0-1.0 GPL-3.0-or-later VeroRoute Electronic circuit layout software for Veroboard (stripboard), Perfboard and simple PCBs

Cross-platform software for producing Veroboard (stripboard), Perfboard, and 1-layer or 2-layer PCB layouts.

Automatically prevents short-circuits and checks for open-circuits.

Interactive auto-routing.

Connectivity checking & visualisation.

Import a netlist from a gEDA or KiCad schematic, or specify the netlist graphically.

1:1 scale PDF output suitable for toner-transfer based PCB creation.

Gerber export for easy 1-layer or 2-layer professional PCB manufacture.

т€‹ Electronics т€‹ VeroRoute Electronics Circuit Layout Routing CAD EDA PCB Veroboard Stripboard Perfboard Gerber https://sourceforge.net/projects/veroroute/ Alex Lawrow veroroute veroroute
VeroRoute/Src/android-sources/res/drawable-ldpi/000755 001750 001750 00000000000 14405612071 022064 5ustar00alexalex000000 000000 VeroRoute/Src/VrtVersion.h000644 001750 001750 00000012776 14565651676 016017 0ustar00alexalex000000 000000 #pragma once #include Q_DECL_CONSTEXPR static const int VRT_VERSION_1 = 1; // Original version Q_DECL_CONSTEXPR static const int VRT_VERSION_2 = 2; // Added ability to show IC pin numbers Q_DECL_CONSTEXPR static const int VRT_VERSION_3 = 3; // Added ground fill parameters Q_DECL_CONSTEXPR static const int VRT_VERSION_4 = 4; // Simplified mapping of pinChar to pinIndex Q_DECL_CONSTEXPR static const int VRT_VERSION_5 = 5; // Added flag to show grid Q_DECL_CONSTEXPR static const int VRT_VERSION_6 = 6; // Added color saturation Q_DECL_CONSTEXPR static const int VRT_VERSION_7 = 7; // Added pin labels Q_DECL_CONSTEXPR static const int VRT_VERSION_8 = 8; // Added crystal component type Q_DECL_CONSTEXPR static const int VRT_VERSION_9 = 9; // Added more trimmers/relays/switches Q_DECL_CONSTEXPR static const int VRT_VERSION_10 = 10; // Added rectangles Q_DECL_CONSTEXPR static const int VRT_VERSION_11 = 11; // Added component manager, bounding rects, reworked Footprint class Q_DECL_CONSTEXPR static const int VRT_VERSION_12 = 12; // Added horizontal vero strips Q_DECL_CONSTEXPR static const int VRT_VERSION_13 = 13; // Added crop margin Q_DECL_CONSTEXPR static const int VRT_VERSION_14 = 14; // Added text manager Q_DECL_CONSTEXPR static const int VRT_VERSION_15 = 15; // Added text color Q_DECL_CONSTEXPR static const int VRT_VERSION_16 = 16; // Added more components Q_DECL_CONSTEXPR static const int VRT_VERSION_17 = 17; // Added text sizes for components and pins Q_DECL_CONSTEXPR static const int VRT_VERSION_18 = 18; // Added custom component type and shapes class Q_DECL_CONSTEXPR static const int VRT_VERSION_19 = 19; // Added component editor flag and new component attributes Q_DECL_CONSTEXPR static const int VRT_VERSION_20 = 20; // Added SURFACE_HOLE attribute Q_DECL_CONSTEXPR static const int VRT_VERSION_21 = 21; // Added target board size Q_DECL_CONSTEXPR static const int VRT_VERSION_22 = 22; // Label offsets measured in 1/16th of a square instead of 1/4 Q_DECL_CONSTEXPR static const int VRT_VERSION_23 = 23; // Added component definer Q_DECL_CONSTEXPR static const int VRT_VERSION_24 = 24; // Added routing method parameter Q_DECL_CONSTEXPR static const int VRT_VERSION_25 = 25; // Moves some variables from CompElement to Element Q_DECL_CONSTEXPR static const int VRT_VERSION_26 = 26; // Reworked codes in Pin to allow 2 wires per grid point Q_DECL_CONSTEXPR static const int VRT_VERSION_27 = 27; // Modified Element to store additional wire info Q_DECL_CONSTEXPR static const int VRT_VERSION_28 = 28; // Added options for wires to share holes or cross/overlay Q_DECL_CONSTEXPR static const int VRT_VERSION_29 = 29; // Added color to component definition Q_DECL_CONSTEXPR static const int VRT_VERSION_30 = 30; // Added pin label alignment Q_DECL_CONSTEXPR static const int VRT_VERSION_31 = 31; // New treatment of labels under part rotation and centering. Q_DECL_CONSTEXPR static const int VRT_VERSION_32 = 32; // Added size of solder mask and silk screen pen Q_DECL_CONSTEXPR static const int VRT_VERSION_33 = 33; // Added PCB track mode, board edge margin, PTH/NPTH option Q_DECL_CONSTEXPR static const int VRT_VERSION_34 = 34; // Added 3rd dimension to grid, and display layer Q_DECL_CONSTEXPR static const int VRT_VERSION_35 = 35; // Added via dimensions Q_DECL_CONSTEXPR static const int VRT_VERSION_36 = 36; // Added thin tracks style Q_DECL_CONSTEXPR static const int VRT_VERSION_37 = 37; // Added flag to enable/disable vias Q_DECL_CONSTEXPR static const int VRT_VERSION_38 = 38; // Added Bourns 3362 series trimpots Q_DECL_CONSTEXPR static const int VRT_VERSION_39 = 39; // Added custom pin/hole size on components Q_DECL_CONSTEXPR static const int VRT_VERSION_40 = 40; // Allow 50 mil holes, and fix bug with non-wire hole use Q_DECL_CONSTEXPR static const int VRT_VERSION_41 = 41; // Allow user-specified colors for nodes Q_DECL_CONSTEXPR static const int VRT_VERSION_42 = 42; // Auto-fix corruption of old VRTs on load Q_DECL_CONSTEXPR static const int VRT_VERSION_43 = 43; // Added vero numbers and vero letters Q_DECL_CONSTEXPR static const int VRT_VERSION_44 = 44; // Added option to show close tracks Q_DECL_CONSTEXPR static const int VRT_VERSION_45 = 45; // Added layer preference for each component pin Q_DECL_CONSTEXPR static const int VRT_VERSION_46 = 46; // Added pad offsets for PCB mode Q_DECL_CONSTEXPR static const int VRT_VERSION_47 = 47; // Added component attribute to allow flying wires Q_DECL_CONSTEXPR static const int VRT_VERSION_48 = 48; // Added board setting to show/hide flying wires Q_DECL_CONSTEXPR static const int VRT_VERSION_49 = 49; // Added vertical alignment flag to text boxes Q_DECL_CONSTEXPR static const int VRT_VERSION_50 = 50; // Added background color property Q_DECL_CONSTEXPR static const int VRT_VERSION_51 = 51; // Added pinlabels to component editor Q_DECL_CONSTEXPR static const int VRT_VERSION_52 = 52; // Added thermal relief tag size Q_DECL_CONSTEXPR static const int VRT_VERSION_53 = 53; // Added X-thermals flag Q_DECL_CONSTEXPR static const int VRT_VERSION_54 = 54; // Added label offsets to CompDefiner Q_DECL_CONSTEXPR static const int VRT_VERSION_55 = 55; // Added SOIC attribute to Pin class Q_DECL_CONSTEXPR static const int VRT_VERSION_56 = 56; // Added SOIC parts to COMP enum Q_DECL_CONSTEXPR static const int VRT_VERSION_57 = 57; // Added inverse Mono option Q_DECL_CONSTEXPR static const int VRT_VERSION_58 = 58; // Added ground fill perimeter Q_DECL_CONSTEXPR static const int VRT_VERSION_59 = 59; // Added colored Mono option Q_DECL_CONSTEXPR static const int VRT_VERSION_CURRENT = VRT_VERSION_59; VeroRoute/Src/images/diagsmax.png000644 001750 001750 00000000513 13661712157 017243 0ustar00alexalex000000 000000 ‰PNG  IHDR szzєbKGDW6ЯXMюЇ pHYsФФ•+tIMEу4ПѕиIDATXУcœтОу?У&†ƒлIыэhюBУиѓб'pљšVЁ1Ив!_в"P@(ži‘_6ФхKZх|–%­ЗЃ™ХDE­-­ IQL‹Њ›‘T дv#9šЈщFr5RЫŒ”hІ†#№ц‚“'OТ16Ггƒ U`ŒИ,ЦЬЭЭ‰ lc+иhRвЈa"ХїФШxIHjЃ†ъ ЕQУDL"#E~PTFЄ4j‰Mpј|ŽЏ@"дЈaЄ†))G$а\W,„mЭјIENDЎB`‚VeroRoute/Src/wiredialog.ui000644 001750 001750 00000003664 14217146207 016165 0ustar00alexalex000000 000000 WireDialog 0 0 300 110 300 110 300 110 Wire Options 10 10 281 91 Wire Options 10 30 261 24 false Qt::TabFocus Allow 2 wires to share a hole 10 60 261 24 false Qt::TabFocus Allow 2 wires to cross / overlay VeroRoute/Src/mainwindow_events.cpp000644 001750 001750 00000127376 14565707642 017767 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #include "mainwindow.h" #include "ui_mainwindow.h" #include "PolygonHelper.h" #include "wiredialog.h" #include "bomdialog.h" #include "finddialog.h" #include "pindialog.h" #include #include Q_DECL_CONSTEXPR static const bool ALLOW_DELAY_BASED_SMART_PAN = true; Q_DECL_CONSTEXPR static const bool ALLOW_DELAY_BASED_PAD_SHIFT = true; // Following 2 are to slow down the auto-panning while moving components with the mouse static std::chrono::steady_clock::time_point g_lastAutoPanTime; static bool g_bHaveAutoPanned = false; #ifdef VEROROUTE_ANDROID #define AVOID_RECT_REDRAWS #endif #ifdef AVOID_RECT_REDRAWS // Following is to avoid too many redraws while defining rectangles static std::chrono::steady_clock::time_point g_lastDrawRect; #endif static std::chrono::steady_clock::time_point g_lastMouseClickTime; // For implementation of ALLOW_DELAY_BASED_SMART_PAN / ALLOW_DELAY_BASED_PAD_SHIFT static bool g_bPinClicked = false; // For implementation of ALLOW_DELAY_BASED_PAD_SHIFT void MainWindow::GetPixMapXY(const QPoint& currentPoint, int& pixmapX, int& pixmapY) const { pixmapX = currentPoint.x() + m_scrollArea->horizontalScrollBar()->value(); pixmapY = currentPoint.y() + m_scrollArea->verticalScrollBar()->value(); int gndL, gndR, gndT, gndB; m_board.GetGroundFillBounds(gndL, gndR, gndT, gndB); const int iEdge = static_cast( m_board.GetEdgeWidth() ); pixmapX += gndL - iEdge; pixmapY += gndT - iEdge; } bool MainWindow::GetRowCol(const QPoint& currentPoint, int& row, int& col, double& deltaRow, double& deltaCol) const { return GetRowCol(currentPoint, m_board.GetRows(), m_board.GetCols(), row, col, deltaRow, deltaCol); } bool MainWindow::GetRowCol(const QPoint& currentPoint, const int rows, const int cols, int& row, int& col, double& deltaRow, double& deltaCol) const { const int& W = m_board.GetGRIDPIXELS(); // Square width in pixels int pixmapX(0), pixmapY(0); GetPixMapXY(currentPoint, pixmapX, pixmapY); deltaRow = pixmapY * 1.0 / W; deltaCol = pixmapX * 1.0 / W; row = pixmapY / W; col = pixmapX / W; deltaRow -= row; // We just want an error in terms of grid squares deltaCol -= col; const bool bInGrid = ( row >= 0 && row < rows ) && ( col >= 0 && col < cols); row = std::max(0, std::min(rows-1, row)); col = std::max(0, std::min(cols-1, col)); return bInGrid; } bool MainWindow::HaveZeroDeltaRowCol(int& deltaRow, int& deltaCol) { // Modify deltaRow/deltaCol to account for out-of-grid locations int pixmapX(0), pixmapY(0); GetPixMapXY(m_mousePos, pixmapX, pixmapY); const int& W = m_board.GetGRIDPIXELS(); const int rows = ( m_board.GetCompEdit() ) ? m_board.GetCompDefiner().GetScreenRows() : m_board.GetRows(); const int cols = ( m_board.GetCompEdit() ) ? m_board.GetCompDefiner().GetScreenCols() : m_board.GetCols(); if ( deltaRow == 0 ) { if ( pixmapY > W * rows ) deltaRow++; } if ( deltaCol == 0 ) { if ( pixmapX > W * cols ) deltaCol++; } if ( deltaRow == 0 ) { if ( pixmapY < 0 ) deltaRow--; } if ( deltaCol == 0 ) { if ( pixmapX < 0 ) deltaCol--; } return deltaRow == 0 && deltaCol == 0; } void MainWindow::wheelEvent(QWheelEvent* event) { #if QT_VERSION >= QT_VERSION_CHECK(5,14,0) m_mousePos = event->position().toPoint(); #else m_mousePos = event->posF().toPoint(); #endif if ( GetShiftKeyDown() ) return; // Ignore wheel events while trying to group components const bool bBack = ( event->angleDelta().y() < 0 ); if ( GetCtrlKeyDown() ) { if ( bBack ) ZoomOut(); else ZoomIn(); } else if ( m_board.GetCompEdit() ) DefinerIncPinNumber(!bBack); else if ( !m_board.GetMirrored() ) CompStretch(!bBack); event->accept(); // If we don't do this, we can get the same event passed multiple times if we're on MS Windows. } void MainWindow::closeEvent(QCloseEvent* event) { #ifndef VEROROUTE_ANDROID if ( GetIsModified() ) { if ( QMessageBox::question(this, tr("Really Quit?"), tr("Your layout is not saved. You will lose changes if you quit. Continue?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No ) return event->ignore(); } #endif event->accept(); } bool MainWindow::CanModifyRuler() const { return m_bRuler && !( m_board.GetCompEdit() || GetSmartPan() || GetShiftKeyDown() || GetResizingText() || GetDefiningRect() || GetPaintPins() || GetErasePins() || GetPaintBoard() || GetEraseBoard() || GetPaintFlood() ); } bool MainWindow::GetHaveFloatingPinTH(int& iFloatingNodeId) // Checks for a floating through-hole pin { iFloatingNodeId = BAD_NODEID; const Element* pC = m_board.Get(m_board.GetCurrentLayer(), m_gridRow, m_gridCol); // This method is called to see if we should automatically erase both layers (to help a floating pin TH be placed) if ( pC->GetHasPin() ) return false; // Skip if we already have a placed pin on either layer for (auto& mapObj : m_board.GetCompMgr().GetMapIdToComp()) { const Component& comp = mapObj.second; if ( comp.GetIsPlaced() ) continue; // Only want floating components const auto& eType = comp.GetType(); if ( eType == COMP::WIRE || eType == COMP::MARK || eType == COMP::VERO_NUMBER || eType == COMP::VERO_LETTER ) continue; if ( comp.GetIsSOIC() ) continue; // SOIC parts are not through-hole const int j(m_gridRow - comp.GetRow()); if ( j < 0 || j >= comp.GetCompRows() ) continue; const int i(m_gridCol - comp.GetCol()); if ( i < 0 || i >= comp.GetCompCols() ) continue; const CompElement* p = comp.GetCompElement(j, i); if ( !p->GetIsPin() ) continue; iFloatingNodeId = comp.GetNodeId( p->GetPinIndex() ); return true; } return false; } void MainWindow::MousePressEvent(const QPoint& pos, bool bLeftClick, bool bRightClick) { SetMouseActionString(""); m_bReRoute = m_bReListNodes = false; // Reset both flags g_bPinClicked = false; g_bHaveAutoPanned = false; // Reset flags for avoiding repeated re-draws if ( !m_findDlg->isVisible() ) ClearFind(); // Clear the set of found components m_mousePos = m_clickedPos = pos; if ( !m_board.GetCompEdit() && m_board.GetMirrored() ) return; const TRACKMODE& trackMode = m_board.GetTrackMode(); const COMPSMODE& compMode = m_board.GetCompMode(); CompDefiner& compDefiner = m_board.GetCompDefiner(); const int& layer = m_board.GetCurrentLayer(); // Get row col double dRow(0), dCol(0); // Fractional correction to row, col for SwapDiagLinks() call bool bInGrid(false); if ( m_board.GetCompEdit() ) bInGrid = GetRowCol(m_mousePos, compDefiner.GetScreenRows(), compDefiner.GetScreenCols(), m_gridRow, m_gridCol, dRow, dCol); else bInGrid = GetRowCol(m_mousePos, m_gridRow, m_gridCol, dRow, dCol); if ( !bInGrid) return HidePadOffsetDialog(); m_bMouseClick = true; // Set the flag meaning "click begin" m_bLeftClick = bLeftClick; m_bRightClick = bRightClick; #ifdef VEROROUTE_ANDROID m_bLeftClick = m_bRightClick = true; // Making the point that there is no difference between left/right clicks in the Android version of the app #endif if ( m_board.GetCompEdit() ) { HidePadOffsetDialog(); // Pin/Shape selection const int pinId = compDefiner.GetPinId(m_gridRow, m_gridCol); const int shapeId = compDefiner.GetShapeId(m_gridRow + dRow - 0.5, m_gridCol + dCol - 0.5); if ( GetCurrentPinId() != pinId ) { SetCurrentPinId(pinId); SetMouseActionString(( pinId == BAD_ID ) ? "unselect point in footprint" : "select point in footprint"); } if ( GetCurrentShapeId() != shapeId ) { SetCurrentShapeId(shapeId); SetMouseActionString(( shapeId == BAD_ID ) ? "unselect shape" : "select shape"); } UpdateCompDialog(); return RepaintSkipRouting(); } // Cursor modification if ( GetSmartPan() ) centralWidget()->setCursor(Qt::ClosedHandCursor); else if ( GetPaintPins() || GetErasePins() || GetPaintBoard() || GetEraseBoard() || GetPaintFlood() || GetEditLayerPref() ) centralWidget()->setCursor(Qt::CrossCursor); else if ( GetResizingText() ) centralWidget()->setCursor(Qt::SizeFDiagCursor); else if ( AllowCurrentTextId() || AllowCurrentCompId() ) centralWidget()->setCursor(Qt::ClosedHandCursor); else centralWidget()->setCursor(Qt::OpenHandCursor); if ( CanModifyRuler() ) { HidePadOffsetDialog(); const QPoint current(m_gridCol, m_gridRow); if ( current == m_rulerA ) m_bModifyRulerA = false; // Do nothing, but prefer end B next time else if ( current == m_rulerB ) m_bModifyRulerA = true; // Do nothing, but prefer end A next time else { if ( m_bModifyRulerA ) m_rulerA = current; else m_rulerB = current; m_bModifyRulerA = !m_bModifyRulerA; } } if ( GetDefiningRect() ) { if ( m_dockPinDlg->isVisible() ) m_dockPinDlg->hide(); HidePadOffsetDialog(); #ifdef VEROROUTE_ANDROID if ( m_bMouseClick ) #else if ( m_bLeftClick ) // Only define rectangles using left-click #endif { centralWidget()->setCursor(Qt::SizeFDiagCursor); m_board.GetRectMgr().StartNewRect(m_gridRow, m_gridCol); SelectAllInRects(); SetMouseActionString("select parts / tracks by area"); #ifdef AVOID_RECT_REDRAWS g_lastDrawRect = std::chrono::steady_clock::now(); #endif ShowCurrentRectSize(); } #ifndef VEROROUTE_ANDROID else // Right/middle click quits rectangle mode { SetDefiningRect( false ); UpdateControls(); } #endif return RepaintSkipRouting(); } if ( !GetSmartPan() && !GetShiftKeyDown() ) m_board.GetRectMgr().Clear(); SetResizingText(false); if ( !GetSmartPan() ) // If not grabbing the board ... { // Text box selection if ( m_board.GetShowText() && m_board.GetTrackMode() != TRACKMODE::PCB ) { const int textId = m_board.GetTextId(m_gridRow, m_gridCol); if ( GetCurrentTextId() != textId ) // If we're changing textId { // If we've clicked away from an empty text box, then delete it if ( GetCurrentTextId() != BAD_TEXTID && StringHelper::IsEmptyStr( GetCurrentTextRect().GetStr() ) ) m_board.GetTextMgr().DestroyRect( GetCurrentTextId() ); if ( textId != BAD_TEXTID ) SetMouseActionString("select text box"); SetCurrentTextId(textId); } if ( GetCurrentTextId() != BAD_TEXTID ) { // If we're on the bottom-right corner of the text box, then resize it rather than move it const TextRect& rect = GetCurrentTextRect(); if ( rect.m_rowMax == m_gridRow && rect.m_colMax == m_gridCol && dRow >= 0.5 && dCol >= 0.5 ) SetResizingText(true); } } if ( compMode != COMPSMODE::OFF ) { // Component selection (if text is not selected) const int compId = !AllowCurrentTextId() ? m_board.GetComponentId(m_gridRow, m_gridCol) : BAD_COMPID; if ( GetCurrentCompId() != compId ) SetCurrentCompId(compId); // Group manipulation GroupManager& groupMgr = m_board.GetGroupMgr(); if ( GetShiftKeyDown() ) { groupMgr.UpdateUserGroup( GetCurrentCompId() ); // Add/remove current comp (and its siblings) to user group UpdateControls(); if ( !AllowCurrentTextId() ) SetMouseActionString("(un)select part(s)"); } else if ( !groupMgr.GetIsUserComp( GetCurrentCompId() ) ) { CompManager& compMgr = m_board.GetCompMgr(); groupMgr.ResetUserGroup( GetCurrentCompId() ); // Reset the user group with the current comp (and its siblings) compMgr.ClearTrax(); UpdateControls(); if ( !AllowCurrentTextId() ) SetMouseActionString("(un)select part(s)"); } } } // Painting/Unpainting the component pins or board if ( GetSmartPan() || GetShiftKeyDown() || trackMode == TRACKMODE::OFF ) return; if ( AllowCurrentTextId() ) { if ( m_dockPinDlg->isVisible() ) m_dockPinDlg->hide(); HidePadOffsetDialog(); return RepaintSkipRouting(); // Don't modify nodeId or paint if editing text } const Element* pC = m_board.Get(layer, m_gridRow, m_gridCol); const bool bColor = ( trackMode == TRACKMODE::COLOR ); const bool bColoredMono = ( trackMode == TRACKMODE::MONO && m_board.GetColoredMono() ); if ( GetPaintFlood() && (bColor || bColoredMono) ) { if ( m_dockPinDlg->isVisible() ) m_dockPinDlg->hide(); HidePadOffsetDialog(); #ifdef VEROROUTE_ANDROID if ( m_bMouseClick ) #else if ( m_bLeftClick ) #endif { if ( GetCurrentNodeId() == BAD_NODEID ) // If trying to left-click paint a BAD_NODEID ... SetCurrentNodeId( m_board.GetNewNodeId() ); // ... use a new NodeId instead m_board.GetColorMgr().ReAssignColors(); // Forces colors to be worked out again assert( GetCurrentNodeId() != BAD_NODEID ); assert( !m_board.GetRoutingEnabled() ); // Sanity check const int tmp = GetCurrentNodeId(); // Need to temporarily change current nodeId for HandleRouting() SetCurrentNodeId( pC->GetNodeId() ); HandleRouting(true); // Work out all MH distances for the flood SetCurrentNodeId(tmp); // Restore current nodeId m_board.FloodNodeId( GetCurrentNodeId() ); SetMouseActionString("paint (flood)", GetCurrentNodeId()); m_bReRoute = m_bReListNodes = true; } } else if ( ( (GetPaintPins() || GetErasePins()) && (bColor || bColoredMono) ) || GetPaintBoard() || GetEraseBoard() ) { if ( m_dockPinDlg->isVisible() ) m_dockPinDlg->hide(); HidePadOffsetDialog(); // Handle competing diagonals first bool bDoSwap(false); if ( GetPaintBoard() && m_board.GetTrackMode() != TRACKMODE::OFF ) { const bool bCloseToCrossPoint = ( hypot(std::min(dRow, 1.0 - dRow), std::min(dCol, 1.0 - dCol)) <= 0.5 ); // true ==> clicked close to crossing diagonals point if ( bCloseToCrossPoint ) // Only consider clicks close to crossing diagonals point { const int dR = ( dRow > 0.5 ) ? 1 : 0; // Correct row, col to account for crossing ... const int dC = ( dCol > 0.5 ) ? 1 : 0; // ... point being near corner of element const int& layer = m_board.GetCurrentLayer(); Element* pRB = m_board.Get(layer, m_gridRow + dR, m_gridCol + dC); if ( pRB->CanSwapDiagLinks() ) { Element* pLB = pRB->GetNbr(NBR_L); bDoSwap = ( pRB->GetNodeId() == GetCurrentNodeId() && !ReadCodeBit(NBR_LT, pRB->GetCode()) ) // pRB has correct nodeID but no diagonal to LT || ( pLB->GetNodeId() == GetCurrentNodeId() && !ReadCodeBit(NBR_RT, pLB->GetCode()) ); // pLB has correct nodeID but no diagonal to RT if ( bDoSwap ) { pRB->SwapDiagLinks(); SetMouseActionString("swap competing diagonals"); m_bReRoute = m_bReListNodes = true; } } } } const bool bTruePin = pC->GetLyrHasPin() && !pC->GetHasWire(); if ( ( GetPaintPins() || GetErasePins() ) && !bTruePin && !bDoSwap ) // Restrict painting/erasing pins to true pins (not wires) return; #ifdef VEROROUTE_ANDROID //TODO Could allow this in Desktop version too const bool bClickedValidNodeID = pC->GetNodeId() != BAD_NODEID; if ( GetPaintBoard() && bClickedValidNodeID && pC->GetNodeId() == GetCurrentNodeId() && pC->ReadFlagBits(USERSET) && !bDoSwap ) // If we're painting board and clicked on a point with matching valid nodeID { const bool bChanged = m_board.SetNodeIdByUser(layer, m_gridRow, m_gridCol, BAD_NODEID, false); // ... then erase the point instead of painting it if ( !bChanged ) return; SetMouseActionString("erase", GetCurrentNodeId()); m_bReRoute = m_bReListNodes = true; } else #endif #ifdef VEROROUTE_ANDROID if ( ( GetPaintPins() || GetPaintBoard() ) && !bDoSwap ) // Paint #else if ( m_bLeftClick && !bDoSwap ) // Paint #endif { if ( GetCurrentNodeId() == BAD_NODEID ) // If trying to left-click paint a BAD_NODEID ... SetCurrentNodeId( m_board.GetNewNodeId() ); // ... use a new NodeId instead m_board.GetColorMgr().ReAssignColors(); // Forces colors to be worked out again const bool bChanged = m_board.SetNodeIdByUser(layer, m_gridRow, m_gridCol, GetCurrentNodeId(), GetPaintPins() || GetErasePins()); if ( !bChanged ) return; SetMouseActionString("paint", GetCurrentNodeId()); m_bReRoute = m_bReListNodes = true; } #ifdef VEROROUTE_ANDROID else if ( ( GetErasePins() || GetEraseBoard() ) && !bDoSwap ) // Erase #else else if ( m_bRightClick && !bDoSwap ) // Erase #endif { // Erase both layers if it makes it easier to let a floating part fall into place. int iFloatingNodeId(BAD_NODEID); const bool bEraseBothLayers = m_board.GetLyrs() > 1 && // If 2-layer board ... !GetPaintPins() && !GetErasePins() && // ... and not erasing a pin GetHaveFloatingPinTH(iFloatingNodeId); // ... then see if we have a floating through-hole pin and gets its nodeId bool bChanged = m_board.SetNodeIdByUser(layer, m_gridRow, m_gridCol, BAD_NODEID, GetPaintPins() || GetErasePins()); if ( bEraseBothLayers ) { const int layerOther = ( layer == 0 ) ? 1 : 0; const int& otherNodeId = m_board.Get(layerOther, m_gridRow, m_gridCol)->GetNodeId(); // Only erase if the other layer has a valid nodeId that does not match the floating nodeId if ( otherNodeId != BAD_NODEID && otherNodeId != iFloatingNodeId ) bChanged = m_board.SetNodeIdByUser(layerOther, m_gridRow, m_gridCol, BAD_NODEID, GetPaintPins() || GetErasePins()) || bChanged; } if ( !bChanged ) return; SetMouseActionString("erase", GetCurrentNodeId()); m_bReRoute = m_bReListNodes = true; } } else if ( GetEditLayerPref() ) { const bool bCloseToGridPoint = ( hypot(dRow - 0.5, dCol - 0.5) <= 0.5 ); // true ==> clicked close to grid point if ( bCloseToGridPoint && pC->GetPinSupportsLayerPref() ) { const bool bToggled = m_board.ToggleLyrPref(layer, m_gridRow, m_gridCol); assert(bToggled); if ( bToggled ) { size_t pinIndex; int compId; m_board.GetSlotInfoForTH(pC, pinIndex, compId); SetMouseActionString("change pin layer preference", compId); } } } else { if ( ALLOW_DELAY_BASED_PAD_SHIFT && pC->GetPinSupportsOffsetPads() ) g_bPinClicked = true; if ( !pC->GetPinSupportsOffsetPads() ) // Hide the pad offset dialog if we click on a place that cannot have a pad offset HidePadOffsetDialog(); } g_lastMouseClickTime = std::chrono::steady_clock::now(); if ( m_bReRoute ) { m_board.WipeAutoSetPoints(); m_board.PlaceFloaters(); // See if we can now place floating components down RepaintWithRouting(); } else RepaintSkipRouting(); } void MainWindow::MouseDoubleClickEvent(const QPoint& pos) { SetMouseActionString(""); g_bPinClicked = false; m_mousePos = pos; if ( !m_board.GetCompEdit() && m_board.GetMirrored() ) return; if ( m_board.GetCompEdit() ) return; if ( GetSmartPan() || GetShiftKeyDown() ) return; if ( GetDefiningRect() ) { SetDefiningRect(false); // Quit define rectangles mode UpdateControls(); return; } if ( AllowCurrentTextId() ) return ShowTextDialog(); const bool bCompsOn = m_board.GetCompMode() != COMPSMODE::OFF; const bool bTrackOn = m_board.GetTrackMode() != TRACKMODE::OFF; if ( !bTrackOn && !bCompsOn ) return; const bool bSameLocation = ( PolygonHelper::Length(m_mousePos - m_clickedPos) ) < m_board.GetGRIDPIXELS(); // Tolerance of one grid square if ( !bSameLocation ) return; // Get row col double dRow(0), dCol(0); // Fractional correction to row, col for SwapDiagLinks() call const bool bInGrid = GetRowCol(m_mousePos, m_gridRow, m_gridCol, dRow, dCol); if ( !bInGrid ) return; const int& layer = m_board.GetCurrentLayer(); Element* pC = m_board.Get(layer, m_gridRow, m_gridCol); const bool bWire = pC->GetHasWire(); const bool bTruePin = pC->GetLyrHasPin() && !bWire; // Cursor modification centralWidget()->setCursor(Qt::CrossCursor); const bool bCloseToGridPoint = ( hypot(dRow - 0.5, dCol - 0.5) <= 0.5 ); // true ==> clicked close to grid point // Handle competing diagonals if ( bTrackOn && !GetPaintAction() ) { const bool bCloseToCrossPoint = ( hypot(std::min(dRow, 1.0 - dRow), std::min(dCol, 1.0 - dCol)) <= 0.5 ); // true ==> clicked close to crossing diagonals point if ( bCloseToCrossPoint ) // Only consider clicks close to crossing diagonals point { const int dR = ( dRow > 0.5 ) ? 1 : 0; // Correct row, col to account for crossing ... const int dC = ( dCol > 0.5 ) ? 1 : 0; // ... point being near corner of element Element* pRB = m_board.Get(layer, m_gridRow + dR, m_gridCol + dC); if ( pRB->SwapDiagLinks() ) { SetMouseActionString("swap competing diagonals"); m_bReRoute = m_bReListNodes = true; m_board.WipeAutoSetPoints(); m_board.PlaceFloaters(); // See if we can now place floating components down return; } } } // Handle selection of nodeId when double-clicking on a pin (when tracks are displayed) if ( bTrackOn && bWire && !GetPaintBoard() && !GetEraseBoard() && !GetPaintFlood() && bCloseToGridPoint ) // Only consider clicks that are close to the grid point { if ( GetCurrentNodeId() != pC->GetNodeId() ) { SetCurrentNodeId( pC->GetNodeId() ); SetMouseActionString( ( GetCurrentNodeId() == BAD_NODEID ) ? "unselect net" : "select net", 0); m_bReRoute = true; // Dont' need to set m_bReListNodes when choosing different nodeID } return; } if ( bTrackOn && bTruePin && !GetPaintPins() && !GetErasePins() && !GetPaintFlood() && bCloseToGridPoint ) // Only consider clicks that are close to the grid point { if ( GetCurrentNodeId() != pC->GetNodeId() ) { SetCurrentNodeId( pC->GetNodeId() ); SetMouseActionString( ( GetCurrentNodeId() == BAD_NODEID ) ? "unselect net" : "select net", 0); m_bReRoute = true; // Dont' need to set m_bReListNodes when choosing different nodeID } return; } // Handle component rotation /* if ( bCompsOn && ( m_eMouseMode == MOUSE_MODE::SELECT || GetPaintPins() || GetErasePins() ) && GetCurrentCompId() != BAD_COMPID ) { if ( !bTruePin ) // ... Only allow rotate if we did not click on a pin { m_bReRoute = m_bReListNodes = false; // Set these false since CompRotateCW() calls RepaintWithListNodes() directly SetMouseActionString(""); // CompRotateCW() will write history return CompRotateCW(); } } */ // Handle selection of nodeId (fallback case) if ( bTrackOn && !GetPaintAction() ) { if ( GetCurrentNodeId() != pC->GetNodeId() ) { SetCurrentNodeId( pC->GetNodeId() ); SetMouseActionString( ( GetCurrentNodeId() == BAD_NODEID ) ? "unselect net" : "select net", 0); m_bReRoute = true; // Dont' need to set m_bReListNodes when choosing different nodeID } } } void MainWindow::MouseMoveEvent(const QPoint& pos) { m_mousePos = pos; if ( !m_board.GetCompEdit() && m_board.GetMirrored() ) return; if ( !m_bMouseClick ) return; const TRACKMODE& trackMode = m_board.GetTrackMode(); const COMPSMODE& compMode = m_board.GetCompMode(); CompDefiner& compDefiner = m_board.GetCompDefiner(); const int& layer = m_board.GetCurrentLayer(); if ( GetPaintFlood() ) return; // Ignore mouse move while flooding if ( GetShiftKeyDown() ) return; // Ignore mouse move while trying to group components if ( ALLOW_DELAY_BASED_SMART_PAN && !m_board.GetCompEdit() && !GetDefiningRect() && !GetPaintBoard() && !GetEraseBoard() && !CanModifyRuler() && !AllowCurrentTextId() && !AllowCurrentCompId() ) { const auto elapsed = std::chrono::steady_clock::now() - g_lastMouseClickTime; const auto duration_ms = std::chrono::duration_cast(elapsed).count(); if ( duration_ms > 500 ) // ... Force smart pan after 500 ms of last mouse click SetSmartPan(true); } if ( m_board.GetCompEdit() && GetCurrentShapeId() != BAD_ID && m_bMouseClick ) centralWidget()->setCursor(Qt::ClosedHandCursor); else if ( GetSmartPan() ) centralWidget()->setCursor(Qt::ClosedHandCursor); else if ( GetDefiningRect() || GetResizingText() ) centralWidget()->setCursor(Qt::SizeFDiagCursor); else if ( GetPaintBoard() || GetEraseBoard() || GetPaintPins() || GetErasePins() || GetPaintFlood() || GetEditLayerPref() ) centralWidget()->setCursor(Qt::CrossCursor); else if ( AllowCurrentTextId() && m_bMouseClick ) centralWidget()->setCursor(Qt::ClosedHandCursor); else if ( AllowCurrentCompId() && m_bMouseClick ) centralWidget()->setCursor(Qt::ClosedHandCursor); else centralWidget()->setCursor(Qt::OpenHandCursor); // Get row col int row(0), col(0); double dRow(0), dCol(0); // Fractional correction to row, col for SwapDiagLinks() call bool bInGrid(false); if ( m_board.GetCompEdit() ) bInGrid = GetRowCol(m_mousePos, compDefiner.GetScreenRows(), compDefiner.GetScreenCols(), row, col, dRow, dCol); else bInGrid = GetRowCol(m_mousePos, row, col, dRow, dCol); int deltaRow = row - m_gridRow; int deltaCol = col - m_gridCol; int oldRow(m_gridRow), oldCol(m_gridCol); m_gridRow = row; m_gridCol = col; // g_bPinClicked needs to be set false in a limited set of cases. // If we don't do anything with the move operation, then we can preserve g_bPinClicked if ( m_board.GetCompEdit() || GetPaintAction() || GetDefiningRect() || GetResizingText() || CanModifyRuler() ) g_bPinClicked = false; if ( m_board.GetCompEdit() ) { if ( GetCurrentShapeId() != BAD_ID ) { if ( HaveZeroDeltaRowCol(deltaRow, deltaCol) ) return; // No change compDefiner.SetCurrentPinId(BAD_ID); // Clear pin selection compDefiner.MoveCurrentShape(deltaRow, deltaCol); // Move the shape SetMouseActionString("move shape", GetCurrentShapeId()); UpdateCompDialog(); } } else if ( !GetSmartPan() && GetDefiningRect() ) { if ( deltaRow != 0 || deltaCol != 0 ) // No change of row or column ==> No change in current rect size { m_board.GetRectMgr().UpdateNewRect(m_gridRow, m_gridCol); SelectAllInRects(); } } else if ( !GetSmartPan() && ( GetPaintBoard() || GetEraseBoard() ) && trackMode != TRACKMODE::OFF ) // (Un)Paint nodeId on board but NOT pins { if ( !bInGrid ) return; // Handle competing diagonals first bool bDoSwap(false); const bool bCloseToCrossPoint = ( hypot(std::min(dRow, 1.0 - dRow), std::min(dCol, 1.0 - dCol)) <= 0.5 ); // true ==> clicked close to crossing diagonals point if ( bCloseToCrossPoint ) // Only consider clicks close to crossing diagonals point { const int dR = ( dRow > 0.5 ) ? 1 : 0; // Correct row, col to account for crossing ... const int dC = ( dCol > 0.5 ) ? 1 : 0; // ... point being near corner of element const int& layer = m_board.GetCurrentLayer(); Element* pRB = m_board.Get(layer, m_gridRow + dR, m_gridCol + dC); if ( pRB->CanSwapDiagLinks() ) { Element* pLB = pRB->GetNbr(NBR_L); bDoSwap = ( pRB->GetNodeId() == GetCurrentNodeId() && !ReadCodeBit(NBR_LT, pRB->GetCode()) ) // pRB has correct nodeID but no diagonal to LT || ( pLB->GetNodeId() == GetCurrentNodeId() && !ReadCodeBit(NBR_RT, pLB->GetCode()) ); // pLB has correct nodeID but no diagonal to RT if ( bDoSwap ) { pRB->SwapDiagLinks(); SetMouseActionString("swap competing diagonals"); m_bReRoute = m_bReListNodes = true; } } } assert( !GetPaintPins() && !GetErasePins() && !GetPaintFlood() ); // Sanity check #ifdef VEROROUTE_ANDROID if ( GetPaintBoard() && !bDoSwap ) // Paint #else if ( m_bLeftClick && !bDoSwap ) // Paint #endif { const bool bChanged = m_board.SetNodeIdByUser(layer, m_gridRow, m_gridCol, GetCurrentNodeId(), false); // false ==> Only allow paint board (not pins) if ( !bChanged ) return; // No change SetMouseActionString("paint", GetCurrentNodeId()); m_bReRoute = m_bReListNodes = true; } #ifdef VEROROUTE_ANDROID if ( GetEraseBoard() && !bDoSwap ) // Erase #else if ( m_bRightClick && !bDoSwap ) // Erase #endif { // Erase both layers if it makes it easier to let a floating part fall into place. int iFloatingNodeId(BAD_NODEID); const bool bEraseBothLayers = m_board.GetLyrs() > 1 && // If 2-layer board ... !GetPaintPins() && !GetErasePins() && // ... and not erasing a pin GetHaveFloatingPinTH(iFloatingNodeId); // ... then see if we have a floating through-hole pin and gets its nodeId bool bChanged = m_board.SetNodeIdByUser(layer, m_gridRow, m_gridCol, BAD_NODEID, false); // false ==> Only allow erase board (not pins) if ( bEraseBothLayers ) { const int layerOther = ( layer == 0 ) ? 1 : 0; const int& otherNodeId = m_board.Get(layerOther, m_gridRow, m_gridCol)->GetNodeId(); // Only erase if the other layer has a valid nodeId that does not match the floating nodeId if ( otherNodeId != BAD_NODEID && otherNodeId != iFloatingNodeId ) bChanged = m_board.SetNodeIdByUser(layerOther, m_gridRow, m_gridCol, BAD_NODEID, false) || bChanged; // false ==> Only allow erase board (not pins) } if ( !bChanged ) return; // No change SetMouseActionString("erase", GetCurrentNodeId()); m_bReRoute = m_bReListNodes = true; } m_board.WipeAutoSetPoints(); m_board.PlaceFloaters(); // See if we can now place floating components down } else if ( !GetSmartPan() && AllowCurrentTextId() ) { if ( HaveZeroDeltaRowCol(deltaRow, deltaCol) ) return; // No change if ( g_bHaveAutoPanned ) // If we've auto-panned the grid before ... { const auto elapsed = std::chrono::steady_clock::now() - g_lastAutoPanTime; const auto duration_ms = std::chrono::duration_cast(elapsed).count(); if ( duration_ms >= 0 && duration_ms < 40 ) return; // ... do nothing if within 40 ms of the last auto-pan } if ( GetResizingText() ) { m_board.GetTextMgr().UpdateRect( GetCurrentTextId(), m_gridRow, m_gridCol ); } else { const bool bAutoPanned = m_board.MoveTextBox(deltaRow, deltaCol); // Move the text box and note if the grid was auto-panned if ( bAutoPanned ) { g_bHaveAutoPanned = true; g_lastAutoPanTime = std::chrono::steady_clock::now(); m_bReRoute = m_bReListNodes = true; } } SetMouseActionString(GetResizingText() ? "resize text box" : "move text box", GetCurrentTextId()); } else if ( !GetSmartPan() && AllowCurrentCompId() && compMode != COMPSMODE::OFF ) // Move user-group components { if ( HaveZeroDeltaRowCol(deltaRow, deltaCol) ) return; // No change if ( g_bHaveAutoPanned ) // If we've auto-panned the grid before ... { const auto elapsed = std::chrono::steady_clock::now() - g_lastAutoPanTime; const auto duration_ms = std::chrono::duration_cast(elapsed).count(); if ( duration_ms >= 0 && duration_ms < 40 ) return; // ... do nothing if within 40 ms of the last auto-pan } const bool bAutoPanned = m_board.MoveUserComps(deltaRow, deltaCol); // Move the components and note if the grid was auto-panned if ( bAutoPanned ) { g_bHaveAutoPanned = true; g_lastAutoPanTime = std::chrono::steady_clock::now(); } const bool bPlural = ( m_board.GetGroupMgr().GetNumUserComps() > 1 ); SetMouseActionString(bPlural ? "move parts" : "move part", bPlural ? -1 : GetCurrentCompId()); m_bReRoute = m_bReListNodes = true; } else if ( GetSmartPan() ) // If we're not moving anything else, we can smart pan { if ( HaveZeroDeltaRowCol(deltaRow, deltaCol) ) return; // No change m_board.SmartPan(deltaRow, deltaCol); // Pan whole circuit w.r.t. grid area, growing/shrinking as needed SetMouseActionString("move whole layout", 0); m_bReRoute = m_bReListNodes = true; } if ( CanModifyRuler() ) { const QPoint old(oldCol, oldRow); const QPoint current(m_gridCol, m_gridRow); bool bModifyA = ( old == m_rulerA ); bool bModifyB = !bModifyA && ( old == m_rulerB ); if ( !(bModifyA || bModifyB) ) bModifyA = PolygonHelper::Length(current - m_rulerA) < PolygonHelper::Length(current - m_rulerB); // Choose nearest if ( bModifyA ) m_rulerA = current; else m_rulerB = current; m_bModifyRulerA = !bModifyA; } if ( abs(deltaRow) <= 1 && abs(deltaCol) <= 1 ) // If not moved mouse too fast ... { if ( GetDefiningRect() ) { if ( deltaRow != 0 || deltaCol != 0 ) // No change of row or column ==> No change in current rect size { ShowCurrentRectSize(); #ifdef AVOID_RECT_REDRAWS const auto elapsed = std::chrono::steady_clock::now() - g_lastDrawRect; const auto duration_ms = std::chrono::duration_cast(elapsed).count(); if ( duration_ms >= 0 && duration_ms < 200 ) return; // ... do nothing if within 40 ms of the last draw g_lastDrawRect = std::chrono::steady_clock::now(); #endif RepaintSkipRouting(); } } else { if ( m_bReRoute ) RepaintWithRouting(); else RepaintSkipRouting(); m_bReRoute = false; } } if ( abs(deltaRow) > 0 || abs(deltaCol) > 0 ) g_bPinClicked = false; } void MainWindow::MouseReleaseEvent(const QPoint& pos) { bool bShowPadOffsetDialog(false); if ( g_bPinClicked && !m_board.GetVeroTracks() && !m_bRuler ) { const auto elapsed = std::chrono::steady_clock::now() - g_lastMouseClickTime; const auto duration_ms = std::chrono::duration_cast(elapsed).count(); bShowPadOffsetDialog = ( duration_ms >= 1000 ); } g_bPinClicked = false; m_mousePos = pos; releaseMouse(); if ( GetSmartPan() ) SetSmartPan(false); if ( !m_board.GetCompEdit() && m_board.GetMirrored() ) return; m_bMouseClick = false; if ( m_board.GetCompEdit() ) { } else if ( GetResizingText() ) { centralWidget()->setCursor(Qt::OpenHandCursor); SetResizingText(false); } else if ( GetDefiningRect() ) { centralWidget()->setCursor(Qt::SizeFDiagCursor); m_board.GetRectMgr().EndNewRect(); SelectAllInRects(); ShowCurrentRectSize(); } else if ( GetPaintPins() || GetErasePins() || GetPaintBoard() || GetEraseBoard() || GetPaintFlood() || GetEditLayerPref() ) centralWidget()->setCursor(Qt::CrossCursor); else centralWidget()->setCursor(Qt::OpenHandCursor); UpdateHistory(m_mouseActionString, m_mouseObjId); UpdateControls(); if ( m_bReListNodes ) RepaintWithListNodes(); else if ( m_bReRoute ) RepaintWithRouting(); else RepaintSkipRouting(); if ( bShowPadOffsetDialog ) ShowPadOffsetDialog(); m_bReRoute = m_bReListNodes = false; // Clear both flags } void MainWindow::keyPressEvent(QKeyEvent* event) { #ifndef VEROROUTE_ANDROID commonKeyPressEvent(event); if ( GetCtrlKeyDown() ) return; // Try to keep Ctrl key input handled by menu items if ( GetShiftKeyDown() ) return; // Ignore other key presses while trying to group components if ( !m_board.GetCompEdit() && m_board.GetMirrored() ) return; const TRACKMODE& trackMode = m_board.GetTrackMode(); const COMPSMODE& compMode = m_board.GetCompMode(); CompDefiner& compDefiner = m_board.GetCompDefiner(); GroupManager& groupMgr = m_board.GetGroupMgr(); const int nComps = groupMgr.GetNumUserComps(); const bool bIsAutoRepeat = event->isAutoRepeat(); #ifdef _GRID_DEBUG switch(event->key()) { case Qt::Key_F4: m_iGridDebugMode = ( m_iGridDebugMode + 1 ) % DEBUGMODE_END; break; } #endif if ( m_board.GetCompEdit() ) { if ( GetCurrentShapeId() != BAD_ID ) { switch( event->key() ) { case Qt::Key_Left: compDefiner.MoveCurrentShape( 0, -1); UpdateCompDialog(); RepaintSkipRouting(); break; case Qt::Key_Right: compDefiner.MoveCurrentShape( 0, 1); UpdateCompDialog(); RepaintSkipRouting(); break; case Qt::Key_Up: compDefiner.MoveCurrentShape(-1, 0); UpdateCompDialog(); RepaintSkipRouting(); break; case Qt::Key_Down: compDefiner.MoveCurrentShape( 1, 0); UpdateCompDialog(); RepaintSkipRouting(); break; } if ( !bIsAutoRepeat ) { switch( event->key() ) { case Qt::Key_Backspace: case Qt::Key_Delete: Delete(); break; } } } event->accept(); return; } bool bUpdateControls(false); // Rectangle mode if ( !bIsAutoRepeat ) { switch( event->key() ) { case Qt::Key_R: SetDefiningRect(true); bUpdateControls = true; break; } } const bool bSingle = ( m_board.GetGroupMgr().GetNumUserComps() == 1 ); const int objID = ( bSingle ) ? m_board.GetUserComponent().GetId() : -1; // Component manipulation switch( event->key() ) { case Qt::Key_Underscore: case Qt::Key_Minus: CompShrink(); break; case Qt::Key_Plus: case Qt::Key_Equal: CompGrow(); break; case Qt::Key_Left: if ( !m_board.GetDisableMove() ) { m_board.MoveUserComps(0,-1); UpdateHistory(bSingle ? "move part" : "move parts", objID); RepaintWithRouting(); } break; case Qt::Key_Right: if ( !m_board.GetDisableMove() ) { m_board.MoveUserComps(0, 1); UpdateHistory(bSingle ? "move part" : "move parts", objID); RepaintWithRouting(); } break; case Qt::Key_Up: if ( !m_board.GetDisableMove() ) { m_board.MoveUserComps(-1,0); UpdateHistory(bSingle ? "move part" : "move parts", objID); RepaintWithRouting(); } break; case Qt::Key_Down: if ( !m_board.GetDisableMove() ) { m_board.MoveUserComps( 1,0); UpdateHistory(bSingle ? "move part" : "move parts", objID); RepaintWithRouting(); } break; } if ( !bIsAutoRepeat ) { switch( event->key() ) { case Qt::Key_Z: CompRotateCCW(); break; case Qt::Key_X: CompRotateCW(); break; case Qt::Key_Delete: if ( AllowCurrentTextId() || ( nComps && compMode != COMPSMODE::OFF ) ) Delete(); // So delete works like the backspace keyboard shortcut break; } } // Painting/Unpainting if ( !bIsAutoRepeat ) { const bool bAllowPaintPins = ( compMode != COMPSMODE::OFF ) && ( ( trackMode == TRACKMODE::COLOR ) || ( trackMode == TRACKMODE::MONO && m_board.GetColoredMono() ) ); // Only one flag for paint-board/paint-pins/paint-flood must be true switch( event->key() ) { case Qt::Key_P: if ( !bAllowPaintPins || GetPaintBoard() || GetEraseBoard() || GetPaintFlood() ) return; SetPaintPins(true); break; case Qt::Key_Space: if ( trackMode == TRACKMODE::OFF || GetPaintPins() || GetErasePins() || GetPaintFlood() ) return; SetPaintBoard(true); break; case Qt::Key_F: if ( !bAllowPaintPins || GetPaintBoard() || GetEraseBoard() || GetPaintPins() || GetErasePins() || m_board.GetRoutingEnabled() ) return; SetPaintFlood(true); break; case Qt::Key_W: WipeTracks(); break; } } if ( !GetDefiningRect() ) m_board.GetRectMgr().Clear(); if ( bUpdateControls ) UpdateControls(); #endif event->accept(); // If we don't do this, we can get the same event passed multiple times if we're on MS Windows. } void MainWindow::keyReleaseEvent(QKeyEvent* event) { #ifdef VEROROUTE_ANDROID if ( event->key() == Qt::Key_Back ) { if ( m_bHistoryDir && m_historyMgr.GetCanUndo() ) QTimer::singleShot(0, this, SLOT(Undo())); return event->accept(); } #else commonKeyReleaseEvent(event); if ( GetSmartPan() ) SetSmartPan(false); if ( !m_board.GetCompEdit() && m_board.GetMirrored() ) return; if ( event->isAutoRepeat() ) return; if ( m_board.GetCompEdit() ) UpdateCompDialog(); else { switch( event->key() ) { case Qt::Key_R: SetDefiningRect(false); break; case Qt::Key_P: SetPaintPins(false); break; case Qt::Key_F: SetPaintFlood(false); break; case Qt::Key_Space: SetPaintBoard(false); break; default: if ( AllowCurrentTextId() && m_bMouseClick ) centralWidget()->setCursor(Qt::ClosedHandCursor); else if ( AllowCurrentCompId() && m_bMouseClick ) centralWidget()->setCursor(Qt::ClosedHandCursor); else centralWidget()->setCursor(Qt::OpenHandCursor); } UpdateControls(); RepaintWithListNodes(); } event->accept(); // If we don't do this, we can get the same event passed multiple times if we're on MS Windows. #endif } #ifndef VEROROUTE_ANDROID void MainWindow::commonKeyPressEvent(QKeyEvent* event) // So child dialogs can relay Ctrl and Shift to the main window { g_bPinClicked = false; switch( event->key() ) { case Qt::Key_Shift: return SetShiftKeyDown(true); case Qt::Key_Control: if ( m_bMouseClick ) centralWidget()->setCursor(Qt::ClosedHandCursor); return SetCtrlKeyDown(true); } } void MainWindow::commonKeyReleaseEvent(QKeyEvent* event) // So child dialogs can relay Ctrl and Shift to the main window { g_bPinClicked = false; switch( event->key() ) { case Qt::Key_Shift: return SetShiftKeyDown(false); case Qt::Key_Control: return SetCtrlKeyDown(false); } } void MainWindow::specialKeyPressEvent(QKeyEvent* event) // So child dialogs can do Ctrl+Q etc { commonKeyPressEvent(event); if ( !GetCtrlKeyDown() ) return; switch( event->key() ) { case Qt::Key_N: return New(); case Qt::Key_O: return Open(); case Qt::Key_M: return Merge(); case Qt::Key_S: return GetShiftKeyDown() ? SaveAs() : Save(); case Qt::Key_Q: return Quit(); } } #endif void MainWindow::dragEnterEvent(QDragEnterEvent *e) { if ( e->mimeData()->hasUrls() ) e->acceptProposedAction(); } void MainWindow::dropEvent(QDropEvent *e) { if ( e->mimeData()->hasUrls() ) { QString fileName = e->mimeData()->urls().first().toLocalFile(); if ( fileName.isEmpty() ) return; SetCtrlKeyDown(false); // Clear flag since key release can get missed. if ( GetIsModified() ) if ( QMessageBox::question(this, tr("Confirm Open"), tr("Your layout is not saved. You will lose changes if you open a new one. Continue?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No ) return; OpenVrt(fileName, false); } } bool MainWindow::eventFilter(QObject* object, QEvent* event) { // Intercept the Android "back" button event if ( event->type() == QEvent::KeyRelease && qobject_cast(object) ) { QKeyEvent* ke = (QKeyEvent*)event; if ( ke->key() == Qt::Key_Back ) { ke->accept(); return true; } } return QWidget::eventFilter(object, event); } void MainWindow::SetPaintPins(bool b) { if ( b == GetPaintPins() ) return; if ( b ) HideAllNonDockedDlgs(); m_eMouseMode = ( b ) ? MOUSE_MODE::PAINT_PINS : MOUSE_MODE::SELECT; centralWidget()->setCursor(b ? Qt::CrossCursor : Qt::OpenHandCursor); UpdateControls(); } void MainWindow::SetErasePins(bool b) { if ( b == GetErasePins() ) return; if ( b ) HideAllNonDockedDlgs(); m_eMouseMode = ( b ) ? MOUSE_MODE::ERASE_PINS : MOUSE_MODE::SELECT; centralWidget()->setCursor(b ? Qt::CrossCursor : Qt::OpenHandCursor); UpdateControls(); } void MainWindow::SetPaintBoard(bool b) { if ( b == GetPaintBoard() ) return; if ( b ) HideAllNonDockedDlgs(); m_eMouseMode = ( b ) ? MOUSE_MODE::PAINT_GRID : MOUSE_MODE::SELECT;; centralWidget()->setCursor(b ? Qt::CrossCursor : Qt::OpenHandCursor); UpdateControls(); } void MainWindow::SetEraseBoard(bool b) { if ( b == GetEraseBoard() ) return; if ( b ) HideAllNonDockedDlgs(); m_eMouseMode = ( b ) ? MOUSE_MODE::ERASE_GRID : MOUSE_MODE::SELECT;; centralWidget()->setCursor(b ? Qt::CrossCursor : Qt::OpenHandCursor); UpdateControls(); } void MainWindow::SetPaintFlood(bool b) { if ( b == GetPaintFlood() ) return; if ( b ) HideAllNonDockedDlgs(); m_eMouseMode = ( b ) ? MOUSE_MODE::PAINT_FLOOD : MOUSE_MODE::SELECT; centralWidget()->setCursor(b ? Qt::CrossCursor : Qt::OpenHandCursor); UpdateControls(); } void MainWindow::SetEditLayerPref(bool b) { if ( b == GetEditLayerPref() ) return; if ( b ) HideAllNonDockedDlgs(); m_eMouseMode = ( b ) ? MOUSE_MODE::EDIT_LAYER_PREF : MOUSE_MODE::SELECT; centralWidget()->setCursor(b ? Qt::CrossCursor : Qt::OpenHandCursor); UpdateControls(); } void MainWindow::SetDefiningRect(bool b) { if ( b == GetDefiningRect() ) return; if ( b ) HideAllNonDockedDlgs(); m_eMouseMode = ( b ) ? MOUSE_MODE::DEFINE_RECT : MOUSE_MODE::SELECT; centralWidget()->setCursor(b ? Qt::SizeFDiagCursor : Qt::OpenHandCursor); UpdateControls(); } void MainWindow::SetResizingText(bool b) { if ( b == GetResizingText() ) return; if ( b ) { m_wireDlg->hide(); m_bomDlg->hide(); m_findDlg->hide(); } // Mutually exclusive with m_textDlg m_eMouseMode = ( b ) ? MOUSE_MODE::RESIZE_TEXT : MOUSE_MODE::SELECT; UpdateControls(); } void MainWindow::SetSmartPan(bool b) { if ( b == GetSmartPan() ) return; if ( b ) HideAllNonDockedDlgs(); m_eMouseMode = ( b ) ? MOUSE_MODE::SMART_PAN : MOUSE_MODE::SELECT; centralWidget()->setCursor(Qt::OpenHandCursor); UpdateControls(); } void MainWindow::SetMouseActionString(const std::string& str, const int objId) { m_mouseActionString = str; m_mouseObjId = objId; } VeroRoute/tutorials/tutorial_12.vrt000644 001750 001750 00000033745 14433261440 017701 0ustar00alexalex000000 000000 9TUTORIAL 12 - DIAGONAL MODES AND TRACK WIDTHS 12.1 DIAGONAL MODES There are two buttons in the toolbar (also listed under the "Track Styles" menu item) that determine if diagonal connections are allowed and how they are drawn to screen. They are labelled "Diagonals (Min)" and "Diagonals (Max)". Using the "Fat" track style (which should already be selected for this example), try out the following modes. DIAGONALS MIN: In this mode, diagonally adjacent grid points may be electrically connected. The diagonal connections are only drawn where they are needed. DIAGONALS MAX: In this mode, diagonally adjacent grid points may be electrically connected. The diagonal connections are drawn wherever they exist. This has the effect of "filling in" some of the 90 degree corners with chamfers. DIAGONALS OFF: To disable diagonal connections, make sure that both of the diagonal mode buttons in the toolbar are unselected. Note that this is the only mode allowed when using the "Vero" style. With diagonal connections forbidden, only the left pair of pads (Pad1 and Pad2) in the current layout are electrically connected by a continuous piece of track. Note that the "Min" and "Max" modes have the same electrical connectivity, so the difference between them is largely cosmetic. Now change the track style to "Thin" or "Curved" and see how the three diagonal modes affect what is drawn. 12.2 TRACK WIDTH CONTROLS To demonstrate the effect of all track width controls, it is best to first select "Mono" mode in the Control Dialog, and then uncheck the 3 checkboxes (Line/Name/Value) so that no part outlines are drawn. To access the track width controls, select Windows -> Rendering Options  in the menu bar, or hit the "mil" button in the toolbar. The track width controls (Pad, Track, Hole, Gap) only apply to the "Fat", "Thin" and "Curved" track styles. PAD: Is the width of the pads that connect parts to the board. TRACK: Is the width of the track. If using the "Fat" track style, then this width only applies to diagonal connections. HOLE: Is the width of the pin holes. GAP: Is the width of the border around tracks when performing a ground-fill. The control is only enabled when in Mono  and PCB  modes, and will only have an effect when ground-fill is switched on. Ground-fills are covered in a later tutorial. The width ranges have been deliberately restricted to a (hopefully) useful set of values. If the pad and track widths are made too large, it is possible that a short-circuit will be produced in the image of the tracks, even though one does not exist within the representation of the circuit. The Rendering Options dialog shows the closest distance between two tracks. If the distance is 0 mil then you have a short-circuit. Set the style to "Fat" and enable diagonal connections, and then see what happens when the Pad and Track widths are set to their maximum values (98 mil and 50 mil respectively).џџџџџџџџџџџ*@.. 2< џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџџџџџџџџџџџџџџџџ @џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ"џџџџџџ"џџџџџџџџџџ"џџџџџџџџџџ"1џџџџџџџџџџ"AџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџФџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ"†џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџPџџџџџџџџџџ™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ"HџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ" џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ"DџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџXџџџџџџџџџџ…џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ#Pџџџџџџџџџџ#џџџџџџџџџџ „џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ"Hџџџџџџџџџџџџџџџџџџџџ"Bџџџџџџџџџџџџџџџџџџџџ"$џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџLџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ# џџџџџџџџџџ ˆџџџџџџџџџџ#Рџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ"Dџџџџџџџџџџџџџџџџџџџџ"dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ"ТџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Hџџџџџџџџџџ#џџџџџџџџџџ#џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ"Dџџџџџџџџџџџџџџџџџџџџ"џџџџџџџџџџ"џџџџџџџџџџ"џџџџџџџџџџ"џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџdџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ"$џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ4џџџџџџџџџџCџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ !џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ"2џџџџџџџџџџ"Aџџџџџџџџџџџџџџџџџџџџ"@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџFџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Тџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ"цџџџџџџџџџџџџџџџџџџџџ"фџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџ"џџџџџџ"џџџџџџџџџџ"џџџџџџџџџџ"џџџџџџџџџџ"џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџdPad3Pad3PadPadPADџџџѓWF( 1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdPad2Pad2PadPadPAD  WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdPad6Pad6PadPadPAD џџџѓWF("1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdPad1Pad1PadPadPADџџџѓWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdPad5Pad5PadPadPAD WF("1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdPad4Pad4PadPadPAD  WF( 1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпB@џџџўINVALID TracksWF(џџџ€џџџ€џџџ€џџџ€џџџџџџџџF#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Р@Р@@V€џVeroRoute/tutorials/tutorial_23.vrt000644 001750 001750 00000224062 14433261670 017702 0ustar00alexalex000000 000000 9LTUTORIAL 23 - FLYING WIRES Regular wires in VeroRoute behave in a certain way. In particular... 1) They do not have a netlist ID of their own, but rather inherit the netlist ID of the grid square where they are placed. 2) They can only be placed horizontally or vertically. 3) They cannot cross other parts but can be placed in the gap between pins of an IC socket. 4) There are options to allow 2 wires to share a hole, and for 2 wires to cross or overlay one another. "Flying wires" in VeroRoute are not actual objects, but rather automatically generated connections between a set of "flying wire pads". So to create "flying wires" you must place a set of "flying wire pads" down on the grid and paint them with the same netlist ID. Use the menu item "Add -> Pad (Flying Wire)" to add a flying wire pad to your layout. VeroRoute treats all "flying wire pads" with the same netlist ID as being electrically connected, and it automatically generates a daisy chain of flying wires between them to indicate that. Look at the example layout. Flying wires are drawn in the same style as regular wires except they have white stripes instead of a solid color. Note that the "Broken Nets" list is empty, meaning there are no open-circuits. Now go to the View menu and choose "Hide Flying Wires". The "Broken Nets" list remains empty because the flying wire pads have an implicit electrical connection regardless of whether you choose to draw the flying wires to screen. Flying wires are always hidden in Mono  and PCB  modes. Now do View -> Show Flying Wires". Click on one of the "flying wire pad" objects (e.g. the green pad to the right of D5 near the top of the layout) and drag it to different places in the layout. You will see the daisy chain of flying wires being rebuilt according to where the pad is placed. џџџџџџџџџџџZ.. 2< џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@Wџџџџџџџџџџџџџџџџџџџџџџџџџ*@Wџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџ*Zџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ D]џџџџџџ џџџџџџџџџ P]џџџџџFџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Фџџџџџџџџџџ џџџџџџџџџџ lџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџlџџџџџXџџџџџџџџџџџџџџџXџџџџџGџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ"0Tџџџџџџ"Aџџџџџџџџџџџџџџџџџџџ)@Tџџџџџ@2џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ`2Eџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@Eџџџџџџџџџџџџџџџџџџџџџџџџџџ"Fџџџџџџџџџ!`?џџџџџ)UџџџџџD@џџџџџ#@Bџџџџџ(` џџџџџџџџџџџџџџџџџџџџџџџџџ&p џџџџџ&Сџџџџџџџџџџџџџџџџџџџџџџџџџ4џџџџџcџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџ@+џџџџџџџџџџџџџџџ@+џџџџџ@,џџџџџџџџџџџџџџџ@,џџџџџ0;џџџџџA.џџџџџ@.џџџџџ@-џџџџџџDџџџџџџџџџ@-џџџџџ @>џџџџџ"d\џџџџџ!4\џџџџџџ!CџџџџџџџџџD5џџџџџ#D5џџџџџџ(џџџџџџџџџ(4џџџџџ%@4џџџџџ&<3џџџџџџ&Gџџџџџџџџџ'3џџџџџ'џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџDџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџFџџџџџџџџџџDџџџџџџџџџDџџџџџџDџџџџџџџџџџDџџџџџџџџџџ Dџџџџџџџџџџ"4џџџџџџџџџ"C'џџџџџџ!FџџџџџџџџџџDџџџџџџџџџ#d'џџџџџџџџџџџџџџџџџџџџџџџџџ%Ф<џџџџџџџџџџџџџџџџ&Цџџџџџџџџџ%@<џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџDџџџџџџDџџџџџџџџџџџџџџџџџџџDџџџџџџDџџџџџџџџџ0џџџџџџAџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџDџџџџџџџџџџDџџџџџџџџџџџџџџ D&џџџџџџџџџџџџџџџџ"Fџџџџџџџџџ!D&џџџџџD6џџџџџџ#џџџџџџџџџ#6џџџџџ%8!џџџџџџ%Eџџџџџџџџџџ&Xџџџџџџџџџ&…!џџџџџ%Dџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџCџџџџџџDџџџџџџџџџ@CџџџџџџfџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџDџџџџџџџџџџDџџџџџџџџџ@џџџџџџ Dџџџџџџџџџџџџџџџџџџџ"D$џџџџџџ!DџџџџџџџџџџDџџџџџџџџџ@$џџџџџ`џџџџџџџџџџџџџџџџ%Fџџџџџџџџџ&Lџџџџџ$@Aџџџџџџ%Dџџџџџџџџџ@џџџџџџџџџџџџџџџџDџџџџџџџџџ@џџџџџџDџџџџџџџџџџDџџџџџџџџџD=џџџџџџџџџџџџџџџ@=џџџџџDџџџџџџDџџџџџџџџџџ4џџџџџџџџџCџџџџџџџџџџџџџџџџDџџџџџџџџџDHџџџџџџDџџџџџџџџџDHџџџџџ %џџџџџ @џџџџџ "џџџџџ !џџџџџ џџџџџџФџџџџџџџџџџTџџџџџџџџџ ƒџџџџџ %џџџџџ &џџџџџ $џџџџџџ%DџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџ џџџџџ џџџџџ џџџџџ џџџџџ џџџџџ @џџџџџ џџџџџ џџџџџџФџџџџџџџџџџџџџџџџџџџџFџџџџџџџџџ @џџџџџ џџџџџ џџџџџ Dџџџџџ7џџџџџџџџџџџџџџџ hџџџџџџџџџџџџџџџџPџџџџџџџџџџ™џџџџџџџџџџџџџџџџџџџLiџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ @Pџџџџџџ%DџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ mџџџџџџџџџџџџџџџџxџџџџџџџџџџХџџџџџџџџџџџџџџџџџџџDSџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ [џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџLџџџџџџџџџ @eџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџ%DџџџџџџџџџDjџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ @dџџџџџџџџџџџџџџџџ\џџџџџџџџџџ‡џџџџџџџџџџџџџџџџџџџџDџџџџџџџџџ kџџџџџџџџџџџџџџџ 0fџџџџџџAџџџџџџџџџџџџџџџџџџџp%џџџџџ Сџџџџџ @џџџџџ dџџџџџ џџџџџџџџџџџџџџџџDџџџџџџџџџ Pџџџџџ џџџџџ Рџџџџџ Dџџџџџџ%DџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџ  @џџџџџ  @џџџџџ  @џџџџџ  @џџџџџ  `џџџџџ џџџџџ  Рџџџџџ Lџџџџџ@8џџџџџ@9џџџџџџDџџџџџџџџџ @џџџџџ @џџџџџ @џџџџџ џџџџџ@:џџџџџџ\џџџџџџџџџ‡#џџџџџџDџџџџџџџџџџџџџџџџџџџ#џџџџџџџџџџџџџџџџџџџџџЬџџџџџџџџџџXџџџџџџџџџ…џџџџџџdџџџџџџџџџ% џџџџџџDџџџџџџџџџџџџџџџџџџџ  џџџџџџ Dџџџџџџџџџ  џџџџџ D џџџџџџ Tџџџџџџџџџџ ›џџџџџџџџџџ џџџџџџџџџD џџџџџџџџџџџџџџџџDџџџџџџџџџDџџџџџDџџџџџD(џџџџџџџџџџџџџџџ(џџџџџџLџџџџџџџџџџџџџџџџџџџD"џџџџџџџџџџџџџџџџџџџџџџџџџ0"џџџџџџYџџџџџџџџџџ…џџџџџџџџџlџџџџџџџџџџџџџџџџtџџџџџџџџџУџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџР џџџџџ Dџџџџџџ Lџџџџџџџџџџџџџџџџџџџ@џџџџџџDџџџџџџџџџpџџџџџСџџџџџџDџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџ1џџџџџџџџџџџџџџџ1џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџnџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ/џџџџџ/џџџџџ0џџџџџа0џџџџџџ‘џџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџ  џџџџџ *џџџџџџџџџџџџџџџd*џџџџџ џџџџџџќџџџџџџџџџџчџџџџџџџџџ џџџџџџФџџџџџџџџџџџџџџ)џџџџџџџџџџџџџџџФ)џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ DџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџbџџџџџџџџџџџџџџџ]є\C114u7@N.P.CCeramicCAP_CERAMICWF(""1!2ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ Pџџ, R104k7RResistorRESISTOREF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§nkPad"Pad (Flying Wire)PAD_FLYINGWIREWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп, R7470RRResistorRESISTORSF(1 2ПЧ =pЃз ?Ч =pЃз ПдzсGЎ{?дzсGЎ{@V€‚Я§Пъ=pЃз >П”zсGЎxПй™™™™™š?й™™™™™™@V€‚Я§?”zсGЎx?ъ=pЃз >Пй™™™™™š?й™™™™™™@V€‚Я§ПЧ =pЃз ?Ч =pЃз ПдzсGЎ{ПдzсGЎ{@V€‚Я§ПЧ =pЃз ?Ч =pЃз ?дzсGЎ{?дzсGЎ{@V€‚Я§Пъ=pЃз >П”zсGЎxПй™™™™™š?й™™™™™™@J€РJ€‚Я§?”zсGЎx?ъ=pЃз >Пй™™™™™š?й™™™™™™@m @_Р‚Я§џШC Wire4 Wire4WireWire WF(12П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџd:4InPadPadPADWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџџ,R1847kRResistorRESISTORWF(12ПњсGЎzс?њсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§Р\(ѕТПјQы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?јQы…ИR@\(ѕТПй™™™™™š?й™™™™™™@V€‚Я§ПњсGЎzс?њсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПњсGЎzс?њсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§Р\(ѕТПјQы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?јQы…ИR@\(ѕТПй™™™™™š?й™™™™™™@m @_Р‚Я§ndPad"Pad (Flying Wire)PAD_FLYINGWIREWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп    џџџџџџџџ    @IC3 TL062ICDIPDIP WF(12345!6"78П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€   d?10 Rate3PadPadPADWF(!1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R23100kRResistorRESISTOR EF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§niPad"Pad (Flying Wire)PAD_FLYINGWIRE WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџџџџџџџџџџџџџШD Wire5 Wire5WireWire WF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџє1C1010nCCeramicCAP_CERAMICEF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџџ, R910kRResistorRESISTORWF( 12ПњсGЎzс?њсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§Р\(ѕТПјQы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?јQы…ИR@\(ѕТПй™™™™™š?й™™™™™™@V€‚Я§ПњсGЎzс?њсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПњсGЎzс?њсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§Р\(ѕТПјQы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?јQы…ИR@\(ѕТПй™™™™™š?й™™™™™™@m @_Р‚Я§nmPad"Pad (Flying Wire)PAD_FLYINGWIRE WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџШ= Wire3 Wire3WireWire WF(12П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџd;5OutPadPadPADWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџ6D4 1N4148D Diode DIODE WF(1#2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џfD?у333332?у333332Пй™™™™™š?й™™™™™š@V€џfD?фЬЬЬЬЬЬ?фЬЬЬЬЬЬПй™™™™™š?й™™™™™š@V€џfD?ѕ™™™™™™?ѕ™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џfDџє,C5220nCCeramicCAP_CERAMICWF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,R1210kRResistorRESISTOR WF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џє+C41n5CCeramicCAP_CERAMICEF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PnPPad"Pad (Flying Wire)PAD_FLYINGWIRE WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп    џџџџџџџџ    @IC1 NE5532ICDIPDIP WF(12345678П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€   џџШ< Wire2 Wire2WireWire WF(%%1%%2Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџ5D3 IN4148D Diode DIODEEF(#12ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џfD?Й™™™™™˜?Й™™™™™˜Пй™™™™™š?й™™™™™š@V€џfD?У333334?У333334Пй™™™™™š?й™™™™™š@V€џfD?ы333333?ы333333Пй™™™™™š?й™™™™™š@V€џfDПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џfDџџ,R2115kRResistorRESISTOR WF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d82Throw1_(Swirl)PadPadPADWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџ џ џ  џ  џ џ џ ш]C12470uC(Electrolytic 300 milCAP_ELECTRO_300WF(12Пј?јПј?ј@V€ŠŠф?ђffffff?ђffffffПюИQы…И?юИQы…И@V€ŠŠфПј?јПј?ј@V€ŠŠфџџ,"R31100kRResistorRESISTOREF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџџ,R1610kRResistorRESISTORWF(12ПњсGЎzс?њсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§Р\(ѕТПјQы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?јQы…ИR@\(ѕТПй™™™™™š?й™™™™™™@V€‚Я§ПњсGЎzс?њсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПњсGЎzс?њсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§Р\(ѕТПјQы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?јQы…ИR@\(ѕТПй™™™™™š?й™™™™™™@m @_Р‚Я§nbPadPad (Fly Wire)PAD_FLYINGWIREWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџє(C110nCCeramicCAP_CERAMICEF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,R2833kRResistorRESISTOR EF(1&2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§є/C810uCCeramicCAP_CERAMIC WF(12ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PnjPad"Pad (Flying Wire)PAD_FLYINGWIRE WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R1510kRResistorRESISTOR EF(1%2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§є0C910uCCeramicCAP_CERAMIC EF(12ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PdZ+9V+9VPadPadPADWF(*1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ, R810kRResistorRESISTOR EF( 1%2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R510kRResistorRESISTOREF(1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,WR3722RRResistorRESISTORWF(1*2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џџџџџџџџШ2 Wire1 Wire1WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџџ,R13470RRResistorRESISTOREF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§4D2 RedLEDD Diode DIODEWF((1%2ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џfD?Й™™™™™˜?Й™™™™™˜Пй™™™™™š?й™™™™™š@V€џfD?У333334?У333334Пй™™™™™š?й™™™™™š@V€џfD?ы333333?ы333333Пй™™™™™š?й™™™™™š@V€џfDПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џfDџџџџџџџџџџџџџџШE Wire6 Wire6WireWire WF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџє.C71uCCeramicCAP_CERAMICEF(12ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ Pџџ, R6470RRResistorRESISTORWF(1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џXD5 1N4001D Diode DIODEEF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џfD?у333332?у333332Пй™™™™™š?й™™™™™š@V€џfD?фЬЬЬЬЬЬ?фЬЬЬЬЬЬПй™™™™™š?й™™™™™š@V€џfD?ѕ™™™™™™?ѕ™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џfDџ3D1 1N4148D Diode DIODE WF(&&1'2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џfD?у333332?у333332Пй™™™™™š?й™™™™™š@V€џfD?фЬЬЬЬЬЬ?фЬЬЬЬЬЬПй™™™™™š?й™™™™™š@V€џfD?ѕ™™™™™™?ѕ™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џfD,R14470RRResistorRESISTORSF(12ПЧ =pЃз ?Ч =pЃз ПдzсGЎ{?дzсGЎ{@V€‚Я§Пъ=pЃз >П”zсGЎxПй™™™™™š?й™™™™™™@V€‚Я§?”zсGЎx?ъ=pЃз >Пй™™™™™š?й™™™™™™@V€‚Я§ПЧ =pЃз ?Ч =pЃз ПдzсGЎ{ПдzсGЎ{@V€‚Я§ПЧ =pЃз ?Ч =pЃз ?дzсGЎ{?дzсGЎ{@V€‚Я§Пъ=pЃз >П”zсGЎxПй™™™™™š?й™™™™™™@J€РJ€‚Я§?”zсGЎx?ъ=pЃз >Пй™™™™™š?й™™™™™™@m @_Р‚Я§џє*C322nCCeramicCAP_CERAMICEF(1 2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PnlPad"Pad (Flying Wire)PAD_FLYINGWIRE WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпnGPad"Pad (Flying Wire)PAD_FLYINGWIREWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпnfPad"Pad (Flying Wire)PAD_FLYINGWIREWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп,R20100kRResistorRESISTORSF(12ПЧ =pЃз ?Ч =pЃз ПдzсGЎ{?дzсGЎ{@V€‚Я§Пъ=pЃз >П”zсGЎxПй™™™™™š?й™™™™™™@V€‚Я§?”zсGЎx?ъ=pЃз >Пй™™™™™š?й™™™™™™@V€‚Я§ПЧ =pЃз ?Ч =pЃз ПдzсGЎ{ПдzсGЎ{@V€‚Я§ПЧ =pЃз ?Ч =pЃз ?дzсGЎ{?дzсGЎ{@V€‚Я§Пъ=pЃз >П”zсGЎxПй™™™™™š?й™™™™™™@J€РJ€‚Я§?”zсGЎx?ъ=pЃз >Пй™™™™™š?й™™™™™™@m @_Р‚Я§џШH Wire7 Wire7WireWire WF(12П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџnSPad"Pad (Flying Wire)PAD_FLYINGWIRE WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџ,R11MRResistorRESISTOREF(12ПхТ\(ѕТ?хТ\(ѕТПдzсGЎ{?дzсGЎ{@V€‚Я§ПѕИQы…ПрЃз =pЄПй™™™™™š?й™™™™™™@V€‚Я§?рЃз =pЃ?ѕИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПхТ\(ѕТ?хТ\(ѕТПдzсGЎ{ПдzсGЎ{@V€‚Я§ПхТ\(ѕТ?хТ\(ѕТ?дzсGЎ{?дzсGЎ{@V€‚Я§ПѕИQы…ПрЃз =pЄПй™™™™™š?й™™™™™™@J€РJ€‚Я§?рЃз =pЃ?ѕИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џє)C24n7CCeramicCAP_CERAMICEF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ P,R1947kRResistorRESISTORSF(12ПЧ =pЃз ?Ч =pЃз ПдzсGЎ{?дzсGЎ{@V€‚Я§Пъ=pЃз >П”zсGЎxПй™™™™™š?й™™™™™™@V€‚Я§?”zсGЎx?ъ=pЃз >Пй™™™™™š?й™™™™™™@V€‚Я§ПЧ =pЃз ?Ч =pЃз ПдzсGЎ{ПдzсGЎ{@V€‚Я§ПЧ =pЃз ?Ч =pЃз ?дzсGЎ{?дzсGЎ{@V€‚Я§Пъ=pЃз >П”zсGЎxПй™™™™™š?й™™™™™™@J€РJ€‚Я§?”zсGЎx?ъ=pЃз >Пй™™™™™š?й™™™™™™@m @_Р‚Я§nePad"Pad (Flying Wire)PAD_FLYINGWIREWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпd>9Rate1,2PadPadPADWF( 1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп,R215kRResistorRESISTORSF(12ПЧ =pЃз ?Ч =pЃз ПдzсGЎ{?дzсGЎ{@V€‚Я§Пъ=pЃз >П”zсGЎxПй™™™™™š?й™™™™™™@V€‚Я§?”zсGЎx?ъ=pЃз >Пй™™™™™š?й™™™™™™@V€‚Я§ПЧ =pЃз ?Ч =pЃз ПдzсGЎ{ПдzсGЎ{@V€‚Я§ПЧ =pЃз ?Ч =pЃз ?дzсGЎ{?дzсGЎ{@V€‚Я§Пъ=pЃз >П”zсGЎxПй™™™™™š?й™™™™™™@J€РJ€‚Я§?”zсGЎx?ъ=pЃз >Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,TR383k6RResistorRESISTORWF("1)2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џє-C64n7CCeramicCAP_CERAMICEF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,R2247kRResistorRESISTOR EF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§nhPad"Pad (Flying Wire)PAD_FLYINGWIRE WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdF0VPad1PadPadPADWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R174k7RResistorRESISTOR EF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d93Throw2_(Whirl)PadPadPADWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпd71PolePadPadPAD WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdU14Flash_LED+PadPadPADWF()1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп,R347kRResistorRESISTOREF(12ПЧ =pЃз ?Ч =pЃз ПдzсGЎ{?дzсGЎ{@V€‚Я§Пъ=pЃз >П”zсGЎxПй™™™™™š?й™™™™™™@V€‚Я§?”zсGЎx?ъ=pЃз >Пй™™™™™š?й™™™™™™@V€‚Я§ПЧ =pЃз ?Ч =pЃз ПдzсGЎ{ПдzсGЎ{@V€‚Я§ПЧ =pЃз ?Ч =pЃз ?дzсGЎ{?дzсGЎ{@V€‚Я§Пъ=pЃз >П”zсGЎxПй™™™™™š?й™™™™™™@J€РJ€‚Я§?”zсGЎx?ъ=pЃз >Пй™™™™™š?й™™™™™™@m @_Р‚Я§dA12 Depth2PadPadPAD WF($1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,$R3368kRResistorRESISTOR EF(1"2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R43k9RResistorRESISTOR WF(1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dB13 Depth3PadPadPADWF(#1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп        џџџџџџџџџџџџџџџџ        @IC4LM13600ICDIPDIP WF( 1 2 3 4 56 78910111213141516РЬЬЬЬЬЭ@ЬЬЬЬЬЭП§™™™™™š?§™™™™™š@V€   РЬЬЬЬЬЭРЬЬЬЬЬЭП§™™™™™šПа@V€   РЬЬЬЬЬЭРЬЬЬЬЬЭ?а?§™™™™™š@V€   РЬЬЬЬЬЭ@ЬЬЬЬЬЭ?§™™™™™š?§™™™™™š@V€   @ЬЬЬЬЬЭРЬЬЬЬЬЭП§™™™™™šП§™™™™™š@V€   @ЬЬЬЬЬЭ@ЬЬЬЬЬЭ?§™™™™™šП§™™™™™š@V€   РffffffР ЬЬЬЬЬЭПа?аРV€@V€   n[PadPad (Fly Wire)PAD_FLYINGWIRE WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,#R32220kRResistorRESISTOREF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§    џџџџџџџџ    @IC2 TL062ICDIPDIP WF(1234$5&6%78П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€   џџ,R24100kRResistorRESISTORWF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R25100kRResistorRESISTOREF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R26270kRResistorRESISTOR WF(1&&2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R273k3RResistorRESISTOR EF(1'2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ, R2968kRResistorRESISTORWF((1&2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,!R30100kRResistorRESISTOR WF(%1&2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,%R3412kRResistorRESISTOR SF(1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,&R35820kRResistorRESISTOR WF( 1!2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R113k9RResistorRESISTOR WF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,'R364k7RResistorRESISTOR WF("1#2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d@11 Depth1PadPadPADWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпB@џџџўINVALID TracksWF(џџџ€џџџ€џџџ€џџџ€џџџџџџџџF#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Р@Р@@V€џџ’ ЮVeroRoute/Src/Template.h000644 001750 001750 00000006517 14427313144 015423 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include "Component.h" class Template : public Component { public: Template() {} Template(const Template& o) : Component() { *this = o; } Template& operator=(const Template& o) { Component::operator=(o); // Call operator= in base class return *this; } virtual ~Template() override {} bool MakeTemplate(const Component& o) // Clears data not relevant to the template definition { Component::operator=(o); // Call operator= in base class SetImportStr( GetFullImportStr() ); if ( GetIsTemplate() ) return true; // Nothing more to do switch( GetType() ) { case COMP::TO92: case COMP::TO18: case COMP::TO39: case COMP::TO220: case COMP::SOIC8: case COMP::SOIC14: case COMP::SOIC16: case COMP::SOIC14W: case COMP::SOIC16W: case COMP::SOIC20W: case COMP::SOIC24W: case COMP::SOIC28W: case COMP::DIP: case COMP::DIP_RECTIFIER: case COMP::SIP: case COMP::CUSTOM: SetId(BAD_COMPID); // This bad ID indicates the component is actually a template // Wipe irrelevant data SetNameStr(""); for (size_t i = 0; i < GetNumPins(); i++) { SetNodeId(i, BAD_NODEID); for (int lyr = 0; lyr < 2; lyr++) SetOrigId(lyr, i, BAD_NODEID); } SetRow(0); SetCol(0); SetDirection('W'); SetIsPlaced(false); return true; default: return false; } } bool IsLessThan(const Template& o, bool bGeneric) const { if ( bGeneric ) return *this < o; std::string a = GetFullTypeStr(); std::string b = o.GetFullTypeStr(); int i = a.compare( b ); // Compare Type strings if ( i != 0 ) return i < 0; return GetValueStr().compare( o.GetValueStr() ); // Compare Value strings } bool operator<(const Template& o) const { // First order by type if ( CompTypes::GetListOrder(GetType()) != CompTypes::GetListOrder(o.GetType()) ) return CompTypes::GetListOrder(GetType()) < CompTypes::GetListOrder(o.GetType()); if ( GetType() != o.GetType() ) return static_cast(GetType()) < static_cast(o.GetType()); // .. then by least pins if ( GetNumPins() != o.GetNumPins() ) return GetNumPins() < o.GetNumPins(); // ... then by type string comparison const int iCompareType = GetTypeStr().compare( o.GetTypeStr() ); if ( iCompareType != 0 ) return iCompareType < 0; // ... then by value string comparison const int iCompareVal = GetValueStr().compare( o.GetValueStr() ); return iCompareVal < 0; } bool operator==(const Template& o) const { return GetType() == o.GetType() && GetNumPins() == o.GetNumPins() && GetTypeStr() == o.GetTypeStr() && GetValueStr() == o.GetValueStr(); } }; VeroRoute/libraries/TinyCAD/VeroRoute_Passive.TCLib000644 001750 001750 00000776000 13515171160 022460 0ustar00alexalex000000 000000 SQLite format 3@ ^ћћ.!%%‚tableSymbolSymbolCREATE TABLE [Symbol] ([SymbolID] INTEGER PRIMARY KEY,[Data] TEXT)ƒ8!†9tableNameNameCREATE TABLE [Name] ([NameID] INTEGER PRIMARY KEY,[Name] TEXT,[SymbolID] INTEGER,[Type] INTEGER,[Reference] TEXT,[ppp] INTEGER,[Description] TEXT,[ShowName] INTEGER,[ShowRef] INTEGER,[DefRotate] INTEGEіъћіёQЫˆCБ†W~ѓ=%AMN3006lU?128-St- -CAP-FILMkC?Film) !!DIODEjD?DiodeM EEDIODE-SCHOTTKYiD?Schottky DiodeA 99DIODE-ZENERhD?Zener DiodeC ]LEDgD?Light Emitting DiodeA )ESW-3PDTfSW?Off Board 3PDTA )ESW-DPDTeSW?Off Board DPDTA )ESW-SPDTdSW?Off Board SPDTA )ESW-SPSTcSW?Off Board SPST5 --RESISTORbR?ResistorG =AOPAMP-SINGLEaU?Single Op Amp; )=SPEAKER`S?Loud SpeakerZ  RV_RV?Resistor Variable. (Off-board)Q yRT^RT?Resistor Trimmer (On-AuVMGEw§ЮЩьчАФПЕЋІЁћіœ—’ˆƒ~yКтниjto$B=83.)d^XRL ћѕящунзбЫХПЙГ­ЇЁ›•‰ƒ}wˆ -10 &7;2I0=)qP6* ё^?WAVU  `P<X:тџњюєштт6ќТЂh.Ь’p6 8i$$SPICE_PROLOG_PRIORITY5 )!PackagePADS28i$$SPICE_EPILOG_PRIORITY58i$$SPICE_PROLOG_PRIORITY5&)-PackageRESISTOR8i$$SPICE_EPILOG_PRIORITY58 i$$SPICE_PROLOG_PRIORITY5 )PackageDIP88 i$$SPICE_EPILOG_PRIORITY58 i$$SPICE_PROLOG_PRIORITY5 )!PackagePADS28i$$SPICE_EPILOG_PRIORITY58i$$SPICE_PROLOG_PRIORITY5 )!PackagePADS38i$$SPICE_EPILOG_PRIORITY58i$$SPICE_PROLOG_PRIORITY5()1PackageTRIM_VERT8i$$SPICE_EPILOG_PRIORITY58i$$SPICE_PRэ‚-У‚zcмs: ””OЫƒ8!†9tableNameNameCREATE TABLE [Name] ([NameID] INTEGER PRIMARY KEY,[Name] TEXT,[SymbolID] INTEGER,[Type] INTEGER,[Reference] TEXT,[ppp] INTEGER,[Descriptƒ8!†9tableNameNameCREATE TABLE [Name] ([NameID] INTEGER PRIMARY KEY,[Name] TEXT,[SymbolID] INTEGER,[Type] INTEGER,[Reference] TEXT,[ppp] INTEGER,[Description] TEXT,[ShowName] INTEGER,[ShowRef] INTEGER,[DefRotate] INTEGER).!%%‚tableSymbolSymbolCREATE TABLE [Symbol] ([SymbolID] INTEGER PRIMARY KEY,[Data] TEXT) І-О RKD=‘Š`YƒungИљђ6/(Ÿ˜БЊфнжЯ!ШОгЬХск|яшы§іСфффœœœРРРввввввTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT6){0)z*)y$(x (w(vH'u 't'sŠ$&rŠ&qŠ&pŠ%oŠ %nŠ%mЎ$lЎ $kЎ$jв%oв %nв%mіH"fіB"eі<"dі6(xі (wі(vЦ'uі'tі'sі){і )zі)y6Z0Y*X$WL VLUTL SLRQ POT SR˜W˜ V˜U˜Z˜ Y˜X˜]˜ \˜[˜ `˜ _˜ ^в(xв (wв(vж>Кж>Йж >ИжHжRѕ! a#b&b%b$c(c'd+d*e.e-SїИ1“1’1‘a!QѓQђQёIй=З=Ж=ЕJнJмMчMцMхc)JоIлIкSљSјTћTњOыe/a"` ``Tќd,OэOь &&[‚2!11„tableAttributeAttributeCREATE TABLE [Attribute] ([AttributeID] INTEGER PRIMARY KEY,[NameID] INTEGER,[AttName] TEXT,[AttValue] TEXT,[ShowAtt] INTEGER)"!51aindexidx_NameIDAttributeCREATE INDEX [idx_NameID] ON [Attribute] ( [NameID] )>0 400 0 0 0 0 Arial 000000 1 -1 000000 000' which='0' elec='0' direction='0' part='0' number='5' show='3' >0 400 0 0 0 0 Arial
000000 1 -1 000000
ЪЪTALIC> 0 0 0 Arial 000000 –'[ЌR -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 0 400 0 0 0 0 Arial 000000 1 -1 000000 C>0 0 0 0 Arial 000000 1 -1 000000 ŸŸ џџˆ D -10 -10 0 400 0 0 0 -10 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 ћ\\—в лУУУУУУУУУЩЩ668 Ђаi8 i$$SPICE_PROLOG_PRIORITY58i$$SPICE_EPILOG_PRIORITY5&)-Pacћ:i$$SPICE_PROLOG_PRIORITY5ћ:i$$SPICE_EPILOG_PRIORITY5ћ()-PackageRESISTOR8i1$$SPICE_PROLOG_PRIORITY58i1$$SPICE_EPILOG_PRIORITY5&)-1PackageCAP_FILMMЅi2$$SPICE_PROLOG_PRIORITY5;i2$$SPICE_EPILOG_PRIORITY5/)92PackageCAP_CERAMIC85i=$$SPICE_PROLOG_PRIORITY586i=$$SPICE_EPILOG_PRIORITY547)I=PackageCAP_ELECTRO_200Гi>$$SPICE_PROLOG_PRIORITY5;i>$$SPICE_EPILOG_PRIORITY5=)U>PackageCAP_ELECTRO_NP_200 ˜ўfЬ2ўў]}ЗёK…Їс=wБг81i$$SPICE_PROLOG_PRIORITY582i$$SPICE_EPILOG_PRIORITY5 3)!PackageTRIM684i$$SPIC‰U’" -10 0 400 -10 0 400 -10 0 400 -10 0 400 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 ' elec='0' direction='0' part='0' number='1' show='3' length='15' number_pos='0' centre_name='0'> ' elec='0' direction='0' part='0' number='1' show='3' length='15' number_pos='0' centre_name='0'>   ‹h —T -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 ' elec='0' direction='0' part='0' number='1' show='3' length='15' number_pos='0' centre_name='0'>   ‹h —T -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 000000 1 -1 000000 jjYЧ’ˆ D -10 0 400 0 0 0 0 -10 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 (ˆ D -10 Arial 000000 1 -1 000000 4.00000,22.00000' which='0' elec='0' direction='1' part='0' number='1' show='3' length='12' number_pos='0' centre_name='0'> >0 400 0 0 0 0 Arial 000000 1 -1 000000 Щ,,Raꇇ‡‡]5 --RES$1 82nЂC?Filmu= A1uЎC?Electrolytic, Pitch 100 mil, Diameter 200 milS˜‚1uЏC?Electrolytic (Non-Polarised), Pitch 100 mil, Diameter 200 milwI A3u3КC?Electrolytic, Pitch 200 mil, Diameter 300 milwJ A4u7ЛC?Electrolytic, Pitch 200 mil, Diameter 400 mil4‚3u3МC?Electrolytic (Non-Polarised), Pitch 200 mil, Diameter 300 milš‚4u7НC?Electrolytic (Non-Polarised), Pitch 200 mil, Diameter 400 milwM A5u6ОC?Electrolytic, Pitch 300 mil, Diameter 500 milC>0 0 0 0 Arial 000000 1 -1 000000 4.00000,22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'> f00fI‰ЁХмэ"2–']ЌR -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 -1 00›’" -10 0 400 -10 0 400 -10 0 400 -10 0 400 -10 0 400 -10 0 400 C>0 0 0 0 Arial 000000 1 -1 000000 o’ЙKнoЖ style='2' fill='0'/> -10 -10 -10 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 3' length='20' number_pos='0' centre_name='0'> --’—HŸ -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 >0 400 0 0 0 0 Arial 000000 1 -1 000000 >0 400 0 0 0 0 Arial 000000 1 -1 000000 pos='0.05000,0.15000' arc='0'/> 0 400 0 0 0 0 Arial 000000 1 -1 000000 27.04000,37.88000' style='4' fill='0'/> >0 400 0 0 0 0 Arial 000000 1 -1 000000 C>0 0 0 0 Arial 000000 1 -1 000000 3' length='20' number_pos='0' centre_name='0'> 2.00000,28.00000' which='0' elec='0' direction='0' part='0' number='1' show='3' length='12' number_pos='0' centre_name='0'> OLYGON pos='58.00000,48.00000' style='2' fill='0'> 3ber='3' show='3' length='20' number_pos='0' centre_name='0'>

-10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 2.00000,28.00000' which='0' elec='0' direction='0' part='0' number='1' show='3' length='12' number_pos='0' centre_name='0'> N'Nos='0.00000,1.00000' arc='0'/> -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 њ!!hжDD‹N — -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 -10 -10 -10 0 400 0 00 400 0 0 0 0 Arial 000000 1 -1 000000 A+ 95Switch SPDT,SW?DIP SWITCH --И ћHWŸ -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 --"2HVŸ -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 000000 1 -1 000000 RLINE> 0 0 Arial 000000 1 -1 000000 F Arial 000000 1 -1 000000 Speaker OLYGON pos='58.00000,48.00000' style='2' fill='0'> Eber='3' show='3' length='20' number_pos='0' centre_name='0'> œ( рr–((ˆ 0D -10 ˆ /D -10 -10 -10 -10 0 400 0 0 -10 -10 0 400 0 0 0 0D4.00000,22.00000' which='0' elec='0' direction='1' part='0' number='1' show='3' length='12' number_pos='0' centre_name='0'> C>0 0 0 0 Arial 000000 1 -1 000000 4.00000,22.00000' which='0' elec='0' direction='1' part='0' number='1' show='3' length='12' number_pos='0' centre_name='0'> 4.00000,22.00000' which='0' elec='0' direction='1' part='0' number='1' show='3' length='12' number_pos='0' centre_name='0'> N'NNˆЊфЖ{LSёХЗŽЃh9,)9,Packag‹N>— -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 N'Nн!!‰1)’f‹N<— -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 000000 1 -1 000000 Electrolytic 1 pitch, 3 diameterE id='2'> 000000 1 -1 000000 >0 400 0 0 0 0 Arial 000000 1 -1 000000 >0 400 0 0 0 0 Arial 000000 1 -1 000000 RLINE> 0 0 Arial 000000 1 -1 000000 >0 400 0 0 0 0 Arial 000000 1 -1 000000 C>0 0 0 0 Arial 000000 1 -1 000000 $KKKK‹N:— -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 -10 N'N‹N@— -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 4.00000,22.00000' which='0' elec='0' direction='1' part='0' number='1' show='3' length='12' number_pos='0' centre_name='0'> N'N‹NB— -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 4.00000,22.00000' which='0' elec='0' direction='1' part='0' number='1' show='3' length='12' number_pos='0' centre_name='0'> N'N‹ND— -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 000000 1 -1 000000 4.00000,22.00000' which='0' elec='0' direction='1' part='0' number='1' show='3' length='12' number_pos='0' centre_name='0'> 4.00000,22.00000' which='0' elec='0' direction='1' part='0' number='1' show='3' length='12' number_pos='0' centre_name='0'> 4.00000,22.00000' which='0' elec='0' direction='1' part='0' number='1' show='3' length='12' number_pos='0' centre_name='0'> N'N‹NF— -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 4.00000,22.00000' which='0' elec='0' direction='1' part='0' number='1' show='3' length='12' number_pos='0' centre_name='0'> N'N‹NH— -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 4.00000,22.00000' which='0' elec='0' direction='1' part='0' number='1' show='3' length='12' number_pos='0' centre_name='0'> N'N‹NJ— -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 4.00000,22.00000' which='0' elec='0' direction='1' part='0' number='1' show='3' length='12' number_pos='0' centre_name='0'> N'N‹NL— -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 000000 1 -1 000000 4.00000,22.00000' which='0' elec='0' direction='1' part='0' number='1' show='3' length='12' number_pos='0' centre_name='0'> Y'ѓY‰P’" -10 0 400 -10 0 400 -10 0 400 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 N'NENAME>Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 s Arial 000000 1 -1 000000 Speaker C>0 0 0 0 Arial 000000 1 -1 000000 4.00000,22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'> з}}Иѓ*e ХХХХХХХХХХХN/PIN> 000000 1 -1 000000 E id='2'> 000000 1 -1 000000 >0 400 0 0 0 0 Arial 000000 1 -1 000000 Pitch 200 mil, Diameter 300 milE id='2'> 000000 1 -1 000000 ВйВ2ЗМ$4ЄЉ$4ЄЉ"2ЗМ"2ЗМ$ЉЄКЄ4ЕЉЄЉЄК•ЂЁ”: -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 4.00000,22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'> %%Пmber_pos='0' centre_name=‰_’" -10 0 400 b -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 >0 400 0 0 0 0 Arial 000000 1 -1 000000 NN'0' number_pos='0' centre_name='0'>CP1 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 000000 1 -1 000000 ,40.00000' b='66.00000,64.00000' style='2' fill='0'/> 4.00000,22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'> 4.00000,22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'> N'N”гYСў;zЗ++}~ѓ=%AMN3006lU?12‹Nu— -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 000000 1 -1 000000 4.00000,22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'> E id='2'> 000000 1 -1 000000 E id='2'> 000000 1 -1 000000 џ&џŠ%”: -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 000000 1 -1 000000 ‹йВ‹ЗМ$4ЄЉ$4ЄЉ"2ЗМŠ”: -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial CP1 IN VGG -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial -10 -10 -10 -10 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 000000 1 -1 000000 Speaker 4.00000,22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'>   w YGON> -10 -10 0 400 -10 0 400 0 0 0 0Д‘gЃR -10 0 400 0 0 0 0К E id='2'> 000000 1 -1 000000 E id='2'> 000000 1 -1 000000 E id='2'> 000000 1 -1 000000 E id='2'> 000000 1 -1 000000 8 8s='0.00000,0.00000' arc='0'/> -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0“‘g ЃR -10 0 400 0 0 0 0w џ&џPм f,іx=======8i-$$SPICE_EPILOG_PRIORITY58i-$$SPICE_PROLOG_PRIORITY5C)-,PackageCAP_FILMvi,$$SPICE_EPILOЁ'”: -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 -10 0 -10 -10 0 400 0 0 0 0 Arial 0 400 0 0 0 0 Arial 000000 1 -1 000000 ='0' elec='4' direction='3' part='0' number='2' show='3' lengthœ L&L‹N— -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 000000 1 -1 000000 4.00000,22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'> 4.00000,22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'> >0 400 0 0 0 0 Arial 000000 1 -1 000000 E id='2'> 000000 1 -1 000000 !&џ!ˆ #D -10 -10 -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 E id='2'> 000000 1 -1 000000 4.00000,22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'> L&LV(khV(khV(khV(k‹N— -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 000000 1 -1 000000 4.00000,22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'> 4.00000,22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'> 4.00000,22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'> >0 400 0 0 0 0 Arial 000000 1 -1 000000 C>0 0 0 0 Arial 000000 1 -1 000000 4.00000,22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'> >0 400 0 0 0 0 Arial 000000 1 -1 000000 Е Arial 000000 1 -1 000000 Speaker E id='2'> 000000 1 -1 000000 E id='2'> 000000 1 -1 000000 4.00000,22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'> џ&џМЋМœОŽЂ}ЄЅІЇ|Њ­ГЌА„’™œ—oЖ{šrВ|ЈЉ‚ЎŸ”В‚ xa#%0'> -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 000000 1 -1 000000 Speaker 4.00000,22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'> 4.00000,22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'> E id='2'> 000000 1 -1 000000 E id='2'> 000000 1 -1 000000 4.00000,22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'> џ&џŠ-”: -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 000000 1 -1 000000 šVV‘Ьћ6qХХХ-----MмiX$$SPICE_EPILOG_PRIORITY5MЁiX$$SPICE_PROLOG_PRIORITY5Mf)UWPackageCAP_ELECTRO_300_NPM)iW$$SPICE_EPILOG_PRIORITY5MюiW$$SPICE_PROLOG_PRIORITY58wiS$$SPICE_PROLOG_PRIORITY58xiS$$SPICE_EPILOG_PRIORITY5,y)9SPackageCAP_CERAMIC8ziT$$SPICE_PROLOG_PRIORITY58{iT$$SPICE_EPILOG_PRIORITY5&|)-TPackageRESISTORfiZ$$SPICE_PROLOG_PRIORITY5M;iZ$$SPICE_EPILOG_PRIORITY5M=)UZPackageCAP_ELECTRO_600_NPГ)U]PackageCAP_ELECTRO_300_NP;i^$$SPICE_PROLOG_PRIORITY5;i^$$SPICE_EPILOG_PRIORITY54.00000,22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'> џ&џŠ/”: -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 000000 1 -1 000000 4.00000,22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'> џ&џŠ1”: -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 000000 1 -1 000000 4.00000,22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'> џ&џŠ3”: -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 000000 1 -1 000000 E id='2'> 000000 1 -1 000000 4.00000,22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'> L&L‹N5— -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 ВйВŠ7”: -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 4.00000,22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'> џ&џŠ9”: -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 000000 1 -1 000000 4.00000,22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'> L&L‹N;— -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 E id='2'> 000000 1 -1 000000 ВйВŠ=”: -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial 000000 1 -1 000000  VˆM(эЖШVVVVVVVV4s)IQPackageCAP_ELECTRO_2508riQ$$SPICE_EPILOG_PRIORITY58qiQ$$SPICE_PROLOG_PRIORITY5cГ)UPPackageCAP_ELECTRO_NP_500УviP$$SPICE_EPILOG_PRIORITY5У;iP$$SPICE_PROLOG_PRIORITY54m)IOPackageCAP_ELECTRO_6008liO$$SPICE_EPILOG_PRIORITY58kiO$$SPICE_PROLOG_PRIORITY5УГ)UNPackageCAP_ELECTRO_NP_600УviN$$SPICE_EPILOG_PRIORITY5У;iN$$SPICE_PROLOG_PRIORITY54g)IMPackageCAP_ELECTRO_5008fiM$$SPICE_EPILOG_PRIORITY58eiM$$SPICE_PROLOG_PRIORITY5=)ULPackageCAP_ELECTRO_NP_4004.00000,22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'> џ&џŠ?”: -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 џ&џŠA”: -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 000000 1 -1 000000 4.00000,22.00000' which='0' elec='4' direction='1' part='0' number='1' show='1' length='12' number_pos='0' centre_name='0'> &џˆ DD -10 -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 000000 1 -1 000000 >0 400 0 0 0 0 Arial 000000 1 -1 000000 ОО†>E -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 ‹йВ‹ŠH”: -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 E id='2'> 000000 1 -1 000000 fhЮ4šfe ‚6u8жC?Electrolytic (Non-Polarised), Pitch 300 mil, Diameter 600 mild ‚5u6еC?Electrolytic (Non-Polarised), Pitch 300 mil, Diameter 500 milc ‚4u7дC?Electrolytic (Non-Polarised), Pitch 200 mil, Diameter 400 milb ‚3u3гC?Electrolytic (Non-Polarised), Pitch 200 mil, Diameter 300 mila ‚2u2вC?Electrolytic (Non-Polarised), Pitch 100 mil, Diameter 250 mil` ‚1uбC?Electrolytic (Non-Polarised), Pitch 100 mil, Diameter 200 milE id='2'> 000000 1 -1 000000 ‹йВ‹ŠK”: -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 E id='2'> 000000 1 -1 000000 E id='2'> 000000 1 -1 000000 ‹йВ‹ŠN”: -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 E id='2'> 000000 1 -1 000000 E id='2'> 000000 1 -1 000000 ‹йВ‹ŠQ”: -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 E id='2'> 000000 1 -1 000000 E id='2'> 000000 1 -1 000000 E id='2'> 000000 1 -1 000000 ‹йВ‹ŠT”: -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 E id='2'> 000000 1 -1 000000 ВйВŠV”: -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 ˆХˆ:‚/)UePackageCAP_ELECTRO_600_NP8‚.ie$$SPICE_EPILOG_PRIORITY5VeroRoute/Src/hotkeysdialog.h000644 001750 001750 00000002243 14026030660 016500 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include class MainWindow; class Ui_HotkeysDialog; class HotkeysDialog : public QDialog { Q_OBJECT public: explicit HotkeysDialog(MainWindow* parent = nullptr); ~HotkeysDialog(); protected: void keyPressEvent(QKeyEvent* event); void keyReleaseEvent(QKeyEvent* event); private: void Setup(); Ui_HotkeysDialog* ui; MainWindow* m_pMainWindow; QStringList m_tableHeader; }; VeroRoute/libraries/gEDA/veroroute_linear/OpAmp_LM358.sym000644 001750 001750 00000002530 13515171161 023433 0ustar00alexalex000000 000000 v 20130925 2 T 200 1100 5 10 0 0 0 0 1 slot=1 T 200 1300 5 10 0 0 0 0 1 numslots=2 T 200 1500 5 10 0 0 0 0 1 slotdef=1:3,2,8,4,1 T 200 1700 5 10 0 0 0 0 1 slotdef=2:5,6,8,4,7 P 0 200 200 200 1 0 0 { T 150 250 5 8 1 1 0 6 1 pinnumber=3 T 150 250 5 8 0 0 0 0 1 pinseq=1 T 250 200 9 8 0 1 0 0 1 pinlabel=IN+ T 150 250 5 8 0 0 0 0 1 pintype=in } P 0 600 200 600 1 0 0 { T 150 650 5 8 1 1 0 6 1 pinnumber=2 T 150 650 5 8 0 0 0 0 1 pinseq=2 T 250 600 9 8 0 1 0 0 1 pinlabel=IN- T 150 650 5 8 0 0 0 0 1 pintype=in } P 500 600 500 800 1 0 1 { T 550 600 5 8 1 1 0 0 1 pinnumber=8 T 550 600 5 8 0 0 0 0 1 pinseq=3 T 475 575 9 8 1 1 0 5 1 pinlabel=V+ T 550 600 5 8 0 0 0 0 1 pintype=pwr } P 500 200 500 0 1 0 1 { T 550 100 5 8 1 1 0 0 1 pinnumber=4 T 550 100 5 8 0 0 0 0 1 pinseq=4 T 450 200 9 8 1 1 0 3 1 pinlabel=V- T 550 100 5 8 0 0 0 0 1 pintype=pwr } P 800 400 1000 400 1 0 1 { T 850 450 5 8 1 1 0 0 1 pinnumber=1 T 850 450 5 8 0 0 0 0 1 pinseq=5 T 800 400 9 8 0 1 0 6 1 pinlabel=OUT T 850 450 5 8 0 0 0 0 1 pintype=out } L 200 800 200 0 3 0 0 0 -1 -1 L 200 800 800 400 3 0 0 0 -1 -1 L 800 400 200 0 3 0 0 0 -1 -1 L 300 250 300 150 3 0 0 0 -1 -1 L 250 200 350 200 3 0 0 0 -1 -1 L 250 600 350 600 3 0 0 0 -1 -1 T 600 900 5 10 1 1 0 0 1 device=LM358 T 200 900 8 10 1 1 0 0 1 refdes=U? T 200 1100 8 10 0 0 0 0 1 footprint=DIP8 T 200 1100 8 10 0 0 0 0 1 description=Dual Op Amp VeroRoute/Src/Board_import.cpp000644 001750 001750 00000042263 14423005303 016611 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #include "Board.h" #include #include bool Board::BuildAndPlacePart(TemplateManager& templateMgr, const CompStrings& compStrings, std::list& offBoard, std::string& errorStr, bool& bPartTypeOK) { Component comp; // Only configured if the part type is OK // First see if m_importStr is an alias for a valid import string const std::string& validImportStr = templateMgr.GetImportStrFromAlias(compStrings.m_importStr); CompStrings test(compStrings); // A working copy of compStrings (with possibly modified m_importStr) if ( !validImportStr.empty() ) test.m_importStr = validImportStr; bool bOK = bPartTypeOK = templateMgr.CheckPartOK(test, &offBoard, &errorStr, &comp); if ( !bOK ) templateMgr.AddAlias(compStrings.m_importStr, ""); // Don't have a valid import string yet else { bOK = ( AddComponent(-1, -1, comp) != BAD_COMPID ); // Create the part and place it if ( !bOK ) { const std::string strID = "Part: Name = " + compStrings.m_nameStr + ", Value = " + compStrings.m_valueStr + ", Type = " + compStrings.m_importStr; errorStr = strID + "\nInternal error creating and placing part"; } } return bOK; } // Helper to get all part info from a Protel V1 / Tango file bool Board::GetPartsTango(const std::string& filename, std::list& listOut) const { CompStrings compStrings; // References to keep code tidy std::string& nameStr = compStrings.m_nameStr; // TinyCAD "Ref" / gEDA "refdes" ==> VeroRoute "Name" (e.g. "U4") std::string& valueStr = compStrings.m_valueStr; // TinyCAD "Name" / gEDA "device" ==> VeroRoute "Value" (e.g. "TL072") std::string& importStr = compStrings.m_importStr; // TinyCAD "Package" / gEDA "footprint" ==> VeroRoute "Type" (e.g. "DIP8") QFile file( QString::fromStdString(filename) ); bool bOK = file.open(QIODevice::ReadOnly); if ( !bOK ) return bOK; QTextStream inStream(&file); bool bPart(false), bNet(false); // Flags indicating "part" and "netlist" sections int iRow(0); // Row counter within "part" and "netlist" sections while( bOK ) // Loop through file { if ( inStream.atEnd() ) break; const std::string str = inStream.readLine().toStdString(); if ( str == "[" ) { bOK = !bPart && !bNet; bPart = true; iRow = 0; compStrings.Clear(); continue; } if ( str == "]" ) { bOK = bPart && !bNet; bPart = false; continue; } if ( str == "(" ) { bOK = !bPart && !bNet; bNet = true; iRow = 0; continue; } if ( str == ")" ) { bOK = !bPart && bNet; bNet = false; continue; } if ( bPart ) // We're in a "Part" description section { switch(iRow) { case 0: nameStr = str; break; case 1: importStr = str; break; case 2: valueStr = str; listOut.push_back(compStrings); break; } } iRow++; } if ( file.isOpen() ) file.close(); return bOK; } // Helper to get all part info from an OrcadPCB2 file bool Board::GetPartsOrcad(const std::string& filename, std::list& listOut) const { CompStrings compStrings; // References to keep code tidy std::string& nameStr = compStrings.m_nameStr; // KiCAD "Reference" ==> VeroRoute "Name" (e.g. "U4") std::string& valueStr = compStrings.m_valueStr; // KiCAD "Value" ==> VeroRoute "Value" (e.g. "TL072") std::string& importStr = compStrings.m_importStr; // KiCAD "Footprint" ==> VeroRoute "Type" (e.g. "DIP8") QFile file( QString::fromStdString(filename) ); bool bOK = file.open(QIODevice::ReadOnly); if ( !bOK ) return bOK; QTextStream inStream(&file); bool bPartStart(false); while( bOK ) // Loop through file { if ( inStream.atEnd() ) break; const std::string str = inStream.readLine().toStdString(); if ( str.empty() ) continue; // Skip blank lines // First non-blank char on every line should be '(' or ')' or '*' const bool bCurvedOpen = str.find("(") != std::string::npos; const bool bCurvedClose = str.find(")") != std::string::npos; if ( bCurvedOpen && str.find("{") != std::string::npos && str.find("}") != std::string::npos ) continue; // Line is a comment so skip it if ( !bCurvedOpen && !bCurvedClose ) { if ( str.find("*") != std::string::npos ) break; // reached the '*' bOK = false; //errorStr = "Expecting all lines to start with '('' or ')'' or '*'"; break; } if ( bCurvedOpen && !bPartStart ) { // We're expecting the line to say something like "( /5D5ADFE2 DIP16 IC1 SAD1024" std::vector strList; StringHelper::GetSubStrings(str, strList); // Break str into space separated list const size_t numSubStrings = strList.size(); bOK = ( numSubStrings == 4 || numSubStrings == 5 ); //if ( !bOK ) errorStr = "Expecting format: ( /5D5ADFE2 FOOTPRINT NAME VALUE , but got:" + str; if ( !bOK ) break; importStr = strList[2]; nameStr = strList[3]; valueStr = ( numSubStrings == 5 ) ? strList[4] : ""; listOut.push_back(compStrings); bPartStart = true; } else { // We're in the pin section... assert( bCurvedClose ); // Should have ')' on every line if ( !bCurvedOpen ) { // If we have just a ')' on the line then we're done with the pins ... bPartStart = false; // ... and we're done with the part, move onto the next one continue; } } } if ( file.isOpen() ) file.close(); return bOK; } // Import Protel V1 / Tango netlist (exported from TinyCAD / gEDA) bool Board::ImportTango(TemplateManager& templateMgr, const std::string& filename, std::string& errorStr, bool& bPartTypeOK) { Clear(); CompStrings compStrings; // References to keep code tidy std::string& nameStr = compStrings.m_nameStr; // TinyCAD "Ref" / gEDA "refdes" ==> VeroRoute "Name" (e.g. "U4") std::string& valueStr = compStrings.m_valueStr; // TinyCAD "Name" / gEDA "device" ==> VeroRoute "Value" (e.g. "TL072") std::string& importStr = compStrings.m_importStr; // TinyCAD "Package" / gEDA "footprint" ==> VeroRoute "Type" (e.g. "DIP8") std::string netStr; // Net name QFile file( QString::fromStdString(filename) ); bool bOK = file.open(QIODevice::ReadOnly); if ( !bOK ) return bOK; QTextStream inStream(&file); bool bPart(false), bNet(false); // Flags indicating "part" and "netlist" sections int iRow(0); // Row counter within "part" and "netlist" sections int iNodeId(BAD_NODEID); // Increase this with each imported net std::list offBoard; // List of off-board part names (for breaking into pads) while( bOK ) // Loop through file { if ( inStream.atEnd() ) break; const std::string str = inStream.readLine().toStdString(); if ( str == "[" ) { bOK = !bPart && !bNet; bPart = true; iRow = 0; continue; } if ( str == "]" ) { bOK = bPart && !bNet; bPart = false; continue; } if ( str == "(" ) { bOK = !bPart && !bNet; bNet = true; iRow = 0; continue; } if ( str == ")" ) { bOK = !bPart && bNet; bNet = false; continue; } if ( bPart ) // We're in a "Part" description section { if ( iRow == 0 ) { nameStr = str; bOK = ( nameStr.find("-") == std::string::npos ); // Name should not have a "-" if ( !bOK ) errorStr = "Part section: " + nameStr + "\nPart names must not contain a minus sign"; if ( !bOK ) break; bOK = ( m_compMgr.GetComponentIdFromName(nameStr) == BAD_COMPID ); // Name must be unique if ( !bOK ) errorStr = "Part section: " + nameStr + "\nPart names must be unique"; if ( !bOK ) break; } if ( iRow == 1 ) { importStr = str; } if ( iRow == 2 ) { valueStr = str; // Build the part and place it ... bOK = BuildAndPlacePart(templateMgr, compStrings, offBoard, errorStr, bPartTypeOK); if ( !bOK ) break; } } if ( bNet ) // We're in a "Netlist" description section { if ( iRow == 0 ) { netStr = str; iNodeId++; // str has the net name, so make a new NodeID for it } else { // The line should have a part identifier and pin number separated by a '-'. const auto pos = str.find("-"); bOK = ( pos != std::string::npos ); // Should have a "-" on the line if ( !bOK ) errorStr = "Net section: " + netStr + "\nLine has no minus sign: " + str; if ( !bOK ) break; const std::string pinStr = str.substr(pos+1);; // Pin number bOK = ( pinStr.find("-") == std::string::npos ); // Should only have one "-" on the line if ( !bOK ) errorStr = "Net section: " + netStr + "\nLine has more than one minus sign: " + str; if ( !bOK ) break; const std::string lineNameStr = str.substr(0, pos); bOK = !StringHelper::IsEmptyStr(lineNameStr); // Should have part name if ( !bOK ) errorStr = "Net section: " + netStr + "\nLine has no part identifier: " + str; if ( !bOK ) break; // Paint the component pin using SetNodeIdByUser const size_t iPinIndex = static_cast( atoi(pinStr.c_str()) - 1 ); const int compId = m_compMgr.GetComponentIdFromName(lineNameStr); bOK = compId != BAD_COMPID; if ( !bOK ) errorStr = "Net section: " + netStr + "\nLine has unknown part identifier: " + str; if ( !bOK ) break; const Component& comp = m_compMgr.GetComponentById( compId ); assert( comp.GetType() != COMP::INVALID ); bOK = iPinIndex < comp.GetNumPins(); if ( !bOK ) errorStr = "Net section: " + netStr + "\nLine has invalid pin number: " + str; if ( !bOK ) break; int row, col; bOK = GetPinRowCol(compId, iPinIndex, row, col); if ( !bOK ) errorStr = "Net section: " + netStr + "\nLine: " + str + "\nInternal error mapping the pin to a board location"; if ( !bOK ) break; SetNodeIdByUser(0, row, col, iNodeId, true); // true ==> paint pins } } iRow++; } if ( file.isOpen() ) file.close(); // Break the SIPs representing off-board parts into PADs BreakSIPSintoPADS(offBoard); return bOK; } // Import OrcadPCB2 netlist (exported from KiCAD) bool Board::ImportOrcad(TemplateManager& templateMgr, const std::string& filename, std::string& errorStr, bool& bPartTypeOK) { Clear(); CompStrings compStrings; // References to keep code tidy std::string& nameStr = compStrings.m_nameStr; // KiCAD "Reference" ==> VeroRoute "Name" (e.g. "U4") std::string& valueStr = compStrings.m_valueStr; // KiCAD "Value" ==> VeroRoute "Value" (e.g. "TL072") std::string& importStr = compStrings.m_importStr; // KiCAD "Footprint" ==> VeroRoute "Type" (e.g. "DIP8") QFile file( QString::fromStdString(filename) ); bool bOK = file.open(QIODevice::ReadOnly); if ( !bOK ) return bOK; QTextStream inStream(&file); int maxNodeId(BAD_NODEID); // Increase this with each new node we encounter std::unordered_map mapNetToNodeId; std::list offBoard; // List of off-board part names bool bPartStart(false); while( bOK ) // Loop through file { if ( inStream.atEnd() ) break; const std::string str = inStream.readLine().toStdString(); if ( str.empty() ) continue; // Skip blank lines // First non-blank char on every line should be '(' or ')' or '*' const bool bCurvedOpen = str.find("(") != std::string::npos; const bool bCurvedClose = str.find(")") != std::string::npos; if ( bCurvedOpen && str.find("{") != std::string::npos && str.find("}") != std::string::npos ) continue; // Line is a comment so skip it if ( !bCurvedOpen && !bCurvedClose ) { if ( str.find("*") != std::string::npos ) break; // reached the '*' bOK = false; errorStr = "Expecting all lines to start with '('' or ')'' or '*'"; break; } if ( bCurvedOpen && !bPartStart ) { // We're expecting the line to say something like "( /5D5ADFE2 DIP16 IC1 SAD1024" std::vector strList; StringHelper::GetSubStrings(str, strList); // Break str into space separated list const size_t numSubStrings = strList.size(); bOK = ( numSubStrings == 4 || numSubStrings == 5 ); if ( !bOK ) errorStr = "Expecting format: ( /5D5ADFE2 FOOTPRINT NAME VALUE , but got:" + str; if ( !bOK ) break; importStr = strList[2]; nameStr = strList[3]; valueStr = ( numSubStrings == 5 ) ? strList[4] : ""; bOK = ( m_compMgr.GetComponentIdFromName(nameStr) == BAD_COMPID ); // Name must be unique if ( !bOK ) errorStr = "\nPart name " + nameStr + " is not unique"; if ( !bOK ) break; // Build the part and place it ... bOK = BuildAndPlacePart(templateMgr, compStrings, offBoard, errorStr, bPartTypeOK); if ( !bOK ) break; bPartStart = true; } else { const std::string strID = "Part: Type = " + importStr + ", Name = " + nameStr + ", Value = " + valueStr; // We're in the pin section... assert( bCurvedClose ); // Should have ')' on every line if ( !bCurvedOpen ) { // If we have just a ')' on the line then we're done with the pins ... bPartStart = false; // ... and we're done with the part, move onto the next one continue; } std::vector strList; StringHelper::GetSubStrings(str, strList); // Break str into space separated list bOK = ( strList.size() == 4 ); if ( !bOK ) errorStr = strID + "\nLine: " + str + "\nError: Expecting line with format: ( PINNUMBER NETNAME )"; if ( !bOK ) break; const std::string pinStr = strList[1];; // Pin number const std::string netStr = strList[2];; // Net name if ( netStr == "?" ) continue; // KiCad outputs a net name of "?" for unused pins instead of omitting them from the netlist int nodeId(BAD_NODEID); auto iter = mapNetToNodeId.find(netStr); if ( iter != mapNetToNodeId.end() ) nodeId = iter->second; else { maxNodeId++; mapNetToNodeId[netStr] = nodeId = maxNodeId; } bOK = ( nodeId != BAD_NODEID ); if ( !bOK ) errorStr = strID + "\nInternal error: VeroRoute has run out of net IDs"; if ( !bOK ) break; // Paint the component pin using SetNodeIdByUser const size_t iPinIndex = static_cast( atoi(pinStr.c_str()) - 1 ); const int compId = m_compMgr.GetComponentIdFromName( nameStr ); bOK = compId != BAD_COMPID; if ( !bOK ) errorStr = strID + "\nInternal error: VeroRoute lost the component ID"; if ( !bOK ) break; const Component& comp = m_compMgr.GetComponentById( compId ); assert( comp.GetType() != COMP::INVALID ); bOK = iPinIndex < comp.GetNumPins(); if ( !bOK ) errorStr = strID + "\nLine: " + str + "\nError: Line has invalid pin number"; if ( !bOK ) break; int row, col; bOK = GetPinRowCol(compId, iPinIndex, row, col); if ( !bOK ) errorStr = strID + "\nLine: " + str + "\nInternal error mapping the pin to a board location"; if ( !bOK ) break; SetNodeIdByUser(0, row, col, nodeId, true); // true ==> paint pins } } if ( file.isOpen() ) file.close(); // Break the SIPs representing off-board parts into PADs BreakSIPSintoPADS(offBoard); return bOK; } void Board::BreakSIPSintoPADS(const std::list& offBoard) { // Break the SIPS representing off-board parts into PADs for (const auto& nameStr : offBoard) { const int compId = m_compMgr.GetComponentIdFromName( nameStr ); Component& comp = m_compMgr.GetComponentById( compId ); assert( comp.GetType() != COMP::INVALID ); BreakComponentIntoPads(comp); } } void Board::BreakComponentIntoPads(Component& comp) { const COMP& eType = comp.GetType(); if ( eType == COMP::MARK || eType == COMP::PAD || eType == COMP::PAD_FLYINGWIRE || eType == COMP::WIRE || eType == COMP::VERO_NUMBER || eType == COMP::VERO_LETTER ) return; // Not real components if ( !comp.GetIsPlaced() ) return; // Can't break a floating component std::vector nodeList = { BAD_NODEID }; // Re-used for each new pad const size_t numPins = comp.GetNumPins(); for (size_t iPinIndex = 0; iPinIndex < numPins; iPinIndex++) // Loop component pins { // Create a new PAD component for the pin, with suitable name, value, nodeId nodeList[0] = comp.GetNodeId(iPinIndex); Component tmp(comp.GetNameStr() + std::string("_") + std::to_string(iPinIndex+1), comp.GetValueStr(), COMP::PAD, nodeList); // Find board location of existing pin, and put the new PAD there int row, col; if ( GetPinRowCol(comp.GetId(), iPinIndex, row, col) ) { tmp.SetRow(row); tmp.SetCol(col); AddComponent(-1, -1, tmp, false); // Add PAD floating over the existing pin } } DestroyComponent(comp); // All pins have been copied, so destroy the old component PlaceFloaters(); // Unfloat the new PADs } bool Board::GetPinRowCol(int compId, size_t iPinIndex, int& row, int& col) const { if ( compId == BAD_COMPID || iPinIndex == BAD_PININDEX ) return false; for (int i = 0, iSize = GetSize(); i < iSize; i++) { const Element* p = GetAtConst(i); for (int iSlot = 0; iSlot < 2; iSlot++) { if ( !p->GetHasWire() && p->GetSlotCompId(iSlot) == compId && p->GetSlotPinIndex(iSlot) == iPinIndex ) { GetRowCol(p, row, col); return true; } } } return false; } VeroRoute/Src/MyRGB.h000644 001750 001750 00000004456 14377670762 014610 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include "Persist.h" #include class MyRGB : public Persist { public: MyRGB(int i = 0) { m_B = (i & 0xFF); i >>= 8; m_G = (i & 0xFF); i >>= 8; m_R = (i & 0XFF); } MyRGB(int r, int g, int b) : m_R(r), m_G(g), m_B(b) {} MyRGB(const MyRGB& o) { *this = o; } MyRGB(const QColor& o) { SetRGB(o.red(), o.green(), o.blue()); } virtual ~MyRGB() {} MyRGB& operator=(const MyRGB& o) { m_R = o.m_R; m_G = o.m_G; m_B = o.m_B; return *this; } bool operator==(const MyRGB& o) const // Compare persisted info { return m_R == o.m_R && m_G == o.m_G && m_B == o.m_B; } bool operator!=(const MyRGB& o) const { return !(*this == o); } bool operator<(const MyRGB& o) const { if ( m_R != o.m_R ) return m_R < o.m_R; if ( m_G != o.m_G ) return m_G < o.m_G; return m_B < o.m_B; } bool SetRGB(int R, int G, int B) { const bool bChanged = (m_R != R || m_G != G || m_B != B); m_R = R; m_G = G; m_B = B; return bChanged; } void GetRGB(int& R, int& G, int& B) const { R = m_R; G = m_G; B = m_B; } const int& GetR() const { return m_R; } const int& GetG() const { return m_G; } const int& GetB() const { return m_B; } QColor GetQColor() const { return QColor(m_R, m_G, m_B); } // Persist interface functions virtual void Load(DataStream& inStream) override { inStream.Load(m_R); inStream.Load(m_G); inStream.Load(m_B); } virtual void Save(DataStream& outStream) override { outStream.Save(m_R); outStream.Save(m_G); outStream.Save(m_B); } private: int m_R = 0; int m_G = 0; int m_B = 0; }; VeroRoute/libraries/gEDA/veroroute_passive/Capacitor_Ceramic_300mil.sym000644 001750 001750 00000001277 13515171161 026412 0ustar00alexalex000000 000000 v 20130925 2 T 200 700 5 10 0 0 0 0 1 numslots=0 P 200 700 400 700 1 0 0 { T 350 750 5 8 1 1 0 6 1 pinnumber=1 T 350 750 5 8 0 0 0 6 1 pinseq=1 T 350 750 5 8 0 0 0 6 1 pinlabel=1 T 350 750 5 8 0 0 0 6 1 pintype=pas } P 1100 700 900 700 1 0 0 { T 950 750 5 8 1 1 0 0 1 pinnumber=2 T 950 750 5 8 0 0 0 0 1 pinseq=2 T 950 750 5 8 0 0 0 0 1 pinlabel=2 T 950 750 5 8 0 0 0 0 1 pintype=pas } L 600 900 600 500 3 0 0 0 -1 -1 L 900 700 700 700 3 0 0 0 -1 -1 L 600 700 400 700 3 0 0 0 -1 -1 L 700 900 700 500 3 0 0 0 -1 -1 T 500 300 5 10 1 1 0 0 1 device=820p T 500 1000 8 10 1 1 0 0 1 refdes=C? T 0 100 8 10 0 0 0 0 1 footprint=CAP_CERAMIC3 T 0 100 8 10 0 0 0 0 1 description=Ceramic Capacitor (300 mil length) VeroRoute/libraries/gEDA/veroroute_bbd/MN3204.sym000644 001750 001750 00000003300 13515171160 021662 0ustar00alexalex000000 000000 v 20130925 2 T 300 400 8 10 0 0 0 0 1 numslots=0 B 300 400 1800 1800 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 P 0 1000 300 1000 1 0 0 { T 205 1045 5 10 1 1 0 6 1 pinnumber=1 T 200 1000 5 10 0 0 0 0 1 pinseq=1 T 355 945 5 10 1 1 0 0 1 pinlabel=GND T 200 1000 5 10 0 0 0 0 1 pintype=pwr } P 0 1600 300 1600 1 0 0 { T 205 1645 5 10 1 1 0 6 1 pinnumber=3 T 200 1600 5 10 0 0 0 0 1 pinseq=3 T 355 1545 5 10 1 1 0 0 1 pinlabel=IN T 200 1600 5 10 0 0 0 0 1 pintype=pwr } P 900 2500 900 2200 1 0 0 { T 850 2295 5 10 1 1 90 0 1 pinnumber=5 T 900 2400 5 10 0 0 0 0 1 pinseq=5 T 950 2145 5 10 1 1 90 6 1 pinlabel=VDD T 900 2400 5 10 0 0 0 0 1 pintype=pwr } P 1500 2500 1500 2200 1 0 0 { T 1450 2295 5 10 1 1 90 0 1 pinnumber=4 T 1500 2400 5 10 0 0 0 0 1 pinseq=4 T 1550 2145 5 10 1 1 90 6 1 pinlabel=VGG T 1500 2400 5 10 0 0 0 0 1 pintype=pas } P 2400 1600 2100 1600 1 0 0 { T 2195 1645 5 10 1 1 0 0 1 pinnumber=8 T 2500 1600 5 10 0 0 0 0 1 pinseq=8 T 2045 1545 5 10 1 1 0 6 1 pinlabel=OUT2 T 2500 1600 5 10 0 0 0 0 1 pintype=out } P 2400 1000 2100 1000 1 0 0 { T 2195 1045 5 10 1 1 0 0 1 pinnumber=7 T 2500 1000 5 10 0 0 0 0 1 pinseq=7 T 2045 945 5 10 1 1 0 6 1 pinlabel=OUT1 T 2500 1000 5 10 0 0 0 0 1 pintype=out } P 900 100 900 400 1 0 0 { T 850 305 5 10 1 1 90 6 1 pinnumber=2 T 900 100 5 10 0 0 0 0 1 pinseq=2 T 950 455 5 10 1 1 90 0 1 pinlabel=CP1 T 900 100 5 10 0 0 0 0 1 pintype=clk } P 1500 100 1500 400 1 0 0 { T 1450 305 5 10 1 1 90 6 1 pinnumber=6 T 1500 100 5 10 0 0 0 0 1 pinseq=6 T 1550 455 5 10 1 1 90 0 1 pinlabel=CP2 T 1500 100 5 10 0 0 0 0 1 pintype=clk } T 1900 2455 5 10 1 1 0 0 1 device=MN3204 T 1900 2655 8 10 1 1 0 0 1 refdes=U? T 1600 2055 8 10 0 1 0 0 1 footprint=DIP8 T 1900 1845 8 10 0 1 0 0 1 description=512-Stage BBD VeroRoute/libraries/gEDA/veroroute_bbd/MN3009.sym000644 001750 001750 00000003277 13515171160 021702 0ustar00alexalex000000 000000 v 20130925 2 T 300 400 8 10 0 0 0 0 1 numslots=0 B 300 400 1800 1800 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 P 0 1000 300 1000 1 0 0 { T 205 1045 5 10 1 1 0 6 1 pinnumber=1 T 200 1000 5 10 0 0 0 0 1 pinseq=1 T 355 945 5 10 1 1 0 0 1 pinlabel=GND T 200 1000 5 10 0 0 0 0 1 pintype=pwr } P 0 1600 300 1600 1 0 0 { T 205 1645 5 10 1 1 0 6 1 pinnumber=3 T 200 1600 5 10 0 0 0 0 1 pinseq=3 T 355 1545 5 10 1 1 0 0 1 pinlabel=IN T 200 1600 5 10 0 0 0 0 1 pintype=in } P 900 2500 900 2200 1 0 0 { T 850 2295 5 10 1 1 90 0 1 pinnumber=5 T 900 2400 5 10 0 0 0 0 1 pinseq=5 T 950 2145 5 10 1 1 90 6 1 pinlabel=VDD T 900 2400 5 10 0 0 0 0 1 pintype=pwr } P 1500 2500 1500 2200 1 0 0 { T 1450 2295 5 10 1 1 90 0 1 pinnumber=4 T 1500 2400 5 10 0 0 0 0 1 pinseq=4 T 1550 2145 5 10 1 1 90 6 1 pinlabel=VGG T 1500 2400 5 10 0 0 0 0 1 pintype=pas } P 2400 1600 2100 1600 1 0 0 { T 2195 1645 5 10 1 1 0 0 1 pinnumber=8 T 2500 1600 5 10 0 0 0 0 1 pinseq=8 T 2045 1545 5 10 1 1 0 6 1 pinlabel=OUT2 T 2500 1600 5 10 0 0 0 0 1 pintype=out } P 2400 1000 2100 1000 1 0 0 { T 2195 1045 5 10 1 1 0 0 1 pinnumber=7 T 2500 1000 5 10 0 0 0 0 1 pinseq=7 T 2045 945 5 10 1 1 0 6 1 pinlabel=OUT1 T 2500 1000 5 10 0 0 0 0 1 pintype=out } P 900 100 900 400 1 0 0 { T 850 305 5 10 1 1 90 6 1 pinnumber=2 T 900 100 5 10 0 0 0 0 1 pinseq=2 T 950 455 5 10 1 1 90 0 1 pinlabel=CP1 T 900 100 5 10 0 0 0 0 1 pintype=clk } P 1500 100 1500 400 1 0 0 { T 1450 305 5 10 1 1 90 6 1 pinnumber=6 T 1500 100 5 10 0 0 0 0 1 pinseq=6 T 1550 455 5 10 1 1 90 0 1 pinlabel=CP2 T 1500 100 5 10 0 0 0 0 1 pintype=clk } T 1900 2455 5 10 1 1 0 0 1 device=MN3009 T 1900 2655 8 10 1 1 0 0 1 refdes=U? T 1600 2055 8 10 0 1 0 0 1 footprint=DIP8 T 1900 1845 8 10 0 1 0 0 1 description=256-Stage BBD VeroRoute/Src/templatesdialog.cpp000644 001750 001750 00000032451 14432157604 017360 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #include "templatesdialog.h" #include "ui_templatesdialog.h" #include "mainwindow.h" #include "TemplateManager.h" TemplatesDialog::TemplatesDialog(QWidget* parent) : QWidget(parent) , ui(new Ui_TemplatesDialog) , m_pMainWindow(nullptr) , m_iRowL(-1) , m_iRowR(-1) { ui->setupUi( reinterpret_cast(this) ); #ifdef VEROROUTE_ANDROID ui->tableWidget->verticalScrollBar()->setStyleSheet( ANDROID_VSCROLL_WIDTH ); ui->tableWidget->horizontalScrollBar()->setStyleSheet( ANDROID_HSCROLL_HEIGHT ); ui->tableWidget_2->verticalScrollBar()->setStyleSheet( ANDROID_VSCROLL_WIDTH ); ui->tableWidget_2->horizontalScrollBar()->setStyleSheet( ANDROID_HSCROLL_HEIGHT ); #endif } void TemplatesDialog::SetMainWindow(MainWindow* p) { m_pMainWindow = p; QObject::connect(ui->tableWidget, SIGNAL(itemSelectionChanged()), this, SLOT(GenericChanged())); QObject::connect(ui->tableWidget, SIGNAL(cellDoubleClicked(int,int)), this, SLOT(GenericDoubleClicked(int,int))); QObject::connect(ui->tableWidget_2, SIGNAL(itemSelectionChanged()), this, SLOT(UserChanged())); QObject::connect(ui->tableWidget_2, SIGNAL(cellDoubleClicked(int,int)), this, SLOT(UserDoubleClicked(int,int))); QObject::connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(AddTemplates())); QObject::connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(DeleteTemplate())); QObject::connect(ui->pushButton_3, SIGNAL(clicked()), this, SLOT(LoadFromVrt())); QObject::connect(ui->pushButton_4, SIGNAL(clicked()), this, SLOT(SaveToVrt())); LoadFromUserVrt(false); // false ==> no message box } TemplatesDialog::~TemplatesDialog() { delete ui; } void TemplatesDialog::Update() { TemplateManager& mgr = m_pMainWindow->GetTemplateManager(); for (int iTable = 0; iTable < 2; iTable++) { const bool bGeneric = ( iTable == 0 ); const int numRows = static_cast(mgr.GetSize(bGeneric)); auto* pTableWidget = ( bGeneric ) ? ui->tableWidget : ui->tableWidget_2; auto& tableHeader = ( bGeneric ) ? m_tableHeaderL : m_tableHeaderR; auto& iRow = ( bGeneric ) ? m_iRowL : m_iRowR; tableHeader.clear(); if ( bGeneric ) tableHeader << "Type"; else tableHeader << "Type" << "Value"; // Set up the table pTableWidget->clear(); pTableWidget->setRowCount(numRows); pTableWidget->setColumnCount(tableHeader.size()); for (int i = 0, iSize = tableHeader.size(); i < iSize; i++) { int iWidth(0); switch( i ) { case 0: iWidth = bGeneric ? 360 : 180; break; case 1: iWidth = 160; break; // Allow for vertical scroll bar } pTableWidget->setColumnWidth(i,iWidth); } pTableWidget->setHorizontalHeaderLabels(tableHeader); pTableWidget->horizontalHeader()->setVisible(!bGeneric); pTableWidget->verticalHeader()->setVisible(false); pTableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); pTableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); pTableWidget->setSelectionMode(QAbstractItemView::SingleSelection); pTableWidget->setShowGrid(true); // Populate the table with data std::string strType(""), strValue(""), strFull(""); for (int i = 0; i < numRows; i++) { const Component& comp = mgr.GetNth(bGeneric, static_cast(i)); const COMP& eType = comp.GetType(); strType = bGeneric ? comp.GetTypeStr() : comp.GetFullTypeStr(); // e.g. Use "DIP" in generic list rather than "DIP16" strValue = comp.GetValueStr(); strFull = CompTypes::GetFamilyStr( eType ); // e.g. "Capacitor" if ( !StringHelper::IsEmptyStr(strFull) ) strFull += ": "; strFull += strType; // e.g. "Capacitor: Film" // Write current row to table. Note: No memory leak since setItem() takes ownership. if ( bGeneric ) { pTableWidget->setItem(i, 0, new QTableWidgetItem(QString::fromStdString(strFull))); } else { pTableWidget->setItem(i, 0, new QTableWidgetItem(QString::fromStdString(strType))); pTableWidget->setItem(i, 1, new QTableWidgetItem(QString::fromStdString(strValue))); } } iRow = ( numRows > 0 ) ? 0 : -1; if ( iRow >= 0 ) pTableWidget->selectRow(iRow); if ( !bGeneric ) ui->pushButton_2->setDisabled(m_iRowR == -1); } SaveToUserVrt(); } void TemplatesDialog::GenericClicked(int row) { m_iRowL = row; ui->tableWidget->selectRow(m_iRowL); } void TemplatesDialog::GenericChanged() { GenericClicked( ui->tableWidget->currentRow() ); } void TemplatesDialog::GenericDoubleClicked(int row, int) { GenericClicked(row); TemplateManager& mgr = m_pMainWindow->GetTemplateManager(); const bool bGeneric = true; if ( m_iRowL >= 0 && m_iRowL < static_cast(mgr.GetSize(bGeneric)) ) m_pMainWindow->AddFromTemplate(bGeneric, mgr.GetNth(bGeneric, static_cast(m_iRowL))); } void TemplatesDialog::UserClicked(int row) { m_iRowR = row; ui->tableWidget_2->selectRow(m_iRowR); } void TemplatesDialog::UserChanged() { UserClicked( ui->tableWidget_2->currentRow() ); } void TemplatesDialog::UserDoubleClicked(int row, int) { UserClicked(row); TemplateManager& mgr = m_pMainWindow->GetTemplateManager(); const bool bGeneric = false; if ( m_iRowR >= 0 && m_iRowR < static_cast(mgr.GetSize(bGeneric)) ) m_pMainWindow->AddFromTemplate(bGeneric, mgr.GetNth(bGeneric, static_cast(m_iRowR))); } const Component* TemplatesDialog::GetCurrentUserComp() const { TemplateManager& mgr = m_pMainWindow->GetTemplateManager(); const bool bGeneric = false; if ( m_iRowR >= 0 && m_iRowR < static_cast(mgr.GetSize(bGeneric)) ) return &mgr.GetNth(bGeneric, static_cast(m_iRowR)); return nullptr; } void TemplatesDialog::AddTemplates() { AddTemplatesFromBoard(m_pMainWindow->m_board, false, true); // false ==> Restrict to user-group } void TemplatesDialog::DeleteTemplate() { TemplateManager& mgr = m_pMainWindow->GetTemplateManager(); const bool bGeneric = false; if ( m_iRowR >= 0 && m_iRowR < static_cast(mgr.GetSize(bGeneric)) ) { const Component comp = mgr.GetNth(bGeneric, static_cast(m_iRowR)); const std::string messageStr = "The template (Type = " + comp.GetFullTypeStr() + ") " + "(Value = " + comp.GetValueStr() + ") is about to be deleted. There is no undo for this operation. Continue?"; if ( QMessageBox::question(this, tr("Confirm Delete Template"), tr(messageStr.c_str()), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No ) return; if ( mgr.Remove(comp) ) { Update(); m_pMainWindow->UpdateAliasDialog(); } } } QString TemplatesDialog::GetUserFilename() const { TemplateManager& mgr = m_pMainWindow->GetTemplateManager(); char buffer[256] = {'\0'}; sprintf(buffer, "%s/templates/user.vrt", mgr.GetPathStr().c_str()); return QString(buffer); } void TemplatesDialog::LoadFromVrt() { const QString fileName = QFileDialog::getOpenFileName(this, tr("Open file"), ""/*directory*/, tr("VeroRoute (*.vrt);;All Files (*)")); if ( !fileName.isEmpty() ) Load(fileName, true); } void TemplatesDialog::LoadFromUserVrt(bool bInfoMsg) { const QString fileName = GetUserFilename(); if ( !fileName.isEmpty() ) Load(fileName, bInfoMsg); } void TemplatesDialog::Load(const QString& fileName, bool bInfoMsg) { const std::string fileNameStr = fileName.toStdString(); DataStream inStream(DataStream::READ); if ( inStream.Open( fileNameStr.c_str() ) ) { Board tmp; // Load using a temporary board in case there is a problem with the file tmp.Load(inStream); inStream.Close(); if ( inStream.GetOK() ) // If it loaded OK ... AddTemplatesFromBoard(tmp, true, bInfoMsg); // true ==> Don't restrict to user group else QMessageBox::information(this, tr("Unsupported VRT version"), tr(fileNameStr.c_str())); } else if ( fileName != GetUserFilename() ) QMessageBox::information(this, tr("Unable to open file"), tr(fileNameStr.c_str())); } void TemplatesDialog::SaveToVrt() { #ifdef VEROROUTE_ANDROID QMessageBox::information(this, tr("Information"), tr("You must now select or enter a filename ending in .vrt")); const QString fileName = m_pMainWindow->GetSaveFileName(tr(""), tr("VeroRoute (*.vrt);;All Files (*)"), QString("vrt")); #else const QString fileName = m_pMainWindow->GetSaveFileName(tr("Save templates as"), tr("VeroRoute (*.vrt);;All Files (*)"), QString("vrt")); #endif if ( !fileName.isEmpty() ) Save(fileName); } void TemplatesDialog::Save(const QString& fileName) { DataStream outStream(DataStream::WRITE); const std::string fileNameStr = fileName.toStdString(); if ( outStream.Open( fileNameStr.c_str() ) ) { Board tmp; // Load using a temporary board in case there is a problem with the file const bool bGeneric = false; TemplateManager& mgr = m_pMainWindow->GetTemplateManager(); for (size_t i = 0, iSize = mgr.GetSize(bGeneric); i < iSize; i++) { const Component& comp = mgr.GetNth(bGeneric,i); tmp.AddComponent(-1, -1, comp, false); } tmp.Save(outStream); outStream.Close(); } else QMessageBox::information(this, tr("Unable to save file"), tr(fileNameStr.c_str())); } void TemplatesDialog::SaveToUserVrt() { if ( !m_pMainWindow->m_bTemplatesDir ) return; QString fileName = GetUserFilename(); if ( !fileName.isEmpty() ) Save(fileName); } void TemplatesDialog::AddTemplatesFromBoard(Board& board, bool bAllComps, bool bInfoMsg) { CompManager& compMgr = board.GetCompMgr(); GroupManager& groupMgr = board.GetGroupMgr(); TemplateManager& mgr = m_pMainWindow->GetTemplateManager(); if ( !bAllComps && groupMgr.GetNumUserComps() == 0 && bInfoMsg ) { QMessageBox::information(this, tr("Information"), tr("No parts are currently selected in the main view.")); return; } const bool bGeneric = false; bool bOverWriteAll_AlreadyExists(false); // To handle the "Yes To All" case bool bOverWriteAll_UsedImportStr(false); // To handle the "Yes To All" case std::list< std::string > errorStrList; int nCount(0); for (const auto& mapObj : compMgr.GetMapIdToComp()) { if ( bAllComps || groupMgr.GetIsUserComp(mapObj.first) ) { bool bAlreadyExists(false), bUsedImportStr(false); // Gets set true if template already exists, or import string is already in use std::string errorStr; const Component& comp = mapObj.second; bool bOK = mgr.Add(bGeneric, comp, bAlreadyExists, bUsedImportStr, &errorStr); if ( !bOK && ( bAlreadyExists || bUsedImportStr ) ) { bool bFound(false); // true ==> we've encountered the error before (i.e. a part with same type and value) for (auto& str : errorStrList ) if ( str == errorStr ) { bFound = true; break; } if ( !bFound ) { errorStrList.push_back(errorStr); bool bOverWrite(false); if ( bAlreadyExists ) { if ( bOverWriteAll_AlreadyExists ) bOverWrite = true; else { auto button = QMessageBox::question(this, tr("Confirm Overwrite"), tr(errorStr.c_str()) + tr(" and will be overwritten. There is no undo for this operation. Continue?"), QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No, QMessageBox::No); if ( button == QMessageBox::YesToAll ) bOverWriteAll_AlreadyExists = true; bOverWrite = bOverWriteAll_AlreadyExists || ( button == QMessageBox::Yes ); } } else if ( bUsedImportStr ) { if ( bOverWriteAll_UsedImportStr ) bOverWrite = true; else { auto button = QMessageBox::question(this, tr("Confirm Overwrite"), tr(errorStr.c_str()) + tr(". It will be overwritten with (Value ='") + tr(comp.GetValueStr().c_str()) + tr("'). There is no undo for this operation. Continue?"), QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No, QMessageBox::No); if ( button == QMessageBox::YesToAll ) bOverWriteAll_UsedImportStr = true; bOverWrite = bOverWriteAll_UsedImportStr || ( button == QMessageBox::Yes ); } } if ( bOverWrite ) bOK = mgr.Add(bGeneric, comp, bAlreadyExists, bUsedImportStr, &errorStr); // Repeat Add() with bAlreadyExists or bUsedImportStr set true to allow overwrite } } if ( bOK ) { nCount++; Update(); m_pMainWindow->UpdateAliasDialog(); } } } if ( bInfoMsg ) QMessageBox::information(this, tr("Information"), QString::number(nCount) + QString(" new templates added.")); } void TemplatesDialog::keyPressEvent(QKeyEvent* event) { #ifndef VEROROUTE_ANDROID m_pMainWindow->specialKeyPressEvent(event); #endif QWidget::keyPressEvent(event); event->accept(); } void TemplatesDialog::keyReleaseEvent(QKeyEvent* event) { #ifdef VEROROUTE_ANDROID if ( event->key() == Qt::Key_Back ) return m_pMainWindow->keyReleaseEvent(event); // Try Undo operation #else m_pMainWindow->commonKeyReleaseEvent(event); #endif QWidget::keyReleaseEvent(event); event->accept(); } VeroRoute/libraries/gEDA/veroroute_linear/Generic_SIP14.sym000644 001750 001750 00000005312 13515171161 024024 0ustar00alexalex000000 000000 v 20130925 2 T 300 0 8 10 0 0 0 0 1 numslots=0 B 300 0 1400 5600 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 P 0 5400 300 5400 1 0 0 { T 205 5445 5 10 1 1 0 6 1 pinnumber=1 T 200 5400 5 10 0 1 0 0 1 pinseq=1 T 355 5395 5 10 0 1 0 0 1 pinlabel=1 T 200 5400 5 10 0 1 0 0 1 pintype=pas } P 0 5000 300 5000 1 0 0 { T 205 5045 5 10 1 1 0 6 1 pinnumber=2 T 200 5000 5 10 0 1 0 0 1 pinseq=2 T 355 4945 5 10 0 1 0 0 1 pinlabel=2 T 200 5000 5 10 0 1 0 0 1 pintype=pas } P 0 4600 300 4600 1 0 0 { T 205 4645 5 10 1 1 0 6 1 pinnumber=3 T 200 4600 5 10 0 1 0 0 1 pinseq=3 T 355 4545 5 10 0 1 0 0 1 pinlabel=3 T 200 4600 5 10 0 1 0 0 1 pintype=pas } P 0 4200 300 4200 1 0 0 { T 205 4245 5 10 1 1 0 6 1 pinnumber=4 T 200 4200 5 10 0 1 0 0 1 pinseq=4 T 355 4145 5 10 0 1 0 0 1 pinlabel=4 T 200 4200 5 10 0 1 0 0 1 pintype=pas } P 0 3800 300 3800 1 0 0 { T 205 3845 5 10 1 1 0 6 1 pinnumber=5 T 200 3800 5 10 0 1 0 0 1 pinseq=5 T 355 3745 5 10 0 1 0 0 1 pinlabel=5 T 200 3800 5 10 0 1 0 0 1 pintype=pas } P 0 3400 300 3400 1 0 0 { T 205 3445 5 10 1 1 0 6 1 pinnumber=6 T 200 3400 5 10 0 1 0 0 1 pinseq=6 T 355 3345 5 10 0 1 0 0 1 pinlabel=6 T 200 3400 5 10 0 1 0 0 1 pintype=pas } P 0 3000 300 3000 1 0 0 { T 205 3045 5 10 1 1 0 6 1 pinnumber=7 T 200 3000 5 10 0 1 0 0 1 pinseq=7 T 355 2945 5 10 0 1 0 0 1 pinlabel=7 T 200 3000 5 10 0 1 0 0 1 pintype=pas } P 0 2600 300 2600 1 0 0 { T 205 2645 5 10 1 1 0 6 1 pinnumber=8 T 200 2600 5 10 0 1 0 0 1 pinseq=8 T 355 2545 5 10 0 1 0 0 1 pinlabel=8 T 200 2600 5 10 0 1 0 0 1 pintype=pas } P 0 200 300 200 1 0 0 { T 205 245 5 10 1 1 0 6 1 pinnumber=14 T 200 200 5 10 0 1 180 6 1 pinseq=14 T 355 195 5 10 0 1 0 0 1 pinlabel=14 T 200 200 5 10 0 1 180 6 1 pintype=pas } P 0 600 300 600 1 0 0 { T 205 645 5 10 1 1 0 6 1 pinnumber=13 T 200 600 5 10 0 1 180 6 1 pinseq=13 T 355 595 5 10 0 1 0 0 1 pinlabel=13 T 200 600 5 10 0 1 180 6 1 pintype=pas } P 0 1000 300 1000 1 0 0 { T 205 1045 5 10 1 1 0 6 1 pinnumber=12 T 200 1000 5 10 0 1 180 6 1 pinseq=12 T 355 995 5 10 0 1 0 0 1 pinlabel=12 T 200 1000 5 10 0 1 180 6 1 pintype=pas } P 0 1400 300 1400 1 0 0 { T 205 1445 5 10 1 1 0 6 1 pinnumber=11 T 200 1400 5 10 0 1 180 6 1 pinseq=11 T 355 1395 5 10 0 1 0 0 1 pinlabel=11 T 200 1400 5 10 0 1 180 6 1 pintype=pas } P 0 1800 300 1800 1 0 0 { T 205 1845 5 10 1 1 0 6 1 pinnumber=10 T 200 1800 5 10 0 1 180 6 1 pinseq=10 T 355 1795 5 10 0 1 0 0 1 pinlabel=10 T 200 1800 5 10 0 1 180 6 1 pintype=pas } P 0 2200 300 2200 1 0 0 { T 205 2245 5 10 1 1 0 6 1 pinnumber=9 T 200 2200 5 10 0 1 180 6 1 pinseq=9 T 355 2195 5 10 0 1 0 0 1 pinlabel=9 T 200 2200 5 10 0 1 180 6 1 pintype=pas } T 1200 5755 5 10 1 1 0 0 1 device=Name T 300 5755 8 10 1 1 0 0 1 refdes=U? T 1600 2055 8 10 0 1 0 0 1 footprint=SIP14 T 1900 1845 8 10 0 1 0 0 1 description=Generic 14 Pin SIP VeroRoute/libraries/gEDA/veroroute_electromechanical/Switch_Offboard_3PDT.sym000644 001750 001750 00000003546 13515171160 027623 0ustar00alexalex000000 000000 v 20130925 2 T 300 2000 8 10 0 0 0 0 1 numslots=0 P 300 2000 0 2000 1 0 1 { T 150 2050 5 10 1 1 0 0 1 pinnumber=4 T 150 2050 5 10 0 0 0 0 1 pinseq=4 T 150 2050 5 10 0 0 0 0 1 pinlabel=4 T 150 2050 5 10 0 0 0 0 1 pintype=pas } P 600 2200 900 2200 1 0 1 { T 750 2250 5 10 1 1 0 0 1 pinnumber=1 T 750 2250 5 10 0 0 0 0 1 pinseq=1 T 750 2250 5 10 0 0 0 0 1 pinlabel=1 T 750 2250 5 10 0 0 0 0 1 pintype=pas } P 600 1800 900 1800 1 0 1 { T 750 1850 5 10 1 1 0 0 1 pinnumber=7 T 750 1850 5 10 0 0 0 0 1 pinseq=7 T 750 1850 5 10 0 0 0 0 1 pinlabel=7 T 750 1850 5 10 0 0 0 0 1 pintype=pas } P 300 1300 0 1300 1 0 1 { T 150 1350 5 10 1 1 0 0 1 pinnumber=5 T 150 1350 5 10 0 0 0 0 1 pinseq=5 T 150 1350 5 10 0 0 0 0 1 pinlabel=5 T 150 1350 5 10 0 0 0 0 1 pintype=pas } P 600 1500 900 1500 1 0 1 { T 750 1550 5 10 1 1 0 0 1 pinnumber=2 T 750 1550 5 10 0 0 0 0 1 pinseq=2 T 750 1550 5 10 0 0 0 0 1 pinlabel=2 T 750 1550 5 10 0 0 0 0 1 pintype=pas } P 600 1100 900 1100 1 0 1 { T 750 1150 5 10 1 1 0 0 1 pinnumber=8 T 750 1150 5 10 0 0 0 0 1 pinseq=8 T 750 1150 5 10 0 0 0 0 1 pinlabel=8 T 750 1150 5 10 0 0 0 0 1 pintype=pas } P 300 600 0 600 1 0 1 { T 150 650 5 10 1 1 0 0 1 pinnumber=6 T 150 650 5 10 0 0 0 0 1 pinseq=6 T 150 650 5 10 0 0 0 0 1 pinlabel=6 T 150 650 5 10 0 0 0 0 1 pintype=pas } P 600 800 900 800 1 0 1 { T 750 850 5 10 1 1 0 0 1 pinnumber=3 T 750 850 5 10 0 0 0 0 1 pinseq=3 T 750 850 5 10 0 0 0 0 1 pinlabel=3 T 750 850 5 10 0 0 0 0 1 pintype=pas } P 600 400 900 400 1 0 1 { T 750 450 5 10 1 1 0 0 1 pinnumber=9 T 750 450 5 10 0 0 0 0 1 pinseq=9 T 750 450 5 10 0 0 0 0 1 pinlabel=9 T 750 450 5 10 0 0 0 0 1 pintype=pas } L 300 2000 600 2200 3 0 0 0 -1 -1 L 300 1300 600 1500 3 0 0 0 -1 -1 L 300 600 600 800 3 0 0 0 -1 -1 T 200 0 5 10 1 1 0 0 1 device=Name T 295 195 8 10 1 1 0 0 1 refdes=S? T 1295 193 8 10 0 0 0 0 1 footprint=PADS9 T 1295 193 8 10 0 0 0 0 1 description=Offboard Switch VeroRoute/Src/images/right.png000644 001750 001750 00000000706 13661712157 016567 0ustar00alexalex000000 000000 ‰PNG  IHDR йsВgAMAБ ќa cHRMz&€„њ€шu0ъ`:˜pœКQ<bKGDЊ#2 pHYs з зB(›xtIMEу%5ЯS*”IDATHЧэ”Б Т0Eп")R ШщS0YŒиC‘RЦf‚у$QљЕ_џwвtЌH#№Fк С$дTHЂ В$6 ?E уРбhGfЇ†5C№К`MЫй wN“іv<‰/t4›8џсJљ’lиэШЂOкŽžо&]АчЪЭј*ъPОы %tEXtdate:create2019-04-04T21:37:53+02:00}ŒрH%tEXtdate:modify2019-04-04T21:37:53+02:00 бXєtEXtSoftwarewww.inkscape.org›ю<IENDЎB`‚VeroRoute/libraries/gEDA/veroroute_regulator/LM79Lxx.sym000644 001750 001750 00000001454 13515171161 023511 0ustar00alexalex000000 000000 v 20130925 2 T 1700 800 5 10 0 0 0 0 1 numslots=0 P 1700 800 2000 800 1 0 1 { T 1800 900 5 10 1 1 0 0 1 pinnumber=3 T 1800 900 5 10 0 0 0 0 1 pinseq=3 T 1600 700 9 10 1 1 0 6 1 pinlabel=Out T 1800 900 5 10 0 0 0 0 1 pintype=pas } P 0 800 300 800 1 0 0 { T 200 900 5 10 1 1 0 6 1 pinnumber=2 T 200 900 5 10 0 0 0 0 1 pinseq=2 T 400 700 9 10 1 1 0 0 1 pinlabel=In T 200 900 5 10 0 0 0 0 1 pintype=pas } P 1000 0 1000 300 1 0 0 { T 1100 100 5 10 1 1 0 0 1 pinnumber=1 T 1100 100 5 10 0 0 0 0 1 pinseq=1 T 1100 100 5 10 0 0 0 0 1 pinlabel=1 T 1100 100 5 10 0 0 0 0 1 pintype=pas } B 300 300 1400 1000 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 T 600 1100 5 10 1 1 0 0 1 device=LM79Lxx T 1100 1400 8 10 1 1 0 6 1 refdes=U? T 1800 1400 8 10 0 0 0 6 1 footprint=TO92 T 1800 1400 8 10 0 0 0 6 1 description=Negative Regulator 100mA VeroRoute/libraries/gEDA/veroroute_transistor/JFET_Nchannel_2N5459.sym000644 001750 001750 00000001551 13515171161 025753 0ustar00alexalex000000 000000 v 20130925 2 T 100 500 5 10 0 0 0 0 1 numslots=0 P 100 500 400 500 1 0 0 { T 100 350 5 6 1 1 0 0 1 pinnumber=3 T 100 350 5 6 0 0 0 0 1 pinseq=3 T 100 350 5 6 0 0 0 0 1 pinlabel=3 T 100 350 5 6 0 0 0 0 1 pintype=pas } P 600 1000 600 800 1 0 0 { T 500 850 5 6 1 1 0 0 1 pinnumber=1 T 500 850 5 6 0 0 0 0 1 pinseq=1 T 500 850 5 6 0 0 0 0 1 pinlabel=1 T 500 850 5 6 0 0 0 0 1 pintype=pas } P 600 200 600 0 1 0 1 { T 500 50 5 6 1 1 0 0 1 pinnumber=2 T 500 50 5 6 0 0 0 0 1 pinseq=2 T 500 250 5 6 1 1 0 0 1 pinlabel=S T 500 50 5 6 0 0 0 0 1 pintype=pas } L 400 800 600 800 3 0 0 0 -1 -1 L 400 200 600 200 3 0 0 0 -1 -1 L 400 900 400 100 3 0 0 0 -1 -1 L 300 600 400 500 3 0 0 0 -1 -1 L 400 500 300 400 3 0 0 0 -1 -1 T 700 700 5 10 1 1 0 0 1 device=2N5459 T 700 400 8 10 1 1 0 0 1 refdes=Q? T 595 95 8 10 0 0 0 0 1 footprint=TO92 T 595 95 8 10 0 0 0 0 1 description=N-Channel JFET VeroRoute/Src/bomdialog.ui000644 001750 001750 00000002417 14446032552 015770 0ustar00alexalex000000 000000 BomDialog 0 0 720 510 720 510 720 510 Bill Of Materials 10 10 700 462 Qt::NoFocus 200 478 321 27 Qt::NoFocus Save to Tab Separated Text File VeroRoute/libraries/gEDA/veroroute_transistor/NPN_BC639.sym000644 001750 001750 00000001562 13515171161 023772 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=3 T 100 550 5 6 0 0 0 0 1 pinseq=3 T 100 550 5 6 0 0 0 0 1 pinlabel=3 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=2 T 400 850 5 6 0 0 0 0 1 pinseq=2 T 400 850 5 6 0 0 0 0 1 pinlabel=2 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=1 T 400 50 5 6 0 0 0 0 1 pinseq=1 T 400 50 5 6 0 0 0 0 1 pinlabel=1 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 403,209 L 501,200 L 431,273 L 425,240 z T 600 700 5 10 1 1 0 0 1 device=BC639 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=NPN Transistor VeroRoute/libraries/gEDA/veroroute_transistor/NPN_2N3904.sym000644 001750 001750 00000001563 13515171161 024044 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=3 T 400 850 5 6 0 0 0 0 1 pinseq=3 T 400 850 5 6 0 0 0 0 1 pinlabel=3 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=1 T 400 50 5 6 0 0 0 0 1 pinseq=1 T 400 50 5 6 0 0 0 0 1 pinlabel=1 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 403,209 L 501,200 L 431,273 L 425,240 z T 600 700 5 10 1 1 0 0 1 device=2N3904 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=NPN Transistor VeroRoute/libraries/gEDA/veroroute_transistor/NPN_BC214.sym000644 001750 001750 00000001562 13515171161 023757 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=3 T 400 850 5 6 0 0 0 0 1 pinseq=3 T 400 850 5 6 0 0 0 0 1 pinlabel=3 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=1 T 400 50 5 6 0 0 0 0 1 pinseq=1 T 400 50 5 6 0 0 0 0 1 pinlabel=1 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 403,209 L 501,200 L 431,273 L 425,240 z T 600 700 5 10 1 1 0 0 1 device=BC214 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=NPN Transistor VeroRoute/platforms/000755 001750 001750 00000000000 13626302046 014745 5ustar00alexalex000000 000000 VeroRoute/tutorials/tutorial_13.vrt000644 001750 001750 00000156565 14433261452 017713 0ustar00alexalex000000 000000 9hTUTORIAL 13 - VISUALIZING & FIXING CONNECTIVITY This is probably the single most important and useful feature. 13.1 SELECTING A NET You select a netlist ID by double-clicking on a track or pin that has that netlist ID. Try the following... Double-click on the "Tone1" track in the layout. The track will be drawn in dark grey to "highlight" it as the "selected net". All the component pins for that net are connected together, so that net does not have an open-circuit. Now double-click on the "Tone2" track. The "selected net" changes to that of the "Tone2" track and highlights that in dark grey instead. Finally, double-click on a blank area of the layout. This clears the "selected net" so no tracks will be drawn in dark grey. We will now see how open-circuits are reported and visualised. 13.2 BROKEN NETS Double-click on the "+9V" track on the left of the layout. It will be drawn in dark grey along with other places with the same netlist ID. Notice that dotted red lines are drawn between some of the dark grey areas. Those red lines indicate that the net has an open-circuit. Also notice that the number "2" is highlighted in the "Broken Nets" list of the Control Dialog. The number "2" in the netlist ID of the currently selected net. The red lines are drawn between track portions that need connecting together. Notice that although the far left and far right grey areas are not connected together, no red line is drawn between them. That is because VeroRoute draws the minimum number of connections needed to fix a broken net (which in this case is two). This particular net has open-circuits due to two wire jumpers that have been moved to the top of the layout. Move the wire jumpers back down to fix the problem. Do them one at a time and see how the connectivity changes. Once the two jumpers have been put back, the netlist ID of "2" will no longer appear in the "Broken Nets" list. The net with a netlist ID of "1" is still in the "Broken Nets" list. Click on that list item. All places in the layout with that netlist ID will be shown in dark grey. Again the problem is down to jumpers that have been moved, this time to the bottom of the grid. In general you will need to fix connectivity problems by either moving components or painting netlist IDs directly to the grid. This is covered in the next tutorial. If a component is floating, then its pins are not connected to the board, and so the nets used by those those pins will have open-circuits. These nets will be labelled as floating when they appear in the "Broken Nets" list. The nets at the top of the "Broken Nets" list will often be easier to fix than the ones at the bottom. IMPORTANT: Circuit connectivity is not re-evaluated while you are dragging parts. It is only re-evaluated at the end of the drag when you release the mouse button. The same applies to moving or manipulating parts using the keyboard. The connectivity is only re-evaluated when you release the key. џџџџџџџџџџџZ.. 2< џџџџџџџџџџџџџџџџџџџџAџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџAџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџFџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџFџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@)џџџџџ@2џџџџџ@3џџџџџ@4џџџџџџpџџџџџџџџџџСџџџџџџџџџџ pџџџџџџџџџџ Сџџџџџџџџџџ@џџџџџџџџџџ @џџџџџџџџџџpџџџџџџџџџџСџџџџџџџџџџ@џџџџџџџџџ@5џџџџџ@6џџџџџ@7џџџџџџpџџџџџџџџџС8џџџџџ!@9џџџџџ@:џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџџџџџGџџџџџџ |џџџџџџџџџџ ЧџџџџџџџџџџDџџџџџџџџџџ Dџџџџџџџџџџ|џџџџџџџџџџЧџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџ\Gџџџџџџ‡џџџџџџџџџ!+џџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџ @џџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџ @џџџџџџџџџџ @џџџџџџџџџџ |џџџџџџџџџџ ЧџџџџџџџџџџDџџџџEџ Dџџџџџџџџџџ|џџџџџџџџџџЧџџџџџџџџџDEџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџLџџџџџџџџџџpџџџџџџџџџџСџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџ DџџџџџџDџџџџџџџџџDџџџџџџ Dџџџџџџџџџ D$џџџџџџ |џџџџџџџџџ Ч$џџџџџD џџџџџ D&џџџџџџ|џџџџџџџџџЧ&џџџџџDџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџ|џџџџџЧџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ фџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџ D%џџџџџџ |џџџџџџџџџ ч%џџџџџџџџџџџџџџџ D'џџџџџџ|џџџџџџџџџч'џџџџџџџџџџџџџџџџDџџџџџџџџџ"џџџџџџDџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ#џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ xџџџџџџџџџџ ѕџџџџџџџџџ ѓџџџџџ Сџџџџџ Dџџџџџ Dџџџџџ |џџџџџ їџџџџџџ Уџџџџџџџџџ Dџџџџџ| џџџџџїџџџџџџУџџџџџџџџџџDџџџџџџџџџџ@џџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџ@џџџџџџџџџџpџџџџџџџџџџСџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ |џџџџџџ пџџџџџџџџџџ Ÿџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ ?џџџџџџџџџ G џџџџџџ џџџџџџџџџџџџџџџџџџџџ?џџџџџџџџџGџџџџџџDџџџџџџџџџD"џџџџџџDџџџџџџџџџџDџџџџџџџџџdџџџџџ<џџџџџG#џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ <џџџџџџџџџџ OџџџџџџџџџџpџџџџџџџџџСџџџџџџpџџџџџџџџџёџџџџџџёџџџџџџџџџСџџџџџџ FџџџџџџџџџpџџџџџџёџџџџџџџџџСџџџџџџFџџџџџџџџџџDџџџџџџџџџHџџџџџџDџџџџџџџџџџDџџџџџџџџџtHџџџџџџУџџџџџџџџџџFџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџ fџџџџџџџџџ<џџџџџџGџџџџџџџџџ<џџџџџџ_џџџџџџџџџПџџџџџџGџџџџџџџџџџ Dџџџџџџџџџџ\џџџџџџџџџП џџџџџџGџџџџџџџџџDIџџџџџџDџџџџџџџџџ@IџџџџџџDџџџџџџџџџџDџџџџџџџџџџ<џџџџџџџџџџGџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџd*џџџџџџ 4џџџџџџџџџ  C,џџџџџ F,џџџџџ @,џџџџџџNџџџџџџџџџ @-џџџџџ F-џџџџџ  D-џџџџџџLџџџџџџџџџ @.џџџџџ F.џџџџџ D.џџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџ @/џџџџџ F/џџџџџ D/џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџtџџџџџУџџџџџџ џџџџџџџџџФџџџџџDџџџџџџDџџџџџџџџџD џџџџџDџџџџџџ DџџџџџџџџџD џџџџџDџџџџџD џџџџџџџџџџџФџџџџџџџџџ џџџџџФџџџџџџdџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ|џџџџџџџџџџЧџџџџџџџџџxџџџџџџХџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџ DџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџxџџџџџџџџџХ!џџџџџџxџџџџџџџџџџХџџџџџџџџџџtџџџџџџџџџџѓџџџџџџџџџџСџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ\џџџџџџџџџџ‡џџџџџџџџџ џџџџџџџџџџџџџџџџќџџџџџџџџџџџџџџџџџџџџџЧџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџpџџџџџСџџџџџpџџџџџёџџџџџџёџџџџџџџџџё џџџџџСџџџџџpџџџџџС џџџџџpџџџџџС џџџџџLџџџџџp!џџџџџџёџџџџџџџџџљџџџџџџ§џџџџџџџџџџџџџџџЧџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ(џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџBџџџџџџџџџџџџџџџџџџџџџџџџџBџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџCџџџџџџџџџџџџџџџџџџџџџџџџџCџџџџџDџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџBџџ,R4470kRResistorRESISTORNF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d(Pad1GndPadPadPADWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ, R13100kRResistorRESISTOR SF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџџШE Wire5 Wire5WireWire WF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџџШC Wire3 Wire3WireWire WF(12Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџџєC8500pCCeramicCAP_CERAMIC NF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pd2Pad5Sustain1PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ, R14470kRResistorRESISTOR SF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   L/Q4 2N5088QTO92TO92 WF(123Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џџ, R11390RRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d+Pad4OutPadPadPAD$WF(!1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R710kRResistorRESISTORNF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R9470kRResistorRESISTORNF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R8100kRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R18470kRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєC5500pCCeramicCAP_CERAMIC NF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,R61kRResistorRESISTORWF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   L.Q3 2N5088QTO92TO92 WF(123Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џџ, R1012kRResistorRESISTOR NF(1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R139kRResistorRESISTOR SF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џє!C1110nCCeramicCAP_CERAMICSF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,R1720kRResistorRESISTOR SF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d5Pad8 Tone1PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R19100kRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d7 Pad10 Tone3PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R2100kRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џ&D3 1N4148D Diode DIODE EF(1 2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џfD?у333332?у333332Пй™™™™™š?й™™™™™š@V€џfD?фЬЬЬЬЬЬ?фЬЬЬЬЬЬПй™™™™™š?й™™™™™š@V€џfD?ѕ™™™™™™?ѕ™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џfDџєC2500pCCeramicCAP_CERAMICNF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ P џџџџџџџџџџШG Wire7 Wire7WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџd3Pad6Sustain2PadPadPADSF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R1512kRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєC947nCCeramicCAP_CERAMIC NF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pd9 Pad12Vol2PadPadPADџџџфNF(!1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпd8 Pad11Vol1PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџШI Wire9 Wire9WireWire WF(12П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџџєC40.1uCCeramicCAP_CERAMICWF(1 2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџє C103n9CCeramicCAP_CERAMIC SF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pd4Pad7Sustain3PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R16390RRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R212k7RResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џ%D2 1N4148D Diode DIODEWF( 1 2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џfD?у333332?у333332Пй™™™™™š?й™™™™™š@V€џfD?фЬЬЬЬЬЬ?фЬЬЬЬЬЬПй™™™™™š?й™™™™™š@V€џfD?ѕ™™™™™™?ѕ™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џfDџџ,R2322kRResistorRESISTOR SF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєC10.1uCCeramicCAP_CERAMICSF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ P   L-Q2 2N5088QTO92TO92 WF(12 3Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џџ, R1210kRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d*Pad3InPadPadPAD џџџ№WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџџџШF Wire6 Wire6WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџ   L,Q1 2N5088QTO92TO92 EF(12 3Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џєC30.1uCCeramicCAP_CERAMICWF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџє#C130.1uCCeramicCAP_CERAMICNF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PџџШH Wire8 Wire8WireWire WF(12Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџџџШB Wire2 Wire2WireWireWF(12Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџџєC70.1uCCeramicCAP_CERAMIC NF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PџШD Wire4 Wire4WireWire WF(12П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџџє"C120.1uCCeramicCAP_CERAMICNF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pd6Pad9 Tone2PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџ'D4 1N4148D Diode DIODE WF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џfD?у333332?у333332Пй™™™™™š?й™™™™™š@V€џfD?фЬЬЬЬЬЬ?фЬЬЬЬЬЬПй™™™™™š?й™™™™™š@V€џfD?ѕ™™™™™™?ѕ™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џfDџџ,R3390RRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R2010kRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џ$D1 1N4148D Diode DIODEEF( 1 2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џfD?у333332?у333332Пй™™™™™š?й™™™™™š@V€џfD?фЬЬЬЬЬЬ?фЬЬЬЬЬЬПй™™™™™š?й™™™™™š@V€џfD?ѕ™™™™™™?ѕ™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џfDџџ,R221MRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d: Pad13Vol3PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпd)Pad2+9VPadPadPADџџџьWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R512kRResistorRESISTORNF(1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џџџџџџџШA Wire1 Wire1WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџєC647nCCeramicCAP_CERAMICNF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PB@џџџўINVALID TracksWF(џџџ€џџџ€џџџ€џџџ€џџџџџџџџF#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Р@Р@@V€џVeroRoute/libraries/gEDA/veroroute_passive/Capacitor_Electrolytic_400mil.sym000644 001750 001750 00000001420 13515171161 027500 0ustar00alexalex000000 000000 v 20130925 2 T 200 700 5 10 0 0 0 0 1 numslots=0 P 200 700 400 700 1 0 0 { T 350 750 5 8 1 1 0 6 1 pinnumber=1 T 350 750 5 8 0 0 0 6 1 pinseq=1 T 350 750 5 8 0 0 0 6 1 pinlabel=1 T 350 750 5 8 0 0 0 6 1 pintype=pas } P 1100 700 900 700 1 0 0 { T 950 750 5 8 1 1 0 0 1 pinnumber=2 T 950 750 5 8 0 0 0 0 1 pinseq=2 T 950 750 5 8 0 0 0 0 1 pinlabel=2 T 950 750 5 8 0 0 0 0 1 pintype=pas } L 600 900 600 500 3 0 0 0 -1 -1 L 900 700 700 700 3 0 0 0 -1 -1 L 600 700 400 700 3 0 0 0 -1 -1 A 1400 700 700 165 30 3 0 0 0 -1 -1 L 489 900 489 800 3 0 0 0 -1 -1 L 540 849 440 849 3 0 0 0 -1 -1 T 500 300 5 10 1 1 0 0 1 device=4u7 T 500 1000 8 10 1 1 0 0 1 refdes=C? T 500 700 8 10 0 0 0 0 1 footprint=CAP_ELECTRO_400 T 500 700 8 10 0 0 0 0 1 description=Electrolytic Capacitor (400 mil diameter) VeroRoute/tutorials/tutorial_24.vrt000644 001750 001750 00000124452 14433261701 017700 0ustar00alexalex000000 000000 9;TUTORIAL 24 - COMPONENT EDITOR MODE The in-built component editor lets you define your own parts for adding to the parts library. You can not modify the default parts provided by VeroRoute but you can copy their definitions if you wish and use them as a basis for your own parts. In order to add a user-defined part to the parts library, it must satisfy some minimum requirements which will be described in detail below. 1) It must be given a "Type" and a "Value" so that the part can be clearly identified in the list of library parts. 2) If the part has pins, then the pin numbers must be unique and consecutively numbered starting with 1. For example, a part with 4 pins must have the pin numbers 1, 2, 3, 4. 3) The part must contain at least one shape (e.g. line, rectangle, circle, etc) that has no fill. 4) If the part has an "Import" name (for netlist import) then it must be unique to VeroRoute. You will be prevented from adding a part to the library if it does not satisfy the above requirements. To demonstrate the component editor functionality we will look at the definition of one of the existing parts in VeroRoute. So click on the large capacitor in the middle of the screen. To switch between Component Editor Mode and Circuit Layout Mode , click on the Pencil icon on the far left of the toolbar. Try clicking that icon a few times now to see what happens. 24.1 COMPONENT DEFINITION CONTROLS The "Type" and "Value" fields determine where the part will be appear in the Library Parts  list. You will not be allowed to add the part to the library if these fields are empty. The "Prefix" field determines how a new part name is generated when a part is added to a layout. In this example, the prefix is "C" since capacitors are named C1, C2, etc. The "Import" field is the footprint/package name that will be used by VeroRoute when importing a netlist in Protel1/Tango/OrcadPCB2 format. This field may be left blank if you do not want to use that functionality. The "Import" name should not contain any whitespace, and should not be one of the names already used by VeroRoute. In this example, the footprint name "CAP_ELECTRO_600" is already used by VeroRoute, so it is not possible to add the part to the library. You will need to change the "Import" field or clear it in order for the "Add To Parts Library" button to become enabled. So go ahead and wipe the Import field to continue with the rest of this tutorial. 24.2 PIN RENDERING AND LABELS These controls determine how pins will be drawn when the part is used in a layout. The "Labels" checkbox determines if pin labels are allowed. The combo box next to it determines if pins should be drawn as circles (the default case) or as rectangles (which is what VeroRoute uses for switches and relays). Note: Pins will always be shown as numbers when in component editor mode. Ticking the "Custom" checkbox allows you to enter custom Pad and Hole sizes for the part. You will not see the effect of these changes in the component editor, but they will have an effect when the part is finally used in a PCB design (using Mono/PCB mode). Some parts (such as TO220 packages) will require larger holes than other parts (such as resistors). 24.3 FOOTPRINT DIMENSIONS The footprint "Width" and "Height" define a rectangular set of grid points within which all the component pins must lie. This area is shown in the component editor as a dashed rectangle. The central axes through that rectangle are shown as dotted lines. All shape coordinates are specified relative to those central axes. Note that the footprint area is independent to the set of shapes used to draw a part in the view. When selecting and manipulating a part during a layout, VeroRoute checks if the mouse was clicked within the footprint area. It does not check or care about where the shapes are drawn. If you modify the "Width" or "Height" of a footprint in the editor, then all the pin locations are cleared, and the set of shapes is reset to a single rectangle around the footprint area. So you should make sure that you set the "Width" and "Height" before defining pins and placing shapes. Try modifying the "Width" or "Height" buttons now just to see what happens. Then exit and re-enter the component editor (by hitting the pencil icon 2 times), clear the "Import" field, and then continue with this tutorial. 24.4 MANIPULATING SHAPES To select a shape in the view, click on it with the mouse so it is shown in bold. To move a shape in the view, select it and drag it with the mouse, or use the cursor keys. This will move the shape in steps of 100 mil (i.e. one grid square). For fine adjustment or other modifications, use the controls in the Shape Info  section of the dialog. These controls also respond to the mouse wheel. Holding down the CTRL key while using the mouse wheel will give larger adjustments. To delete a shape in the view, select it and then use the Edit -> Delete Selected Shape  menu item, or the toolbar button. You can also use the DELETE or BACKSPACE key on the keyboard. To copy a shape in the view, select it and use the Edit -> Copy Selected Shape  menu item, or the toolbar button. To add a new shape to the view, use the Add  menu item or the buttons in the toolbar. Shapes can be filled with a color by checking the "Fill" box and selecting a color using the RGB button. Note that any shapes that have the "Fill" button checked will be affected by the "Fill" value in the Control Dialog. In other words, they can be made transparent, or even completely hidden if the "Fill" value in the Control Dialog is set to 0. Only unfilled shapes are displayed all the time. If you have a stack of overlapping shapes, then the up and down arrow buttons can be used to move shapes towards the front or back of the stack. 24.5 SETTING PIN NUMBERS & SURFACE OCCUPANCY To make it easier to follow this section, first move all the shapes (a line and two large circles) out of the footprint area so it is easier to see what is going on there. Component pins can only lie within the footprint area. Click on a point within the footprint area and you will see a small red circle. Then use the mouse wheel to set the pin number at that location. A location with no pin number can be drawn in one of three possible colors (white / light blue / dark grey) depending on how far the mouse wheel is rolled. The colors describe how that portion of the footprint affects the surface occupancy  of the PCB. They have the following meaning: White: This indicates free empty space. Other parts and tracks are allowed at the location when the part is used in a layout. Light blue: This indicates occupied space. Other parts are not allowed at the location when the part is used in a layout, but tracks are allowed there. Dark grey: This indicates a hole in the board. Other parts are not allowed at the location when the part is used in a layout, and tracks are not allowed there either. This makes it possible to define a "drill hole" component. For an example, inspect the "500 mil hole" in the layout. Try adding more pins to the current part. Notice that the "Add To Parts Library" button is disabled if you have an invalid set of pin numbers. 24.6 MODIFYING LIBRARY PARTS To modify an existing library part you must first temporarily place that part in your layout. Then select it and edit its definition with the component editor. On hitting "Add To Parts Library" you will be warned that it will replace the existing library part.џџџџџџџџџџџb2221 $џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ1џџџџџџџџџџAџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџˆџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ ˆџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ ˆџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџ џџџџџџ џџџџџџџџџџ џџџџџџџџџ  џџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ "џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Рџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џ џџџџ џ џ џ џџ џ џ џ џ џ џ  џ џ  џ џ џ џ џ џ џ џџ џ џ џ џџџџ џ џџC1C1C(Electrolytic 600 milCAP_ELECTRO_600 WF(12Р@Р@@V€ŠŠф@ffffff@ffffffПўсGЎzс?ўсGЎzс@V€ŠŠфР@Р@@V€ŠŠф џ џ џ  ^L1L1LInductorINDUCTOR NF(12ПњсGЎzс?њсGЎzсПдzсGЎ{?дzсGЎ{@V€џр€Р\(ѕТПјQы…ИRПй™™™™™š?й™™™™™™@V€џр€?јQы…ИR@\(ѕТПй™™™™™š?й™™™™™™@V€џр€ПњсGЎzс?њсGЎzсПдzсGЎ{ПдzсGЎ{@V€џр€ПњсGЎzс?њсGЎzс?дzсGЎ{?дzсGЎ{@V€џр€Р\(ѕТПјQы…ИRПй™™™™™š?й™™™™™™@J€РJ€џр€?јQы…ИR@\(ѕТПй™™™™™š?й™™™™™™@m @_Рџр€џџџџџџџџџџџџџџџџџџџџџџџџџ†  Hole1500 mil holeHoleHoleWF(Р@Р@@V€џB@џџџўINVALID TracksWF(џџџ€џџџ€џџџ€џџџ€џџџџџџџџF#C1C(Electrolytic 600 milCAP_ELECTRO_600џџџ џ џџџџ џ џ џ џџ џ џ џ џ џ џ џ џ  џ џ џ џ џ џ џ џџ џ џ џ џџџџ џ џџР@Р@@V€ŠŠф@ffffff@ffffffПўсGЎzс?ўсGЎzс@V€ŠŠфР@Р@@V€ŠŠфVeroRoute/libraries/TinyCAD/000755 001750 001750 00000000000 14405612071 016143 5ustar00alexalex000000 000000 VeroRoute/Src/ColorManager.cpp000644 001750 001750 00000002047 14026366725 016556 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #include "ColorManager.h" MyRGB ColorManager::sm_color[] = { MyRGB(0x3C18C8), MyRGB(0xC024F8), MyRGB(0xD26060), MyRGB(0xDCDC58) , MyRGB(0x60C858), MyRGB(0x5896C8), MyRGB(0x6010FF), MyRGB(0xE142D2) , MyRGB(0xE18C30), MyRGB(0xA0C828), MyRGB(0x48C896), MyRGB(0x5080FF) }; VeroRoute/Src/images/center.png000644 001750 001750 00000000654 13661712157 016734 0ustar00alexalex000000 000000 ‰PNG  IHDR йsВgAMAБ ќa cHRMz&€„њ€шu0ъ`:˜pœКQ<bKGDЊ#2 pHYsФФ•+tIMEу&xя…zIDATHЧcdиЩ Т@>ИУТАŠA•nQ w #РˆТ3eha`" уC5У—EђУk6ќbј<аОƒ0242hR џ ƒƒ H tŒ‚СPЫD† ДBќa˜Ю№СEUЎТNDЁКй`‡(Ъ!›e%tEXtdate:create2019-04-04T21:38:19+02:00ЌНъq%tEXtdate:modify2019-04-04T21:38:19+02:00нрRЭtEXtSoftwarewww.inkscape.org›ю<IENDЎB`‚VeroRoute/000775 001750 001750 00000000000 14565712731 012751 5ustar00alexalex000000 000000 VeroRoute/libraries/TinyCAD/VeroRoute_Linear.TCLib000644 001750 001750 00000744000 13515171160 022253 0ustar00alexalex000000 000000 SQLite format 3@ s;-тћћ.!%%‚tableSymbolSymbolCREATE TABLE [Symbol] ([SymbolID] INTEGER PRIMARY KEY,[Data] TEXT)ƒ8!†9tableNameNameCREATE TABLE [Name] ([NameID] INTEGER PRIMARY KEY,[Name] TEXT,[SymbolID] INTEGER,[Type] INTEGER,[Reference] TEXT,[ppp] INTEGER,[Description] TEXT,[ShowName] INTEGER,[ShowRef] INTEGER,[DefRotate] INTEGE 9 №œg<ћЖq0№˜эQeEQOPAMP-DUG -QNJM4558LVU?Dual Op Amp (SIP)л-YNJM455E !YLM741YU?Single Op Amp (DIP)A !QTL072WU?Dual Op Amp (DIP)EQOPAA !QTL074XU?Quad Op Amp (DIP)? QSIP8SU?Generic 8-pin SIPC !UDIP16HU?Generic 16-pin DIPC !UDIP14GU?Generic 14-pin DIP? QDIP8FU?Generic 8-pin DIP) !!NE555EU?Timer3 !5LM311DU?Comparatorb ) LM13600CU?Dual Transconductance AmplifierEЇђћіёьчтнигЮœ—’ˆƒ~ІЁФytЋoje`[VQLGB=83.)$ПКЕАЩ ќїђэшуойдЯЪХРЛЖБЌЇ•5Њn -10 0 400 0 0 0 0 Arial 000000 1H$SB2/%    ілћіјжœbBЮЌr8оЄ„J88i$$SPICE_PROLOG_PRIORITY5)PackageDIP88i$$SPICE_EPILOG_PRIORITY58i$$SPICE_PROLOG_PRIORITY5)PackageDIP88i$$SPICE_EPILOG_PRIORITY58 i$$SPICE_PROLOG_PRIORITY5 )!PackageDIP168 i$$SPICE_EPILOG_PRIORITY58 i$$SPICE_PROLOG_PRIORITY5 )PackageDIP88i$$SPICE_EPILOG_PRIORITY58i$$SPICE_PROLOG_PRIORITY5 )!PackageDIP148i$$SPICE_EPILOG_PRIORITY58i$$SPICE_PROLOG_PRIORITY5)PackageDIP88i$$SPICE_EPILOG_PRIORITY58i$$SPICE_PROLOG_PRIOR?&; ””OЫƒ8!†9tableNameNameCREATE TABLE [Name] ([NameID] INTEGER PRIMARY KEY,[Name] TEXT,[SymbolID] INTEGER,[Type] INTEGER,[Reference] TEXT,[ppp] INTEGER,[Descriptƒ8!†9tableNameNameCREATE TABLE [Name] ([NameID] INTEGER PRIMARY KEY,[Name] TEXT,[SymbolID] INTEGER,[Type] INTEGER,[Reference] TEXT,[ppp] INTEGER,[Description] TEXT,[ShowName] INTEGER,[ShowRef] INTEGER,[DefRotate] INTEGER).!%%‚tableSymbolSymbolCREATE TABLE [Symbol] ([SymbolID] INTEGER PRIMARY KEY,[Data] TEXT) !:ФОИВЌІ š”Žˆ‚|vpjd^XRLF@:жаЪштмњєюрррррррррррррррЮЮЮ:]: \:[юќ `юі _ю№ ^юъWюфVюоUюи6Иœ5И–4И 'ИŠ &И„ %И~?Иx>Иr=987321       <;:?>=BA@ &&[‡Ÿ!EE1tablecreation_tablecreation_table;CREATE TABLE creation_table (tmp INTEGER)‚2!11„tableAttributeAttributeCREATE TABLE [Attribute] ([AttributeID] INTEGER PRIMARY KEY,[NameID] INTEGER,[AttName] TEXT,[AttValue] TEXT,[ShowAtt] INTEGER)"!51aindexidx_NameIDAttributeCREATE INDEX [idx_NameID] ON [Attribute] ( [NameID] ) number_pos='0' centre_name='0'>+ - OUTPUT + - OUTPUT + - OUTPUT + - OUTPUT ='20' number_pos='0' centre_name='0'>TRIG OUT RESET VC THRES DISCH VCC <<•5Њn -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND - OUTPUT + - OUTPUT ЏЏŽF -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + + - OUTPUT + - OUTPUT + - OUTPUT + - OUTPUT <<•5Њn -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 V- OUTPUT OS FC OS/FC ))LŸ -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 V+ + - - OUTPUT + - OUTPUT ЏЏŽF -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + 000000 1 -1 000000 VS+ + - OUTPUT + - OUTPUT + - OUTPUT GND &аNЙ&‘ Ђ -10 0 400 !‘ Ђ -10 0 400 <šoЕb -10 0 400 0 0 0 0 Arial -9 4 400 0 -10 0 400 0 0 0 0 Arial  ˜˜6.00000' b='36.00000,26.00000' style='3' fill='0'/> -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + - TRIG OUT RESET CTRL THRESH DISCH VCC ALIC> 0 0 0 Arial 000000 1 -1 000000 VS + - OUTPUT BYP GND PWR GND ITALIC>0 0 0 0 Arial -8 4 400 0 0 0 0 Arial 000000 1 -1 000000 + - OUTPUT offset + - " 0 0 0 0 Arial -8 4 400 0 0 0 0 Arial 000000 1 -1 000000 + - OUTPUT offset + - $ 0 0 0 0 Arial -8 4 400 0 0 0 0 Arial 000000 1 -1 000000 + - OUTPUT offset + - DmDКŠЁz -10 0 400 -10 0 400 0 0 0 0 Arial -10 0 400 #'='3'> -9 4 400 0 0 0 0 Arial -8 4 400 0 0 0 0 Arial 000000 1 -1 000000 VS + - OUTPUT BYP BYP GND ” length='20' number_pos='0' centre_name='0'>+ Out V- BUFFER IN BUFFER OUT + Diode Bias - Amp Bias - V- COL OUT EMIT OUT V+ BALANCE BAL/STRB 3' length='20' number_pos='0' centre_name='0'> . number_pos='0' centre_name='0'>+ - OUTPUT + - OUTPUT + - OUTPUT + - OUTPUT <<•5Њn -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + - OUTPUT + - OUTPUT + - OUTPUT + - OUTPUT <<•5Њn -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 - OUTPUT + - OUTPUT ЏЏŽF -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + OUTPUT + - OUTPUT + - OUTPUT 5' number_pos='0' centre_name='0'>+ - - OUTPUT os os >>’Y -10 0 400 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND -10 0 400 0 0 0 0 Arial 000000 1+ - OUTPUT + - -10 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 zЦІl2жœzJJJJJJJJJJJ 0ber='3' show='3' length='20' number_pos='0' centre_name='0'> - Amp bias A='1' number='9' show='3' length='20' number_pos='0' centre_name='0'> Amp bias + + Diode bias - OUTPUT + - OUTPUT B pos='52.00000,22.00000' style='3' fill='0'> + - - OUTPUT os os EPSE a='31.54211,24.99864' b='29.54211,26.99864' style='3' fill='0'/> Out - BUFFER IN BUFFER OUT <+ - -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + OUTPUT + - OUTPUT + - OUTPUT ,26.00000' which='0' elec='4' direction='2' part='1' number='7' show='2' length='20' number_pos='0' centre_name='0'>OUTPUT + - OUTPUT + - OUTPUT >>ŽF -10 0 400 7#šr -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + - -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + + - OUTPUT + - + - OUTPUT + - - OUTPUT + - OUTPUT 0' number_pos='0' centre_name='0'>- OUTPUT + - OUTPUT GESS> 000000 1 -1 000000 + - + -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + + -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + - OUTPUT + - OUTPUT + - OUTPUT + - OUTPUT ' number_pos='0' centre_name='0'>- - OUTPUT + - OUTPUT ЏЏŽF -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 TRIG OUT RESET CTRL THRESH DISCH VCC 0' number_pos='0' centre_name='0'>- OUTPUT + - OUTPUT ЏЏŽF" -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + - - OUTPUT os os >>7&šr -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + - OUTPUT + - OUTPUT ЏЏŽF' -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + -1 000000 V+ + Bias - OUTPUT <POINT pos='0.00000,0.00000' arc='0'/> + - OUTPUT Out V- ’T)Ѕ, -10 0 400 0 0 0 0 Arial 000000 Bias - OUTPUT + - OUTPUT Out V- •^*Ћ@ -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 V+ +fjh='0' elec='4' direction='3' part='0' number='3' show='3' length='20' number_pos='0' centre_name='0'>+ Bias - OUTPUT + - OUTPUT Out V- œn+Й` -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 V+ - OUTPUT + - OUTPUT Out V- __Ї ,Ю -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 V+ + Bias Bias - OUTPUT + - OUTPUT Out V- ээЅ|-Ы| -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 V+ + Diode Bias - Amp Bias + - OUTPUT Out V- ххІ.Ь -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 V+ + Diode Bias - Amp Bias + - OUTPUT Out V- ххІ/Ь -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 V+ + - OUTPUT + - OUTPUT ЏЏŽF0 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + Diode Bias - Amp Bias + - OUTPUT Out V- ххІ1Ь -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 V+ + Diode Bias - Amp Bias + - OUTPUT Out V- BUFFER IN BUFFER OUT ввІ2Ь2 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 V+ + - OUTPUT + - OUTPUT ЏЏŽF3 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + - OUTPUT + - OUTPUT ЏЏŽF4 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + OUTPUT + - OUTPUT + - OUTPUT ‘number_pos='0' centre_name='0'>+ - OUTPUT + - -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 ssЌr6йh -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 V+ + Diode Bias - Amp Bias - + Out V- BUFFER IN BUFFER OUT ­W7л2 -10 0 400 0 0 0 0 Arial 000000 1 000000 1 -1 000000 V+ + Diode Bias - Amp Bias - + Out V- BUFFER IN BUFFER OUT ­W8л2 -10 0 400 0 0 0 0 Arial 000000 1 000000 1 -1 000000 V+ + Diode Bias - Amp Bias - + Out - BUFFER IN BUFFER OUT + - ­W9л2 -10 0 400 0 0 0 0 Arial 000000 1 000000 1 -1 000000 + + Diode Bias - Amp Bias - + Out - BUFFER IN BUFFER OUT + - ­W:л2 -10 0 400 0 0 0 0 Arial 000000 1 000000 1 -1 000000 + -1 000000 + + Diode Bias - Amp Bias <БPOINT pos='0.00000,0.00000' arc='0'/> - + Out - BUFFER IN BUFFER OUT `0`Ћ5<жn -10 0 400 0 0 0 0 Arial 000000 1 000000 ЕЋ5;жn -10 0 400 0 0 0 0 Arial 000000 1 000000 ЏЖ1 -1 000000 + + Diode Bias - Amp Bias <ЗPOINT pos='0.00000,0.00000' arc='0'/> - + Out - BUFFER IN BUFFER OUT Лtion='1' part='0' number='11' show='3' length='20' number_pos='0' centre_name='0'>+ - + Out - BUFFER IN BUFFER OUT Amp bias + + Diode bias - Amp bias ˜˜ЌM=й -10 0 400 0 0 0 0 Arial 000000 1 000000 1 -1 000000 + - + Out - BUFFER IN BUFFER OUT Amp bias + + Diode bias - Amp bias ˜˜ЌM>й -10 0 400 0 0 0 0 Arial 000000 1 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + OUTPUT + - OUTPUT + - OUTPUT 5' number_pos='0' centre_name='0'>+ - - OUTPUT os os >>ыџџџыџџџыџџџыџџџыџџџыџџџыџџџыџџџыџџџыџџџыџџџыџџџыџџџыџџџыџџџыџџџыџџџыџџџыџџџыџџџыџџџыџџџыџџџыџџџыџџџыџџџыџџџыџџџыџџџыџџџыџџџ7@šr -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + + - - OUTPUT + - -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND 3' length='20' number_pos='0' centre_name='0'> --HIŸ -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 --HJŸ -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 - - OUTPUT + - OUTPUT ­­ŽHK -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + + - - OUTPUT + - OUTPUT ­­ŽHL -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + + - - OUTPUT + - OUTPUT ­­ŽHM -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + + + - - OUTPUT + - OUTPUT + - OUTPUT + - OUTPUT ::•7NЊr -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + i$$SPICE_EPILOG_PRIORITY58=i$$SPICE_PROLOG_PRIORITY53)PackageSIP882i$$SPICE_EPILOG_PRIORITY581i$$SPICE_PROLOG_PRIORITY59)PackageSIP888i$$SPICE_EPILOG_PRIORITY587i$$SPICE_PROLOG_PRIORITY5B)PackageDIP88Ai$$SPICE_EPILOG_PRIORITY58@i$$SPICE_PROLOG_PRIORITY5<)PackageDIP88;i$$SPICE_EPILOG_PRIORITY58:i$$SPICE_PROLOG_PRIORITY5 ?)!PackageDIP14' number_pos='0' centre_name='0'>- - OUTPUT + - OUTPUT ­­ŽHO -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + + + - - OUTPUT os os >>7Pšr -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + - - OUTPUT + - OUTPUT ­­ŽHQ -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + + - - OUTPUT + - OUTPUT ­­ŽHR -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + + --HSŸ -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + - - OUTPUT OS OS >>7Tšr -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + + - - OUTPUT OS OS >>7Ušr -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + - - OUTPUT + - OUTPUT ­­ŽHV -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + + - - OUTPUT + - OUTPUT ­­ŽHW -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + + + - - OUTPUT + - OUTPUT + - OUTPUT + - OUTPUT ::•7XЊr -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + + - - OUTPUT OS OS >>7Yšr -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 + New was not forcing a single-layer board to be created. // Bug fix: Stripes on flying wires were not always rendered properly on unix builds. // Bug fix: Component Editor Mode was not working if "flip view" options were enabled in Circuit Layout Mode. // New feature: Complete reworking of how connectivity info is displayed (no more red lines all over the tracks). // Instead show missing connections with a minimal set of air-wires. // Improvement: Removed the "flip view" options from the toolbar (they were too easy to hit by mistake on a tablet screen). They are only in the View menu now. // Improvement: No longer use "T" key to change pin layer preference for 2-layer PCBs. Instead double-click on a pin when in PCB mode. // Improvement: Show board dimensions in status bar instead of title bar. // Improvement: Added "Surface" combo box to component editor so it can be set without relying on use of mouse wheel in the view. // Improvement: No longer set PCB pad offsets with cursor keys. Instead click on a pin for 1 second, then release to launch Pad Offset Dialog. // Improvement: Single toolbar with bigger icons and buttons that change according to mode (Circuit Layout/Component Editor). // Improvement: Added toolbar icons for "Delete" and "Copy". // Improvement: Allow "Copy" operation to work on shapes in Component Editor Mode. // Improvement: Auto-centre the view when switching to Component Editor Mode. // Improvement: Double-click on selected components rotates them (if you dont click on a pin). // Improvement: More efficent undo/redo history logging. // Improvement: Allow competing diagonals to be resolved by regular paint procedure (i.e. paint on the crossing after painting the ends of the diagonal). // Improvement: No more selection/desection of netlist ID by single clicks. // You must now double-click on a track/pin to select, and double-click on a blank area to deselect. // Stops confusing behaviour such as a netlist of interest becoming deselected when you try to move some other part. // Improvement: Only allow painting/unpainting of pins (and paint by flood fill) when in Color mode. // Improvement: Added Layers menu item for resetting all pin layer preferences. // Improvement: On a 2-layer board, if you have a floating component (because the tracks on the layers do not match the floating pins) // and you go to erase the tracks under those floating pins so that the component can drop into place, then // auto-erase the tracks on the other board layer also if necessary. This saves the user having to switch layers // to erase the tracks manually. // Improvement: Force docking of major dialogs (necessary for Android usability). // Replaced all sliders in the GUI with check boxes or spin controls. // Use of the "P" key is now strictly for painting/erasing component pins. Not regular grid points or wires. // Updated the tutorials. //"2.19"; // Bug fix: The grid did not properly resize itself when the user tried to add a component or text box that // was wider/taller than the current grid size, leading to a corrupted layout. //"2.18"; // Bug fix: Pin layer preference logic for PCBs was not properly handling diagonal connections, so // diagonally adjacent pins that were electrically connected might not have a connection drawn on either layer. // New feature: Extra thermal relief tags are produced by default when producing PCBs with ground pours. //"2.17"; // Improvement: When using ground-fill, the width of the thermal relief tags connecting pads to the ground-fill can be set in the Rendering Options. //"2.16" // Bug fix: When vias are enabled, connectivity info was wiped when zooming or changing sliders, leading to erroneous hatched lines being displayed. // Improvement: The Pin Label dialog can now also be used in Component Editor mode. //"2.15"; // Improvement: Added background brightness to Rendering Options. //"2.14"; // Improvement: Added vertical alignment options to text boxes. //"2.13"; // Bug fix: Code to fix corruption can mess up competing diagonals on boards that are OK. //"2.12"; // Bug fix: Corrected tab order in Rendering Options and Component Editor dialogs. // Updated Tutorial 18 with info on applying pad offsets. //"2.11"; // Bug fix: The routing changes in V2.09 introduced a bug in the connectivity checking of layouts with wires, // so fully connected nets that use wires could sometimes be wrongly listed as "Bad Nodes". //"2.10"; // Bug fix: Show closest tracks did not draw all locations due to rounding errors. // Bug fix: Flying wires not drawn properly to offset pads. // Improvement: If all pads on a component are shifted by the same amount, then give the component outline and text the same shift. // Improvement: Show rectangular area sizes and pad offsets in both mil and mm. // Improvement: Allow pad offsets to change in 1 mil steps instead of 5 mil. // New feature: Added distance tool for measuring distance between holes/grid points (to help set pad offsets) //"2.09"; // Improvement: Routing algorithm speed increased. //"2.08"; // Bug fix: Autorouting in non-fast mode corrupts how adjacent nodeIDs on the grid are tracked, // leading to many adjacent nets being given the same color. // Improvement: Speed up how flying wires are handled during connectivity checking. // Improvement: Speed up code for tracking adjacent nodeIDs on the grid. // Improvement: Speed up routing in non-fast mode by 5% to 10%. // Improvement: Allow "Paste" when auto-routing to be restricted to grey areas. // Improvement: Moving/rotating grey areas while auto-routing will ignore auto-routed tracks in the grey areas // instead of pasting them. //"2.07"; // Improvement: Faster algorithm for building the list of broken nodes. // Improvement: Copying a part with no name and no value should produce a part with no name and no value. // New feature: Flying wires. Automatically generated between "Pad (Flying Wire)" objects. //"2.06"; // Bug fix: In Rendering Options, the "Show closest tracks" box was not being hidden when minimum separation was same as Gap size. // Bug fix. In Fat Tracks mode with diagonals, tracks in the view were not all of correct width, but the ones in Gerber export were. // Bug fix: In Fat Tracks mode with diagonals, the track separation algorithm was not handling all cases properly. // Bug fix: In Fat Tracks mode, Gerber export should create an aperture for pads even if there are no parts in the circuit. // Improvement: Allow reset pin layer preference ("T" + right button) while moving mouse instead of having to do single clicks. //"2.05"; // Bug fix: Code for filling parts with color not correctly handling shape transformations. // Bug fix: Track separation info in the Rendering dialog not updating when auto-routing toggled. // Bug fix: Components with lines outside the footprint area could be rendered off screen // leading to an invalid set of Gerber files (e.g. GTO file having points outside the boundary in the GKO file). // Improvement: Total rewrite of minimum track separation for improved accuracy. // Improvement: Show points for all layers when displaying locations of minimum track separation. // New feature: In PCB mode, individual pad locations can be shifted by up to 50 mil using Ctrl + Arrow keys. //"2.04"; // Bug fix: Since 2.02, VeroRoute freezes if the grid is made 1 column wide. // Omit deprecated G codes from Gerber export, and allow Gerber export in mm or inches. // Allow circuit panning/grid resize by grabbing the grid with the right mouse button (ctrl key optional). // Improve GUI behaviour in Tutorials by passing key presses from the Info dialog to the main window. //"2.03"; // Bug fix: Wire rendering broken in 2.02. // New feature. Can specify layer preference on component pins of 2-layer PCBs. // Updated tutorials. //"2.02"; // Bug fix: Fill slider should be enabled when track slider is set to Off. // Bug fix: Calculation of minimum track separation was not correct when using fat tracks style. // Bug fix: Changed render order in Color/Mono mode to fix issues with how custom sizes pads are drawn. // Track width changes: Minimum allowed track widths lowered to 4 mil. // Minimum allowed via hole lowered to 8 mil. // Minimum allowed via pad lowered to 16 mil. // Maximum custom pad size increased to 130 mil. // Maximum custom hole size increased to 100 mil. // New feature: Add ability to show locations of minimum track separation. // Updated tutorials. //"2.01"; // Bug fix: Chains of wires sharing holes sometimes not colored completely. // Added ability to define custom pad/hole size in component editor. // Added ability to add veroboard labels (numbers or letters). // Improved algorithm for solder bridges. Don't show a solder bridge if a wire is already doing that job. //"2.00"; // Bug fix: Poor-man's 2-layer Gerber export was not handling crossing wires. // Bug fix: Isolated nodes were rendered to Gerber with pad-width instead of track-width. // Bug fix: Isolated nodes were rendered to top layer for poor-man's 2-layer Gerber export. // Improvement: Allow TAB to change focus of dialog controls. // Improvement: Reworked some icons that did not work well with dark themes. // Removed menu item to fix corruption. Old corrupted VRTS are now auto-fixed on load. //"1.99"; // Code changes to help prevent layout from becoming corrupted. //"1.98"; // Put in extra checks to stop potential crashes arising from a corrupted layout. // Added file menu option to fix a corrupted layout. //"1.97"; // Bug fix: In Color mode, diagonal track portions were drawn too long if using custom track color. // Disabled code for drawing extra thermal relief tags (so a filled PCB will be easier to solder). //"1.96"; // New feature: In Color mode, color each wire according to its NodeId. //"1.95"; // Bug fix: Thermal relief tags not calculated properly for pads with custom size. // New feature: Allow user to specify a color for any NodeID. // Improvement: Show info on Bad/Floating nodes in a single list. // For consistency between view types, draw hashed lines for broken connections in red instead of yellow. //"1.94"; // Bug fix: When ground-filling with no specified nodeId, do not draw thermal relief tags to unassigned pins. // New feature: Find parts in layout by Name or Value. // Improvement: Made Rendering Options dialog better handle 11pt font. //"1.93"; // Make control dialog better handle large font. // // Draw pads for unassigned pins in Mono/PCB mode. //"1.92"; // Bug fix: Delete selected template would sometimes remove wrong template. //"1.91"; // Bug fix: Allow 2-pin DIPs. // Bug fix: Mouse click not always selecting most relevant shape in component editor mode. // Improvement: Draw some parts (e.g. resistors/diodes/DIPs) differently in PCB mode when appropriate. //"1.90"; // Bug fix: While auto-routing, unpainting the board under a part would not always let it fall into place. // Bug fix: Hole-usage was not handled properly for non-wires. // Improvement: Increase max allowed hole size for parts from 40 mil to 50 mil. //"1.89"; // Bug fix: Gerber export in V1.88 was writing unusable drill file, and not handling variable pad/hole widths correctly. //"1.88"; // Roll back of change made in V1.85: Top solder mask now works in same way as bottom solder mask. // Bug fix: Fix problem with docked dialogs passing mouse clicks to the main window. // Improvement: Various minor fixes, improvements and simplificatons to Gerber Export code. // Improvement: Changed diode cathode marking so it is less likely to be erased on a PCB. // Improvement: Show actual minimum track separation (instead of the guaranteed minimum). // New feature: Show minimum ground fill width to help avoid isolated ground "islands". // New feature: Allow custom pad and hole sizes to be set on each part. //"1.87"; // Bug fix: 300 mil electrolytic cap was missing line marking negative side. // Improvement: When modifying shapes in component editor, allow unit steps with the mouse wheel. // Improvement: Allow flipped views in PCB mode but don't allow export/editing when flipped. // Lots of minor GUI tweaks such as disabling certain buttons according to display mode. // Added the Bourns 3362 series to the set of trimmers in the Templates dialog. //"1.86"; // Bug fix: V1.85 was sometimes hiding pin outlines (e.g. when track slider was set to Off). // Bug fix: Switching to Component Editor mode from PCB mode gave black background. // Bug fix: Placing a wire in 2-layer mode did not handle both wire ends properly. // Improvement: Added button to Templates dialog to save all templates to a VRT file. // Improvement: For ground-fills, auto-generate additional tags for thermal reliefs. // Functionality change: To avoid track breaks, markers in Mono mode only make holes in ground-fills. // Functionality change: Disabled show/hide of docked widgets by right mouse-click on menu bar. // Added command line options (-h, --help, -v, --version). // Added manpage as part of unix installation. //"1.85"; // Bug fix: Refresh problem. Broken and Floating lists could show zombie entries when the control dialog is docked. // Bug fix: Rendering problem. In Mono and Color modes, some zoom levels would leave gaps between pixmaps and draw offset diagonals. // Bug fix: In Mono and Color modes, it was not possible to set via-pad and via-hole sizes. // Improvement: Allow larger zoom level. // Improvement: To avoid problems with some PCB companies, made the top solder mask cover most (but not all) of each pad/via. // Improvement: When rendering the top layer in PCB mode, make it better represent the fact that a portion of each pad/via is visible. // Improvement: When writing the drill file, use XNC/Excellon Format 2. //"1.84"; // Bug fix: Repainting pins on layer 2 did not update grid connections properly, and could crash when the part is moved. //"1.83"; // Bug fix: Pin dialog should be hidden in component editor mode. // Bug fix: Vias were only drawn with correct size in PCB mode. // Improvement: Zoom with respect to mouse position rather than centre of view. // Improvement: When adding to part templates from current circuit, only consider currently selected parts. // Improvement: Reduce minimum allowed track width from 30 mil to 12 mil. // New feature: Allow use vias to be enabled/disabled under Layers menu. // New feature: Added new "Thin" track style for more traditional look and smaller Gerber files. //"1.82"; // Bug fix: Merge should not update the filename used for saving. //"1.81"; // Bug fix: Hiding the top toolbar made mouse clicks map to the wrong grid locations. // Bug fix: Right clicking on the top toolbar allowed control and component editor dialogs to be displayed together. // Added shell script to uninstall on Linux and updated README.txt with info on uninstall procedure. //"1.80"; // Added second board layer. // Made the Control and Component Editor dialogs dockable and docked by default. // Updated the tutorials to describe 2-layer functionality. //"1.79"; // New feature: File menu allows Gerber export as either 1-layer or 2-layer. // Removed NPTH/PTH selection since it is implied by the export type (1-layer/2-layer). // Changed hatched lines in Mono mode from yellow to red. // Hide vias in PCB mode (as they are ignored at the moment). // Help->Support now opens forum in browser. // Added "Clear recent files list" to File menu. //"1.78"; // Bug fix: Unpainted wire ends were being drawn as painted. // Improvement: Added default label offsets to small Electrolytic Caps so they don't lie over pin holes. // Stop offsetting pad labels by default (it was too confusing manipulating them like that). //"1.77"; // Bug fix: Text rendering to PDF was broken by changes for PCB text. // Improvement: Text size setting in Renderer Dialog affects PCB text size also. // Improvement: Added more PCB parameters (for Gerber) to Rendering Dialog. // Moved all Gerber related viewing from Mono mode to new PCB mode on the Track slider. //"1.76"; // Improvement: In Mono mode, all text boxes are now automatically mirrored for toner-transfer. // Improvement: In Mono mode, all component outlines and component text are rendered to match Gerber output. //"1.75"; // Partial bug fix: Rendering components to PDF would always show them filled (even if "Fill" slider was off). // Fixed to show only outline if "Fill" slider is off. // New feature: Added info to rendering dialog showing the minimum guaranteed track separation // based on the current (pad, track, gap, diagonal mode, ground fill) settings. // New feature: Allow Gerber export when in Mono mode (Beta). //"1.74"; // Better treatment of part labels under part rotation. Offset labels for Pads/Connectors by default. //"1.73"; // New feature: Make pin label alignment (Left,Centre,Right) editable in pin labels dialog. //"1.72"; // Bug fix: Flood fill not preserving status of grid under wires. //"1.71"; // Bug fix: Component editor not checking connectors (strip/blocks) for reserved import strings. //"1.70"; // Bug fix: Handle selection of rotated shapes in component editor. // Bug fix: Make netlist import handle connectors (strip/blocks) with different numbers of pins. //"1.69"; // New feature: Allow netlist import in OrcadPCB2 format (so KiCad can be used as schematic editor). //"1.68"; // Bug fix: Component Editor not drawing footprint area with dashed line. //"1.67"; // Bug fix: Rotating a track pattern did not correctly handle competing diagonals. // // Bug fix: Couldn't use keys to move/rotate a track pattern unless components were also selected. //"1.66"; // New feature: Allow shapes to be filled with colors. //"1.65"; // Bug fix: Wire hole-sharing under an IC only worked with wire-crossing enabled. // // Improvement: Render wires as rounded rectangles so hole-sharing looks clearer. //"1.64"; // Bug fix: Fixed algorithm for stacking wires. // // New feature: Allow 2 wires to share a hole. // // Added "Wire Options" dialog to set allowed wire operations. //"1.63"; // Bug fix: 1.62 could crash or corrupt the layout if stacking wires under an IC. //"1.62"; // Bug fix: Don't allow parts/tracks selected by area to be manipulated if a control slider is hiding some of the selection. // // Bug fix: Don't show selected area if both control sliders are moved to Off. // // New feature: Allow wires to cross, and allow up to two wires to be stacked next to each other (but no hole sharing yet). //"1.61"; // Improvement: Auto-router respects manually painted track between two pins. // // Allow manual over-painting of auto-routed track, and show // // all auto-routed tracks with hatched lines (including the current selection). // // Split "Paste" and "Tidy" buttons, and only allow "Tidy" on completed circuits. //"1.60"; // Bug fix: Since V1.58, connected tracks were not always rendered properly. // // Improvement: Added option to disable "Fast" routing (to try reduce Bad Nodes). //"1.59"; // Improvement: Added Key/Mouse Actions dialog under Help menu. //"1.58"; // Improvement: Faster routing and connectivity checking. //"1.57"; // Improvement: Faster routing algorithm. //"1.56"; // Tweaked dialog layouts to better handle 11 point fonts. //"1.55"; // Improvement: List recent VRT files in File menu. //"1.54"; // Added Zoom buttons to toolbar. // // Changed executable name, folder names, and file names to lowercase. // // Made program search for "tutorials" folder in standard locations. //"1.53"; // Improvement: Added Undo/Redo buttons to toolbar. // // Improvement: Allow Undo/Redo in Component Editor mode. //"1.52"; // Bug fix: Missing Templates folder would disable Undo/Redo. // // Bug fix: Changing component type using Control Dialog (e.g. from Diode to LED) not working properly. // // History and Templates folders now auto-created in OS/application specific locations. //"1.51"; // Bug fix: Floating track pattern could not be placed over unpainted wires on the board. // // Improvement: Made buttons to move component labels use a smaller step size. //"1.50"; // Bug fix: Clicking on a floating track pattern should not place floating components. // // Moved the Pad/Track/Hole/Gap controls to the Rendering Options dialog. Updated the tutorials. //"1.49"; // Restrict labels to 2 orientations. (Left to right, or bottom to top). // // Improvement: Add rendering options to show target board area. //"1.48"; // Bug fix: Possible crash during auto-routing while moving wires. // // Improvement: Speed up algorithm for routing/connectivity checking. //"1.47"; // Bug fix: Version 1.46 would produce duplicate shapes when loading parts from VRT. // // Bug fix: Changing DIP width wasn't changing the component outline. // // New feature: Component editor can define "holes" (i.e. non-paintable grid points). //"1.46"; // Bug fix: Fixed error in loaded old VRTs with strip connectors. //"1.45"; // Bug fix: Prevent mouse from dragging shapes off screen in the component editor. // // Bug fix: Fix shape selection in the component editor. //"1.44"; // Bug fix: Fixed bad TRCD Relay. // // New feature: Added component editor. //"1.43"; // Bug fix: Stop potential crash when defining areas for part/track selection. // Improvement: Add toolbar button to select part/tracks by area. //"1.42"; // Improvement: Added Rendering dialog controls for component text size. // // Bug fix: Correct footprints for GTR-2 relays. // // Improved outline sizes for relays and Bourns trimpots. //"1.41"; // Bug fix: Menu and toolbars were being blanked while drawing rectangles with the "R" key. // // Bug fix: The status of the diagonals mode was not always restored when toggling between vero and non-vero styles. // // Improvement: Prevent copying of textboxes with no text. // // Improvement: Show text box outline in dark grey instead of black, so it can be seen in ground-fill mode. // // Improvement: When zooming in/out, try to keep the view showing the same centre point. // // Improvement: Draw pin labels in black instead of grey so they are easier to read. //"1.40"; // Minor improvements: Automatically delete textboxes with no text. // // Show board size in mm in the window title bar. Show drawn rectangle size in mm in the status bar. // // Color toolbar icons to differentiate track styles / diagonal modes. //"1.39"; // Moved some controls from the control dialog to the toolbar. Reduced heights of control dialog and templates dialog. //"1.38"; // Added more component types: TO-39 package, pin strips, terminal blocks, inductor, wide film cap, fuse holder, relays. //"1.37"; // Bug fix: Trying to undo "Delete text" could cause a crash. // // New feature: Text color can now be chosen. // // New feature: Hitting "V" key will copy+paste a selected text box. //"1.36"; // Bug fix: Buttons in Text Label Editor weren't always reflecting text style. // // Bug fix: Prevent user from selecting text boxes in "Hide Text" mode. // // New feature: Added painting by "flood-fill". //"1.35"; // New feature: Replace "Mirror" with "Flip-H" and "Flip-V" options. // // New feature: Add->Text menu item for putting labels on the grid. //"1.34"; // Bug fix: Merge was not clearing existing user-defined areas. // // New feature: Added margin control for auto-crop. // // New feature: While the user draws a rectangle, show its size in the status bar. //"1.33"; // New feature: Allow horizontal veroboard strips. // // Tweaked color assignment algorithm. //"1.32"; // New feature: "File->Open (merge into current)". //"1.31"; // Improvement: User-defined areas select tracks as well as components. //"1.30"; // Improvement: Duplicating components copies their Value too if it's different to the name. // // Added more component types. (Relays, Switches, Trimpots). // // Changed default lengths of resistors and diodes to 400 mil. // // Updated gEDA/TinyCAD import code for RESISTOR/DIODE/CAP_CERAMIC/CAP_FILM // // so that appending an optional integer number to the footprint name // // sets the length in 100s of mil. (e.g. RESISTOR3 = 300mil) // // Updated gEDA library with resistors and caps of different lengths. // // Added ability to select components/wipe tracks within area (hold down "R" to draw areas). //"1.29"; // Added Crystal component type and gEDA library symbol. //"1.28"; // Improvements: // // Added "Toggle Grid" and "Toggle Mirror" as View menu items. // // List part types in B.O.M. // // Allow pin labels for TO packages as well as DIPs, SIPs. // // New feature: Added "Parts/Templates Dialog" so user can build a parts library // // for ICs and TO packages (avoids defining pin labels with each new circuit). // // Double-clicking on any listed part adds it to the circuit. //"1.27"; // Bug fix: Deleting a component was not immediately updating the Bad Nodes lists. // // Bug fix: V1.26 allowed components to be dragged while user was painting pins. //"1.26"; // Bug fix: Holding down "P" and SPACE at the same time would allow mouse move to modify component pins. // // Usability tweak: Holding down SPACE now allows un-painting the board under a placed component pin, // // or painting the board under the pin to match the existing NodeId on the pin. //"1.25"; // Usability tweaks: // // Slow down the grid auto-pan/resize when moving components with the mouse. // // Selecting a NodeID in the "Broken" list should also highlight it in the "Floating" list if it's there. // // Added a Spin FV-1 IC and serial EEPROM to the gEDA library. //"1.24"; // Added IC Pin Labels dialog. //"1.23"; // Fixed memory leak on shutdown. // // Updated Tutorial 19 with info on creating a registry key for MS Windows. // // Added more JFETs to the symbol libraries. //"1.22"; // Added command line options to specify VRT file and path to VeroRoute home directory. // // Support drag and drop of VRT files from file explorer. // // Allow multiple VeroRoute instances to run at the same time. // // Improved error reporting during netlist import. // // Added color saturation slider. // // Changed rendering behaviour when clicking on an item in the Broken list. // // Added gEDA symbol libraries. //"1.21"; // Improved rendering speed by avoiding pointless repaints. // // Control dialog rearranged so a checkbox controls ground-fill. // // Draw foil capacitors with thinner shape to better match the footprint. // // Draw floating component text in red. // // Made export to PDF centre on grid bounds instead of circuit bounds. // // Write status bar messages. //"1.20"; // Added Grid checkbox. PDF shows bounding box and can show grid. // // Increased max pins per component to 255. // // When writing to file, append ". vrt", ".pdf", ".png" to filename as needed. //"1.19"; // Add separate "Paste" and "Paste+Tidy" buttons for auto-routing. Updated tutorials. //"1.18"; // Bug fix: Info dialog edits weren't treated as changes so "Save" was broken, but "Save As" was OK. //"1.17"; // Added ground-fill. //"1.16"; // Fixed mouse-wheel behaviour on windows. Added View menu option to show IC pins as numbers. //"1.15"; // Added more Edit menu items. Check for Tutorials and History folders at start-up. //"1.14"; // Added Help menu item to check if a new version is available. //"1.13"; // Bug fixes: PDF write was broken since V1.10. "Add" menu item was enabled when view was mirrored. //"1.12"; // Fixed TinyCAD package names for NP capacitors. Make netlist import allow spaces in Name and Value fields. //"1.11"; // Fixed crash on importing unknown package. Increased maximum number of pins per component to over 200. //"1.10"; // Added import of netlist from TinyCAD schematic. Hide old Import/Export. //"1.01"; // Added scroll bars. Place new components in top-left of visible view and float them if needed. //"1.00"; // Disable component text buttons when appropriate. Tidy code. Drop Beta. //"0.999"; // Bug fix: Fix possible crash if adding new wire while auto-routing is enabled. //"0.998"; // Bug fix: After "Paste" auto-routed wire, color should stay on board when wire moved. //"0.997"; // Added part type combo. Added width buttons for DIP gap resizing instead of "E","R" keys. //"0.996"; // Bug fix: Deleting grouped components could cause a crash later. Allow DIP gap resizing with "E","R" keys. //"0.995"; // Check if circuit has been saved before launching Tutorials. Don't auto-raise Info window on Undo/Redo. //"0.994"; // Bug fix: Erasing under floating pins while auto-routing. //"0.993"; // Routing improvement. //"0.992"; // Improve routing. //"0.991"; // Bug fix: Redraw when toggling track styles. //"0.99"; // Added new part types including multi-pole switches. //"0.981"; // Bug fix: Undo/Redo. //"0.98"; // Added Undo/Redo. //"0.97"; // Added new part types. Improved TO-92 outline. Auto-centre when writing to PDF. //"0.96"; // Show File menu-shortcuts. Fixed tutorial description of polarised component Export. //"0.95"; // Added save to PNG. //"0.94"; // Added B.O.M. //"0.93"; // Try auto-generate unique Name when adding new part. //"0.92"; // Add Ctrl shortcuts for File menu options. Changed tutorials. Fixed origId bug. //"0.91"; // Fixed bad write to PDF. Allow backspace to work as delete. //"0.90"; // First release to Sourceforge. VeroRoute/Src/images/justify.png000644 001750 001750 00000000640 13661712157 017144 0ustar00alexalex000000 000000 ‰PNG  IHDR йsВgAMAБ ќa cHRMz&€„њ€шu0ъ`:˜pœКQ<bKGDЊ#2 pHYs з зB(›xtIMEу&*'ъ nIDATHЧэ•Б €0 Яр  @ЩBд0Б ˆ‚(!Œ€”GTЙо_ияc!P‘ЧЭfŒt‚Рa4дXІ@тЪœ,|Ši„3žЮЄ9б‰є‚@Ё€1KFк•Є…j Užщ‡-^‘ЋЭдrы§i`XыЦ%tEXtdate:create2019-04-04T21:38:42+02:00цZАя%tEXtdate:modify2019-04-04T21:38:42+02:00—StEXtSoftwarewww.inkscape.org›ю<IENDЎB`‚VeroRoute/Src/VeroRouteAndroid.h000644 001750 001750 00000002062 14565671243 017104 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include #ifdef Q_OS_ANDROID #define VEROROUTE_ANDROID #endif // Remove comment from next line to test Android UI on a Desktop build //#define VEROROUTE_ANDROID // Remove the following comment so we can dump some debug info into the status bar //#define VEROROUTE_DEBUG VeroRoute/Src/GWriter.h000644 001750 001750 00000013441 14426506665 015240 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include #include #include "CurveList.h" class QPointF; class QPolygonF; class QString; class Board; class GStream; enum class GPOLARITY { UNKNOWN = 0, DARK, CLEAR }; enum class GFILE { GKO = 0, GBL, GBS, GBO, GTL, GTS, GTO, DRL }; Q_DECL_CONSTEXPR static const int NUM_STREAMS = 8; struct GPenInfo { GPenInfo(GPEN ePen = GPEN::NONE, int iWidth = 0, int iCode = 0, const QString& comment = "", bool bCustom = false) : m_ePen(ePen), m_iWidth(iWidth), m_iCode(iCode), m_comment(comment), m_bCustom(bCustom) {} GPenInfo(const GPenInfo& o) { *this = o; } GPenInfo& operator=(const GPenInfo& o) { m_ePen = o.m_ePen; m_iWidth = o.m_iWidth; m_iCode = o.m_iCode; m_comment = o.m_comment; m_bCustom = o.m_bCustom; return *this; } bool operator==(const GPenInfo& o) const { return m_ePen == o.m_ePen && m_iWidth == o.m_iWidth && m_iCode == o.m_iCode && m_comment == o.m_comment && m_bCustom == o.m_bCustom; } bool operator!=(const GPenInfo& o) const { return !(*this == o); } GPEN m_ePen; int m_iWidth; int m_iCode; // Aperture/Tool code // e.g. "10" for D10 or T10 QString m_comment; bool m_bCustom; }; // Wrapper for a stream to a Gerber file class GStream { public: GStream() { Clear(); } ~GStream() { Close(); Clear(); } void Clear(); void Close(); bool Open(const QString& fileName, GFILE eType, bool bMetric, const Board& board, bool bVias, bool bSOIC, bool bSOIC16, bool bConfirmEachFile); void WriteHeader(const QString& UTC); void WriteFooter(); void Drill(const QPoint& pF); void SetPolarity(GPOLARITY ePolarity, bool bCheckOK = true); void AddPad(const QPointF& pF, GPEN ePen, int w = 0); // Add to m_pads buffer void AddViaPad(const QPointF& pF, GPEN ePen); // Add to m_viapads buffer void AddTrack(const QPolygonF& pF, GPEN ePen); // Add to m_tracks buffer void AddVariTrack(const QPolygonF& pF, GPEN ePenHV, GPEN ePen); // Add to m_tracks buffer void AddLoop(const QPolygonF& pF, GPEN ePen); // Add to m_loops buffer void AddRegion(const QPolygonF& pF); // Add to m_regions buffer void AddHole(const QPointF& pF, GPEN ePen, int w = 0); // Add to m_holes buffer void ClearBuffers(bool bCheckOK = true); void DrawBuffers(); // Methods to draw things immediately // void DrawPad(const QPointF& pF, GPEN ePen, int w) { ClearBuffers(); AddPad(pF, ePen, w); DrawBuffers(); } // void DrawTrack(const QPolygonF& pF, GPEN ePen ) { ClearBuffers(); AddTrack(pF, ePen); DrawBuffers(); } void DrawLoop(const QPolygonF& pF, GPEN ePen) { ClearBuffers(); AddLoop(pF,ePen); DrawBuffers(); } void DrawRegion(const QPolygonF& pF) { ClearBuffers(); AddRegion(pF); DrawBuffers(); } private: void MakeDrills(); void MakeApertures(); void LinearInterpolation(); void Comment(const QString& str); void EndLine(); void QtEndline(); bool GetOK() const; void SetPen(GPEN ePen, int w); void Flash(const QPoint& p); void Move(const QPoint& p); void Draw(const QPoint& p); void Line(const QPoint& pA, const QPoint& pB); void Region(const Curve& curve) ; // A filled curve (with zero width pen) void Polygon(const Curve& curve); // Filled polygon (with non-zero width pen) void OutLine(const Curve& curve, bool bClose); // Outline of a curve (can be closed) void WriteXY(const QPoint& p, bool bFullLine); void WriteDrillOrdinate(int iDeciMils); void GetQPoint(const QPointF& in, QPoint& out) const; // Convert float to integer void GetQPolygon(const QPolygonF& in, QPolygon& out) const; // Convert float to integer QString MilToInch(int iMil, bool bLZ = false) const; QString MilToMM( int iMil, bool bLZ = false) const; // Data GFILE m_eType = GFILE::GBL; // GKO, GBL, GBS, GTL, GTS, GTO GPEN m_ePen = GPEN::NONE; int m_penWidth = 0; std::list m_ePenList; GPOLARITY m_ePolarity = GPOLARITY::UNKNOWN; const Board* m_pBoard = nullptr; // The board, so we can get dimensions and track sizes bool m_bVias = false; // true ==> the board has vias bool m_bSOIC = false; // true ==> board has SOICs bool m_bSOIC16 = false; // true ==> board has 16 pin SOICs int m_iLastX = INT_MAX; // Last X used int m_iLastY = INT_MAX; // Last Y used bool m_bMetric = false; // true ==> use mm as units instead of inches // Buffers for optimising data before writing to file CurveList m_pads; // Pads CurveList m_viapads; // Via pads CurveList m_tracks; // Tracks (drawn with non-zero width pen). CurveList m_loops; // Loops (drawn with non-zero width pen). CurveList m_regions; // Drawn with zero width pen. For filling gaps between tracks. CurveList m_holes; // Pad/Via holes // The output stream QFile m_file; QTextStream m_os; }; // Wrapper for handling a set of Gerber files class GWriter { public: GWriter() {} ~GWriter() { Close(); } bool Open(const QString& fileName, const Board& board, bool bVias, bool bSOIC, bool bSOIC16, bool bTwoLayerGerber, bool bMetric, bool bConfirmEachFile); void Close(); GStream& GetStream(GFILE eType); private: GStream m_os[NUM_STREAMS]; // Output file streams }; VeroRoute/Src/AdjInfo.h000644 001750 001750 00000004071 14377762621 015167 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include "TrackElement.h" // For BAD_NODEID // Class to record the adjacency info for a NodeId on the board (NOT floating components). // Every board element has 8 adjacent elements regardless of whether diagonals are allowed. class AdjInfo { public: AdjInfo(int nodeId) : m_nodeId(nodeId) {} ~AdjInfo() {} AdjInfo(const AdjInfo& o) { *this = o; } AdjInfo& operator=(const AdjInfo& o) { m_nodeId = o.m_nodeId; m_adjCount.clear(); m_adjCount.insert(o.m_adjCount.begin(), o.m_adjCount.end()); return *this; } const int& GetNodeId() const { return m_nodeId; } bool GetHasAdj(int nodeId) const { return m_adjCount.find(nodeId) != m_adjCount.end(); } void IncCount(int nodeId) { assert( m_nodeId != nodeId ); // Sanity check. Can't be adjacent to self const auto iter = m_adjCount.find(nodeId); if ( iter != m_adjCount.end() ) iter->second++; else m_adjCount[nodeId] = 1; } void DecCount(int nodeId) { assert( m_nodeId != nodeId ); // Sanity check. Can't be adjacent to self const auto iter = m_adjCount.find(nodeId); if ( iter != m_adjCount.end() ) { iter->second--; if ( iter->second == 0 ) m_adjCount.erase(iter); } } private: int m_nodeId = BAD_NODEID; // The NodeID of interest std::unordered_map m_adjCount; // Map of adjacent NodeID to element count }; VeroRoute/libraries/gEDA/veroroute_linear/000755 001750 001750 00000000000 14405612072 021035 5ustar00alexalex000000 000000 VeroRoute/Src/images/zoomin.png000644 001750 001750 00000001671 14214157556 016770 0ustar00alexalex000000 000000 ‰PNG  IHDR szzєsRGBЎЮщgAMAБ ќa pHYsУУЧoЈdNIDATXGН–ЯOSAЧЇЏМЖжЂR!jЂ’‰’˜ј /ˆDЂœдФxс §є€'юOƒ!11LP{"дˆQ  jm!mmяђЖжвіэъ'™ььОюЮьЬьnщрi}™…˜]eB,—нnї;ЏЯї“u, Є!Ч7K`јрљЌ;N Бф Z~[+4Г•„tЗ{лtК/ів№§єіУ'ŠФW„@ЧО™ ј§ў)n1л8Ь„8дSёXЌЖБЉ‰žLМ ДхONRџЕ+4?;K<їЯmчсHсN[їŸэєЧWЂ•$ІO;r`бhєpGg'Ž?7Gеш9wV8Уб[t6=Ћ—­€C2C0ŽKућцq:Iз ГДЬС\#™Ќ_]КgŽЊ!# B†…ргЋШЫВМšІп)CŒ•i8v`ŸанЛ‘ЃЊNш \ А=qœPTв8Рю…tf]с…™ќvЉ‹CФ@r\~гјLїCщюЭU59йАЫЙњD:-Zф|wмŠкТм\”ŽуџюЄвJgе"фКЫе&ag\ВЭЅSM•“тЦ*ХXьђV›кп#.eБ”u•4Є2Ъиˆ(ц@94\ PPХƒ #їvчЏЁŠfЄRŸЁ„пLŠЭ зрТžŠZ2™М eldD lЙіАP@ž№ˆЬ ƒ‡Цъў/Ўb\Щ&Jљ8ь–Лш\ш:ƒfCрQ'лЂUE^єƒxHPDyЛPs0ЗНeншlІ;=‡”Ћ7їв№CвPтNGk…Мџёлл§t§H€і4жQ}ЎьDaЎBќ,?ХЫˆюv\ЏИсdmР(Њ7іx­ш|еКzДZ^aN|џN‹Ын}_ЖJ}Фп,ёЏШŠ пCэA?ЊujЎuSРыБхD. В`R_с™FšјБ ГкЧв<M8b ƒ–V šљ•ЄЅxB…q•t” Nьн‘ѕytл‘и2РFœиR€]'Жм`Ч‰Š8T(u 6Эы/?,OЈ˜РЪ PБфS,ЏBђxŽ˜v‰ўAыЋ/Kй–?IENDЎB`‚VeroRoute/libraries/gEDA/veroroute_passive/Capacitor_Electrolytic_NP_250mil.sym000644 001750 001750 00000001341 13515171161 030102 0ustar00alexalex000000 000000 v 20130925 2 T 200 700 5 10 0 0 0 0 1 numslots=0 P 200 700 400 700 1 0 0 { T 350 750 5 8 1 1 0 6 1 pinnumber=1 T 350 750 5 8 0 0 0 6 1 pinseq=1 T 350 750 5 8 0 0 0 6 1 pinlabel=1 T 350 750 5 8 0 0 0 6 1 pintype=pas } P 1100 700 900 700 1 0 0 { T 950 750 5 8 1 1 0 0 1 pinnumber=2 T 950 750 5 8 0 0 0 0 1 pinseq=2 T 950 750 5 8 0 0 0 0 1 pinlabel=2 T 950 750 5 8 0 0 0 0 1 pintype=pas } L 600 900 600 500 3 0 0 0 -1 -1 L 900 700 700 700 3 0 0 0 -1 -1 L 600 700 400 700 3 0 0 0 -1 -1 A 1400 700 700 165 30 3 0 0 0 -1 -1 T 500 300 5 10 1 1 0 0 1 device=2u2 T 500 1000 8 10 1 1 0 0 1 refdes=C? T 500 700 8 10 0 0 0 0 1 footprint=CAP_ELECTRO_250_NP T 500 700 8 10 0 0 0 0 1 description=Non-Polarised Electrolytic Capacitor (250 mil diameter) VeroRoute/libraries/gEDA/veroroute_electromechanical/Switch_Offboard_SPST.sym000644 001750 001750 00000001113 13515171160 027666 0ustar00alexalex000000 000000 v 20130925 2 T 300 500 8 10 0 0 0 0 1 numslots=0 P 300 500 0 500 1 0 1 { T 150 550 5 10 1 1 0 0 1 pinnumber=2 T 150 550 5 10 0 0 0 0 1 pinseq=2 T 150 550 5 10 0 0 0 0 1 pinlabel=2 T 150 550 5 10 0 0 0 0 1 pintype=pas } P 600 500 900 500 1 0 1 { T 750 550 5 10 1 1 0 0 1 pinnumber=1 T 750 550 5 10 0 0 0 0 1 pinseq=1 T 750 550 5 10 0 0 0 0 1 pinlabel=1 T 750 550 5 10 0 0 0 0 1 pintype=pas } L 300 500 600 700 3 0 0 0 -1 -1 T 200 0 5 10 1 1 0 0 1 device=Name T 300 200 8 10 1 1 0 0 1 refdes=S? T 895 793 8 10 0 0 0 0 1 footprint=PADS2 T 895 793 8 10 0 0 0 0 1 description=Offboard Switch VeroRoute/libraries/gEDA/veroroute_passive/Capacitor_Film_100.sym000644 001750 001750 00000001270 13515171161 025223 0ustar00alexalex000000 000000 v 20130925 2 T 200 700 5 10 0 0 0 0 1 numslots=0 P 200 700 400 700 1 0 0 { T 350 750 5 8 1 1 0 6 1 pinnumber=1 T 350 750 5 8 0 0 0 6 1 pinseq=1 T 350 750 5 8 0 0 0 6 1 pinlabel=1 T 350 750 5 8 0 0 0 6 1 pintype=pas } P 1100 700 900 700 1 0 0 { T 950 750 5 8 1 1 0 0 1 pinnumber=2 T 950 750 5 8 0 0 0 0 1 pinseq=2 T 950 750 5 8 0 0 0 0 1 pinlabel=2 T 950 750 5 8 0 0 0 0 1 pintype=pas } L 600 900 600 500 3 0 0 0 -1 -1 L 900 700 700 700 3 0 0 0 -1 -1 L 600 700 400 700 3 0 0 0 -1 -1 L 700 900 700 500 3 0 0 0 -1 -1 T 500 300 5 10 1 1 0 0 1 device=82n T 500 1000 8 10 1 1 0 0 1 refdes=C? T 0 100 8 10 0 0 0 0 1 footprint=CAP_FILM1 T 0 100 8 10 0 0 0 0 1 description=Film Capacitor (100 mil length) VeroRoute/Src/main.cpp000644 001750 001750 00000010536 14465137502 015127 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #include "Version.h" #include "mainwindow.h" #include void versionmsg() { std::cout << "VeroRoute Version " << szVEROROUTE_VERSION << std::endl; } void helpmsg() { std::cout << "Usage: veroroute [OPTION] [FILE]"<< std::endl << std::endl; std::cout << "Starts the application and opens the specified FILE (a VeroRoute VRT file)." << std::endl << std::endl; std::cout << "[OPTION] is one of the following" << std::endl; std::cout << " -p PATH specify the PATH to the 'tutorials' directory" << std::endl; std::cout << " -h, --help display this help and exit" << std::endl; std::cout << " -v, --version display version information and exit" << std::endl; } int main(int argc, char *argv[]) { #ifdef VEROROUTE_ANDROID QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); #endif QString pathStr("."); // By default, take the home directory to be the current one for (int i = 1; i < argc; i++) { const QString str( argv[i] ); if ( str == "-h" || str == "--help" ) { helpmsg(); return 0; } if ( str == "-v" || str == "--version" ) { versionmsg(); return 0; } } // See if any command line arguments contain the "-p" instruction int iArgP(0); // The index of the argument containing the "-p" instruction for (int i = 1; i < argc-1; i++) // The "-p" can't come last { const QString str( argv[i] ); if ( str == "-p" ) { iArgP = i; pathStr = argv[i+1]; break; } } QCoreApplication::addLibraryPath(pathStr); // Search "platforms" sub-directory for plugin DLLs QApplication a(argc, argv); QString appDataPathStr = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); // appDataPathStr on Linux = "~/.local/share/veroroute" // appDataPathStr on Windows = "C:/Users//AppData/Roaming/veroroute" // If the folder doesn't exist then create it QDir dir(appDataPathStr); if ( !dir.exists() ) dir.mkpath("."); // If the "history" folder doesn't exist then create it QDir historyDir(appDataPathStr + QString("/history")); if ( !historyDir.exists() ) historyDir.mkpath("."); // If the "templates" folder doesn't exist then create it QDir templatesDir(appDataPathStr + QString("/templates")); if ( !templatesDir.exists() ) templatesDir.mkpath("."); // If the "aliases" folder doesn't exist then create it QDir aliasesDir(appDataPathStr + QString("/aliases")); if ( !aliasesDir.exists() ) aliasesDir.mkpath("."); #ifdef Q_OS_ANDROID QString tutorialsPathStr = "assets:/"; #else // Fallback "tutorials" path should be in same folder as the exe (until distribution method for Windows changes) QString tutorialsPathStr = pathStr; // Search for relative "tutorials" path assuming the binary is installed in usr/bin QString relativeTutorialsPathStr = ("../share/veroroute"); QDir tutorialsDir(relativeTutorialsPathStr + QString("/tutorials")); if ( tutorialsDir.exists() ) tutorialsPathStr = relativeTutorialsPathStr; else // Search for system wide "tutorials" path { const auto& locationsConst = QStandardPaths::standardLocations(QStandardPaths::AppDataLocation); for (const auto& dataLocationPath : locationsConst) { QDir tutorialsDir(dataLocationPath + QString("/tutorials")); // Take first hit if ( tutorialsDir.exists() ) { tutorialsPathStr = dataLocationPath; break; } } } #endif // Spawn main window MainWindow w( appDataPathStr, tutorialsPathStr ); for (int i = 1; i < argc; i++) { if ( iArgP > 0 && ( i == iArgP || i == iArgP+1 ) ) continue; // If "-p" was specified, ignore it and the subsequent argv QString fileName( argv[i] ); w.OpenVrt(fileName, false); break; } w.show(); return a.exec(); } VeroRoute/Src/images/addroundedrect.png000644 001750 001750 00000000667 13734466164 020454 0ustar00alexalex000000 000000 ‰PNG  IHDR szzєbKGDљCЛ pHYsФФ•+tIMEф  ь7^DIDATXУэWБjУ@ }*7$tѓтЬW0„N§C~ЂйŸѕO ѕ|YВ•Žъ_z–/ФД'Ÿ‡j1–…о“t'ЩФe‰Pž_њЎaјњ|%(ЫƒTє]УЖЊaЋлЧ7^œРв’€ k“А g‚6іmUЯ2юЛ&9‰ь% .ЫЩiїщЛfdЌQ#K2кН џ- гiЄиXQ#ё=љ fЦіihХur<"Š`fрСJ%кcD„Bp-рDˆˆ.З@‚LSчџњф  цйvЛЈЃѓ~ЌhлŸчМяI &Œў ~јзт§9Gž„ЯТ Чqъшяј6)§ъЎйŠ‹ЖEq<цчУ!н4\*нџKщ<CзR‘ˆяь„bЮ™ˆ|‚CБQЌ= Grяыиˆ"ZХ$ќіоЃAEд9%IENDЎB`‚VeroRoute/Src/mainwindow.ui000644 001750 001750 00000127564 14565707406 016233 0ustar00alexalex000000 000000 MainWindow true 0 0 1350 720 800 720 true Qt::StrongFocus VeroRoute ArrowCursor true Qt::StrongFocus 0 0 1350 22 Qt::NoFocus File Import Netlist Export as Gerber (1-Layer) Export as Gerber (2-Layer) Edit Add Capacitor Trim-pot Switch Connector SOIC View Windows Help Layers Track Style Paint Add 0 0 0 40 16777215 40 toolBar_2 BottomToolBarArea false 0 40 16777215 40 toolBar_3 BottomToolBarArea false true 0 0 0 40 16777215 40 24 24 BottomToolBarArea false New Ctrl+N Ctrl+N false Open Ctrl+O Ctrl+O false Save Ctrl+S Ctrl+S false Save As Ctrl+Shift+S Ctrl+Shift+S false Protel1/Tango false OrcadPCB2 false Export as PDF false Export as PNG false Quit Ctrl+Q Ctrl+Q false :/images/zoomin.png:/images/zoomin.png Zoom In Zoom In Ctrl+= :/images/zoomout.png:/images/zoomout.png Zoom Out Zoom Out Ctrl+- Auto-Crop Auto-crop the grid to the layout false true :/images/fliph.png:/images/fliph.png Flip Horizontal Flip Horizontal (On/Off) false true :/images/flipv.png:/images/flipv.png Flip Vertical Flip Vertical (On/Off) false true :/images/grid.png:/images/grid.png Grid Grid (On/Off) false true :/images/pinlabels.png:/images/pinlabels.png Pin Labels Pin Labels (On/Off) false :/images/undo.png:/images/undo.png Undo Ctrl+Z :/images/redo.png:/images/redo.png Redo Ctrl+Shift+Z :/images/copy.png:/images/copy.png Copy Selected Part(s) / Text Box Copy Selected Part(s) / Text Box Copy Selected Part(s) / Text Box V false Group Selected Parts G false Ungroup Selected Parts U false Select All Parts Ctrl+A false :/images/delete.png:/images/delete.png Delete Selected Part(s) / Text Box Backspace false Wire Resistor Ceramic Film Electrolytic NP (200 mil) Electrolytic NP (250 mil) Electrolytic NP (300 mil) Electrolytic NP (400 mil) Electrolytic NP (500 mil) Electrolytic NP (600 mil) Electrolytic (200 mil) Electrolytic (250 mil) Electrolytic (300 mil) Electrolytic (400 mil) Electrolytic (500 mil) Electrolytic (600 mil) Vertical Vertical Offset Flat Crystal Diode LED Vertical Offset (Wide Gap) Flat (Wide Gap) TO-92 TO-18 TO-220 DIP SIP Single Throw Double Throw Single Throw (DIP) Marker Control Dialog Control Dialog Control Dialog true :/images/templates.png:/images/templates.png Parts Library Parts Library Parts Library Info true :/images/render.png:/images/render.png Rendering Options B.O.M. Part Aliases true :/images/pineditor.png:/images/pineditor.png Pin Labels Editor About Tutorials Support (link to forum) Check for new version Open (merge into current) Ctrl+M Ctrl+M false true :/images/text.png:/images/text.png Text Boxes Text Boxes (On/Off) false Text Box Add Text Box Vero Numbers Add line of numbers as Veroboard labels Vero Letters Add line of letters as Veroboard labels TO-39 Film (Wide) Pad Pin Strip (100 mil) Terminal Block (100 mil) Terminal Block (200 mil) Inductor true :/images/verov.png:/images/verov.png Vero (Vertical) Vero track style (vertical strips) true :/images/veroh.png:/images/veroh.png Vero (Horizontal) Vero track style (horizontal strips) true :/images/fat.png:/images/fat.png Fat Fat track style true :/images/curved.png:/images/curved.png Curved Curved track style true :/images/diagsmin.png:/images/diagsmin.png Diagonals (Min) Diagonals (min) true :/images/diagsmax.png:/images/diagsmax.png Diagonals (Max) Diagonals (max) true :/images/fill.png:/images/fill.png Ground Fill Ground Fill using selected Net true :/images/area.png:/images/area.png Select Parts / Tracks by Area Select parts / tracks by area true :/images/editor.png:/images/editor.png Editor Component Editor :/images/addline.png:/images/addline.png Line Add line :/images/addrect.png:/images/addrect.png Rectangle Add rectangle :/images/addroundedrect.png:/images/addroundedrect.png Rounded rectangle Add rounded rectangle :/images/addellipse.png:/images/addellipse.png Ellipse Add ellipse :/images/addarc.png:/images/addarc.png Arc Add arc Component Definition Dialog Component Definition Dialog Component Definition Dialog :/images/addchord.png:/images/addchord.png Chord Add chord Key/Mouse Actions Wire Options Clear Recent Files List Add Top Layer Remove Top Layer :/images/layertop.png:/images/layertop.png Switch Layer L false true :/images/thin.png:/images/thin.png Thin Thin track style Toggle Vias Find Parts in Layout Search for parts by name or value Ctrl+F Imperial units (inches) Metric units (mm) Imperial units (inches) Metric units (mm) Pad (Flying Wire) Flying Wires Flying Wires (On/Off) false Distance Tool Distance Tool (On/Off) true :/images/paintgrid.png:/images/paintgrid.png Paint Track Paint Track true :/images/erasegrid.png:/images/erasegrid.png Erase Track Erase Track true :/images/paintpins.png:/images/paintpins.png Paint Pins Paint Pins true :/images/erasepins.png:/images/erasepins.png Erase Pins Erase Pins true :/images/paintflood.png:/images/paintflood.png Flood Pins and Track Flood Pins and Track Move Whole Layout / Resize Grid Reset Pin Layer Preferences SOIC-8 SOIC-14 SOIC-16 SOIC-14W SOIC-16W SOIC-20W SOIC-24W SOIC-28W Inverse Mono Swap black and white in Mono mode Allow colored tracks in Mono mode Enable/Disable colored tracks in Mono mode true :/images/layerpref.png:/images/layerpref.png Edit Pin Layer Preferences Auto-Set Pin Layer Preferences VeroRoute/examples/geda_schematic.sch000644 001750 001750 00000046340 13515171160 020200 0ustar00alexalex000000 000000 v 20130925 2 C 18300 62000 1 0 0 Capacitor_Film.sym { T 18800 62300 5 10 1 1 0 0 1 device=100n T 18800 63000 5 10 1 1 0 0 1 refdes=C1 T 18300 62100 5 10 0 0 0 0 1 footprint=CAP_FILM } C 24000 60900 1 0 0 Resistor.sym { T 24200 60950 5 10 1 1 0 0 1 device=4k7 T 24300 61500 5 10 1 1 0 0 1 refdes=R4 T 24100 61300 5 10 0 0 0 0 1 footprint=RESISTOR } C 22500 62900 1 180 1 OpAmp_TL072.sym { T 23200 63000 5 10 1 1 180 6 1 device=TL072 T 23200 63300 5 10 1 1 180 6 1 refdes=IC1 T 22700 61800 5 10 0 0 180 6 1 footprint=DIP8 T 23200 60700 5 10 0 0 0 0 1 slot=2 } C 17900 52500 1 180 1 OpAmp_TL072.sym { T 17500 52700 5 10 1 1 180 6 1 device=TL062 T 17500 52900 5 10 1 1 180 6 1 refdes=IC3 T 18100 51400 5 10 0 0 180 6 1 footprint=DIP8 } C 26400 59800 1 0 0 OpAmp_TL072.sym { T 27200 59500 5 10 1 1 0 0 1 device=TL072 T 27200 59800 5 10 1 1 0 0 1 refdes=IC1 T 26600 60900 5 10 0 0 0 0 1 footprint=DIP8 } C 22500 51300 1 0 0 OpAmp_TL072.sym { T 23300 51200 5 10 1 1 0 0 1 device=TL062 T 23300 51400 5 10 1 1 0 0 1 refdes=IC3 T 22700 52400 5 10 0 0 0 0 1 footprint=DIP8 T 22700 52400 5 10 0 0 0 0 1 slot=2 } C 29000 50000 1 180 1 Comparator_LM311.sym { T 30150 48850 5 10 1 1 180 6 1 device=LM311 T 30200 49100 5 10 1 1 180 6 1 refdes=IC4 T 29700 49400 5 10 0 0 180 6 1 footprint=DIP8 } C 31400 47900 1 0 0 4013.sym { T 31600 48000 5 8 1 1 0 0 1 device=CD4013 T 33000 50200 5 10 1 1 0 6 1 refdes=IC5 T 33200 48100 5 10 0 0 0 0 1 footprint=DIP14 } C 38400 51000 1 0 0 4013.sym { T 38600 51100 5 8 1 1 0 0 1 device=CD4013 T 40000 53300 5 10 1 1 0 6 1 refdes=IC5 T 40200 51200 5 10 0 0 0 0 1 footprint=DIP14 T 40200 52000 5 10 0 0 0 0 1 slot=2 } C 27500 51700 1 180 1 PNP_2N5087.sym { T 28100 51100 5 10 1 1 180 6 1 device=2N5087 T 28100 51400 5 10 1 1 180 6 1 refdes=Q2 T 28100 51300 5 10 0 0 180 6 1 footprint=TO92 } C 37300 58500 1 0 0 NPN_2N5088.sym { T 37900 58800 5 10 1 1 0 0 1 device=2N5088 T 37900 59100 5 10 1 1 0 0 1 refdes=Q1 T 37900 58900 5 10 0 0 0 0 1 footprint=TO92 } C 17800 56400 1 0 0 LM78Lxx.sym { T 18550 57400 5 10 1 1 0 0 1 device=78L12 T 18350 57800 5 10 1 1 0 6 1 refdes=U1 T 19600 57800 5 10 0 0 0 6 1 footprint=TO92 } C 28700 49600 1 90 0 Capacitor_Ceramic.sym { T 28400 50000 5 10 1 1 90 0 1 device=470p T 27700 50000 5 10 1 1 90 0 1 refdes=C16 T 28600 49600 5 10 0 0 90 0 1 footprint=CAP_CERAMIC } C 26000 53900 1 270 0 Generic.sym { T 27100 52800 5 10 1 1 90 0 1 device=1N4001 T 26400 53000 5 10 1 1 90 0 1 refdes=D1 T 26400 53500 5 10 0 0 270 0 1 footprint=DIODE } C 31100 49500 1 90 0 Resistor.sym { T 31050 49700 5 10 1 1 90 0 1 device=220R T 30500 49800 5 10 1 1 90 0 1 refdes=R29 T 30700 49600 5 10 0 0 90 0 1 footprint=RESISTOR } C 31100 52000 1 90 0 Resistor.sym { T 31050 52300 5 10 1 1 90 0 1 device=10k T 30500 52300 5 10 1 1 90 0 1 refdes=R28 T 30700 52100 5 10 0 0 90 0 1 footprint=RESISTOR } C 28400 52800 1 90 0 Resistor.sym { T 28350 53100 5 10 1 1 90 0 1 device=2k7 T 27800 53100 5 10 1 1 90 0 1 refdes=R27 T 28000 52900 5 10 0 0 90 0 1 footprint=RESISTOR } C 27100 51800 1 90 0 Resistor.sym { T 27050 52100 5 10 1 1 90 0 1 device=3k3 T 26500 52100 5 10 1 1 90 0 1 refdes=R25 T 26700 51900 5 10 0 0 90 0 1 footprint=RESISTOR } C 27100 49800 1 90 0 Resistor.sym { T 27050 50100 5 10 1 1 90 0 1 device=22k T 26500 50100 5 10 1 1 90 0 1 refdes=R26 T 26700 49900 5 10 0 0 90 0 1 footprint=RESISTOR } N 28000 52800 28000 52700 4 N 28000 51700 28000 51800 4 N 27500 51200 26700 51200 4 N 26700 50700 26700 51800 4 C 28900 50000 1 0 0 Generic.sym { T 30000 50400 5 10 1 1 180 0 1 device=1N4148 T 29800 51100 5 10 1 1 180 0 1 refdes=D2 T 29300 50400 5 10 0 0 0 0 1 footprint=DIODE } N 28000 50700 29200 50700 4 N 28900 49500 28900 50700 4 N 30100 50700 30700 50700 4 N 30700 50400 30700 52000 4 N 30700 49500 30700 49300 4 N 30200 49300 31400 49300 4 N 27900 49100 29200 49100 4 N 28900 49100 28900 48800 4 C 29600 47700 1 90 0 Capacitor_Ceramic.sym { T 29400 48100 5 10 1 1 90 0 1 device=100n T 28600 48200 5 10 1 1 90 0 1 refdes=C17 T 29500 47700 5 10 0 0 90 0 1 footprint=CAP_CERAMIC } N 28000 57500 28000 59600 4 N 31400 49700 31400 50800 4 N 31400 50800 33800 50800 4 N 33800 48500 33800 50800 4 N 34200 48500 33000 48500 4 { T 33800 48200 5 10 1 1 0 0 1 netname=CLK1 } N 31400 47900 31400 48900 4 N 38400 51000 38400 52800 4 N 26700 53600 26700 53700 4 N 30700 53700 30700 52900 4 N 29500 48800 29900 48800 4 N 29475 49900 29700 49900 4 N 31400 47900 32200 47900 4 N 38400 51000 39200 51000 4 C 18300 63400 1 180 0 Pad.sym { T 17600 63200 5 10 1 1 180 0 1 device=In T 17600 62400 5 10 1 1 180 0 1 refdes=In T 17700 62200 5 10 0 0 180 0 1 footprint=PAD } C 18300 62000 1 180 0 Pad.sym { T 17600 61800 5 10 1 1 180 0 1 device=Gnd T 17700 61000 5 10 1 1 180 0 1 refdes=G_In T 17700 60800 5 10 0 0 180 0 1 footprint=PAD } C 22100 61500 1 90 0 Resistor.sym { T 22050 61700 5 10 1 1 90 0 1 device=100k T 21500 61800 5 10 1 1 90 0 1 refdes=R3 T 21700 61600 5 10 0 0 90 0 1 footprint=RESISTOR } C 19500 62300 1 0 0 Resistor.sym { T 19800 62350 5 10 1 1 0 0 1 device=5k6 T 19800 62900 5 10 1 1 0 0 1 refdes=R2 T 19600 62700 5 10 0 0 0 0 1 footprint=RESISTOR } N 19500 62700 19400 62700 4 N 18200 62700 18500 62700 4 C 21400 61300 1 90 0 Capacitor_Film.sym { T 21100 61800 5 10 1 1 90 0 1 device=2n7 T 20400 61800 5 10 1 1 90 0 1 refdes=C2 T 21300 61300 5 10 0 0 90 0 1 footprint=CAP_FILM } C 37900 56800 1 0 1 gnd-1.sym C 20600 60900 1 0 0 gnd-1.sym C 20800 60200 1 270 0 Capacitor_Electrolytic_200mil.sym { T 22000 59400 5 10 1 1 90 0 1 device=10u T 21200 59400 5 10 1 1 90 0 1 refdes=C13 T 21500 59700 5 10 0 0 270 0 1 footprint=CAP_ELECTRO_200 } N 21700 60000 21700 61500 4 N 20500 60000 25200 60000 4 C 19900 58800 1 0 0 gnd-1.sym N 20000 59100 20000 59500 4 N 20700 61500 20700 61200 4 N 22300 62300 22300 61300 4 N 22300 61300 24000 61300 4 N 23800 61300 23800 62500 4 N 23500 62500 24000 62500 4 N 20400 62700 22500 62700 4 N 21700 62400 21700 62700 4 N 20700 62700 20700 62400 4 C 23800 61800 1 0 0 Capacitor_Film.sym { T 24300 62100 5 10 1 1 0 0 1 device=47n T 24300 62800 5 10 1 1 0 0 1 refdes=C3 T 23800 61900 5 10 0 0 0 0 1 footprint=CAP_FILM } C 25200 62100 1 0 0 Resistor.sym { T 25400 62150 5 10 1 1 0 0 1 device=470R T 25500 62700 5 10 1 1 0 0 1 refdes=R5 T 25300 62500 5 10 0 0 0 0 1 footprint=RESISTOR } C 26600 61100 1 0 0 Resistor.sym { T 26900 61150 5 10 1 1 0 0 1 device=6k8 T 26900 61700 5 10 1 1 0 0 1 refdes=R6 T 26700 61500 5 10 0 0 0 0 1 footprint=RESISTOR } C 26800 59500 1 0 0 gnd-1.sym N 24900 62500 25200 62500 4 N 26300 60400 26300 62500 4 N 26100 62500 26600 62500 4 N 24900 61300 25100 61300 4 N 25100 61300 25100 62500 4 C 25200 59600 1 0 0 Resistor.sym { T 25400 59650 5 10 1 1 0 0 1 device=100k T 25500 60200 5 10 1 1 0 0 1 refdes=R7 T 25300 60000 5 10 0 0 0 0 1 footprint=RESISTOR } N 26400 60000 26100 60000 4 N 27400 60200 28000 60200 4 N 27800 60200 27800 62500 4 N 26600 61500 26300 61500 4 N 27500 62500 32700 62500 4 N 27500 61500 27800 61500 4 N 22500 62300 22300 62300 4 N 26400 60400 26300 60400 4 N 28900 61100 29500 61100 4 C 27900 57200 1 0 0 gnd-1.sym C 26400 61800 1 0 0 Capacitor_Film.sym { T 26900 62100 5 10 1 1 0 0 1 device=1n T 26900 62800 5 10 1 1 0 0 1 refdes=C4 T 26400 61900 5 10 0 0 0 0 1 footprint=CAP_FILM } C 32700 62100 1 0 0 Resistor.sym { T 33000 62150 5 10 1 1 0 0 1 device=13k T 33000 62700 5 10 1 1 0 0 1 refdes=R8 T 32800 62500 5 10 0 0 0 0 1 footprint=RESISTOR } C 34200 61800 1 0 0 Capacitor_Film.sym { T 34700 62100 5 10 1 1 0 0 1 device=47n T 34700 62800 5 10 1 1 0 0 1 refdes=C5 T 34200 61900 5 10 0 0 0 0 1 footprint=CAP_FILM } C 31800 57600 1 90 0 Resistor.sym { T 31750 57900 5 10 1 1 90 0 1 device=10k T 31200 57900 5 10 1 1 90 0 1 refdes=R9 T 31400 57700 5 10 0 0 90 0 1 footprint=RESISTOR } C 33100 57400 1 90 0 Capacitor_Film.sym { T 32800 57900 5 10 1 1 90 0 1 device=3n3 T 32100 57900 5 10 1 1 90 0 1 refdes=C7 T 33000 57400 5 10 0 0 90 0 1 footprint=CAP_FILM } C 34500 58600 1 0 0 Resistor.sym { T 34800 58650 5 10 1 1 0 0 1 device=10k T 34700 59200 5 10 1 1 0 0 1 refdes=R10 T 34600 59000 5 10 0 0 0 0 1 footprint=RESISTOR } C 32500 58300 1 0 0 Capacitor_Film.sym { T 33000 58600 5 10 1 1 0 0 1 device=47n T 33000 59300 5 10 1 1 0 0 1 refdes=C6 T 32500 58400 5 10 0 0 0 0 1 footprint=CAP_FILM } C 34800 56200 1 90 0 Capacitor_Film.sym { T 34500 56700 5 10 1 1 90 0 1 device=47n T 33800 56700 5 10 1 1 90 0 1 refdes=C9 T 34700 56200 5 10 0 0 90 0 1 footprint=CAP_FILM } C 34500 55500 1 90 0 Resistor.sym { T 34450 55700 5 10 1 1 90 0 1 device=470R T 33900 55800 5 10 1 1 90 0 1 refdes=R11 T 34100 55600 5 10 0 0 90 0 1 footprint=RESISTOR } C 36400 56200 1 90 0 Capacitor_Film.sym { T 36100 56700 5 10 1 1 90 0 1 device=47n T 35400 56700 5 10 1 1 90 0 1 refdes=C10 T 36300 56200 5 10 0 0 90 0 1 footprint=CAP_FILM } C 36100 55500 1 90 0 Resistor.sym { T 36050 55700 5 10 1 1 90 0 1 device=470R T 35500 55800 5 10 1 1 90 0 1 refdes=R12 T 35700 55600 5 10 0 0 90 0 1 footprint=RESISTOR } N 30400 59600 30900 59600 4 N 30900 59600 30900 59400 4 N 30900 58500 30900 58400 4 N 30900 58400 30400 58400 4 N 31400 59000 32700 59000 4 N 33600 59000 34500 59000 4 N 34100 58500 34100 59000 4 N 32800 57400 32800 56400 4 C 32700 55200 1 0 0 gnd-1.sym C 34000 55200 1 0 0 gnd-1.sym C 35600 55200 1 0 0 gnd-1.sym N 34100 57300 34100 57600 4 N 34100 57400 32800 57400 4 N 35400 59000 35700 59000 4 N 35700 57300 35700 62500 4 N 33600 62500 34400 62500 4 N 35300 62500 35700 62500 4 N 31400 58500 31400 59000 4 N 32400 58500 32400 59000 4 C 31300 57300 1 0 0 gnd-1.sym C 32300 57300 1 0 0 gnd-1.sym C 30800 55200 1 0 0 Capacitor_Film.sym { T 31300 55500 5 10 1 1 0 0 1 device=4n7 T 31300 56200 5 10 1 1 0 0 1 refdes=C8 T 30800 55300 5 10 0 0 0 0 1 footprint=CAP_FILM } N 32300 55900 31900 55900 4 N 31000 55900 26300 55900 4 N 26300 55900 26300 60000 4 C 18600 61600 1 90 0 Resistor.sym { T 18550 61800 5 10 1 1 90 0 1 device=2M2 T 18000 61900 5 10 1 1 90 0 1 refdes=R1 T 18200 61700 5 10 0 0 90 0 1 footprint=RESISTOR } N 18200 62500 18200 62700 4 N 18200 61600 18200 61200 4 N 34600 58100 34600 58500 4 N 34600 58500 34100 58500 4 C 37200 57300 1 90 0 Resistor.sym { T 37150 57500 5 10 1 1 90 0 1 device=470k T 36600 57600 5 10 1 1 90 0 1 refdes=R14 T 36800 57400 5 10 0 0 90 0 1 footprint=RESISTOR } C 37200 60000 1 90 0 Resistor.sym { T 37150 60300 5 10 1 1 90 0 1 device=1M T 36600 60300 5 10 1 1 90 0 1 refdes=R13 T 36800 60100 5 10 0 0 90 0 1 footprint=RESISTOR } C 38200 60000 1 90 0 Resistor.sym { T 38150 60300 5 10 1 1 90 0 1 device=10k T 37600 60300 5 10 1 1 90 0 1 refdes=R15 T 37800 60100 5 10 0 0 90 0 1 footprint=RESISTOR } C 38200 57300 1 90 0 Resistor.sym { T 38150 57600 5 10 1 1 90 0 1 device=4k7 T 37600 57600 5 10 1 1 90 0 1 refdes=R16 T 37800 57400 5 10 0 0 90 0 1 footprint=RESISTOR } C 35700 58300 1 0 0 Capacitor_Film.sym { T 36200 58600 5 10 1 1 0 0 1 device=100n T 36200 59300 5 10 1 1 0 0 1 refdes=C11 T 35700 58400 5 10 0 0 0 0 1 footprint=CAP_FILM } C 38100 59100 1 0 0 Capacitor_Film.sym { T 38600 59400 5 10 1 1 0 0 1 device=100n T 38600 60100 5 10 1 1 0 0 1 refdes=C12 T 38100 59200 5 10 0 0 0 0 1 footprint=CAP_FILM } N 35900 59000 35700 59000 4 N 36800 61200 36800 60900 4 N 37800 60900 37800 61200 4 C 36700 56800 1 0 0 gnd-1.sym N 36800 57100 36800 57300 4 N 37800 57100 37800 57300 4 N 37300 59000 36800 59000 4 N 36800 58200 36800 60000 4 N 37800 60000 37800 59500 4 N 37800 58500 37800 58200 4 N 38300 59800 37800 59800 4 C 39000 56500 1 0 0 Pad.sym { T 39600 57500 5 10 1 1 0 0 1 device=Gnd T 39600 56700 5 10 1 1 0 0 1 refdes=G_Out T 39600 57700 5 10 0 0 0 0 1 footprint=PAD } C 39000 59100 1 0 0 Pad.sym { T 39600 59400 5 10 1 1 0 0 1 device=Out T 39600 60100 5 10 1 1 0 0 1 refdes=Out T 39600 60300 5 10 0 0 0 0 1 footprint=PAD } N 37600 50700 37600 53400 4 N 35200 49200 35200 52500 4 N 35200 49200 36700 49200 4 C 18600 58500 1 270 1 Potentiometer_Trimmer_Vertical.sym { T 19400 60050 5 10 1 1 90 6 1 refdes=RT3 T 19700 60100 5 10 1 1 90 6 1 device=20k-B T 19400 59400 5 10 0 0 270 6 1 footprint=TRIM_VERT } C 29500 57500 1 270 1 Potentiometer_Trimmer_Vertical.sym { T 30500 59150 5 10 1 1 90 6 1 refdes=RT1 T 30700 59100 5 10 1 1 90 6 1 device=1k-B T 30300 58400 5 10 0 0 270 6 1 footprint=TRIM_VERT } C 32700 56600 1 270 1 Potentiometer_Trimmer_Vertical.sym { T 33500 58150 5 10 1 1 90 6 1 refdes=RT2 T 33800 58200 5 10 1 1 90 6 1 device=10k-B T 33500 57500 5 10 0 0 270 6 1 footprint=TRIM_VERT } C 26600 50800 1 270 1 Potentiometer_Trimmer_Vertical.sym { T 27800 52450 5 10 1 1 90 6 1 refdes=RT4 T 28800 52400 5 10 1 1 90 6 1 device=10k-B T 27400 51700 5 10 0 0 270 6 1 footprint=TRIM_VERT } N 28500 52300 28500 52700 4 N 28500 52700 28000 52700 4 C 23100 63200 1 180 0 gnd-1.sym C 18100 60900 1 0 0 gnd-1.sym C 35100 48900 1 0 0 gnd-1.sym C 34200 57400 1 90 1 Potentiometer_Offboard.sym { T 32600 56450 5 10 1 1 90 6 1 refdes=Color T 33200 56200 5 10 1 1 90 6 1 device=10k-B T 33400 56500 5 10 0 0 90 6 1 footprint=PADS3 } C 26600 49500 1 0 0 gnd-1.sym C 27900 49500 1 0 0 gnd-1.sym N 29200 49500 28900 49500 4 C 28800 47600 1 0 0 gnd-1.sym N 39100 57200 37800 57200 4 N 37800 61200 36800 61200 4 C 27000 48700 1 0 0 Resistor.sym { T 27200 48750 5 10 1 1 0 0 1 device=220k T 27200 49300 5 10 1 1 0 0 1 refdes=R30 T 27100 49100 5 10 0 0 0 0 1 footprint=RESISTOR } C 17000 51000 1 90 0 Resistor.sym { T 16950 51300 5 10 1 1 90 0 1 device=18k T 16400 51300 5 10 1 1 90 0 1 refdes=R17 T 16600 51100 5 10 0 0 90 0 1 footprint=RESISTOR } C 17000 50100 1 90 0 Resistor.sym { T 16950 50400 5 10 1 1 90 0 1 device=10k T 16400 50400 5 10 1 1 90 0 1 refdes=R18 T 16600 50200 5 10 0 0 90 0 1 footprint=RESISTOR } C 17000 49200 1 90 0 Resistor.sym { T 16950 49500 5 10 1 1 90 0 1 device=5k6 T 16400 49500 5 10 1 1 90 0 1 refdes=R19 T 16600 49300 5 10 0 0 90 0 1 footprint=RESISTOR } C 19400 52700 1 90 0 Resistor.sym { T 19350 53000 5 10 1 1 90 0 1 device=39k T 18800 53000 5 10 1 1 90 0 1 refdes=R20 T 19000 52800 5 10 0 0 90 0 1 footprint=RESISTOR } C 20900 53700 1 0 0 Resistor.sym { T 21200 53750 5 10 1 1 0 0 1 device=27k T 21200 54300 5 10 1 1 0 0 1 refdes=R21 T 21000 54100 5 10 0 0 0 0 1 footprint=RESISTOR } C 20900 52700 1 0 0 Resistor.sym { T 21200 52750 5 10 1 1 0 0 1 device=10k T 21200 53300 5 10 1 1 0 0 1 refdes=R22 T 21000 53100 5 10 0 0 0 0 1 footprint=RESISTOR } C 20900 51500 1 0 0 Resistor.sym { T 21200 51550 5 10 1 1 0 0 1 device=33k T 21200 52100 5 10 1 1 0 0 1 refdes=R23 T 21000 51900 5 10 0 0 0 0 1 footprint=RESISTOR } C 21900 52400 1 0 0 Capacitor_Electrolytic_200mil.sym { T 22400 52700 5 10 1 1 0 0 1 device=10u T 22400 53400 5 10 1 1 0 0 1 refdes=C14 T 22400 53100 5 10 0 0 0 0 1 footprint=CAP_ELECTRO_200 } C 24100 52400 1 0 1 Capacitor_Electrolytic_200mil.sym { T 23600 52700 5 10 1 1 0 6 1 device=10u T 23600 53400 5 10 1 1 0 6 1 refdes=C15 T 23600 53100 5 10 0 0 0 6 1 footprint=CAP_ELECTRO_200 } N 21800 53100 22100 53100 4 N 21800 51900 22500 51900 4 C 21600 54500 1 180 0 Potentiometer_Offboard.sym { T 20550 52900 5 10 1 1 180 0 1 refdes=Rate T 20300 53500 5 10 1 1 180 0 1 device=1M-C T 20700 53700 5 10 0 0 180 0 1 footprint=PADS3 } N 20600 53100 20900 53100 4 N 17400 54100 20900 54100 4 N 19000 54100 19000 53600 4 N 17900 52300 17400 52300 4 N 17400 52300 17400 54100 4 N 17900 51900 17400 51900 4 N 21800 54100 23900 54100 4 N 23900 50300 23900 54100 4 N 23500 51700 23900 51700 4 N 18900 52100 20100 52100 4 N 19000 52100 19000 52700 4 N 20100 52600 20100 52100 4 N 20800 51900 20800 53100 4 N 20900 51900 20800 51900 4 N 16600 51900 16600 54700 4 N 22500 51500 22000 51500 4 N 22000 51500 22000 51000 4 N 22000 51000 16600 51000 4 N 17400 51900 17400 51000 4 C 16500 48900 1 0 0 gnd-1.sym C 18500 52800 1 180 0 gnd-1.sym C 22900 51000 1 0 0 gnd-1.sym C 21600 51500 1 180 0 Potentiometer_Offboard.sym { T 20750 49900 5 10 1 1 180 0 1 refdes=Range T 20400 50600 5 10 1 1 180 0 1 device=100k-B T 20700 50700 5 10 0 0 180 0 1 footprint=PADS3 } C 21700 50800 1 180 1 Switch_Offboard_SPDT.sym { T 21700 50400 5 10 1 1 180 6 1 device=SW T 21700 50600 5 10 1 1 180 6 1 refdes=SW T 22595 50007 5 10 0 0 180 6 1 footprint=PADS3 } N 23900 50300 22600 50300 4 C 25100 50600 1 90 0 Resistor.sym { T 25050 50900 5 10 1 1 90 0 1 device=39k T 24500 50900 5 10 1 1 90 0 1 refdes=R24 T 24700 50700 5 10 0 0 90 0 1 footprint=RESISTOR } N 24700 51500 24700 54700 4 N 24700 50600 24700 49900 4 N 24700 49900 22600 49900 4 N 21700 50100 20600 50100 4 N 19700 50100 16600 50100 4 N 27000 49100 20100 49100 4 N 20100 49100 20100 49600 4 C 31300 47600 1 0 0 gnd-1.sym C 38300 50700 1 0 0 gnd-1.sym C 21400 58800 1 0 0 gnd-1.sym C 17000 57900 1 180 0 Pad.sym { T 16300 57700 5 10 1 1 180 0 1 device=18V T 16300 56900 5 10 1 1 180 0 1 refdes=18V T 16400 56700 5 10 0 0 180 0 1 footprint=PAD } C 17000 56700 1 180 0 Pad.sym { T 16300 56500 5 10 1 1 180 0 1 device=Gnd T 16300 55700 5 10 1 1 180 0 1 refdes=Gnd T 16400 55500 5 10 0 0 180 0 1 footprint=PAD } C 21600 57600 1 180 0 Resistor.sym { T 21400 57550 5 10 1 1 180 0 1 device=47R T 21300 57000 5 10 1 1 180 0 1 refdes=R31 T 21500 57200 5 10 0 0 180 0 1 footprint=RESISTOR } C 19800 59000 1 180 0 Generic.sym { T 18700 57900 5 10 1 1 0 0 1 device=1N4001 T 18900 58600 5 10 1 1 0 0 1 refdes=D3 T 19400 58600 5 10 0 0 180 0 1 footprint=DIODE } N 16900 57200 17800 57200 4 N 17300 56900 17300 57200 4 N 16900 56000 22000 56000 4 N 20300 56200 20300 56000 4 N 22000 56200 22000 56000 4 N 18800 56400 18800 56000 4 N 19800 57200 20700 57200 4 N 20300 57200 20300 56900 4 N 21600 57200 22900 57200 4 N 22000 56900 22000 57200 4 N 17300 57200 17300 58300 4 N 17300 58300 18600 58300 4 N 19500 58300 22900 58300 4 N 20300 58300 20300 57200 4 N 22000 53100 22000 51900 4 C 35200 49100 1 0 0 SAD1024.sym { T 36800 53655 5 10 1 1 0 0 1 device=SAD1024 T 36800 53855 5 10 1 1 0 0 1 refdes=IC2 T 36800 51155 5 10 0 0 0 0 1 footprint=DIP16 T 36200 49500 5 10 0 0 0 0 1 slot=2 } C 28000 56800 1 0 0 SAD1024.sym { T 29700 60955 5 10 1 1 0 0 1 device=SAD1024 T 29700 61155 5 10 1 1 0 0 1 refdes=IC2 T 29600 58855 5 10 0 0 0 0 1 footprint=DIP16 } C 22900 57400 1 270 0 vcc-1.sym C 22900 58500 1 270 0 vdd-1.sym C 16400 54700 1 0 0 vcc-1.sym N 24700 54700 16600 54700 4 C 22800 52100 1 0 0 vcc-1.sym C 18600 51700 1 180 0 vcc-1.sym C 26500 53700 1 0 0 vdd-1.sym C 30100 48600 1 180 0 vdd-1.sym C 29800 50200 1 180 0 gnd-1.sym C 32000 50300 1 0 0 vdd-1.sym N 29900 48600 29900 48800 4 C 28700 61100 1 0 0 vdd-1.sym C 36600 61200 1 0 0 vdd-1.sym C 26700 60600 1 0 0 vdd-1.sym C 23200 62100 1 180 0 vdd-1.sym C 19800 60400 1 0 0 vdd-1.sym C 16600 57100 1 270 0 Capacitor_Electrolytic_250mil.sym { T 17700 56200 5 10 1 1 90 0 1 device=220u T 17000 56300 5 10 1 1 90 0 1 refdes=C18 T 17300 56600 5 10 0 0 270 0 1 footprint=CAP_ELECTRO_250 } C 17200 55700 1 0 0 gnd-1.sym C 19600 57100 1 270 0 Capacitor_Electrolytic_250mil.sym { T 20700 56200 5 10 1 1 90 0 1 device=100u T 20000 56300 5 10 1 1 90 0 1 refdes=C19 T 20300 56600 5 10 0 0 270 0 1 footprint=CAP_ELECTRO_250 } C 21300 57100 1 270 0 Capacitor_Electrolytic_250mil.sym { T 22500 56200 5 10 1 1 90 0 1 device=100u T 21700 56300 5 10 1 1 90 0 1 refdes=C20 T 22000 56600 5 10 0 0 270 0 1 footprint=CAP_ELECTRO_250 } N 30700 53700 26700 53700 4 C 39000 53400 1 0 0 vdd-1.sym C 35900 53400 1 0 0 vdd-1.sym N 36100 53400 37600 53400 4 N 33000 49700 33500 49700 4 { T 33100 49400 5 10 1 1 0 0 1 netname=CLK2 } N 29500 56900 29500 56600 4 { T 29700 56500 5 10 1 1 180 0 1 netname=CLK2 } N 28900 56900 28900 56600 4 { T 29100 56500 5 10 1 1 180 0 1 netname=CLK1 } B 15900 47200 9600 8100 3 0 0 1 -1 200 0 -1 -1 -1 -1 -1 B 26000 47200 8500 7100 3 0 0 1 -1 200 0 -1 -1 -1 -1 -1 T 16200 47500 9 14 1 0 0 0 1 LFO T 26200 47500 9 14 1 0 0 0 1 VCO T 22700 50400 9 10 1 0 0 0 1 Sweep T 22700 49600 9 10 1 0 0 0 1 Filter Matrix N 39100 59800 39200 59800 4 VeroRoute/tutorials/tutorial_14.vrt000644 001750 001750 00000107257 14433261462 017707 0ustar00alexalex000000 000000 9.ЎTUTORIAL 14 - MAKING CONNECTIONS As seen in the previous tutorials, connections are automatically made between adjacent grid points that have the same netlist ID. So to manually build a track, netlist IDs need to be "painted" to grid points and component pins. We will go through an example in detail, but first of all here is an overview. To paint things (i.e. assign netlist IDs) you must hold down a particular keyboard key while clicking the mouse. The key used depends on whether you want to paint a component pin or a regular grid point. 14.1 PAINTING COMPONENT PINS Component pins are special and must be protected from being edited by accident. Therefore in order to paint or erase a pin you must hold down the "P" key for "pin" while you click the mouse on the pin to modify it. You can only paint true component pins with the "P" key. You cannot use the "P" key to paint regular grid points or wires. Note that it is not possible to paint a component pin if the component is floating. It must be placed on the grid first. 14.2 PAINTING THE GRID Regular grid points can be painted by holding down the SPACE bar and clicking with the mouse. Using the SPACE bar avoids the need for repeated mouse-clicks and you can paint (or erase) multiple points by moving the mouse while holding down a mouse button. Component pins are protected and left unmodified when painting with the SPACE bar. 14.3 ERASING When either the "P" key or the SPACE bar is being held down, use the left mouse button to paint, and use the right mouse button to erase. 14.4 SELECTING THE NETLIST ID FOR PAINTING To paint using an existing netlist ID, you must first make it the "selected net" by double-clicking on a point with that netlist ID in the layout (or in the "Broken Nets" list) just as you would when viewing connectivity. It will be highlighted in dark grey in the layout. To paint with a brand new netlist ID, you must first double-click the mouse in a blank area of the grid to clear the "selected net" so that nothing in the layout is shown in dark grey. This will cause a brand new netlist ID to be used for painting. EXAMPLE Now let's paint the parts in the top part of the layout... Start by double-clicking in a blank area of the layout so that nothing is shown in dark grey. This means the first thing we paint will have a brand new netlist ID. Hold down "P" and left-click on the top pin of R1. It will be painted in dark grey with the new netlist ID. We want to connect the tops of R1, R2 and R3. So making sure that the top pin of R1 is still shown in dark grey, hold down "P" and click on the top pins of R2 and R3. You will see the net highlighted in the "Broken Nets" list because the three painted pins are not electrically connected. You can fix that my moving the parts so that the pins are adjacent, but let's paint a track instead. Hold down the SPACE bar and paint in the grid points between the 3 pins to join them electrically and fix the broken net. Now drag R1 a few steps to the left with the mouse. Upon releasing the mouse, connectivity is re-evaluated and you will see that the net is in the "Broken Nets" list again. This is because parts (except for wires) take their netlist IDs with them as they are moved. So the act of painting a pin does not paint the underlying grid. Now move R1 back. Next we will connect the bottom of R2 to the top of Q1. We want to use a brand new netlist ID, so double-click the mouse in a blank part of the grid so that nothing is shown in dark grey. Then hold down "P" and left-click on the bottom of R2, and on the top of Q1, and then paint a track between them. That's all there is to it. The only difference between painting and erasing is using the right mouse button instead of the left. So holding down the SPACE bar, right-click and move the mouse to wipe all the tracks that you have painted. Notice that the pins are not wiped when using the SPACE bar. If you want to wipe them, you must use the "P" key instead and right-click on each one. 14.5 PAINTING WIRES When painting a wire-end, you are actually painting the grid point under the wire-end rather than the wire itself. Try the following. Hold down the SPACE bar and left-click to paint one end of the wire on the left of the grid. Notice that the other wire-end is automatically painted. Now move the wire up. You will see the point that you painted is still colored, but the other point loses its color once the wire is moved. That is because it was only electrically connected to the painted point while the wire was in place. 14.6 PAINTING TRACKS & PINS WITH FLOOD FILL It is possible to repaint entire tracks and all the pins on them using a "flood-fill". To do this, hold down the "F" key instead of the "P" key or SPACE bar. Try this now by first double-clicking on one of the track portions in the bottom-right portion of the layout to select a netlist ID for painting. Then hold down the F key and left click on the unbroken vertical track connecting C1 and C2. Both the track and the pins on it will be assigned the selected netlist ID. Now try painting the broken track portion on the right of C1. Notice that the the broken track portion on C2 remains unaffected because it was not connected to the point that was clicked. 14.7 TOGGLING BETWEEN COMPETING DIAGONALS Finally, look at the painted track sections in the bottom right of the grid. (You may need to Reload this tutorial if you modified what was originally there). There is a short diagonal track section going from top-left to bottom-right between two other track sections. VeroRoute does not allow diagonal connections to cross each other, so the current diagonal connection blocks a potential diagonal connection going the other way (from top-right to bottom-left). Double-clicking on the diagonal connection (without holding down any keys) will cause the competing diagonal to be used instead. Give that a try.џџџџџџџџџџџZ.. 2<  џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџ@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџФџџџџџџџџџџdџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ%џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ1џџџџџџџџџџAџџџџџџџџџџRџџџџџџџџџџ‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџFџџџџџџџџџџLџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџєC2C2CCeramicCAP_CERAMICWF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,R110kRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   LQ1 2N3904QTO92TO92SF(123Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џџџШ Wire1 Wire1WireWire WF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџџ,R233kRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R310kRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєC1C1CCeramicCAP_CERAMICWF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PB@џџџўINVALID TracksWF(џџџ€џџџ€џџџ€џџџ€џџџџџџџџF#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Р@Р@@V€џVeroRoute/tutorials/tutorial_25.vrt000644 001750 001750 00000115616 14433261713 017706 0ustar00alexalex000000 000000 9дTUTORIAL 25 - DRAG & DROP SUPPORT / COMMAND LINE OPTIONS. From version 1.22, it is possible to drag a *.vrt file from the file explorer of the OS into a running VeroRoute, and it will behave as if you had chosen to open the file using "File -> Open" in VeroRoute. Command line options have also been added from version 1.22. For example, if the main folder containing the veroroute executable is /home/vroute but you are in some other folder containing the file "circuit.vrt", then you can open the *.vrt file from the command line as follows /home/vroute/veroroute -p /home/vroute circuit.vrt or in different order as follows /home/vroute/veroroute circuit.vrt -p /home/vroute The "-p" option is important because it tells VeroRoute where to look for the "platforms", and "tutorials" folders. If it is omitted then it will just look in the folder from where the command was issued. The main purpose of this command line functionality is to allow a *.vrt file to be opened by double-clicking on it in the file explorer of the OS. This is simple in Linux because when creating a file-type association it is possible to specify the path to the executable as well as command line options. So keeping with the above example, we would associate *.vrt files with the command /home/vroute/veroroute -p /home/vroute On MS Windows, the command line options for the file association need to be specifed in the registry. Read the info in the text file "VRT_Registry_Entry_READ_ME_FIRST.txt". This will tell you how you must edit the file "VRT_Registry_Entry.reg". You can then double click on the reg file to create the registry entry. For both MS Windows and Linux it is possible to create a desktop shortcut to the veroroute executable, and providing the shortcut sets the working directory to be VeroRoute's home directory, then you can drag *.vrt files to the shortcut to open them. Also from version 1.22, it is possible to run multiple instances of VeroRoute at the same time with no problems. Earlier versions would have had problems with Undo/Redo functionality because of the way the program wrote files to the shared history folder. џџџџџџџџџџџb222F &(џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџPџџџџџџџџџџ‘џџџџџџџџџџџџџџџџџџџџ!џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџLџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџBџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџdџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ„џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ рџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ!џџџџџџџџџџџџџџџџџџџџPџџџџџџџџџџБџџџџџџџџџџAџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ!џџџџџџџџџџџџџџџџџџџџTџџџџџџџџџџ“џџџџџџџџџџ1џџџџџџџџџџIџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ!џџџџџџџџџџџџџџџџџџџџ @џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ @џџџџџџџџџџ 8џџџџџџџџџџ Uџџџџџџџџџџ “џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ !џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџhџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџТџџџџџџџџџџLџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџHџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџBџџџџџџџџџџLџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ&џџџџџџџџџџџџџџџџџџџџHџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџBџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџџ Nџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ hџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ ТџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџTџџџџџџџџџџ“џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџBџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Tџџџџџџџџџџ “џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ$џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ„џџџџџџџџџџ,џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ$џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ„џџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџ$џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ„џџџџџџџџџџ $џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Єџџџџџџџџџџџџџџџџџџџџ $џџџџџџџџџџџџџџџџџџџџ €џџџџџџџџџџ ,џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџB@џџџўINVALID TracksWF(џџџ€џџџ€џџџ€џџџ€џџџџџџџџF#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Р@Р@@V€џVeroRoute/libraries/gEDA/veroroute_transistor/NPN_BC237.sym000644 001750 001750 00000001562 13515171161 023764 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=1 T 400 850 5 6 0 0 0 0 1 pinseq=1 T 400 850 5 6 0 0 0 0 1 pinlabel=1 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=3 T 400 50 5 6 0 0 0 0 1 pinseq=3 T 400 50 5 6 0 0 0 0 1 pinlabel=3 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 403,209 L 501,200 L 431,273 L 425,240 z T 600 700 5 10 1 1 0 0 1 device=BC237 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=NPN Transistor VeroRoute/Src/Board.cpp000644 001750 001750 00000076654 14561534327 015252 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #include "Board.h" #include "PolygonHelper.h" // Methods to get objects at a grid location int Board::GetComponentId(int row, int col) // Pick the most relevant component at the location { MakeToroid(row, col); // Make co-ordinates wrap around at grid edges // Most to least prefered order is ... // ... unplaced plugs, unplaced non-plugs, placed plugs, placed non-plugs for (int iLoop = 0; iLoop < 4; iLoop++) { const bool bReqPlaced = ( iLoop / 2 == 1 ); // true ==> Only consider placed components const bool bReqPlug = ( iLoop % 2 == 0 ); // true ==> Only consider components that can go under ICs int iMinArea(INT_MAX), iBestCompID(BAD_COMPID); // If two comps share a grid point, pick one with smallest area for (const auto& mapObj : m_compMgr.GetMapIdToComp()) { const Component& comp = mapObj.second; const bool bPlug = CompTypes::IsPlug( comp.GetType() ); const bool bPlaced = comp.GetIsPlaced(); if ( bPlaced != bReqPlaced ) continue; if ( bPlug != bReqPlug ) continue; int rowTL = comp.GetRow(); int colTL = comp.GetCol(); MakeToroid(rowTL, colTL); // Make co-ordinates wrap around at grid edges if ( row >= rowTL && row < rowTL + comp.GetCompRows() && col >= colTL && col < colTL + comp.GetCompCols() ) { const int area = comp.GetCompRows() * comp.GetCompCols(); if ( area <= iMinArea ) { iMinArea = area; iBestCompID = comp.GetId(); } } } if ( iBestCompID != BAD_COMPID ) return iBestCompID; Component& trax = m_compMgr.GetTrax(); if ( trax.GetSize() > 0 ) { const bool bPlug = CompTypes::IsPlug( trax.GetType() ); const bool bPlaced = trax.GetIsPlaced(); if ( bPlaced != bReqPlaced ) continue; if ( bPlug != bReqPlug ) continue; int rowTL = trax.GetRow(); int colTL = trax.GetCol(); MakeToroid(rowTL, colTL); // Make co-ordinates wrap around at grid edges if ( row >= rowTL && row < rowTL + trax.GetCompRows() && col >= colTL && col < colTL + trax.GetCompCols() ) { if ( trax.GetCompElement(row-rowTL, col-colTL)->ReadFlagBits(RECTSET) ) return trax.GetId(); } } } return BAD_COMPID; } int Board::GetTextId(int row, int col) // Pick the most relevant text box at the location { MakeToroid(row, col); // Make co-ordinates wrap around at grid edges TextRect bestRect; int bestId(BAD_TEXTID); for (const auto& mapObj : m_textMgr.m_mapIdtoText) { const TextRect& rect = mapObj.second; if ( !rect.ContainsPoint(row, col) ) continue; if ( !bestRect.GetIsValid() || rect.GetArea() < bestRect.GetArea() ) { bestRect = rect; bestId = mapObj.first; } } return bestId; } // Methods to handle variable pad/hole and PCB tolerances void Board::GetPadWidths_MIL(std::list& o, int& iDefaultWidth) const { iDefaultWidth = GetPAD_MIL(); m_compMgr.GetPadWidths(o, iDefaultWidth); if ( GetFatTracks() && std::find(o.begin(), o.end(), iDefaultWidth) == o.end() ) o.push_back( iDefaultWidth ); } void Board::GetHoleWidths_MIL(std::list& o, int& iDefaultWidth) const { iDefaultWidth = GetHOLE_MIL(); m_compMgr.GetHoleWidths(o, iDefaultWidth); } void Board::GetSeparations(double& minTrackSeparation_mil, double& minGroundFill_mil) { if ( GetCompEdit() || GetVeroTracks() ) return; // Calc minimum track separation in mil const double dMinSep = 100.0 * m_dMinSeparation; // Min separation in MIL, without ground fill const double dGap = GetGroundFill() ? GetGAP_MIL() : 100.0; minTrackSeparation_mil = std::min(dGap, dMinSep); // Calc minimum ground-fill width in mil // To have a ground fill with no isolated islands, this must be > 0 (and probably at least 8 mil) minGroundFill_mil = GetGroundFill() ? std::min(100.0, std::max(0.0, dMinSep - dGap * 2.0)) : 100.0; // If the minimum track separation is determined by the gap, // then all locations have min separation, so don't show warning points in the view if ( minTrackSeparation_mil - dGap == 0.0 ) ClearWarnPoints(); } void Board::CalcMIN_SEPARATION() // Sets m_dMinSeparation and m_warnPoints[] { ClearWarnPoints(); // Wipe list of warning locations on both layers m_dMinSeparation = DBL_MAX; if ( GetCompEdit() || GetVeroTracks() ) return; // Some SOIC designs in VeroRoute have an SOIC pad/track that is adjacent to a useable non-SOIC grid point (X), // but the SOIC "pin" for that track may not be adjacent to X. So we have to increase "nRings" below to 3 to capture these cases. const int nRings = ( m_compMgr.GetNumSOIC() > 0 ) ? 3 : 2; // 2 ==> Max pad size supported by VeroRoute could be up to 200 mil in future int Xmil, Ymil; // For pad offsets const bool bStandardBlobs = ( MAX_PAD_OFFSET_MIL <= 50 ); // true ==> legs for offset pads will be within a grid square // Get bounds to minimise looping int minRow, minCol, maxRow, maxCol; GetBounds(minRow, minCol, maxRow, maxCol); const bool& bVero = GetVeroTracks(); const bool bMonoPCB = GetTrackMode() == TRACKMODE::MONO || GetTrackMode() == TRACKMODE::PCB; const bool bGroundFill = !bVero && bMonoPCB && GetGroundFill(); const bool bSolderMask = false; const bool bForceXthermals = GetXthermals(); for (int k = 0, kMax = GetLyrs(); k < kMax; k++) // Check all layers { PolygonHelper polygonHelper; for (int j = minRow; j <= maxRow; j++) for (int i = minCol; i <= maxCol; i++) { const Element* pA = Get(k, j, i); const int& nodeIdA = pA->GetNodeId(); const bool bHasPinA = pA->GetHasPinTH(); const bool bSoicA = pA->GetHasPinSOIC() && k == LYR_TOP; if ( nodeIdA == BAD_NODEID && !bHasPinA ) continue; // Skip if no track and no pin const bool bIsGndA = bGroundFill && nodeIdA == GetGroundNodeId(k) && nodeIdA != BAD_NODEID; MyPointF pointA(i, j, 0.005 * GetTRACK_MIL()); // The blob centre for pA (note: track radius !!!) MyPointF padA(pointA); // The pad centre for pA (pad radius will be set below) bool bPadA(true); // Set false if there is no pad at pA bool bPadOffsetA(false); // Set true if we have an offset pad at pA int iPadWidthMIL_A(0); // Needed for tag length if ( pA->GetHasWire() ) padA.m_radius = 0.005 * GetPAD_MIL(); // No custom pad size for wires else if ( bHasPinA ) { size_t pinIndex; int compId; GetSlotInfoForTH(pA, pinIndex, compId); // If hole sharing, preferring TH part over SOIC part const Component& comp = m_compMgr.GetComponentById( compId ); // Non-wire part must use slot 0 iPadWidthMIL_A = comp.GetCustomPads() ? comp.GetPadWidth() : GetPAD_MIL(); // Handle custom pad sizes padA.m_radius = 0.005 * iPadWidthMIL_A; // Handle pad offsets comp.GetCompPinOffsets(pinIndex, Xmil, Ymil); padA += QPointF(0.01 * Xmil, 0.01 * Ymil); bPadOffsetA = ( Xmil != 0 || Ymil != 0 ); } else if ( pA->GetIsVia() ) padA.m_radius = 0.005 * GetVIAPAD_MIL(); else bPadA = false; std::list blobA; // Blob A points (in units of grid squares) std::list soicA; const int iPerimeterCodeA = GetPerimeterCode(pA); const int iTagCodeA = ( bPadA && bIsGndA ) ? GetTagCode(pA, iPerimeterCodeA) : 0; const bool bBlobA = !bPadOffsetA || iPerimeterCodeA != 0 || ( bForceXthermals && bIsGndA ); if ( bBlobA ) CalcBlob(1, pointA, padA, iPadWidthMIL_A, iPerimeterCodeA, iTagCodeA, blobA, bHasPinA, bSoicA, bIsGndA); // 1 ==> scale of 1 grid square if ( bSoicA ) { size_t pinIndex; int compId; GetSlotInfoForSOIC(pA, pinIndex, compId); const Component& compSOIC = GetCompMgr().GetComponentById(compId); CalcSOIC(1, pointA, pinIndex, &compSOIC, soicA, bSolderMask, bIsGndA); } // Only need to loop half the directions in the following loop (the i,j scan takes care of the other half) for (int jj = std::max(minRow,j-nRings); jj <= j; jj++) for (int ii = std::max(minCol,i-nRings), iiMax = std::min(maxCol,i+nRings); ii <= iiMax; ii++) { if ( jj == j && ii == i ) continue; // Skip pA const Element* pB = Get(k, jj, ii); const int& nodeIdB = pB->GetNodeId(); const bool bHasPinB = pB->GetHasPinTH(); const bool bSoicB = pB->GetHasPinSOIC() && k == LYR_TOP; if ( nodeIdB == BAD_NODEID && !bHasPinB ) continue; // Skip if no track and no pin if ( nodeIdB == nodeIdA ) continue; const bool bIsGndB = bGroundFill && nodeIdB == GetGroundNodeId(k) && nodeIdB != BAD_NODEID; MyPointF pointB(ii, jj, 0.005 * GetTRACK_MIL()); // The blob centre for pB (note: track radius !!!) MyPointF padB(pointB); // The pad centre for pB (pad radius will be set below) bool bPadB(true); // Set false if there is no pad at pB bool bPadOffsetB(false); // Set true if we have an offset pad at pB int iPadWidthMIL_B(0); if ( pB->GetHasWire() ) padB.m_radius = 0.005 * GetPAD_MIL(); // No custom pad size for wires else if ( bHasPinB ) { size_t pinIndex; int compId; GetSlotInfoForTH(pB, pinIndex, compId); // If hole sharing, preferring TH part over SOIC part const Component& comp = m_compMgr.GetComponentById( compId ); // Non-wire part must use slot 0 iPadWidthMIL_B = comp.GetCustomPads() ? comp.GetPadWidth() : GetPAD_MIL(); // Handle custom pad sizes padB.m_radius = 0.005 * iPadWidthMIL_B; // Handle pad offsets comp.GetCompPinOffsets(pinIndex, Xmil, Ymil); padB += QPointF(0.01 * Xmil, 0.01 * Ymil); bPadOffsetB = ( Xmil != 0 || Ymil != 0 ); } else if ( pB->GetIsVia() ) padB.m_radius = 0.005 * GetVIAPAD_MIL(); else bPadB = false; std::list blobB; // Blob B points (in units of grid squares) std::list soicB; const int iPerimeterCodeB = GetPerimeterCode(pB); const int iTagCodeB = ( bPadB && bIsGndB ) ? GetTagCode(pB, iPerimeterCodeB) : 0; const bool bBlobB = !bPadOffsetB || iPerimeterCodeB != 0 || ( bForceXthermals && bIsGndB ); if ( bBlobB ) CalcBlob(1, pointB, padB, iPadWidthMIL_B, iPerimeterCodeB, iTagCodeB, blobB, bHasPinB, bSoicB, bIsGndB); // 1 ==> scale of 1 grid square if ( bSoicB ) { size_t pinIndex; int compId; GetSlotInfoForSOIC(pB, pinIndex, compId); const Component& compSOIC = GetCompMgr().GetComponentById(compId); CalcSOIC(1, pointB, pinIndex, &compSOIC, soicB, bSolderMask, bIsGndB); } const bool bCompareBlobs = !bStandardBlobs || ( abs(jj - j) < 2 && abs(ii - i) < 2 ); // Standard blobs ==> just consider neighbouring grid points // Pad A to Pad B if ( bPadA && bPadB ) polygonHelper.CalcSeparation(padA, padB); // Pad A to Blob B if ( bPadA && bBlobB ) for(const auto& b : blobB) polygonHelper.CalcSeparation(padA, b); // Pad B to Blob A if ( bPadB && bBlobA ) for(const auto& a : blobA) polygonHelper.CalcSeparation(padB, a); // Blob A to Blob B if ( bCompareBlobs && bBlobA && bBlobB ) for(const auto& a : blobA) for(const auto& b : blobB) polygonHelper.CalcSeparation(a, b); // SOIC track A to SOIC track B if ( bSoicA && bSoicB ) for(const auto& a : soicA) for(const auto& b : soicB) polygonHelper.CalcSeparation(a, b); // Pad A to SOIC track B if ( bPadA && bSoicB ) for(const auto& b : soicB) polygonHelper.CalcSeparation(padA, b); // Pad B to SOIC track A if ( bPadB && bSoicA ) for(const auto& a : soicA) polygonHelper.CalcSeparation(padB, a); // SOIC track A to Blob B if ( bSoicA && bBlobB ) for(const auto& a : soicA) for(const auto& b : blobB) polygonHelper.CalcSeparation(a, b); // SOIC track B to Blob A if ( bSoicB && bBlobA ) for(const auto& b : soicB) for(const auto& a : blobA) polygonHelper.CalcSeparation(a, b); } } if ( polygonHelper.m_Dmin > m_dMinSeparation ) continue; if ( polygonHelper.m_Dmin < m_dMinSeparation ) // If min for layer is lowest across all layers ... ClearWarnPoints(); // ... wipe all warning points for (auto& p : const_cast(polygonHelper.m_pWarn)) m_warnPoints[k].push_back(p); m_dMinSeparation = polygonHelper.m_Dmin; } // Next layer } void Board::CalcGroundFillBounds() { const int& W = GetGRIDPIXELS(); // Square width in pixels const int C = W >> 1; // Half square width in pixels int deltaL(0), deltaR(0), deltaT(0), deltaB(0); // Maximum pad protrusions (in pixels) at edge of grid // Loop points on edge of grid and look for large pads there int minRow(0), minCol(0), maxRow(GetRows()-1), maxCol(GetCols()-1); for (int j = minRow; j <= maxRow; j++) { const int iStep = ( j == minRow || j == maxRow ) ? 1 : std::max(1, maxCol - minCol); for (int i = minCol; i <= maxCol; i += iStep) { const Element* p = Get(0, j, i); // Sufficient to check layer 0 when looking for TH pins if ( !p->GetHasPinTH() ) continue; if ( p->GetHasWire() ) continue; // Wires can't have custom sized pads or offset pads size_t pinIndex; int compId; GetSlotInfoForTH(p, pinIndex, compId); // If hole sharing, preferring TH part over SOIC part const Component& comp = m_compMgr.GetComponentById( compId ); int Xmil(0), Ymil(0); // Pad offsets comp.GetCompPinOffsets(pinIndex, Xmil, Ymil); if ( !comp.GetCustomPads() && Xmil == 0 && Ymil == 0) continue; // Skip pad if not custom or offset const int w = comp.GetPadWidth(); const int padWidth = GetHalfPixelsFromMIL( w ) + 1; // +1 for back compatibility (i.e. max pad size was 98) const int delta = padWidth - C; // The protrusion for a pad without offset if ( i == minCol ) deltaL = std::max(deltaL, delta - ( Xmil * W ) / 100); if ( i == maxCol ) deltaR = std::max(deltaR, delta + ( Xmil * W ) / 100); if ( j == minRow ) deltaT = std::max(deltaT, delta - ( Ymil * W ) / 100); if ( j == maxRow ) deltaB = std::max(deltaB, delta + ( Ymil * W ) / 100); } } m_gndL = 0 - deltaL; m_gndT = 0 - deltaT; m_gndR = W * GetCols() + deltaR; m_gndB = W * GetRows() + deltaB; const double iFillWidth = static_cast ( GetFillWidth() ); m_gndL -= iFillWidth; m_gndT -= iFillWidth; m_gndR += iFillWidth; m_gndB += iFillWidth; // Loop all shapes and get a safe estimate of their outer bounds const bool bMonoPCB = GetTrackMode() == TRACKMODE::MONO || GetTrackMode() == TRACKMODE::PCB; const bool bFill = !bMonoPCB && GetFillSaturation() > 0; // No component fill in Mono/PCB mode for (const auto& mapObj : m_compMgr.GetMapIdToComp()) { const Component& comp = mapObj.second; double L,R,T,B; comp.GetSafeBounds(L, R, T, B, bFill); // Footprint centre const double X = C * ( comp.GetCol() + comp.GetLastCol() + 1 ); const double Y = C * ( comp.GetRow() + comp.GetLastRow() + 1 ); m_gndL = std::min(m_gndL, static_cast(X + W * L)); m_gndT = std::min(m_gndT, static_cast(Y + W * T)); m_gndR = std::max(m_gndR, static_cast(X + W * R)); m_gndB = std::max(m_gndB, static_cast(Y + W * B)); } } void Board::GetGroundFillBounds(int& L, int& R, int& T, int& B) const { L = m_gndL; R = m_gndR; T = m_gndT; B = m_gndB; } // Methods to paint/unpaint nodeIds void Board::SetNodeId(Element* p, int nodeId, bool bAllLyrs) // Helper to make sure we do UpdateCounts() before painting an element { // For all layers case, always write base layer first Element* q = bAllLyrs ? p->GetNbr(NBR_X) : nullptr; Element* p1 = std::min(p, q); Element* p2 = std::max(p, q); if ( p1 ) { if ( !GetRoutingEnabled() ) // No point updating m_adjInfoMgr since RebuildAdjacencies() is called after routing m_adjInfoMgr.UpdateCounts(p1, nodeId); // Do this BEFORE we call SetNodeId() on the element p1->SetNodeId(nodeId); // Write node value } if ( p2 ) { if ( !GetRoutingEnabled() ) // No point updating m_adjInfoMgr since RebuildAdjacencies() is called after routing m_adjInfoMgr.UpdateCounts(p2, nodeId); // Do this BEFORE we call SetNodeId() on the element p2->SetNodeId(nodeId); // Write node value } } void Board::WipeFlagBits(Element* p, char i, bool bAllLyrs) { // For all layers case, always write base layer first Element* q = bAllLyrs ? p->GetNbr(NBR_X) : nullptr; Element* p1 = std::min(p, q); Element* p2 = std::max(p, q); if ( p1 ) p1->WipeFlagBits(i); if ( p2 ) p2->WipeFlagBits(i); } void Board::MarkFlagBits(Element* p, char i, bool bAllLyrs) { // For all layers case, always write base layer first Element* q = bAllLyrs ? p->GetNbr(NBR_X) : nullptr; Element* p1 = std::min(p, q); Element* p2 = std::max(p, q); if ( p1 ) p1->MarkFlagBits(i); if ( p2 ) p2->MarkFlagBits(i); } bool Board::SetNodeIdByUser(int lyr, int row, int col, int nodeId, bool bPaintPins) { Element* p = Get(lyr, row, col); if ( p->GetIsHole() || ( p->GetSoicProtected() && nodeId != BAD_NODEID ) ) return false; // No change const bool bWire = p->GetHasWire(); const bool bPin = p->GetLyrHasPin(); const bool bUnderSOICpin = !bPin && p->GetHasPinSOIC(); // Special case. On bottom layer, under an SOIC pin assert( !bPin || p->GetHasComp() ); // Sanity check assert( !bWire || p->GetHasPinTH() ); // Wires must have TH pins assert( !bWire || !p->GetHasPinSOIC() ); // Wires can't share with SOICs WIRELIST wireList; // Helper for chains of wires // Handle special case first. if ( ( bPin || bUnderSOICpin ) && !bWire && !bPaintPins ) { // If trying to paint the board under a non-wire pin ... // ... we can modify the "origId" for the pin, but are only allowed // ... to wipe it or make it match the nodeId of the pin. Then quit. bool bChanged(false); for (int iSlot = 0; iSlot < 2; iSlot++) { size_t pinIndex; int compId; p->GetSlotInfo(iSlot, pinIndex, compId); if ( compId == BAD_COMPID ) continue; Component& comp = m_compMgr.GetComponentById( compId ); assert( comp.GetType() != COMP::INVALID ); assert( comp.GetType() != COMP::WIRE ); // Sanity check assert( pinIndex != BAD_PININDEX ); if ( bPin && nodeId != BAD_NODEID && nodeId != comp.GetNodeId(pinIndex) ) continue; // Can't set a bad origId if ( comp.GetOrigId(lyr, pinIndex) == nodeId ) continue; // origId is already as required // Need to do (RemoveComp/ SetNodeId/ AddComp) to ensure m_nodeInfoMgr is updated OK m_nodeInfoMgr.RemoveComp(comp); comp.SetOrigId(lyr, pinIndex, nodeId); m_nodeInfoMgr.AddComp(comp); bChanged = true; } if ( bPin ) // Only return for the bPin case. The bUnderSOICpin case has to paint the board. return bChanged; } // Now do regular cases: Paint the board as needed... if ( bWire ) { // Just need to get origId. Any used slot will do size_t pinIndex; int compId; p->GetSlotInfo(p->GetFirstUsedSlot(), pinIndex, compId); const Component& comp = m_compMgr.GetComponentById( compId ); assert( comp.GetType() == COMP::WIRE ); // Sanity check const int origId = comp.GetOrigId(lyr, pinIndex); if ( nodeId == p->GetNodeId() && origId == nodeId && p->ReadFlagBits(USERSET) ) return false; // No change } else if ( nodeId == p->GetNodeId() && p->ReadFlagBits(USERSET) ) return false; // No change // Set the NodeId on the element and all connected wire points p->GetWireList(wireList); // Get list containing p and its wired points for (const auto& o : wireList) { Element* pW = const_cast (o.first); const bool bAllLyrs = pW->GetHasPinTH(); SetNodeId(pW, nodeId, bAllLyrs); WipeFlagBits(pW, AUTOSET|VEROSET, bAllLyrs); MarkFlagBits(pW, USERSET, bAllLyrs); } // Set the nodeId at the component pin if ( bPin ) { if ( bWire ) // Wire { size_t pinIndex; int compId; for (const auto& o : wireList) { Element* pL = const_cast (o.first); for (int iSlot = 0; iSlot < 2; iSlot++) { Element* pW = pL->GetW(iSlot); pL->GetSlotInfo(iSlot, pinIndex, compId); assert( (pW == nullptr && compId == BAD_COMPID && pinIndex == BAD_PININDEX) || (pW != nullptr && compId != BAD_COMPID && pinIndex != BAD_PININDEX) ); if ( pW == nullptr ) continue; Component& comp = m_compMgr.GetComponentById( compId ); assert( comp.GetType() == COMP::WIRE ); // Sanity check const size_t otherPinIndex = ( pinIndex == 0 ) ? 1 : 0; if ( pL == p ) // If it's the point that was clicked on, then set both the nodeId and origId { comp.SetNodeId(pinIndex, nodeId); for (int iLyr = 0; iLyr < 2; iLyr++) comp.SetOrigId(iLyr, pinIndex, nodeId); } comp.SetNodeId(otherPinIndex, nodeId); for (int iLyr = 0; iLyr < 2; iLyr++) comp.SetOrigId(iLyr, otherPinIndex, ( comp.GetOrigId(iLyr, otherPinIndex) != BAD_NODEID ) ? nodeId : BAD_NODEID); } } } else // Regular component { for (int iSlot = 0; iSlot < 2; iSlot++) { size_t pinIndex; int compId; p->GetSlotInfo(iSlot, pinIndex, compId); if ( compId == BAD_COMPID ) continue; Component& comp = m_compMgr.GetComponentById( compId ); assert( comp.GetType() != COMP::INVALID ); assert( bPaintPins && comp.GetType() != COMP::WIRE ); // Sanity check assert( pinIndex != BAD_PININDEX ); // Need to do (RemoveComp/ SetNodeId/ AddComp) to ensure m_nodeInfoMgr is updated OK m_nodeInfoMgr.RemoveComp(comp); comp.SetNodeId(pinIndex, nodeId); for (int iLyr = 0; iLyr < 2; iLyr++) if ( comp.GetOrigId(iLyr, pinIndex) != nodeId ) // Modifying a pin on a previously painted track ... comp.SetOrigId(iLyr, pinIndex, BAD_NODEID); // ... should wipe the track under the pin m_nodeInfoMgr.AddComp(comp); } } } return true; } void Board::FloodNodeId(int nodeId) { for (int lyr = 0, lyrs = GetLyrs(); lyr < lyrs; lyr++) for (int row = 0, rows = GetRows(); row < rows; row++) for (int col = 0, cols = GetCols(); col < cols; col++) { Element* p = Get(lyr, row, col); if ( p->GetMH() == BAD_MH) continue; if ( p->GetHasWire() ) { // Just need to get origId. Any used slot will do size_t pinIndex; int compId; p->GetSlotInfo(p->GetFirstUsedSlot(), pinIndex, compId); const Component& comp = m_compMgr.GetComponentById( compId ); assert( comp.GetType() == COMP::WIRE ); // Sanity check const int origId = comp.GetOrigId(lyr, pinIndex); if ( origId != p->GetNodeId() || !p->ReadFlagBits(USERSET) ) continue; // Don't paint directly if it wasn't painted directly in the first place } SetNodeIdByUser(lyr, row, col, nodeId, true); // true ==> paint pins } } void Board::AutoFillVero() { int minRow, minCol, maxRow, maxCol; GetBounds(minRow, minCol, maxRow, maxCol); const bool& bVertical = GetVerticalStrips(); // Note: The terms "top" and "bot" in the following code should be // taken to mean "left" and "right" if making horizontal strips. const int k(0); const int jMin = ( bVertical ) ? minCol : minRow; const int jMax = ( bVertical ) ? maxCol : maxRow; const int iMin = ( bVertical ) ? minRow : minCol; const int iMax = ( bVertical ) ? maxRow : maxCol; for (int j = jMin; j <= jMax; j++) { int nodeIdTop(BAD_NODEID), lenTop(INT_MAX); for (int i = iMin; i <= iMax; i++) { Element* pC = ( bVertical ) ? Get(k,i,j) : Get(k,j,i); const int& nodeId = pC->GetNodeId(); if ( nodeId != BAD_NODEID ) { if ( nodeIdTop == nodeId ) lenTop++; // Increment top count else { nodeIdTop = nodeId; lenTop = 1; // Start top count } continue; } if ( pC->GetHasPin() ) continue; // Can't assign pins, so skip if ( pC->GetIsHole() ) continue; // Can't assign holes, so skip if ( pC->GetSoicProtected() ) continue; // Can't assign in SOIC area, so skip // Have a blank non-pin element at this point // Search for first used nodeId below int nodeIdBot(BAD_NODEID), lenBot(INT_MAX); for (int ii = i+1; ii <= iMax; ii++) { const Element* pB = ( bVertical ) ? Get(k,ii,j) : Get(k,j,ii); const int& nodeId = pB->GetNodeId(); if ( nodeId == BAD_NODEID ) { if ( nodeIdBot == BAD_NODEID ) continue; // Skip else break; // End bottom count } else if ( nodeIdBot == BAD_NODEID ) { nodeIdBot = nodeId; lenBot = 1; // Start bottom count } else if ( nodeIdBot == nodeId ) lenBot++; // Increment bottom count else break; // End bottom count } const bool bAllLyrs(false); if ( lenTop == INT_MAX && lenBot == INT_MAX ) SetNodeId(pC, GetNewNodeId(), bAllLyrs); // Unused strip, so make a new nodeId else if ( lenTop < lenBot ) SetNodeId(pC, nodeIdTop, bAllLyrs); else SetNodeId(pC, nodeIdBot, bAllLyrs); WipeFlagBits(pC, USERSET|AUTOSET, bAllLyrs); MarkFlagBits(pC, VEROSET, bAllLyrs); nodeIdTop = pC->GetNodeId(); lenTop = 1; // Start top count } } m_colorMgr.ReAssignColors(); // Forces colors to be worked out again } void Board::CalcSolder() // Work out locations of solder blobs to join veroboard tracks together { for (int i = 0, iSize = GetSize(); i < iSize; i++) GetAt(i)->SetSolderR(false); // Clear solder const bool& bVertical = GetVerticalStrips(); // Strip direction std::vector nodeIds; m_adjInfoMgr.GetBoardNodeIds(nodeIds); // The set of valid nodeIDs on the board for (size_t n = 0, N = nodeIds.size(); n < N; n++) for (int col = 0, numCols = bVertical ? GetCols() : GetRows(); col < numCols; col++) // Loop cols/rows SetSolder(nodeIds[n], col, bVertical); } void Board::SetSolder(int nodeId, int col, bool bVertical) { // Sets elements of bSolderR to indicate solder blob between col and col+1 const int colMax = ( bVertical ) ? GetCols() : GetRows(); if ( col == colMax-1 ) return; assert( nodeId != BAD_NODEID ); int bestRow(-1), bestRowPins(-INT_MAX), bestRowPads(INT_MAX); const int lyr(0); const int rowMax = ( bVertical ) ? GetRows() : GetCols(); for (int row = 0; row < rowMax; row++) { const Element* pC = bVertical ? Get(lyr, row, col) : Get(lyr, col, row); const Element* pR = bVertical ? Get(lyr, row, col+1) : Get(lyr, col+1, row); const bool bMatch = pC->GetNodeId() == nodeId && pR->GetNodeId() == nodeId; const bool bLastRow = row == rowMax-1; if ( bMatch ) { int rowPins(0), rowPads(0); // Try avoid putting a blob where we have a pad. Otherwise prefer pin locations. if ( pC->GetHasPinTH() ) { if ( pC->GetHasWire() ) // Don't treat wire like pad rowPins++; else { size_t pinIndex; int compId; GetSlotInfoForTH(pC, pinIndex, compId); const Component& comp = m_compMgr.GetComponentById( compId ); assert( comp.GetType() != COMP::INVALID ); if ( comp.GetType() == COMP::PAD || comp.GetAllowFlyWire() ) rowPads++; else rowPins++; } } if ( pR->GetHasPinTH() ) { if ( pR->GetHasWire() ) // Don't treat wire like pad rowPins++; else { size_t pinIndex; int compId; GetSlotInfoForTH(pR, pinIndex, compId); const Component& comp = m_compMgr.GetComponentById( compId ); assert( comp.GetType() != COMP::INVALID ); if ( comp.GetType() == COMP::PAD || comp.GetAllowFlyWire() ) rowPads++; else rowPins++; } } const bool bIsBetter = ( bestRow == -1 ) || ( rowPads < bestRowPads ) || ( rowPads == bestRowPads && rowPins > bestRowPins ); if ( bIsBetter ) { bestRow = row; bestRowPins = rowPins; bestRowPads = rowPads; } } if ( bLastRow || !bMatch ) { if ( bestRow != -1 ) { // Finally check that there isn't a wire joining the strips bool bHaveWire(false); // Set true if a wire joins the strips for (int r = bestRow; r >= 0 && !bHaveWire; r--) // Search one way ... { const Element* pC = bVertical ? Get(lyr, r, col) : Get(lyr, col, r); if ( pC->GetNodeId() != nodeId ) break; const Element* pR = bVertical ? Get(lyr, r, col+1) : Get(lyr, col+1, r); if ( pR->GetNodeId() != nodeId ) break; bHaveWire = ( pC->GetW(0) == pR || pC->GetW(1) == pR ); } for (int r = bestRow; r < rowMax && !bHaveWire; r++) // ... and the other { const Element* pC = bVertical ? Get(lyr, r, col) : Get(lyr, col, r); if ( pC->GetNodeId() != nodeId ) break; const Element* pR = bVertical ? Get(lyr, r, col+1) : Get(lyr, col+1, r); if ( pR->GetNodeId() != nodeId ) break; bHaveWire = ( pC->GetW(0) == pR || pC->GetW(1) == pR ); } if ( !bHaveWire ) { if ( bVertical ) Get(lyr, bestRow, col)->SetSolderR(true); else Get(lyr, col, bestRow)->SetSolderR(true); } } bestRow = -1; // Reset bestRowPins = -INT_MAX; // Reset bestRowPads = INT_MAX; // Reset } } } // Command enablers for GUI bool Board::GetDisableCompText() const { if ( GetMirrored() ) return true; if ( ( m_groupMgr.GetNumUserComps() != 1 ) || ( GetCompMode() == COMPSMODE::OFF || GetCompMode() == COMPSMODE::OUTLINE ) ) return true; const Component& comp = GetUserComponent(); const COMP& eType = comp.GetType(); return ( eType == COMP::WIRE || eType == COMP::MARK || eType == COMP::VERO_NUMBER || eType == COMP::VERO_LETTER ); // No labels for wires/markers/vero-labels } bool Board::GetDisableMove() const { if ( GetMirrored() ) return true; const Component& trax = m_compMgr.GetTrax(); const bool bHidingComps = ( m_groupMgr.GetNumUserComps() > 0 ) && ( GetCompMode() == COMPSMODE::OFF ); const bool bHidingTrax = ( trax.GetSize() > 0 ) && ( GetTrackMode() == TRACKMODE::OFF ); if ( bHidingComps || bHidingTrax ) return true; const bool bNoComps = ( m_groupMgr.GetNumUserComps() == 0 ); const bool bNoTrax = ( trax.GetSize() == 0 ); return bNoComps && bNoTrax; } bool Board::GetDisableRotate() const { if ( GetMirrored() ) return true; const Component& trax = m_compMgr.GetTrax(); const bool bHidingComps = ( m_groupMgr.GetNumUserComps() > 0 ) && ( GetCompMode() == COMPSMODE::OFF ); const bool bHidingTrax = ( trax.GetSize() > 0 ) && ( GetTrackMode() == TRACKMODE::OFF ); if ( bHidingComps || bHidingTrax ) return true; const bool bNoComps = ( m_groupMgr.GetNumUserComps() == 0 ); const bool bMark = ( m_groupMgr.GetNumUserComps() == 1 && GetUserComponent().GetType() == COMP::MARK ); // Can't rotate a marker const bool bNoTrax = ( trax.GetSize() == 0 ); return ( bNoComps || bMark ) && bNoTrax; } bool Board::GetDisableStretch(bool bGrow) const { if ( GetMirrored() ) return true; if ( ( m_groupMgr.GetNumUserComps() != 1 ) || ( GetCompMode() == COMPSMODE::OFF ) ) return true; const Component& comp = GetUserComponent(); return !comp.CanStretch(bGrow); } bool Board::GetDisableStretchWidth(bool bGrow) const { if ( GetMirrored() ) return true; if ( ( m_groupMgr.GetNumUserComps() != 1 ) || ( GetCompMode() == COMPSMODE::OFF ) ) return true; const Component& comp = GetUserComponent(); return !comp.CanStretchWidth(bGrow); } bool Board::GetDisableChangeType() const { if ( GetMirrored() ) return true; if ( ( m_groupMgr.GetNumUserComps() != 1 ) || ( GetCompMode() == COMPSMODE::OFF ) ) return true; const Component& comp = GetUserComponent(); const COMP eType = comp.GetType(); return !CompTypes::AllowTypeChange(eType, eType); } bool Board::GetDisableChangeCustom() const { if ( GetMirrored() ) return true; if ( ( m_groupMgr.GetNumUserComps() != 1 ) || ( GetCompMode() == COMPSMODE::OFF ) ) return true; const Component& comp = GetUserComponent(); return !comp.GetAllowCustomPads(); } bool Board::GetDisableWipe() const { return GetTrackMode() == TRACKMODE::OFF; } VeroRoute/libraries/gEDA/veroroute_transistor/NPN_BC550.sym000644 001750 001750 00000001563 13515171161 023763 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=1 T 400 850 5 6 0 0 0 0 1 pinseq=1 T 400 850 5 6 0 0 0 0 1 pinlabel=1 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=3 T 400 50 5 6 0 0 0 0 1` pinseq=3 T 400 50 5 6 0 0 0 0 1 pinlabel=3 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 403,209 L 501,200 L 431,273 L 425,240 z T 600 700 5 10 1 1 0 0 1 device=BC550 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=NPN Transistor VeroRoute/libraries/gEDA/veroroute_passive/Resistor_300mil.sym000644 001750 001750 00000001141 13515171161 024662 0ustar00alexalex000000 000000 v 20130925 2 T 0 400 5 10 0 0 0 0 1 numslots=0 P 0 400 150 400 1 0 0 { T 100 450 5 8 0 1 0 0 1 pinnumber=1 T 100 450 5 8 0 0 0 0 1 pinseq=1 T 100 450 5 8 0 0 0 0 1 pinlabel=1 T 100 450 5 8 0 0 0 0 1 pintype=pas } P 900 400 750 400 1 0 0 { T 800 450 5 8 0 1 0 0 1 pinnumber=2 T 800 450 5 8 0 0 0 0 1 pinseq=2 T 800 450 5 8 0 0 0 0 1 pinlabel=2 T 800 450 5 8 0 0 0 0 1 pintype=pas } B 150 300 600 200 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 T 200 50 5 10 1 1 0 0 1 device=100k T 300 600 8 10 1 1 0 0 1 refdes=R? T 100 400 8 10 0 0 0 0 1 footprint=RESISTOR3 T 100 400 8 10 0 0 0 0 1 description=Resistor (300 mil length) VeroRoute/Src/AdjInfoManager.h000644 001750 001750 00000007433 14377670762 016473 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include "AdjInfo.h" #include "Element.h" // Manager class to record the adjacency info for all NodeIds on the board (NOT floating components) class AdjInfoManager { public: AdjInfoManager() {} ~AdjInfoManager() { DeAllocate(); } void DeAllocate() { for (auto& o : m_mapIdtoAdjInfo) delete o.second; m_mapIdtoAdjInfo.clear(); } AdjInfo* GetAdjInfo(int nodeId) const { auto iter = m_mapIdtoAdjInfo.find(nodeId); return ( iter != m_mapIdtoAdjInfo.end() ) ? iter->second : nullptr; } bool GetNodeIdExists(int nodeId) const // true ==> the nodeId exists on the board { return GetAdjInfo(nodeId) != nullptr; } void InitCounts(Element* p) // Pretend we're assigning "p" for the first time { const int& newNodeId = p->GetNodeId(); if ( newNodeId == BAD_NODEID ) return; AdjInfo* pNew = GetAdjInfo(newNodeId); if ( !pNew ) // If no info on newNodeId ... { pNew = new AdjInfo(newNodeId); m_mapIdtoAdjInfo[ newNodeId ] = pNew; // ... add it } // Modify adjacency info for newNodeId for (int iNbr = 0; iNbr < NUM_NBRS; iNbr++) { if ( p->GetNbr(iNbr) && ReadCodeBit(iNbr, p->GetRoutable()) ) ModifyCount(nullptr, pNew, p->GetNbr(iNbr)->GetNodeId()); } // Don't do p->GetW() !! That will be handled by painting the other wire end } void UpdateCounts(Element* p, int newNodeId) // Only called by Board::SetNodeId() { const int& oldNodeId = p->GetNodeId(); if ( oldNodeId == newNodeId ) return; // No change in nodeId for element // Search for adjacency info on oldNodeId and newNodeId AdjInfo* pOld = GetAdjInfo(oldNodeId); AdjInfo* pNew = GetAdjInfo(newNodeId); if ( !pNew && newNodeId != BAD_NODEID ) // If no info on newNodeId ... { pNew = new AdjInfo(newNodeId); m_mapIdtoAdjInfo[ newNodeId ] = pNew; // ... add it } // Modify adjacency info for oldNodeId and newNodeId assert( pNew == nullptr || pNew->GetNodeId() == newNodeId ); // Sanity check. for (int iNbr = 0; iNbr < NUM_NBRS; iNbr++) { if ( p->GetNbr(iNbr) && ReadCodeBit(iNbr, p->GetRoutable()) ) ModifyCount(pOld, pNew, p->GetNbr(iNbr)->GetNodeId()); } // Don't do p->GetW() !! That will be handled on painting the other wire end } void GetBoardNodeIds(std::vector& out) const { out.resize( m_mapIdtoAdjInfo.size() ); size_t i(0); for (auto& o : m_mapIdtoAdjInfo) out[i++] = o.first; std::stable_sort(out.begin(), out.end()); // Sort nodeIds to help keep coloring consistent } private: void ModifyCount(AdjInfo* pOld, AdjInfo* pNew, int nbrNodeId) { if ( nbrNodeId == BAD_NODEID ) return; if ( pOld && pNew && pOld->GetNodeId() == pNew->GetNodeId() ) return; // No change in nodeId AdjInfo* pNbr = GetAdjInfo(nbrNodeId); if ( pOld && pNbr && pOld->GetNodeId() != pNbr->GetNodeId() ) { pOld->DecCount(pNbr->GetNodeId()); pNbr->DecCount(pOld->GetNodeId()); } if ( pNew && pNbr && pNew->GetNodeId() != pNbr->GetNodeId()) { pNew->IncCount(pNbr->GetNodeId()); pNbr->IncCount(pNew->GetNodeId()); } } private: std::unordered_map m_mapIdtoAdjInfo; }; VeroRoute/libraries/gEDA/veroroute_transistor/000755 001750 001750 00000000000 14405612075 021776 5ustar00alexalex000000 000000 VeroRoute/libraries/gEDA/veroroute_transistor/PNP_MJE2955.sym000644 001750 001750 00000001565 13515171161 024211 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=1 T 100 550 5 6 0 0 0 0 1 pinseq=1 T 100 550 5 6 0 0 0 0 1 pinlabel=1 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=2 T 400 850 5 6 0 0 0 0 1 pinseq=2 T 400 850 5 6 0 0 0 0 1 pinlabel=2 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=3 T 400 50 5 6 0 0 0 0 1 pinseq=3 T 400 50 5 6 0 0 0 0 1 pinlabel=3 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 297,341 L 199,350 L 269,277 L 275,310 z T 600 700 5 10 1 1 0 0 1 device=MJE2955 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO220 T 600 400 8 10 0 0 0 0 1 description=PNP Transistor VeroRoute/Src/android-sources/res/drawable-xhdpi/icon.png000644 001750 001750 00000002762 14206323065 023716 0ustar00alexalex000000 000000 ‰PNG  IHDR``mњрo pHYsФФ•+ЄIDATxœэœMoGЧџ3ГoNМ8iM€Њ@ЅцQ%‹ˆО ‰іPЕ‡zшзш>A9ђ5zшЕ'PiJ ­ ‚(/ЂmBРФСvМЛо™щС!iPЩГЭŒcЋšпЭбцйП~кgv=ІЕ№н7OОўъьqюТБOПпќИќ­\<›[Ќ?uо›јBl~ь]~nБшџ'ˆР "p‚œ 'ˆР "p‚œ 'ˆР+x\TbбB KUв–ЩКƘƒG%№Tй†j[,Пћќ… е+ЇЮŒLMИГаš›­Я}_Я;&™ЗЅyНvšЧЧ9€цmѕь’Њ]жАTп$?-(теі}єљи‰“ёш~РшИ? іЫхЕd]Іч%ŒОЫЦ?у•*їЧ€`Œ‹`jѕGm~ц/ ЈФO9q2žx#ьўeтpШк-uыzУ\(aє4ЏTythc@‡d ЯoH ‚ЬђгƒtђЉщсЎћMFЧќЗO …Ё…1žˆo\;['cёqЮ#ѓђІљ]# eЉZМйZ}Кm@[­uюмZOSгћ €ЪаXPкЖž’еtcAЉФММi~z JкjnЖ> t/дz­ГpНёгХКљ@ЖБzIyeшоhš^ЛЁž§ ЄNo˜П€ u57[аjШn›\МењyЖ>7kЇЭЋ6j—Е†Ъ›шE›7Ь_h$sЬ_YЛ=пмšh­Kk“ 9ъWuуWЩC‰E[“ ˜х/:“Nк:iл|ыў*•чUь:ПыbNDр8ANDPtdHЅЪІЮл|дЦYŠ=tѓZУњЙНфn1'ˆР "p‚œ 'ˆРV›з”JЅnчz]щьоƒіќ|,Ѕ „Иї бъ,sxlXАч јgЏыП ыƒДVZч iG­Іr%•ЫЕvѕZєшK’@Eюъе4ёy%ЁxнЧGؘЧя{} ‚v^_ЃtšЊхЕьЗL>U:бШеhЦЭfд§!Hžчf’ЉFІVжѓћœEи_ о љ„`ЅОз7ДѓњšчZ;иЬ3ЙЂ_цj­Кщh­ЕVЅS•'JgeoЊфНЙ/ыc§žЏZYћЋ™/&ђ!Yч(…vї_ї”ЦћXПчыƒ2Й”ЪЅџ’~‹T.eљRы“E\›'0]ˆЩPLюю쨘 МЩўж'‹˜ЎŠјAэuМ4ˆючq ьMEќ`ы“ЕLзbTАШ•—к0cœ1жm4Œ1Ц8ƒ8ƒЗ­ ѓRы[j} gaФбўŽЊЇђq*—;ъy\Žтxk"—Ы/ћ|_(&CqРчЙAЈoAv\_УgЬч№9ХЁ8ЈuіўЬФЉЫ›s›‹—– <6єЏ}ЌП3ЖžХЮCŽаЧ€ЃGŽUЋ[Пz~|їЩoђ†Дзѕ_‰kѓNDр8ANСF›Ÿž‰Я]8fБюєLlБZ‘гѕ(џ† УGЃНљ&ЗGє.џ‹ЩxKwVmжѕG!†їhz™CаГ+ъїѓ6i№жYoќAg‰охпМ‚ўiБ>dЫfЕ"ЇыQ~зХœ 'ˆР "p‚œ 'ˆР "p‚ŠОДи§} ВыќХ №ў>…0ШO №§}zŸ4рћћц/А@fАїї!1ЬяК-hРїї!1ЬOAОП‰a~Zа€яяCb˜ПиU?Dual 512-Stage BDDM %eCD4049;U?Hex Buffer (Inverting)U %uCD40508U?Hex Buffer (Non-Inverting)%AMN32095U?256-Stage BDDѓ?%EMN32074U?1024-Stage BDD:=%AMN32063U?128-Stage BDDѓ=%AMN32042U?512-Stage BDDЖ?%EMN30071U?1024-Stage BDDJ%AMN30090U?256-Stage BDD %AMN3006/U?128-Stage BDD˜h%MN3101&U?Clock driver for MN3000 series BBDh%MN3102$U?Clock driver for MN3200 series BBDL#)‚ЮКФПгЩћіёьтниЕАЋІGVˆƒ~ytoQB=83.ч)eeeeeeeee•aЋF -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 e >e=C<y:v9s8p7^6)#[1[.K%j 1j0€=’.Y- ,+<*)(O'&% $#5"1!:  =3U L*'|;@X0 >>xВдHjЄооооооооооЦQ5 000000 1 -1 000000 ='20' number_pos='0' centre_name='0'>IN VBB VDD CP2 OUT OUT* NC CP1 IN VGG VDD CP2 OUT1 OUT2 --='30' number_pos='0' centre_name='0HŸ -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 ||ъX˜А& -10 -10 0 400 0 0 0 ˜А& -10 -10 -10 0 400 0 0 0 0 Arial 000000 1 -1$ X–Q­& -10 0 400 0 0 0 •a ЋF -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 CP1 IN VGG VDD CP2 OUT1 OUT2 --’HŸ -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 2 3 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND CP1 IN VGG VDD CP2 OUT1 OUT2  ‚‚Мі>xВдHHHHHHHHооо–Q­&CP1 IN VGG VDD CP2 OUT1 OUT2 on='2' part='0' number='2' show='3' length='21' number_pos='0' centre_name='0'> - + ength='20' number_pos='0' centre_name='0'>CP1 IN VGG VDD CP2 OUT1 OUT2 DD’–Q­& -10 0 400 0 0 0 0 Arial 1(šf -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND - + DD2˜А& -10 -10 0 400 0 1+šf -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND xВдHjЄоBBBBB8i$$SPICE_PROLOG_PRIORITY5šТ)!PackageDIP14jti$$SPICE_EPILOG_PRIORITY5j:i$$SPICE_PROLOG_PRIORITY•cЋJ -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 DD>xВjЄооооBBBBBBBBLti $$SPICE_EPILOG_PRIORITY5L:i $$SPICE_PROLOG_PRIORITY5 $)! PackageDIP148#i $$SPICE_EPILOG_PRIORITY58"i $$SPICE_PROLOG_PRIORI1,šf -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND 0 400 0 0 0 0 Arial 000000 1 -1 000000 % 000000 рh•cЋJ -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 DD='3' length='20' number_pos='0' centre_name='0'> -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 CP1 OX3 VGG VDD CP2 OX1 OX2 EE='3' length='20' number_pos='0' centre_name='0'> -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND CP1 OX3 VGG VDD CP2 OX1 OX2 /ion='2' part='0' number='2' show='3' length='20' number_pos='0' centre_name='0'> •bЋH -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 _SCLR _SLOAD -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND CP1 IN VGG VDD CP2 OUT1 OUT2 ’’T­ -10 œqЙf -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 ength='20' number_pos='0' centre_name='0'>CP1 IN VGG VDD CP2 OUT1 OUT2 DDU”””””1"šf -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND CP1 IN VGG VDD CP2 OUT1 OUT2 8elec='0' direction='3' part='0' number='1' show='2' length='20' number_pos='0' centre_name='0'> DD1 šf -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND CP1 IN VGG VDD CP2 OUT1 OUT2 DD000,39.00000' which='0' elec='0' direction='3' part='0' number='10' show='3' length='20' number_pos='0' centre_name='0'>B C -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND -10 DЌn -10 0 400 0 0 0 0 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 E?n='2' part='0' number='2' show='3' length='21' number_pos='0' centre_name='0'> - + ='10' show='2' length='20' number_pos='0' centre_name='0'> -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 CLOCK Vdd D Vss RESET SET Q Q* CLOCK D RESET SET Q Q* DDnumber_pos='0' centre_name='0'> -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND CP1 IN VGG VDD CP2 OUT1 OUT2 F In='2' part='0' number='2' show='3' length='21' number_pos='0' centre_name='0'> - + length='20' number_pos='0' centre_name='0'>CP1 OX3 VGG VDD CP2 OX1 OX2 EE='2' length='20' number_pos='0' centre_name='0'> -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND -10 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 400 0 0 0 0 Arial 000000 1 -1 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND CP1 IN VGG VDD CP2 OUT1 OUT2 DDr='8' show='2' length='20' number_pos='0' centre_name='0'> -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND GND VCC BIN AIN _CLR Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 CLK ength='20' number_pos='0' centre_name='0'>CP1 IN VGG VDD CP2 OUT1 OUT2 T_pos='0' centre_name='0'>GND VCC Ctc Rtc Q/-Q SELECT Rs Q1 Q2 MASTER RESET MODE NC A B Q ХХ”,Ј\ -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 - + •cЋJ -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND CP1 IN VGG VDD CP2 OUT1 OUT2 DD1.šf -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND CP1 IN VGG VDD CP2 OUT1 OUT2 ` …imgjcfJ,beh+M_a\dc='4' direction='3' part='0' number='3' show='3' length='20' number_pos='0' centre_name='0'>IN VGG VDD CP2 OUT1 OUT2 •c6ЋJ -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 CP1 IN VGG VDD CP2 OUT1 OUT2 DD10šf -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND i$$SPICE_EPILOG_PRIORITY5?)PackageDIP88@i$$SPICE_PROLOG_PRIORITY58Ai$$SPICE_EPILOG_PRIORITY5 B)!PackageDIP168Ci$$SPICE_PROLOG_PRIORITY58Di$$SPICE_EPIL K)!PackageDIP148Ji$$SPICE_EPILOG_PRIORITY58Ii$$SPICE_PROLOG_PRIORITY5ength='20' number_pos='0' centre_name='0'>CP1 IN VGG VDD CP2 OUT1 OUT2 •c6ЋJ -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 CP1 IN VGG VDD CP2 OUT1 OUT2 DD13šf -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND CP1 IN VGG VDD CP2 OUT1 OUT2 •c6ЋJ -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 CP1 IN VGG VDD CP2 OUT1 OUT2 •c6ЋJ -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 - + •c6ЋJ -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 - + ZZ•7Њ2 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 - + ZZ•8Њ2 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 - + ZZ•9Њ2 -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 - + •c:ЋJ -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 - + •c;ЋJ -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 CP1 IN VBB VDD CP2 OUT OUT* NC NC NC GND CP1 IN VBB VDD CP2 OUT OUT* NC NC NC CC*=КX -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 GND NC NC CP1 IN CP2 OUT OUT* ввS­ -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 CLOCK VDD D VSS RESET SET Q Q* CLOCK D RESET SET Q Q* вв”?ЈB -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 . */ #pragma once #include class MainWindow; class Ui_InfoDialog; class InfoDialog : public QWidget { Q_OBJECT public: explicit InfoDialog(QWidget* parent = nullptr); ~InfoDialog(); void SetMainWindow(MainWindow* p); void Update(); bool GetIsModified(); public slots: void TextChanged(); void SetReadOnly(bool b); void ShowButtons(bool b); void EnablePrev(bool b); void EnableNext(bool b); protected: void keyPressEvent(QKeyEvent* event); void keyReleaseEvent(QKeyEvent* event); private: Ui_InfoDialog* ui; MainWindow* m_pMainWindow; std::string m_initialStr; // Set by Update() when we do a New, Open, Save, SaveAs, Undo, Redo, etc }; VeroRoute/Src/Board.h000644 001750 001750 00000124074 14561534336 014705 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include "CompDefiner.h" #include "TemplateManager.h" #include "NodeInfoManager.h" #include "GroupManager.h" #include "ColorManager.h" #include "TextManager.h" #include "ConnectionMatrix.h" #include #define SMART_PAN_CAN_AUTOCROP true class MyScrollArea; // Board is the main algorithm class. // Just about everything apart from the GUI rendering code is in here. // Holds a description of the circuit and handles all manipulation & routing. class Board : public ElementGrid, public GuiControl { public: Board(int lyrs = 1, int rows = 35, int cols = 35) : ElementGrid() , GuiControl() , m_infoStr("Use this box to enter a circuit description or other info") , m_tmpVecSize(0) , m_bRouteMinimal(true) , m_bHasVias(false) { Allocate(lyrs, rows, cols); GlueNbrs(); // Set pointers between neighbouring grid elements } virtual ~Board() override {} Board(const Board& o, bool bFullCopy = true) : ElementGrid() , GuiControl() { PartialCopy(o); if ( bFullCopy ) RebuildAdjacencies(); // Slow } Board& operator=(const Board& o) { Clear(); PartialCopy(o); RebuildAdjacencies(); // Slow return *this; } Board& PartialCopy(const Board& o) // Copies everything but omits RebuildAdjacencies() { m_infoStr = o.m_infoStr; ElementGrid::operator=(o); // Call operator= in base class GuiControl::operator=(o); // Call operator= in base class GlueNbrs(); // Set pointers between neighbouring grid elements // Need all component locations before calling GlueWires() m_compMgr = o.m_compMgr; for (const auto& mapObj : m_compMgr.GetMapIdToComp()) { const Component& comp = mapObj.second; m_nodeInfoMgr.AddComp(comp); } GlueWires(); // Set pointers between wired grid elements //m_nodeInfoMgr = o.m_nodeInfoMgr; // Don't copy! This manager is populated via the above calls to AddComp() //m_adjInfoMgr = o.m_adjInfoMgr; // Don't copy! This manager is populated via the above calls to AddComp() m_groupMgr = o.m_groupMgr; m_rectMgr = o.m_rectMgr; m_textMgr = o.m_textMgr; m_colorMgr = o.m_colorMgr; m_compDefiner = o.m_compDefiner; // Routing algorithm variables are cleared, not copied m_targetPins.clear(); m_growingRoutes.clear(); m_tmpVec.clear(); m_tmpVecSize = 0; m_bRouteMinimal = true; m_bHasVias = false; m_bHavePlacedWires = false; return *this; } bool operator==(const Board& o) const // Compare persisted info { if ( m_infoStr != o.m_infoStr ) return false; if ( GuiControl::operator!=(o) ) return false; if ( ElementGrid::operator!=(o) ) return false; return m_compMgr == o.m_compMgr && m_groupMgr == o.m_groupMgr && m_rectMgr == o.m_rectMgr && m_textMgr == o.m_textMgr && m_compDefiner == o.m_compDefiner && m_colorMgr == o.m_colorMgr; } bool operator!=(const Board& o) const { return !(*this == o); } void Clear() { Allocate(GetLyrs(), GetRows(), GetCols()); GlueNbrs(); // Set pointers between neighbouring grid elements SetInfoStr("Use this box to enter a circuit description or other info"); m_compMgr.Clear(); m_targetPins.clear(); m_growingRoutes.clear(); m_tmpVec.clear(); m_nodeInfoMgr.DeAllocate(); m_adjInfoMgr.DeAllocate(); m_groupMgr.Clear(); m_rectMgr.Clear(); m_textMgr.Clear(); m_compDefiner.Clear(); m_colorMgr.Clear(); GuiControl::Clear(); // Clear() base class } void Reset() // For use with File->New() { Clear(); if ( GetLyrs() == 2 ) GrowThenPan(-1, 0, 0, 0, 0); // Give new board a single layer GuiControl::Reset(); } void GlueNbrs() // Set pointers between neighbouring grid elements { for (int iLyr = 0, iLyrs = GetLyrs(); iLyr < iLyrs; iLyr++) for (int iRow = 0, iRows = GetRows(); iRow < iRows; iRow++) { const int iT(iRow-1), iB(iRow+1); for (int iCol = 0, iCols = GetCols(); iCol < iCols; iCol++) { const int iL(iCol-1), iR(iCol+1); Element* p = Get(iLyr, iRow, iCol); p->SetNbr(NBR_L, Get(iLyr, iRow, iL)); p->SetNbr(NBR_LT, Get(iLyr, iT, iL)); p->SetNbr(NBR_T, Get(iLyr, iT, iCol)); p->SetNbr(NBR_RT, Get(iLyr, iT, iR)); p->SetNbr(NBR_R, Get(iLyr, iRow, iR)); p->SetNbr(NBR_RB, Get(iLyr, iB, iR)); p->SetNbr(NBR_B, Get(iLyr, iB, iCol)); p->SetNbr(NBR_LB, Get(iLyr, iB, iL)); p->SetNbr(NBR_X, iLyrs == 1 ? nullptr : Get((iLyr + 1 ) % 2, iRow, iCol) ); p->ClearWires(); // Wires must be set by GlueWires() // Prevent toroidal routing at board edges int okDirs = CODEBITS_ALL; // All neighbour directions OK by default if ( iRow == 0 ) { ClearCodeBit(NBR_LT, okDirs); ClearCodeBit(NBR_T, okDirs); ClearCodeBit(NBR_RT, okDirs); } if ( iRow == GetRows()-1 ) { ClearCodeBit(NBR_LB, okDirs); ClearCodeBit(NBR_B, okDirs); ClearCodeBit(NBR_RB, okDirs); } if ( iCol == 0 ) { ClearCodeBit(NBR_LT, okDirs); ClearCodeBit(NBR_L, okDirs); ClearCodeBit(NBR_LB, okDirs); } if ( iCol == GetCols()-1 ) { ClearCodeBit(NBR_RT, okDirs); ClearCodeBit(NBR_R, okDirs); ClearCodeBit(NBR_RB, okDirs); } p->SetRoutable(okDirs); } } } int GetSlotForTH(const Element* p) const { for (int iSlot = 0; iSlot < 2; iSlot++) { const int compId = p->GetSlotCompId(iSlot); if ( compId == BAD_COMPID ) continue; if ( !m_compMgr.GetComponentById(compId).GetIsSOIC() ) return iSlot; } assert(0); // Should never get here return 0; } int GetSlotForSOIC(const Element* p) const { for (int iSlot = 0; iSlot < 2; iSlot++) { const int compId = p->GetSlotCompId(iSlot); if ( compId == BAD_COMPID ) continue; if ( m_compMgr.GetComponentById(compId).GetIsSOIC() ) return iSlot; } assert(0); // Should never get here return 0; } void GetSlotInfoForTH(const Element* p, size_t& pinIndex, int& compId) const { const int iSlot = GetSlotForTH(p); p->GetSlotInfo(iSlot, pinIndex, compId); } void GetSlotInfoForSOIC(const Element* p, size_t& pinIndex, int& compId) const { const int iSlot = GetSlotForSOIC(p); p->GetSlotInfo(iSlot, pinIndex, compId); } bool GetPadOffsets(const Element* p, int& padOffsetX, int& padOffsetY) const { if ( !p->GetPinSupportsOffsetPads() ) return false; size_t pinIndex; int compId; GetSlotInfoForTH(p, pinIndex, compId); const Component& comp = m_compMgr.GetComponentById( compId ); comp.GetCompPinOffsets(pinIndex, padOffsetX, padOffsetY); // Get offsets in mil return true; } void ResetPinLayerPrefs(bool bAutoSet) { assert( GetLyrs() == 2 ); size_t pinIndex; int compId; for (int i = 0, iSize = GetSize() / 2; i < iSize; i++) // Use layer 0 only for TH pins { Element* p = GetAt(i); if ( !p->GetPinSupportsLayerPref() ) continue; GetSlotInfoForTH(p, pinIndex, compId); Component& comp = m_compMgr.GetComponentById(compId); comp.SetLayerPref(pinIndex, LAYER_X); } if ( !bAutoSet ) return; const DIAGSMODE diagsModeOld = GetDiagsMode(); // Note current diagonals mode if ( diagsModeOld == DIAGSMODE::MAX ) SetDiagsMode(DIAGSMODE::MIN); // Use DIAGSMODE::MIN instead of DIAGSMODE::MAX for the algorithm below while(true) // Try to choose layer for pins that have the default LAYER_X setting { size_t nChanged(0); // Counts the number of LAYER_X pins changed for (int i = 0, iSize = GetSize() / 2; i < iSize; i++) // Use layer 0 only for TH pins { Element* p = GetAt(i); // Bottom layer point if ( !p->GetPinSupportsLayerPref() ) continue; GetSlotInfoForTH(p, pinIndex, compId); Component& comp = m_compMgr.GetComponentById(compId); if ( comp.GetLayerPref(pinIndex) != LAYER_X ) continue; // Skip if not LAYER_X Element* q = p->GetNbr(NBR_X); assert(q); // Top layer point const int nodeId = p->GetNodeId(); assert(nodeId == q->GetNodeId()); const int codeBot = GetPerimeterCode(p); const int codeTop = GetPerimeterCode(q); const bool bGndBot = GetGroundFill() && nodeId == GetGroundNodeId0(); const bool bGndTop = GetGroundFill() && nodeId == GetGroundNodeId1(); const bool bHaveTrackBot = bGndBot || ( codeBot > 0 ); const bool bHaveTrackTop = bGndTop || ( codeTop > 0 ); if ( !bHaveTrackBot && !bHaveTrackTop ) continue; if ( bHaveTrackBot != bHaveTrackTop ) { comp.SetLayerPref(pinIndex, bHaveTrackBot ? LAYER_B : LAYER_T); nChanged++; continue; } assert(bHaveTrackBot && bHaveTrackTop); if ( bGndBot || bGndTop ) continue; // At this point, we have simple tracks on top and bottom (no ground fill connections), // so try to determine layer preference based on the numbers of track directions on the two layers. int countTop(0), countBot(0); for (int iNbr = 0; iNbr < NBR_X; iNbr++) // Loop directions in a layer { if ( ReadCodeBit(iNbr, codeBot) ) countBot++; if ( ReadCodeBit(iNbr, codeTop) ) countTop++; } if ( countTop != countBot ) { comp.SetLayerPref(pinIndex, ( countBot > countTop ) ? LAYER_B : LAYER_T); nChanged++; continue; } } if ( nChanged == 0 ) break; } SetDiagsMode(diagsModeOld); // Restore diagonals mode } bool ToggleLyrPref(int iLyr, int iRow, int iCol) { Element* p = Get(iLyr, iRow, iCol); if ( !p->GetPinSupportsLayerPref() ) return false; size_t pinIndex; int compId; GetSlotInfoForTH(p, pinIndex, compId); Component& comp = m_compMgr.GetComponentById(compId); switch( comp.GetLayerPref(pinIndex) ) { case LAYER_X: comp.SetLayerPref(pinIndex, ( GetCurrentLayer() == 0 ) ? LAYER_B : LAYER_T); break; case LAYER_B: comp.SetLayerPref(pinIndex, ( GetCurrentLayer() == 0 ) ? LAYER_T : LAYER_X); break; case LAYER_T: comp.SetLayerPref(pinIndex, ( GetCurrentLayer() == 0 ) ? LAYER_X : LAYER_B); break; } return true; } int GetLayerPref(const Element* p) const { assert( GetLyrs() == 2 && p && p->GetPinSupportsLayerPref() ); size_t pinIndex; int compId; GetSlotInfoForTH(p, pinIndex, compId); return m_compMgr.GetComponentById(compId).GetLayerPref(pinIndex); } int GetPerimeterCode(const Element* p) const // Helper for the GUI "blobs" { const bool bDiagsOK = GetDiagsMode() != DIAGSMODE::OFF; const bool bMinDiags = GetDiagsMode() == DIAGSMODE::MIN; const bool bBottomLayer = p->GetIsBotLyr(); const bool bSOIC = p->GetHasPinSOIC() && !bBottomLayer; // Get track perimeter code on this layer (without any layer preferences) int iCode = p->GetPerimeterCode(bDiagsOK, bMinDiags); // 0 to 255 if ( GetLyrs() == 2 && p->GetPinSupportsLayerPref() ) { // For a 2-layer board, modify the track perimeter code on this layer to account for pin layer preferences // Only true components (not wires) can have a pin layer preference. // Get track perimeter code on other layer (without any layer preferences) // Use "false" instead of "bMinDiags" because we are interested in the local // connectivity in the other layer rather than its displayed track pattern. const int iCodeOther = p->GetNbr(NBR_X)->GetPerimeterCode(bDiagsOK, false); // 0 to 255 const int iLayerPrefP = GetLayerPref(p); for (int iNbr = 0; iNbr < 8; iNbr ++) // Loop nbrs in layer { // Only directions that are used in BOTH layers can be affected by layer preference if ( !ReadCodeBit(iNbr, iCode) || !ReadCodeBit(iNbr, iCodeOther) ) continue; const Element* q = p->GetNbr(iNbr); if ( !q->GetPinSupportsLayerPref() ) continue; const int iLayerPrefQ = GetLayerPref(q); const bool bOK = ( iLayerPrefP == LAYER_X && iLayerPrefQ == LAYER_X ) || ( bBottomLayer ? ( iLayerPrefP == LAYER_B || iLayerPrefQ == LAYER_B ) : ( iLayerPrefP == LAYER_T || iLayerPrefQ == LAYER_T ) ); if ( !bOK ) ClearCodeBit(iNbr, iCode); } } const bool bForceXthermals = GetXthermals() && ( p->GetHasPinTH() || bSOIC ); if ( bForceXthermals && (GetTrackMode() == TRACKMODE::PCB || GetTrackMode() == TRACKMODE::MONO ) && GetGroundFill() && GetGroundNodeId(bBottomLayer ? 0 : 1) == p->GetNodeId() ) return 0; return iCode; } int GetTagCode(const Element* p, int iPerimeterCode) const // Helper for the GUI "blobs" { const int& iNodeId = p->GetNodeId(); const bool bBottomLayer = p->GetIsBotLyr(); const int iLayerPrefP = ( GetLyrs() == 1 || !p->GetPinSupportsLayerPref() ) ? LAYER_X : GetLayerPref(p); const bool bSOIC = p->GetHasPinSOIC() && !bBottomLayer; #ifdef _DEBUG const bool& bVero = GetVeroTracks(); const bool bMonoPCB = GetTrackMode() == TRACKMODE::MONO || GetTrackMode() == TRACKMODE::PCB; const bool bGroundFill = !bVero && bMonoPCB && GetGroundFill(); const int& iGndNodeId = GetGroundNodeId(bBottomLayer ? 0 : 1); assert(bGroundFill && p->GetHasPinTH() && iNodeId == iGndNodeId && iNodeId != BAD_NODEID); #endif if ( GetXthermals() && GetLyrs() == 1 && !bSOIC ) return CODEBITS_DIAGS; int iCandidateTagBits(0); for (int iNbr = 0; iNbr < 8; iNbr ++) // Loop nbrs in layer { const Element* q = p->GetNbr(iNbr); const int iNbrNodeId = q->GetNodeId(); const bool bDiag = ( iNbr % 2 ) == 1; if ( ReadCodeBit(iNbr , iPerimeterCode) ) continue; // Skip if direction already has connection if ( ReadCodeBit((iNbr+1)%8 , iPerimeterCode) ) continue; // Skip if adjacent CW direction already has connection if ( ReadCodeBit((iNbr+7)%8, iPerimeterCode) ) continue; // Skip if adjacent CCW direction already has connection if ( ( q->GetHasPinTH() || iNbrNodeId != BAD_NODEID ) && iNbrNodeId != iNodeId ) continue; // Skip if direction is not empty, or has wrong NodeID if ( bDiag ) // Extra check for diagonal reliefs. Needed because wide diagonal reliefs can get close to pads in the H/V directions { const Element* qPrev = p->GetNbr((iNbr+7)%8); const int iNbrPrevNodeId = qPrev->GetNodeId(); if ( ( qPrev->GetHasPinTH() || iNbrPrevNodeId != BAD_NODEID ) && iNbrPrevNodeId != iNodeId ) continue; // Skip if prev direction is not empty, or has wrong NodeID const Element* qNext = p->GetNbr((iNbr+1)%8); const int iNbrNextNodeId = qNext->GetNodeId(); if ( ( qNext->GetHasPinTH() || iNbrNextNodeId != BAD_NODEID ) && iNbrNextNodeId != iNodeId ) continue; // Skip if next direction is not empty, or has wrong NodeID } if ( p->IsBlocked(iNbr, iNodeId) ) continue; // Skip if direction is blocked const int iLayerPrefQ = ( GetLyrs() == 1 || !q->GetPinSupportsLayerPref() ) ? LAYER_X : GetLayerPref(q); const bool bOK = ( iLayerPrefP == LAYER_X && iLayerPrefQ == LAYER_X ) || ( bBottomLayer ? ( iLayerPrefP == LAYER_B || iLayerPrefQ == LAYER_B ) : ( iLayerPrefP == LAYER_T || iLayerPrefQ == LAYER_T ) ); if ( bOK ) SetCodeBit(iNbr, iCandidateTagBits); // Update iCandidateTagBits } int theDiags = CODEBITS_DIAGS; // Default "theDiags" to X pattern const bool bForceXthermals = GetXthermals() && ( p->GetHasPinTH() || bSOIC ); if ( bForceXthermals && bSOIC ) // SOICs can't use the full X pattern for "theDiags" { theDiags = 0; // Clear "theDiags" if ( iLayerPrefP == LAYER_X || iLayerPrefP == LAYER_T ) { for (int iNbr = 1; iNbr < 8; iNbr += 2) // Loop diagonal nbrs { const Element* pNbr = p->GetNbr(iNbr); // Use a subset of the checks in Element::IsBlocked()... if ( pNbr->GetSoicProtected() ) continue; // Block connections to SOIC area bool bProtected(false); switch( iNbr ) // Block diagonals crossing the SOIC area { case NBR_LT: bProtected = ( p->GetNbr(NBR_L)->GetSoicProtected() || p->GetNbr(NBR_T)->GetSoicProtected() ); break; case NBR_RT: bProtected = ( p->GetNbr(NBR_R)->GetSoicProtected() || p->GetNbr(NBR_T)->GetSoicProtected() ); break; case NBR_LB: bProtected = ( p->GetNbr(NBR_L)->GetSoicProtected() || p->GetNbr(NBR_B)->GetSoicProtected() ); break; case NBR_RB: bProtected = ( p->GetNbr(NBR_R)->GetSoicProtected() || p->GetNbr(NBR_B)->GetSoicProtected() ); break; } if ( bProtected ) continue; SetCodeBit(iNbr, theDiags); // Update "theDiags" } } } if ( iCandidateTagBits == 0 ) { if ( bForceXthermals && !bSOIC && ( ( iLayerPrefP == LAYER_X ) || ( iLayerPrefP == ( bBottomLayer ? LAYER_B : LAYER_T ) ) ) ) return theDiags; // If forcing X-thermals and we have no connections in the layer, rely on layer preference alone else if ( bForceXthermals && bSOIC ) return theDiags; else return 0; // No candidate tags, so we're done } if ( bForceXthermals ) return theDiags; if ( iCandidateTagBits == CODEBITS_LYR ) return theDiags; // All tags are allowed, so just use the 4 diagonals // Select a subset of the iCandidateTagBits int iBlank(0); // Find position of first blank bit in iCandidateTagBits for (; iBlank < 8; iBlank++) if ( !ReadCodeBit(iBlank, iCandidateTagBits) ) break; int iTagBits(0); // The chosen subset of iCandidateTagBits bool bIsBlankCCW(true); for (int i = 1; i < 9; i++) { const int iNbr = (i + iBlank) % 8; if ( bIsBlankCCW && ReadCodeBit(iNbr, iCandidateTagBits) ) // If bit is set, and preceeding bit is blank { SetCodeBit(iNbr, iTagBits); bIsBlankCCW = false; } else bIsBlankCCW = true; } return iTagBits; } void GlueWires() // Set pointers between wired grid elements { for (const auto& mapObj : m_compMgr.GetMapIdToComp()) // Iterate components { const int& compId = mapObj.first; const Component& comp = mapObj.second; if ( comp.GetType() == COMP::WIRE && comp.GetIsPlaced() ) { const int& lyr = comp.GetLyr(); assert( lyr == 0 ); const int& rowA = comp.GetRow(); const int& colA = comp.GetCol(); const int rowB = comp.GetLastRow(); const int colB = comp.GetLastCol(); Element* pA = Get(lyr, rowA, colA); assert( pA->GetNumWires() < 2 ); Element* pB = Get(lyr, rowB, colB); assert( pB->GetNumWires() < 2 ); assert( pA->GetNumCompIds() > 0 && pA->GetNumCompIds() < 3 ); assert( pB->GetNumCompIds() > 0 && pB->GetNumCompIds() < 3 ); assert( pB->GetNodeId() == pA->GetNodeId() ); // Wire ends must have same NodeId const int iSlotA = pA->GetSlotFromCompId(compId); assert(iSlotA != -1); const int iSlotB = pB->GetSlotFromCompId(compId); assert(iSlotB != -1); pA->SetW( iSlotA, pB ); // Give pA a pointer to pB pB->SetW( iSlotB, pA ); // Give pB a pointer to pA } } } bool Pan(int iDown, int iRight) // Pan whole circuit w.r.t. the grid. This can grow the grid but never shrink it { if ( iDown == 0 && iRight == 0 ) return false; int incRows(0), incCols(0); // What we need to grow the grid by if we move too far int minRow, minCol, maxRow, maxCol; const bool bOK = GetBounds(minRow, minCol, maxRow, maxCol); // Get the circuit bounds if ( !bOK ) return false; // Can't move an empty circuit if ( minRow + iDown < 0 ) // Too far up ... { incRows = -(minRow + iDown); // ... so grow grid from bottom iDown = -minRow; // ... and pan to very top } else if ( maxRow + iDown >= GetRows() ) // Too far down ... incRows = 1 + maxRow + iDown - GetRows(); // ...so grow grid from bottom if ( minCol + iRight < 0 ) // Too far left ... { incCols = -(minCol + iRight); // ... so grow grid from right iRight = -minCol; // ... and pan to very left } else if ( maxCol + iRight >= GetCols() ) // Too far right ... incCols = 1 + maxCol + iRight - GetCols(); // ... so grow grid from right GrowThenPan(0, incRows, incCols, iDown, iRight); return true; } void SmartPan(int iDown, int iRight) // Pan whole circuit w.r.t. the grid, and grow/shrink grid as needed { if ( iDown == 0 && iRight == 0 ) return; int incRows(0), incCols(0); // What we need to grow the grid by if we pan too far int minRow, minCol, maxRow, maxCol; const bool bOK = GetBounds(minRow, minCol, maxRow, maxCol); // Get the circuit bounds if ( !bOK ) // Have empty board, so there is nothing to pan. Just grow or shrink instead. { if ( iDown < 0 && GetRows() > 1 ) incRows--; if ( iDown > 0 ) incRows++; if ( iRight < 0 && GetCols() > 1 ) incCols--; if ( iRight > 0 ) incCols++; return GrowThenPan(0, incRows, incCols, 0, 0); } if ( minRow + iDown < 0 ) // Too far up ... { if ( SMART_PAN_CAN_AUTOCROP ) incRows = std::min(0, maxRow + 1 - GetRows()); // ... so shrink grid from bottom //else // incRows = -(minRow + iDown); // ... so grow grid from bottom iDown = -minRow; // ... and pan to very top } else if ( maxRow + iDown >= GetRows() ) // Too far down ... incRows = 1 + maxRow + iDown - GetRows(); // ...so grow grid from bottom if ( minCol + iRight < 0 ) // Too far left ... { if ( SMART_PAN_CAN_AUTOCROP ) incCols = std::min(0, maxCol + 1 - GetCols()); // ... so shrink grid from right //else // incCols = -(minCol + iRight); // ... so grow grid from right iRight = -minCol; // ... and pan to very left } else if ( maxCol + iRight >= GetCols() ) // Too far right ... incCols = 1 + maxCol + iRight - GetCols(); // ... so grow grid from right GrowThenPan(0, incRows, incCols, iDown, iRight); } bool Crop(int iRowMargin = -1, int iColMargin = -1) // Moves whole circuit to the top-left, then crops the grid from the bottom-right, then adds margin { int minRow, minCol, maxRow, maxCol; const bool bOK = GetBounds(minRow, minCol, maxRow, maxCol); // Get the circuit bounds if ( !bOK ) return false; Pan(-minRow, -minCol); // First pan to top-left corner of grid GrowThenPan(0, maxRow - minRow + 1 - GetRows(), maxCol - minCol + 1 - GetCols(), 0, 0); // Then shrink grid from bottom-right if ( iRowMargin == -1 ) iRowMargin = GetCropMargin(); // -1 ==> use default if ( iColMargin == -1 ) iColMargin = GetCropMargin(); // -1 ==> use defaul if ( iRowMargin > 0 || iColMargin > 0 ) { const int incRows = 2 * iRowMargin; const int incCols = 2 * iColMargin; GrowThenPan(0, incRows, incCols, iRowMargin, iColMargin); } return true; } void GrowThenPan(int incLyrs, int incRows, int incCols, int iDown, int iRight) { ElementGrid::Grow(incLyrs, incRows, incCols); // Grow the base class ElementGrid::Pan(iDown, iRight); // Pan the base class GlueNbrs(); // Set pointers between neighbouring grid elements // Need all component locations before calling GlueWires() for (auto& mapObj : m_compMgr.m_mapIdToComp) { Component& comp = mapObj.second; int newRow = comp.GetRow() + iDown; int newCol = comp.GetCol() + iRight; MakeToroid(newRow, newCol); // Make co-ordinates wrap around at grid edges comp.SetRow(newRow); comp.SetCol(newCol); } Component& trax = m_compMgr.GetTrax(); if ( trax.GetSize() > 0 ) // If have a trax pattern { int newRow = trax.GetRow() + iDown; int newCol = trax.GetCol() + iRight; MakeToroid(newRow, newCol); // Make co-ordinates wrap around at grid edges trax.SetRow(newRow); trax.SetCol(newCol); } GlueWires(); // Set pointers between wired grid elements // Move all user-defined rectangles m_rectMgr.MoveAll(iDown, iRight); // Move all user-defined text m_textMgr.MoveAll(iDown, iRight); if ( incLyrs > 0 ) // If we added a layer ... { // ... do TakeOff() and PutDown() for all placed parts // ... so new layer is set correctly for (auto& mapObj : m_compMgr.m_mapIdToComp) { Component& comp = mapObj.second; if ( !comp.GetIsPlaced() ) continue; TakeOff(comp); PutDown(comp); } } // Move any warning points for (auto& o : m_warnPoints[0]) o += QPointF(iRight, iDown); for (auto& o : m_warnPoints[1]) o += QPointF(iRight, iDown); } void WipeSoicAreas() { const int numLyrs( GetLyrs() ), numRows( GetRows() ), numCols( GetCols() ); for (int k = 0; k < numLyrs; k++) for (int j = 0; j < numRows; j++) for (int i = 0; i < numCols; i++) { Element* p = Get(k,j,i); if ( p->GetSoicProtected() ) SetNodeIdByUser(k, j, i, BAD_NODEID, false); } } bool GetBounds(int& minRow, int& minCol, int& maxRow, int& maxCol) const { bool bOK(false); // First consider all painted nodeIds on the board const int numLyrs( GetLyrs() ), numRows( GetRows() ), numCols( GetCols() ); minRow = numRows - 1; maxRow = 0; // Start with min and max at the wrong ends minCol = numCols - 1; maxCol = 0; // Start with min and max at the wrong ends for (int k = 0; k < numLyrs; k++) for (int j = 0; j < numRows; j++) for (int i = 0; i < numCols; i++) { if ( Get(k,j,i)->GetNodeId() == BAD_NODEID && !Get(k,j,i)->GetLyrHasPin() ) continue; minRow = std::min(minRow, j); maxRow = std::max(maxRow, j); minCol = std::min(minCol, i); maxCol = std::max(maxCol, i); bOK = true; } if ( !m_compMgr.GetIsEmpty() ) { const Rect rect = m_compMgr.GetBounding(); minRow = std::min(minRow, rect.m_rowMin); maxRow = std::max(maxRow, rect.m_rowMax); minCol = std::min(minCol, rect.m_colMin); maxCol = std::max(maxCol, rect.m_colMax); bOK = true; } const Rect rect = m_textMgr.GetBounding(); if ( rect.GetIsValid() ) { minRow = std::min(minRow, rect.m_rowMin); maxRow = std::max(maxRow, rect.m_rowMax); minCol = std::min(minCol, rect.m_colMin); maxCol = std::max(maxCol, rect.m_colMax); bOK = true; } return bOK; } void RebuildAdjacencies() { m_adjInfoMgr.DeAllocate(); for (int i = 0, iSize = GetSize(); i < iSize; i++) m_adjInfoMgr.InitCounts( GetAt(i) ); } const Component& GetUserComponent() const { assert( m_groupMgr.GetNumUserComps() == 1 ); // Should only have one component selected const Component& comp = m_compMgr.GetComponentById( m_groupMgr.GetUserCompId() ); assert( comp.GetType() != COMP::INVALID ); return comp; } Component& GetUserComponent() // The currently selected component { assert( m_groupMgr.GetNumUserComps() == 1 ); // Should only have one component selected Component& comp = m_compMgr.GetComponentById( m_groupMgr.GetUserCompId() ); assert( comp.GetType() != COMP::INVALID ); return comp; } // Methods to get objects at a grid location int GetComponentId(int row, int col); // Pick the most relevant component at the location int GetTextId(int row, int col); // Pick the most relevant text box at the location // Methods to handle variable pad/hole and PCB tolerances void GetPadWidths_MIL(std::list& o, int& iDefaultWidth) const; void GetHoleWidths_MIL(std::list& o, int& iDefaultWidth) const; void GetSeparations(double& minTrackSeparation_mil, double& minGroundFill_mil); void CalcMIN_SEPARATION(); // Sets m_dMinSeparation and m_warnPoints[] void CalcGroundFillBounds(); void GetGroundFillBounds(int& L, int& R, int& T, int& B) const; // Methods to paint/unpaint nodeIds void SetNodeId(Element* p, int nodeId, bool bAllLyrs); // Helper to make sure we do UpdateCounts() before painting an element void WipeFlagBits(Element* p, char i, bool bAllLyrs); void MarkFlagBits(Element* p, char i, bool bAllLyrs); bool SetNodeIdByUser(int lyr, int row, int col, int nodeId, bool bPaintPins); void FloodNodeId(int nodeId); void AutoFillVero(); void CalcSolder(); // Work out locations of solder blobs to join veroboard tracks together void SetSolder(int nodeId, int col, bool bVertical); // Routing methods void WipeAutoSetPoints() { WipeAutoSetPoints(BAD_NODEID, true); } void WipeAutoSetPoints(int nodeId, bool bHavePlacedWires); void BuildTargetPins(int nodeId); void Route(bool bMinimal); void UpdateVias(); const bool& GetHasVias() const { return m_bHasVias; } unsigned int Flood(int nodeId); unsigned int Flood(bool bSingleRoute = false); void Flood_Helper(bool bBuildTracks); void Flood_Grow(int iFloodNodeId, Element* const pJ, int iNbr, bool bBuildTracks, unsigned int& iMH, unsigned int& iMaxMH, bool& bDone); Element* Backtrace(Element* const pEnd, int nodeId); void BacktracePaint(Element* const p, int nodeId, bool bAllLyrs, bool bWire); void BacktraceErase(Element* const p); bool BacktraceHelper(Element*& p, unsigned int& MH, int nodeId, unsigned int iDeltaMH, int iNbr, int iLoop); void Manhatten(Element* p, bool bSingleRoute); Element* GetConnPin(); unsigned int GetConnRID() const; void CheckAllComplete(); void PasteTracks(bool bTidy); void WipeTracks(); // Methods for component creation/destruction void DestroyComponent(Component& comp); // Destroys a component on the board int CreateComponent(int iRow, int iCol, COMP eType, const Component* pComp = nullptr); int AddComponent(int iRow, int iCol, const Component& tmp, bool bDoPlace = true); void AddTextBox(int iRow, int iCol); // Methods for component placement/removal bool CanPutDown(Component& comp); // Checks if its possible to place the (floating) component on the board bool PutDown(Component& comp); // Tries to place the (floating) component on the board bool TakeOff(Component& comp); void FloatAllComps(); // Float all components (i.e. take them off the board) void FloatAllCompsSOIC(); // Float all SOIC components (i.e. take them off the board) void PlaceFloaters(); // Try to place down all the floating components void FixCorruption(); // GUI helpers for manipulating user-selected components void SelectAllComps(bool bRestrictToRects); bool ConfirmDestroyUserComps(); // returns false if user-group is empty or has only wires and markers void DestroyUserComps(); // Destroy components in the user-group void MoveUserCompText(int deltaRow, int deltaCol); // Move text label void StretchUserComp(bool bGrow); // Stretch the selected component length void StretchWidthUserComp(bool bGrow); // Stretch the selected component width (just for DIPs) void ChangeTypeUserComp(COMP eType); void CopyUserComps(); // Make a blank copy of the user-group components and float them bool MoveUserComps(int deltaRow, int deltaCol); // Move user-group components, and return true if the grid was panned void RotateUserComps(bool bCW); // Rotate the selected components void CopyComps(const std::list& compIds); // Make a blank copy of the components and float them bool MoveTextBox(int deltaRow, int deltaCol); // Move text box, and return true if the grid was panned bool MoveComps(const std::list& compIds, int deltaRow, int deltaCol); // Move components and return true if the grid was panned void RotateComps(const std::list& compIds, bool bCW); // Rotate components Rect GetFootprintBounds(const std::list& compIds) const; void CustomPCBshapes(); // Allow some parts (e.g. DIPs) to be drawn differently in PCB mode // Command enablers for GUI bool GetDisableCompText() const; bool GetDisableMove() const; bool GetDisableRotate() const; bool GetDisableStretch(bool bGrow) const; bool GetDisableStretchWidth(bool bGrow) const; bool GetDisableChangeType() const; bool GetDisableChangeCustom() const; bool GetDisableWipe() const; void SetInfoStr(const std::string& str) { m_infoStr = str; } const std::string& GetInfoStr() const { return m_infoStr; } void CalculateColors() { m_colorMgr.CalculateColors(m_adjInfoMgr, this); } int GetNewNodeId() { const int nodeId = m_nodeInfoMgr.GetNewNodeId(m_adjInfoMgr); m_colorMgr.Unfix(nodeId); // Ensure auto-color is used for new nodeId. return nodeId; } CompManager& GetCompMgr() { return m_compMgr; } NodeInfoManager& GetNodeInfoMgr() { return m_nodeInfoMgr; } GroupManager& GetGroupMgr() { return m_groupMgr; } RectManager& GetRectMgr() { return m_rectMgr; } TextManager& GetTextMgr() { return m_textMgr; } ColorManager& GetColorMgr() { return m_colorMgr; } CompDefiner& GetCompDefiner() { return m_compDefiner; } int GetCurrentPinId() const { return m_compDefiner.GetCurrentPinId(); } int GetCurrentShapeId() const { return m_compDefiner.GetCurrentShapeId(); } bool SetCurrentPinId(int i) { return m_compDefiner.SetCurrentPinId(i); } bool SetCurrentShapeId(int i) { return m_compDefiner.SetCurrentShapeId(i); } // Helper for flying wires bool GetAllowFlyWire(Element* p) const { if ( p->GetNodeId() != BAD_NODEID && p->GetHasPinTH() && !p->GetHasWire() && p->GetIsBotLyr() ) { size_t pinIndex; int compId; GetSlotInfoForTH(p, pinIndex, compId); return m_compMgr.GetAllowFlyWire(compId); } return false; } // Helpers for locations of close tracks std::list& GetWarnPoints(int iLayer) { return m_warnPoints[iLayer]; } void ClearWarnPoints() { m_warnPoints[0].clear(); m_warnPoints[1].clear(); } bool GetHaveWarnPoints() const { return !m_warnPoints[0].empty() || !m_warnPoints[1].empty(); } // Netlist Import bool Import(TemplateManager& templateMgr, const std::string& filename, std::string& errorStr, bool bTango, bool& bPartTypeOK) { return ( bTango ) ? ImportTango(templateMgr, filename, errorStr, bPartTypeOK) : ImportOrcad(templateMgr, filename, errorStr, bPartTypeOK); } bool GetImportParts(const std::string& filename, std::list& listOut, bool bTango) const { return ( bTango ) ? GetPartsTango(filename, listOut) : GetPartsOrcad(filename, listOut); } // Merge interface functions virtual void UpdateMergeOffsets(MergeOffsets& o) override { ElementGrid::UpdateMergeOffsets(o); // Call UpdateMergeOffsets in base class GuiControl::UpdateMergeOffsets(o); // Call UpdateMergeOffsets in base class m_compMgr.UpdateMergeOffsets(o); m_groupMgr.UpdateMergeOffsets(o); m_textMgr.UpdateMergeOffsets(o); m_colorMgr.UpdateMergeOffsets(o); } virtual void ApplyMergeOffsets(const MergeOffsets& o) override // Called on the source board { ElementGrid::ApplyMergeOffsets(o); // Call ApplyMergeOffsets in base class GuiControl::ApplyMergeOffsets(o); // Call ApplyMergeOffsets in base class m_compMgr.ApplyMergeOffsets(o); m_groupMgr.ApplyMergeOffsets(o); m_textMgr.ApplyMergeOffsets(o); m_colorMgr.ApplyMergeOffsets(o); } void Merge(Board& src) { m_rectMgr.Clear(); // Wipe rect manager Crop(GetCropMargin(), 0); // Crop this board (the destination board) with zero margin for cols src.Crop(0, 0); // Crop the source board (the one to merge in) with zero margins // Get merge offsets from this board MergeOffsets o; UpdateMergeOffsets(o); // Grow this board to make room for the merge Grow(std::max(0, src.GetLyrs() - GetLyrs()), src.GetRows()+1, std::max(0, src.GetCols() - GetCols())); GlueNbrs(); // Set pointers between neighbouring grid elements // Apply offsets to the source board, so we can merge it with no conflicts src.ApplyMergeOffsets(o); // Now merge ... ElementGrid::Merge(src, o); // Call Merge in base class GuiControl::Merge(src); // Call Merge in base class // Merge the components. Need all component locations before calling GlueWires() m_compMgr.Merge(src.m_compMgr); for (const auto& mapObj : m_compMgr.GetMapIdToComp()) { const Component& comp = mapObj.second; if ( comp.GetId() >= o.deltaCompId ) // Only want to add the new components m_nodeInfoMgr.AddComp(comp); } CustomPCBshapes(); // Use correct shapes for the current view type GlueWires(); // Set pointers between wired grid elements // Merge the group info m_groupMgr.Merge(src.m_groupMgr); RebuildAdjacencies(); // Slow // Merge the text label m_textMgr.Merge(src.m_textMgr); // Merge the colors m_colorMgr.Merge(src.m_colorMgr); Crop(); // Final crop (with default margin) } // Persist functions virtual void Load(DataStream& inStream) override { Clear(); int iVrtVersion(0); inStream.Load(iVrtVersion); inStream.SetVersion(iVrtVersion); inStream.SetOK(iVrtVersion >= VRT_VERSION_1 && iVrtVersion <= VRT_VERSION_CURRENT); if ( !inStream.GetOK() ) return; // Unsupported VRT version inStream.Load(m_infoStr); GuiControl::Load(inStream); // Call Load() on base class ElementGrid::Load(inStream); // Call Load() on base class GlueNbrs(); // Set pointers between neighbouring grid elements // Need all component locations before calling GlueWires() m_compMgr.Load(inStream); // Call Load() on component manager CustomPCBshapes(); // Some parts (e.g. DIPs) are drawn differently in PCB mode for (const auto& mapObj : m_compMgr.GetMapIdToComp()) m_nodeInfoMgr.AddComp(mapObj.second); GlueWires(); // Set pointers between wired grid elements if ( inStream.GetVersion() < VRT_VERSION_26 ) FixLegacyWires(); if ( inStream.GetVersion() < VRT_VERSION_55 ) FixSoicInfo(); m_groupMgr.Load(inStream); // Call Load() on group manager if ( inStream.GetVersion() >= VRT_VERSION_10 ) m_rectMgr.Load(inStream); // Call Load() on rect manager if ( inStream.GetVersion() >= VRT_VERSION_14 ) m_textMgr.Load(inStream); // Call Load() on text manager if ( inStream.GetVersion() >= VRT_VERSION_23 ) m_compDefiner.Load(inStream); // Call Load() on component definer if ( inStream.GetVersion() >= VRT_VERSION_41 ) m_colorMgr.Load(inStream); // Call Load() on color manager RebuildAdjacencies(); FixCorruption(); } virtual void Save(DataStream& outStream) override { outStream.Save(VRT_VERSION_CURRENT); outStream.Save(m_infoStr); GuiControl::Save(outStream); // Call Save() on base class ElementGrid::Save(outStream); // Call Save() on base class m_compMgr.Save(outStream); // Call Save() on the component manager m_groupMgr.Save(outStream); // Call Save() on the group manager m_rectMgr.Save(outStream); // Call Save() on rect manager // Added in VRT_VERSION_10 m_textMgr.Save(outStream); // Call Save() on text manager // Added in VRT_VERSION_14 m_compDefiner.Save(outStream); // Call Save() on component definer // Added in VRT_VERSION_23 m_colorMgr.Save(outStream); // Call Save() on color manager // Added in VRT_VERSION_41 } private: inline void UpdateMH(Element* p, unsigned int iRouteID, unsigned int iMH, unsigned int& iMaxMH) { m_growingRoutes[static_cast(iRouteID)] = true; m_tmpVec[m_tmpVecSize++] = p; // Add p to set of visited points p->UpdateMH(iRouteID, iMH, iMaxMH); } void FixLegacyWires() { // Find all placed wires and update the surface and hole codes on the board for (const auto& mapObj : m_compMgr.GetMapIdToComp()) { const Component& comp = mapObj.second; if ( comp.GetType() == COMP::WIRE && comp.GetIsPlaced() ) { const int& lyr = comp.GetLyr(); assert( lyr == 0 ); int jRow( comp.GetRow() ); for (int j = 0, jRows = comp.GetCompRows(); j < jRows; j++, jRow++) { int iCol( comp.GetCol() ); for (int i = 0, iCols = comp.GetCompCols(); i < iCols; i++, iCol++) { Element* p = Get(lyr, jRow, iCol); assert( p->GetSurface() == SURFACE_PLUG || p->GetSurface() == SURFACE_FULL ); const bool bGap = ( p->GetSurface() & SURFACE_GAP ) > 0; p->SetOccupancyTH(true); // true ==> WIRE if ( bGap ) p->SetSurface( p->GetSurface() + SURFACE_GAP ); } } } } } void FixSoicInfo() { for (int iRow = 0, iRows = GetRows(); iRow < iRows; iRow++) for (int iCol = 0, iCols = GetCols(); iCol < iCols; iCol++) { Element* p = Get(0, iRow, iCol); // Only need to check base layer p->SetSoicChar( ( p->GetNumWires() == 2 ) ? SOIC_THL_WIRES : ( p->GetNumWires() == 1 ) ? SOIC_THL_WIRE : ( p->GetHasPinLegacy() ) ? SOIC_THL_COMP : SOIC_FREE ); } } void SetHavePlacedWires() { m_bHavePlacedWires = GetCompMgr().GetHavePlacedWires(); } // Netlist Import bool GetPartsTango(const std::string& filename, std::list& listOut) const; bool GetPartsOrcad(const std::string& filename, std::list& listOut) const; bool ImportTango(TemplateManager& templateMgr, const std::string& filename, std::string& errorStr, bool& bPartTypeOK); bool ImportOrcad(TemplateManager& templateMgr, const std::string& filename, std::string& errorStr, bool& bPartTypeOK); bool BuildAndPlacePart(TemplateManager& templateMgr, const CompStrings& compStrings, std::list& offBoard, std::string& errorStr, bool& bPartTypeOK); void BreakSIPSintoPADS(const std::list& offBoard); void BreakComponentIntoPads(Component& comp); bool GetPinRowCol(int compId, size_t iPinIndex, int& row, int& col) const; private: std::string m_infoStr; // General info // Component definer CompDefiner m_compDefiner; // For defining a custom component // Managers CompManager m_compMgr; // Manages components on the board NodeInfoManager m_nodeInfoMgr; // Info on the components that use each nodeId AdjInfoManager m_adjInfoMgr; // Manages info on adjacencies between nodeIds (for coloring algorithm) GroupManager m_groupMgr; // Handles grouping of components for the GUI RectManager m_rectMgr; // Handles the set of user-defined rectangles TextManager m_textMgr; // Handles the set of user-defined text labels ColorManager m_colorMgr; // Handles color assignment to nodeIds // Pixmap info for ground fill extent // Don't persist or copy int m_gndL = 0; // Set by CalcGroundFillBounds() int m_gndR = 0; // Set by CalcGroundFillBounds() int m_gndT = 0; // Set by CalcGroundFillBounds() int m_gndB = 0; // Set by CalcGroundFillBounds() // Track warnings // Don't persist or copy std::list m_warnPoints[2];// For showing locations with min track separation on the 2 layers double m_dMinSeparation = DBL_MAX; // Units of grid squares // Routing algorithm // Don't persist or copy ConnectionMatrix m_connectionMatrix; // Tracks connectivity between target pins std::vector m_targetPins; // Set of pins to route. std::vector m_growingRoutes; // Flags to indicate if routes to target pins are still growing std::vector m_tmpVec; // The set of visited points. size_t m_tmpVecSize; // The number of visited points. int m_iConnPin = -1; // The element index of a connected pin ( set by Manhatten() ) unsigned int m_iConnRID = BAD_ROUTEID; // ... and its route ID bool m_bRouteMinimal; // true ==> don't build tracks between pins that are already connected bool m_bHasVias; // true ==> there are routed vias in the design (as opposed to "wires-as-tracks" vias) bool m_bHavePlacedWires; // true ==> there are placed wires in the design }; VeroRoute/Src/android-sources/res/drawable-xxxhdpi/icon.png000644 001750 001750 00000012212 14206323065 024265 0ustar00alexalex000000 000000 ‰PNG  IHDRРРнОћP pHYsФФ•+“@рG д"ЈE(P‹ P A @-‚@ZЕj д"ЈE(P‹ P A @-‚@ZЕj д"ЈE(P‹ P A @-LƒŸЅ5њ+КПbК}tUвUJfЩ3ЮSNg~vVЭЮМї€ќеЯЛq4ЬfКGЊн)ЯР)ќ\Њ)Њ)аЪј—’џ†"(‚‰дp3ко‰7ЗЃсІnFЦяхx\нС^ЙїMQd…0 эЙ”EДф%[­SД2@*)QJБќ[с ЬкфађђпŒ@ZУеэЉ­шГgЧO;[;ёжNl­р*оп-іw‹ў ЋJ99rœc_5r№ 2а}Ф[дћ\uŸPђ’‡P–p%љ[фoФМqь&RЭ вšј—˜џfъЏ˜с†ниŽ~ёEїЩѓюжNМ:4IWkM4гpУCZ3@я•‡ямщq[Ў€ ZGє ѕŸQя)%ШЎAwAШ#КЅIi“хО”p“eЧ}Сѓп@Н§8ўьѓЮ“чн'ЯЛыЌ”ˆˆԘhpЯ$]-€вd­Ъsn@z€ф‘ъ>Ѕо3ъ}Nб&ЉD(20ЋP]ДЄV|Ю-hyљoF n_onGŸvЖwтѕvuh/џ?Y є4ђŒ…1Ÿњwo‹FнКGёК?Їф!Х›dзшУшœ ?•bкг Zbў›(щЊсfДЕЏ ­ЎА­Ў_EЃ]›tZ4‚ ;А”<$ЛŠЎmІ"и5ˆЇќ-ЉN[ьСRѓп”@њў†нzwzкF?И}/Xœ@œаы<щъFнК‹hЩCш.дѕ‘…]ƒJН‚юо`|%цП”‚6d#Ѕєљїю•бЂ™БЄZєЪВDИ6|) 2DmЉљoSЗfb†ЏФ•Ь^фњё)Y4ЋœœХЕWТNФЫ_ш‹@Xи‰T"mЉљoF <ѕGc7к-NŽ+W^{Ў”гI5к-ŽЧ.O[Д—OQ"7—з67Aўх!|zƒё§5–˜џfњ@yЪЧхшлТZЙЇЋ;h‹ип-Ч.ЯZt ћ n,љ!CvИz=pЙHЪБpvГ!ўE–˜џfJgў`Џьѕ3m(щi—ВD\)ЎфЃЗї:џцev№ЖœЯкєšK1"н2а]py R‚K”cЩveўJŠЊy‹~Ц/1џЭ4›њНз…sТй<^šеЁ] Ѕ{/ЇЧюlRv‹W/в?ПHЧ{хьДMM‘я2;Dљv v Є €xqT'ШпШќKž})хОјГe§=–˜џ†:Ћђ”OŽŠр+ё.ŽbŘ܎*žŒнhЗx§2{љЧєхцщŒkбWX5…ЯPNhЉHХPи-zH’}-ѓ/eўт|2Е=,1џЭф=„9c<*­ЅљдяП)†Џ.Ъ ЊїхуН2qYp‹j9ёf(FB†§”ŠЗ”}§ƒrŽ‘#ЉІрВ=гРRѓпP=€UЩЧe™ѓС^љaASЪyЪщмЯЮ*че(ЭЙАC9RŒ :ђО Œс3pv^PЦеyћБМќ7Y‘ш=N'ўtвЂЮЭOУЃ:Au‚–йёcYJўУHt A @-‚@ZЕj д"ЈE(P‹ P A @-‚@ZЕj д"ЈE“ѕ@ЫGC%а§e‡q К•\їЦФmхЃШЎвр—бмЂ•?оЃb ~IvѕњwЇo!•@цV~IB‹ іП‡‚Нsoйa4ЪG%NHBё'ЫŽу.:бZЕj д"ЈE(P‹ P е8P‘љГ“ъlRЕk§М ”ТЪšYЙgтЮЧ3ёQ tvтџє_ѓџ=+ѓ6Ом%єХЏњЯнпЕ“Г“ъOџ5ћї;šOлИРCo I№щgЩЦжѕkQп6>*иKQШ|ъggm@Qћ6>џп„Nt A @-‚@ZЕj д"ЈE(P‹ P A @-‚@ZЕhлdЊ€,ТМ ЄЈдй”Ц‡м%"—іv$""цgгуЂš”ž DЄMаDŠ ­ЭCќMб6ЮaT,%KС’{ЩYJ‘Š ~ћюнŸОœЄЖЊ*япOЙk­1Ѓoнлwгi1+*EdEš:Š…X‘UИЙ"ŠлџЇ‰HХ’W2ЏјЌтЉ—Œ9s…л{љUМDeY–хћнMЃ(ŠЂшфPіоГЂЈ*ЋTGSЧЈЃV „@ {Sїюmџ'аЄ@ZЃПЂћ+Ілзn7”qžr:ѓГГjvцНПД!Ž *ї’3g^2/Kю%]ќc)YJс*+тщ4&KUUUUѕн'EaŒ™N%+ ЧE%Fqъ)ђ2ЏјTSWQЂ)бдQЊЃ)!hТ‡›Ппйјыа@E0‘nFл;ёцv4мДУЭ‹ Яќћ ЯіО)ŠЌХŽUч `ЧR8ž”ўаё„QАф,%K%XlЧЭФR:Ÿš™љ{•Я"тНЯ _КмsQ1‘&œ*2ŠЂХUk‘^‡ZSЋѓŽEˆПЭЄ5ŒQнžкиŠ>{жyќДГЕoэФ‹-]ХћЛХўnбdU)'G€s\ЙХОg"тМd^f%цўmс%ЃФхU6XШ{8GЮй№о{яsо,/юЏE‚€RˆQЌSˆДFŸ @ЦаŒпWЈO3ѕWЬpУnlGПјЂћфywk'^šЄЋ›ОjІс†5†Д&f€0о+пЙ“ЃE7ГЈdцјИфcЧ'•œ1J Й‡,ˆР ЪJЮrЏМd‘Въ+ŠХ§{у?=nР †шэЧёgŸwž<я>yо]`/m; 1&м3IW  4YЋђœOŽ„ЅЈxZђQСћ…пї’Б”зєІ’"ЈяјдKVё ы\„ЁФ((Šюfќ-Јлз›лбуЇэx§]~№ˆ&kž&PžБ0цSџюm!/™“IЩ‡%9>4ёTНšХ—~сЅ`ЩˆьЂJb4њw3ўFТjF ЄЋ†›бжNМ2Д6КvtлFДКf|vmвQ€xIKTђЁчЙмдКbіtўˆсps гБ—TМ#шHю|Wуo€f4T к”вп З_-šKJ-FХ№ƒй_Р‹уобј› LІjбŒ@Ь№•И’й_š#ќY4Ћœ0Ÿp,ц o\eEаИ8юП‘8љ”<ѕGc7к-NŽ+W^{Ў”гI5к-ŽЧ.O= 4ѕ"Еnѕ}MнМJSзъћ‘Zздд]ПšщDч)”Ѓo chхžОn5іХ ья–Чc—g ІnЄя МР{?Л™2ЅU/Rыбљ…ЇЛ4#P:ѓ{eЏŸiCIOИ4%тJq%ИНзљ7/ГƒЗх|ц ЄЉciM ЊХ„Рпf ‹!‚]дHDъ~Єж-­iъшnЦпHXЭ4›њНз…sТй<^šеЁ] Ѕ{/ЇЧюlRv‹W/в?ПHЧ{хьдЄ(6ч•RJQтјЄтЧg€TЭ]"@[Еbд=ЋюEjh/ІКЋё7@CUyЪ'GE№•xGБZLцUOЦnД[М~™НќcњђѓtЦЮёт(Š”ФŠЃV џ.іШЅ49DMˆ ­$z+ж4ѕ ѕE‹;ћЎЦпЭф=„9c<*­ЅљдяП)†Џ.Ъ ЊїхуН2qYАˆ“Щ XA‰ђаадНВB‘h[[Ћ™љƒ’PЅ”ЕJkQ…яЪ!Ќ"Ћ(RŸ—CЈuC+Šb"KЄяrќаP=€UЩЧe™ѓС^љaASЪyЪщмЯЮ*че(яџš Y""MHжНфп+ШšГ”"ЅQ>ВQЧqќaA–1Ц“ФYe”вD‘ЂHSOSїš‚,тЏO“‰оуtтO'?љЫ•H"šЈ{"М(ъЛ( =cЩ<чVЙN ёъъе%ЁтЄV• ЋUЂО+ Ѕў"ћ%|WеойјыаЮšh"2 ‰)e4uD+—Фђщƒўѓg§OvЎ.JпџжЭпЭFё,їЄШйѓЂtŠ‰Ь піјэ –H+DB] /Т€єbѕщƒсѓПўьйеЏХ|гЭG_Ћ’qХk1!ўцi›@,:Ї шnЙШшС`}}}}kЋwхЯŽцƒŠŒ”zY‹lоіј2-ѕ:p[j д"ЈE(P‹ P A @-‚@ZЕj д"ЈХЅЩTЅ)ŽЉ7hщŽžНŽcRКU pѓI •{цљЏћBhэІЕЯе_ЙзЖ ‚ЦИљџ@ §ќзНOЗ{ль–о ѕЙљП$PмбНБпl`sncўC':P‹ P —ОТЊЉф{Rь‰ќэVjЋФл”l“|œ?Фncў/ фN0§™ќ'svуб§TkџЈt—Ь`йЁќmИљП$ŸЪќ+9ўіг›юЧ ˆ†4ј{iч .ѕЙљ} @-‚@ZЕj д"ЈE(P‹ P A @-‚@ZЕj д"ЈE(P‹ P A @-‚@ZЕj дЂб… 4ЬfКGЊнСbsј œТЯЅšЂšЂЩНиšCkєWtХtћњУэ’2ЮSNg~vVЭЮМoeќKЩC@Pб’G”lQДNбШЉЄђo…3œ/аžk@PЉсfДНonGУM;мМиАЭПпАmя›ЂШ YьИеІј—•џf" 2а}Ф[дћ\uŸPђ’‡P–p%љ[фoФМqь&RЭ эyџRkЃК=ЕБ}іЌѓјigk'ок‰[FКŠїw‹§нЂ?ШЊRNŽчиЗ&ў%цПЬб:ЂOЈџŒzO)yDv К‹Х–Œфн‡вЄ4„I€r_ЪИI#o€ўŠnиэш_tŸ<яnэФЋC“tѕbгZЭ4мАЦжФ Ц{хс;wzмƒ–˜џfв$Tї)ѕžQяsŠ6IE D B‘Y…ъB  %Етsn‘@Н§8ўьѓЮ“чн'ЯЛыьЅmГ!ЦDƒ{&щj”&kUžs{ZbўЈGёК?Їф!Х›dз~№ъБz gУOЅиЃіt‚К}НЙ=~кйо‰зиеЁНќџd-агЪ3Ц|ъпН-–ыU,1џ дн ф!й5Ptm3СЎA<хoIuкb€ЄЋ†›бжNМ2Д6КvhУFДКf|vmвiбШѓп@]DыHBwЁЎ?ВАkP ЂWанFŽм IWппА[тNOлшк•Х НоШ“n‹Vк[bўћЏ ЉХFцзЏœARЄ,Ш\ь?м”‚6d#ЅєyПчJˆhбЬXRmЉљoUЗ†p%ьDМќ…ž™„…H%вІ…H™с+q%ГПД™ђˆШЂYхЄ] Љ./џЭфS”‡ШпРMРхЕЭФСMПAyŸ6rфfШS4vЃнтфИrхЕWР•r:ЉFЛХёихi‹6V^bў(ƒKўFмr§ pЙ8)ЧвЊUмђ”ЪбЗХйБsхЕїцB §нђxьђЌE %цП™NДŸK1"н2а]py R‚K”cЩveўJŠЊy‹~ЦЇ3АWіњ™6”є4€K‰"ЎWђбл{ѓ2;x[Юgmz-/џ 4EОЫьLхSи5и5&тХMP #ѓ/yіЅ”ћтЯ9r3ЬІ~яuсœА@6W‡fuhSоЫщБ;›TЃнте‹єЯ/вё^9;m“@ЫЫ3USј хD@€ёŠT e€нтZВЏeўЅЬ_œOцЕ‡йY•Ї|rф P_‰wqЋХdjUёdьFЛХы—йЫ?І/џ0Ogь\‹ОТ–˜џfa`†b$dиOЉxKйз?('I1’j .л3оC˜г9ЦЃвZšO§ў›bјъЂœЃz_Ю1о+г—ЗЈ–cЉљoh Q;”cp!ХЊ#я š>gчM\ЗoT%”eЮ{х‡e)ч)Їs?;Ћœ[T-;цяГМќ7Z‘шQ :AЫВћcёЇ:iQчцЇБŒќ‡‘ш@-‚@ZЕj д"ЈE(P‹ P A @-‚@ZЕj д"ЈE(P‹ P A @-‚@ZЕj д"ЈХџ_њЃхю1хрIENDЎB`‚VeroRoute/libraries/gEDA/veroroute_battery/000755 001750 001750 00000000000 14405612071 021234 5ustar00alexalex000000 000000 VeroRoute/libraries/gEDA/veroroute_linear/Generic_SIP16.sym000644 001750 001750 00000006070 13515171161 024030 0ustar00alexalex000000 000000 v 20130925 2 T 300 0 8 10 0 0 0 0 1 numslots=0 B 300 0 1400 6400 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 P 0 6200 300 6200 1 0 0 { T 205 6245 5 10 1 1 0 6 1 pinnumber=1 T 200 6200 5 10 0 1 0 0 1 pinseq=1 T 355 6195 5 10 0 1 0 0 1 pinlabel=1 T 200 6200 5 10 0 1 0 0 1 pintype=pas } P 0 5800 300 5800 1 0 0 { T 205 5845 5 10 1 1 0 6 1 pinnumber=2 T 200 5800 5 10 0 1 0 0 1 pinseq=2 T 355 5745 5 10 0 1 0 0 1 pinlabel=2 T 200 5800 5 10 0 1 0 0 1 pintype=pas } P 0 5400 300 5400 1 0 0 { T 205 5445 5 10 1 1 0 6 1 pinnumber=3 T 200 5400 5 10 0 1 0 0 1 pinseq=3 T 355 5345 5 10 0 1 0 0 1 pinlabel=3 T 200 5400 5 10 0 1 0 0 1 pintype=pas } P 0 5000 300 5000 1 0 0 { T 205 5045 5 10 1 1 0 6 1 pinnumber=4 T 200 5000 5 10 0 1 0 0 1 pinseq=4 T 355 4945 5 10 0 1 0 0 1 pinlabel=4 T 200 5000 5 10 0 1 0 0 1 pintype=pas } P 0 4600 300 4600 1 0 0 { T 205 4645 5 10 1 1 0 6 1 pinnumber=5 T 200 4600 5 10 0 1 0 0 1 pinseq=5 T 355 4545 5 10 0 1 0 0 1 pinlabel=5 T 200 4600 5 10 0 1 0 0 1 pintype=pas } P 0 4200 300 4200 1 0 0 { T 205 4245 5 10 1 1 0 6 1 pinnumber=6 T 200 4200 5 10 0 1 0 0 1 pinseq=6 T 355 4145 5 10 0 1 0 0 1 pinlabel=6 T 200 4200 5 10 0 1 0 0 1 pintype=pas } P 0 3800 300 3800 1 0 0 { T 205 3845 5 10 1 1 0 6 1 pinnumber=7 T 200 3800 5 10 0 1 0 0 1 pinseq=7 T 355 3745 5 10 0 1 0 0 1 pinlabel=7 T 200 3800 5 10 0 1 0 0 1 pintype=pas } P 0 3400 300 3400 1 0 0 { T 205 3445 5 10 1 1 0 6 1 pinnumber=8 T 200 3400 5 10 0 1 0 0 1 pinseq=8 T 355 3345 5 10 0 1 0 0 1 pinlabel=8 T 200 3400 5 10 0 1 0 0 1 pintype=pas } P 0 200 300 200 1 0 0 { T 205 245 5 10 1 1 0 6 1 pinnumber=16 T 200 200 5 10 0 1 180 6 1 pinseq=16 T 355 195 5 10 0 1 0 0 1 pinlabel=16 T 200 200 5 10 0 1 180 6 1 pintype=pas } P 0 600 300 600 1 0 0 { T 205 645 5 10 1 1 0 6 1 pinnumber=15 T 200 600 5 10 0 1 180 6 1 pinseq=15 T 355 595 5 10 0 1 0 0 1 pinlabel=15 T 200 600 5 10 0 1 180 6 1 pintype=pas } P 0 1000 300 1000 1 0 0 { T 205 1045 5 10 1 1 0 6 1 pinnumber=14 T 200 1000 5 10 0 1 180 6 1 pinseq=14 T 355 995 5 10 0 1 0 0 1 pinlabel=14 T 200 1000 5 10 0 1 180 6 1 pintype=pas } P 0 1400 300 1400 1 0 0 { T 205 1445 5 10 1 1 0 6 1 pinnumber=13 T 200 1400 5 10 0 1 180 6 1 pinseq=13 T 355 1395 5 10 0 1 0 0 1 pinlabel=13 T 200 1400 5 10 0 1 180 6 1 pintype=pas } P 0 1800 300 1800 1 0 0 { T 205 1845 5 10 1 1 0 6 1 pinnumber=12 T 200 1800 5 10 0 1 180 6 1 pinseq=12 T 355 1795 5 10 0 1 0 0 1 pinlabel=12 T 200 1800 5 10 0 1 180 6 1 pintype=pas } P 0 2200 300 2200 1 0 0 { T 205 2245 5 10 1 1 0 6 1 pinnumber=11 T 200 2200 5 10 0 1 180 6 1 pinseq=11 T 355 2195 5 10 0 1 0 0 1 pinlabel=11 T 200 2200 5 10 0 1 180 6 1 pintype=pas } P 0 2600 300 2600 1 0 0 { T 205 2645 5 10 1 1 0 6 1 pinnumber=10 T 200 2600 5 10 0 1 180 6 1 pinseq=10 T 355 2595 5 10 0 1 0 0 1 pinlabel=10 T 200 2600 5 10 0 1 180 6 1 pintype=pas } P 0 3000 300 3000 1 0 0 { T 205 3045 5 10 1 1 0 6 1 pinnumber=9 T 200 3000 5 10 0 1 180 6 1 pinseq=9 T 355 2995 5 10 0 1 0 0 1 pinlabel=9 T 200 3000 5 10 0 1 180 6 1 pintype=pas } T 1200 6555 5 10 1 1 0 0 1 device=Name T 300 6555 8 10 1 1 0 0 1 refdes=U? T 1600 2055 8 10 0 1 0 0 1 footprint=SIP16 T 1900 1845 8 10 0 1 0 0 1 description=Generic 16 Pin SIP VeroRoute/tutorials/tutorial_15.vrt000644 001750 001750 00000135240 14433261474 017704 0ustar00alexalex000000 000000 9TUTORIAL 15 - AUTO-ROUTING The quick way of wiring parts is to just paint the pins and let the auto-routing draw the tracks for you. The auto-routing is interactive. It is still being developed and will not always manage to route the whole layout. When it fails to do so, the nets with open-circuits will be listed in the "Broken Nets" list of the Control Dialog. While auto-routing is enabled, the auto-routed tracks are shown in color but with thin, white, diamond-hatched lines. This is to differentiate them from any points that have been manually painted by you (the user). User-painted points are shown without the diamond-hatched lines. The routing algorithm will not overwrite or modify any of the user-painted points while it is running. The auto-routing is dynamic and runs every time the layout is modified (e.g. every time you paint or erase grid points or manipulate parts). This makes it possible to work interactively with the routing algorithm. For example, if the routing algorithm does something like lay a track that blocks an obvious connection between nearby points, then you can simply paint in the desired connection manually and the algorithm will be forced to re-route around it. If a pair of pins are connected by a track that has been fully painted manually (from one pin to the other) then the auto-router will not autoroute a new track between that pair of pins. Try the following exercise... The top circuit has already been laid out. Now try and copy that layout on the bottom set of parts. Auto-routing has been switched on. All you need to do is paint the component pins on the bottom. The tracks may not go where you want them, but don't worry about that. You can move parts if you want, and the auto-routing will re-route the tracks. See what happens as you check and uncheck the "On" box during auto-routing. Note that it is recommended to use "Fast" auto-routing by default. Disabling the fast mode makes the algorithm try harder to route any broken nodes, but it may not always make an improvement and can be 10 times slower to run. In order to commit the auto-routed tracks to the board, you need to hit the "Paste" button. This will then switch the auto-routing off. The "Tidy" button is only enabled when auto-routing is turned off and there are no Broken Nets . Hitting "Tidy" will then try to re-route the layout and remove any points that are not considered to provide a useful connection. Since this can erase user-painted tracks and replace them with auto-routed tracks, it is not functionality that will be used often. The "Wipe All Tracks" button can be hit at any time. This will disable auto-routing and wipe all netlist IDs on the grid except for those on the component pins. If you have any highlighted rectangular areas on the screen (from using the Select Parts / Tracks by Area  button) then the wipe is restricted to the areas you selected. Also, when using "Vero" style, hitting the "Paste" button will automatically fill-out the board with strips with breaks in the required places. џџџџџџџџџџџZ.. 2< (џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ`џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџ P џџџџџџ ‘џџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџ џџџџџџџџџ  џџџџџџџџџџџџџџџT џџџџџџ“џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Lџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ  џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ,R4390RResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєC4150nCCeramicCAP_CERAMICWF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,R10100kRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R2100kRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R9390RResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R310kRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   LQ1 2N5088QTO92TO92SF(123Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   dPad8OutPadPadPADWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R1820kRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєC3150nCCeramicCAP_CERAMIC WF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PdPad1InPadPadPADџџџѓWF( 1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп   LQ2 2N5088QTO92TO92SF(123Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   dPad2GndPadPadPAD џџџюWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R8100kRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dPad59VPadPadPADџџџђWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdPad3OutPadPadPADWF( 1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџє C1150nCCeramicCAP_CERAMICWF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџє C2150nCCeramicCAP_CERAMICWF(1 2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ, R710kRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ, R5100kRResistorRESISTORNF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dPad6InPadPadPADџџџ№WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdPad49VPadPadPADџџџђWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdPad7GndPadPadPADџџџяWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ, R6820kRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§B@џџџўINVALID TracksWF(џџџ€џџџ€џџџ€џџџ€џџџџџџџџF#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Р@Р@@V€џVeroRoute/libraries/gEDA/veroroute_transistor/JFET_Nchannel_MPF102.sym000644 001750 001750 00000001551 13515171161 026012 0ustar00alexalex000000 000000 v 20130925 2 T 100 500 5 10 0 0 0 0 1 numslots=0 P 100 500 400 500 1 0 0 { T 100 350 5 6 1 1 0 0 1 pinnumber=3 T 100 350 5 6 0 0 0 0 1 pinseq=3 T 100 350 5 6 0 0 0 0 1 pinlabel=3 T 100 350 5 6 0 0 0 0 1 pintype=pas } P 600 1000 600 800 1 0 0 { T 500 850 5 6 1 1 0 0 1 pinnumber=1 T 500 850 5 6 0 0 0 0 1 pinseq=1 T 500 850 5 6 0 0 0 0 1 pinlabel=1 T 500 850 5 6 0 0 0 0 1 pintype=pas } P 600 200 600 0 1 0 1 { T 500 50 5 6 1 1 0 0 1 pinnumber=2 T 500 50 5 6 0 0 0 0 1 pinseq=2 T 500 250 5 6 1 1 0 0 1 pinlabel=S T 500 50 5 6 0 0 0 0 1 pintype=pas } L 400 800 600 800 3 0 0 0 -1 -1 L 400 200 600 200 3 0 0 0 -1 -1 L 400 900 400 100 3 0 0 0 -1 -1 L 300 600 400 500 3 0 0 0 -1 -1 L 400 500 300 400 3 0 0 0 -1 -1 T 700 700 5 10 1 1 0 0 1 device=MPF102 T 700 400 8 10 1 1 0 0 1 refdes=Q? T 595 95 8 10 0 0 0 0 1 footprint=TO92 T 595 95 8 10 0 0 0 0 1 description=N-Channel JFET VeroRoute/tutorials/tutorial_26.vrt000644 001750 001750 00000136555 14433261724 017716 0ustar00alexalex000000 000000 9 јTUTORIAL 26 - WORKING WITH SOICS VeroRoute has some limited support for SOICs. SOICs require a 2-layer board in order to be placed, so VeroRoute will float all SOICs if there is no top layer. The pattern of tracks that join SOIC pads to the rest of the circuit is pre-defined on the top layer for each SOIC and is not editable. Each SOIC track has an SOIC pad on one end and a "virtual pin" on the other. All connections to an SOIC pad are made via its virtual pin. The virtual pin exists only on the top layer, and the netlist value for an SOIC pad is set by "painting" its virtual pin. If you show pin labels (View -> Pin Labels) you will see that virtual pins are labelled in the same way as regular through-hole pins. A virtual pin can share the same grid point as a regular through-hole pin (but not a wire-end) if the netlist value of the virtual pin matches that of the through-hole pin. When a grid point is shared like this, painting/unpainting will modify both the virtual pin and the through-hole pin. 14-pin SOICs have some short tracks where the virtual pin is close to its corresponding SOIC pad. These virtual pins cannot share the same grid point as a through-hole pin because the hole would be too close to the SOIC pad. Note that SOICs cannot be inspected or modified using the component editor, because the editor does not have the functionality to properly define them.џџџџџџџ$@" 2d  џџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџ 1џџџџџџQџџџџџџџџџ‘$џџџџџџ!џџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџ"џџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџРџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџШџџџџџџџџџ џџџџџџџџџџџџџџџ џџџџџџNџџџџџџџџџ%џџџџџџџџџџџџџџџџbџџџџџџџџџ  џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџ џџџџџџџџџ џџџџџ џџџџџџ џџџџџџџџџ џџџџџџ9џџџџџџџџџџEџџџџџџџџџ  џџџџџ @џџџџџ@ џџџџџџDџџџџџџџџџџџџџџџџџџџ џџџџџџTџџџџџџџџџџ“џџџџџџџџџ  џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџP џџџџџ џџџџџџ ˆџџџџџџџџџ џџџџџ џџџџџ$"  џџџџџ$"$Ф+$D+ џџџџџ џџџџџ $ 4 $ 4џ џџџџџџџџџ 0&џџџџџџAџџџџџџџџџџPџџџџџџџџџ Ё&џџџџџ  џџџџџџ ˆџџџџџџџџџ џџџџџ џџџџџ $ Kџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ Dџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџ џџџџџ  џџџџџ @&џџџџџџFџџџџџџџџџџLџџџџџџџџџ &џџџџџџ  џџџџџџџџџ Qџџџџџџ џџџџџџџџџџџџџџџџџџџ џџџџџџ ˆџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ Dџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџ џџџџџџџџџџџџџџџ &џџџџџџDџџџџџџџџџџDџџџџџџџџџ &џџџџџ  Qџџџџџџ џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџШџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ Dџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџ џџџџџ џџџџџ &џџџџџџФџџџџџџџџџџDџџџџџџџџџ (&џџџџџџ џџџџџџџџџ ‚Qџџџџџџ џџџџџџџџџ9џџџџџџEџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ Dџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџXџџџџџџ…џџџџџџџџџџDџџџџџџџџџ`џџџџџ  џџџџџџˆџџџџџџџџџџџџџџџџџџџ џџџџџџ&џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ $џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџLџџџџџџџџџџџџџџџџџџџфџџџџџ џџџџџ  џџџџџ  џџџџџ  џџџџџџџџџџџџџџџ џџџџџџ "џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ "џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџ $3 3џџџџџ dџџџџџ џџџџџџ5џџџџџџџџџџCџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџPџџџџџџџџџџ‘џџџџџџџџџ џџџџџџ !џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ 1џџџџџџџџџџ Aџџџџџџџџџџ Bџџџџџџџџџџ џџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџ3џџџџџџџџџџAџџџџџџџџџџfџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬџџџџџџџџџ@Hџџџџџ$I$J џџџџџ$L$M$N$O$d- џџџџџ $/џџџџџџџџџџ `(џџџџџ (џџџџџџџџџџ дџџџџџ Гџџџџџ Yџџџџџ …џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ4џџџџџџџџџџSџџџџџџџџџ /џџџџџџџџџџџџџџџџTџџџџџџџџџџ“џџџџџџџџџџџџџџџџџџџ #џџџџџ €*џџџџџ *џџџџџ *џџџџџџџџџџџ)џџџџџџџџџџџџџџџџџџџџџџџџ` џџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџ џџџџџџŽџџџџџџџџџџџџџџџџџџџ€ џџџџџ  'џџџџџ 'џџџџџџџџџџџџџџџ)џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџPџџџџџ 2џџџџџџ  џџџџџџџџџ 2џџџџџ ,џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџаџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџPџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџHџџџџџџџџџџPџџџџџџџџџџ‘џџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџРџџџџџџџџџџHџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŒџџџџџџџџџџ €џџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџLџџџџџџџџџџ@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџdџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ @џџџџџџџџџџ@џџџџџџџџџџPџџџџџџџџџџБџџџџџџџџџџAџџџџџџџџџџџџџџџџџџџџ ˆџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ$џџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџPџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‚џџџџџџџџџџdџџџџџџџџџџџџџџџџџџџџlџџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџPџџџџџџџџџџџџџџџџџџџџHџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ”џџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџ €џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџLџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџрџџџџџџџџџџџџџџџџџџџџ„џџџџџџџџџџ ˆџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџџџџџџџџџџџ!џџџџџџџџџџџџџџџџџџџџ8џџџџџџџџџџUџџџџџџџџџџ‹џџџџџџџџџџ ˆџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ„џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ2џџџџџџџџџџaџџџџџџџџџџџџџџџџџџџџ Hџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ€џџџџџџџџџџVџџџџџџџџџџƒџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŒџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџPџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ"џџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџPџџџџџџџџџџ‰џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџLџџџџџџџџџџ@џџџџџџџџџџ@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ€џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ€џџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџPџџџџџџџџџџБџџџџџџџџџџQџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџdџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџ„џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџРџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџФџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ€џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџ7d#0V0VPadPadPAD џџџђWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdHS0S0PadPadPAD  EF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R1100kRResistorRESISTORWF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dMP1P1PadPadPAD џџџєWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп  † XtalXtalXTXT џџџщWF( 12Пџ333334?юfffffdПмЬЬЬЬЬЬ?мЬЬЬЬЬЬ@V€ДPПџ333334?юfffffdПмЬЬЬЬЬЬ?мЬЬЬЬЬЬ@V€ДPџџ,R1420kRResistorRESISTOR WF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   L*IC1LP2950/3.3QTO92TO92 џџџ№џџџџEF(123Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   dODVDDVDPadPadPAD џџџєWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп            џ џ џ џ џ џ џ џ   џ џ џ џ џ џ џ џ  џџ џ џ џ џ џ џ џ џџџ џ џ џ џ џ џ џ џџџ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ   џ џ џ џ џ џ џ џ            wIC3FV-1ICSOIC-28WSOIC_28WEF(12 34 56789 101112 13 14 151617181920212223242526"2728Р @ П№ЬЬЬЬЬЭ?№ЬЬЬЬЬЭ@V€   Р @ П№ЬЬЬЬЬЭ?№ЬЬЬЬЬЭ@V€   Р 333333Р 333333?цfffffg?юfffffg@V€      C310uC(Electrolytic 200 milCAP_ELECTRO_200 WF(12П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфd%InInPadPadPADџџџєEF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdJS2S2PadPadPAD EF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ, R61kRResistorRESISTORWF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  X2C1522nCFilmCAP_FILMWF(12Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДP   /C161uC(Electrolytic 200 milCAP_ELECTRO_200  NF(12П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџџ, R910kRResistorRESISTOR WF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dNP2P2PadPadPAD џџџєWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R11100RRResistorRESISTOR EF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R1220kRResistorRESISTOR EF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R5180RRResistorRESISTORWF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   C91uC(Electrolytic 200 milCAP_ELECTRO_200 EF(12П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџџ, R101k2RResistorRESISTOR WF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d$0V0VPadPadPADWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdIS1S1PadPadPAD  EF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпє+C12100nCCeramicCAP_CERAMIC WF(12ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PdP0V0VPadPadPAD џџџђWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R1320kRResistorRESISTOREF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  XC41nCFilmCAP_FILMEF(12Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџџ,R41MRResistorRESISTORSF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   4C111uC(Electrolytic 200 milCAP_ELECTRO_200 EF( 12П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠф џ  XC622nCFilmCAP_FILMWF(12Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџџ,R2100kRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џє"C1333pCCeramicCAP_CERAMIC WF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PdLP0P0PadPadPAD џџџєWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп џ  XC51nCFilmCAP_FILMEF(12Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДP    џџџџџџџџ    @IC424LC32AICDIPDIP WF(1234 5 678П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€      'C110uC(Electrolytic 200 milCAP_ELECTRO_200џџџіEF(12П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфd,OutOutPadPadPADWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп  ТD1 GreenDLEDLED NF(12Пь?ьПь?ь@>Р>џfDПь?ьПь?ь@>Р>џfD  ТD3ClipDLEDLEDџџџьNF(1 2Пь?ьПь?ь@>Р>џfDПь?ьПь?ь@>Р>џfD џ  X C101nCFilmCAP_FILMSF(12Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPd)5V5VPadPadPADџџџђWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ, R71kRResistorRESISTORWF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§  ТD2 GreenDLEDLED SF(12Пь?ьПь?ь@>Р>џfDПь?ьПь?ь@>Р>џfD    џџџџџџџџ    @&IC2 TS912ICDIPDIPSF(12345678П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€      3C143u3C(Electrolytic 200 milCAP_ELECTRO_200  WF(12П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџ  џ  џ  џ џ џ РQRT1 20k-BRTBourns 3362PTRIM_3362PSF(123ПіzсGЎ?іzсGЎПіzсGЎ?іzсGЎ@V€Pk§ПіzсGЎ?іzсGЎПіzсGЎ?іzсGЎ@V€Pk§   C71uC(Electrolytic 200 milCAP_ELECTRO_200 SF(12П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфd-0V0VPadPadPAD џџџєWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R310kRResistorRESISTOREF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dKS3S3PadPadPAD WF( 1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R1520kRResistorRESISTORNF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  XC81nCFilmCAP_FILMWF(12Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДP   (C23u3C(Electrolytic 200 milCAP_ELECTRO_200 EF(12П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџџ, R8100RRResistorRESISTOR WF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§B@џџџўINVALID TracksWF(џџџ€џџџ€џџџ€џџџ€џџџџџџџџF(1uC(Electrolytic 200 milCAP_ELECTRO_200 џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ 12Р@Р@@V€џџџUџVeroRoute/libraries/gEDA/veroroute_transistor/NPN_BC238.sym000644 001750 001750 00000001562 13515171161 023765 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=1 T 400 850 5 6 0 0 0 0 1 pinseq=1 T 400 850 5 6 0 0 0 0 1 pinlabel=1 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=3 T 400 50 5 6 0 0 0 0 1 pinseq=3 T 400 50 5 6 0 0 0 0 1 pinlabel=3 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 403,209 L 501,200 L 431,273 L 425,240 z T 600 700 5 10 1 1 0 0 1 device=BC238 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=NPN Transistor VeroRoute/Src/controldialog.h000644 001750 001750 00000003177 14377670762 016527 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include class MainWindow; class Ui_ControlDialog; class ControlDialog : public QWidget { Q_OBJECT public: explicit ControlDialog(QWidget* parent); ~ControlDialog(); void SetMainWindow(MainWindow* p); void ClearList(); void AddListItem(int nodeId, bool bFloating); void SetListItem(int nodeId); void UpdateCompControls(); // Component controls void UpdateControls(); // Non-component controls public slots: void BrokenListItemChanged(); protected: void wheelEvent(QWheelEvent* event); void mousePressEvent(QMouseEvent* event); void mouseDoubleClickEvent(QMouseEvent* event); void mouseMoveEvent(QMouseEvent* event); void mouseReleaseEvent(QMouseEvent* event); void keyPressEvent(QKeyEvent* event); void keyReleaseEvent(QKeyEvent* event); private: Ui_ControlDialog* ui; MainWindow* m_pMainWindow; bool m_bUpdatingControls = false; }; VeroRoute/libraries/gEDA/veroroute_connector/Pad.sym000644 001750 001750 00000000660 13515171160 023014 0ustar00alexalex000000 000000 v 20130925 2 T 600 700 8 10 0 0 0 0 1 numslots=0 P 600 700 100 700 1 0 1 { T 100 500 5 10 0 1 0 0 1 pinnumber=1 T 50 750 5 10 0 0 0 0 1 pinseq=1 T 50 750 5 10 0 0 0 0 1 pinlabel=1 T 50 750 5 10 0 0 0 0 1 pintype=pas } B 600 500 400 400 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 T 600 300 5 10 1 1 0 0 1 device=Pad T 700 1000 8 10 1 1 0 0 1 refdes=J? T 600 1200 8 10 0 0 0 0 1 footprint=PAD T 600 1200 8 10 0 0 0 0 1 description=Connection Pad VeroRoute/Src/aliasdialog.cpp000644 001750 001750 00000023012 14412314274 016440 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #include "aliasdialog.h" #include "ui_aliasdialog.h" #include "mainwindow.h" #include AliasDialog::AliasDialog(MainWindow* parent) : QDialog(parent) , ui(new Ui_AliasDialog) , m_pMainWindow(parent) , m_iRow(-1) { ui->setupUi(this); #ifdef VEROROUTE_ANDROID ui->tableWidget->verticalScrollBar()->setStyleSheet( ANDROID_VSCROLL_WIDTH ); ui->tableWidget->horizontalScrollBar()->setStyleSheet( ANDROID_HSCROLL_HEIGHT ); ui->tableWidget_2->verticalScrollBar()->setStyleSheet( ANDROID_VSCROLL_WIDTH ); ui->tableWidget_2->horizontalScrollBar()->setStyleSheet( ANDROID_HSCROLL_HEIGHT ); #endif QObject::connect(ui->pushButton, SIGNAL(clicked()), m_pMainWindow, SLOT(ReImport())); QObject::connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(DeleteRow())); QObject::connect(ui->pushButton_3, SIGNAL(clicked()), this, SLOT(DeleteAllRows())); QObject::connect(ui->tableWidget_2, SIGNAL(cellPressed(int,int)), this, SLOT(CellPressed(int,int))); QObject::connect(ui->tableWidget_2, SIGNAL(cellChanged(int,int)), this, SLOT(CellChanged(int,int))); QObject::connect(ui->tableWidget, SIGNAL(cellChanged(int,int)), this, SLOT(CellChangedTop(int,int))); QObject::connect(this, SIGNAL(rejected()), m_pMainWindow, SLOT(UpdateControls())); // Close using X button } AliasDialog::~AliasDialog() { delete ui; } void AliasDialog::Configure(const std::string& filename, bool bTango) { m_filename = filename; m_bTango = bTango; } struct RowData { RowData(const std::string& aliasStr, const std::string& importStr) : m_aliasStr(aliasStr), m_importStr(importStr) {} std::string m_aliasStr; // Alias string std::string m_importStr; // Valid import string }; struct IsEarlierRow { bool operator()(const RowData* pA, const RowData* pB) const { // Want rows with missing import strings on the end of the list if ( pA->m_importStr.empty() && !pB->m_importStr.empty() ) return false; if ( pB->m_importStr.empty() && !pA->m_importStr.empty() ) return true; if ( pA->m_importStr != pB->m_importStr ) return pA->m_importStr < pB->m_importStr; return pA->m_aliasStr < pB->m_aliasStr; } }; void AliasDialog::Update() { m_bUpdating = true; std::list strList; // List of valid import strings m_pMainWindow->m_templateMgr.CalcValidImportStrings(strList); // Calculate list, and make sure each one is not listed as an alias ui->pushButton->setEnabled( !m_filename.empty() ); // Disable Re-Import button if no filename // Set up the table of (valid) import strings ui->tableWidget->clear(); ui->tableWidget->setRowCount(static_cast(strList.size())); ui->tableWidget->setColumnCount(2); ui->tableWidget->setColumnWidth(0,180); ui->tableWidget->setColumnWidth(1,510); m_tableHeader << "Valid Import Strings" << "Notes"; ui->tableWidget->setHorizontalHeaderLabels(m_tableHeader); ui->tableWidget->verticalHeader()->setVisible(false); ui->tableWidget->setEditTriggers(QAbstractItemView::CurrentChanged); ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectItems); ui->tableWidget->setSelectionMode(QAbstractItemView::NoSelection); ui->tableWidget->setShowGrid(true); // Populate the table with data int nImport(0); for (auto& strPair : strList) { // Write row to table. Note: No memory leak since setItem() takes ownership. auto pItemA = new QTableWidgetItem(QString::fromStdString(strPair.m_importStr)); auto pItemB = new QTableWidgetItem(QString::fromStdString(strPair.m_notesStr)); pItemA->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable); pItemB->setFlags(Qt::ItemIsEnabled); ui->tableWidget->setItem(nImport, 0, pItemA); ui->tableWidget->setItem(nImport, 1, pItemB); nImport++; } //============================================================= auto& mapAliasToImportStr = m_pMainWindow->m_templateMgr.GetMapAliasToImportStr(); // Copy the info in the map to a std::vector and sort it for display std::vector rowDataVec; rowDataVec.resize(mapAliasToImportStr.size(), nullptr); size_t iCounter(0); for (auto& mapObj : mapAliasToImportStr) rowDataVec[iCounter++] = new RowData(mapObj.first, mapObj.second); std::stable_sort(rowDataVec.begin(), rowDataVec.end(), IsEarlierRow()); // Sort the list appropriately // Set up the table of aliases for (valid) import strings ui->tableWidget_2->clear(); ui->tableWidget_2->setRowCount(static_cast(rowDataVec.size())); ui->tableWidget_2->setColumnCount(2); ui->tableWidget_2->setColumnWidth(0,180); ui->tableWidget_2->setColumnWidth(1,510); m_tableHeader_2 << "Import String" << "Alias (Footprint/Package)" ; ui->tableWidget_2->setHorizontalHeaderLabels(m_tableHeader_2); ui->tableWidget_2->verticalHeader()->setVisible(false); ui->tableWidget_2->setEditTriggers(QAbstractItemView::AllEditTriggers); ui->tableWidget_2->setSelectionBehavior(QAbstractItemView::SelectRows); ui->tableWidget_2->setSelectionMode(QAbstractItemView::NoSelection); ui->tableWidget_2->setShowGrid(true); // Populate the table with data int nAlias(0); for (auto& pRowData : rowDataVec) { // Write row to table. Note: No memory leak since setItem() takes ownership. auto pItemA = new QTableWidgetItem(QString::fromStdString(pRowData->m_importStr)); auto pItemB = new QTableWidgetItem(QString::fromStdString(pRowData->m_aliasStr)); pItemA->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable); pItemB->setFlags(Qt::ItemIsEnabled); ui->tableWidget_2->setItem(nAlias, 0, pItemA); ui->tableWidget_2->setItem(nAlias, 1, pItemB); nAlias++; } ui->tableWidget_2->verticalScrollBar()->setSliderPosition( ui->tableWidget_2->verticalScrollBar()->maximum() ); CellPressed(-1,-1); // Deselect row in alias table so we disable the Delete button for (auto& pRowData : rowDataVec) delete pRowData; // Deallocate objects in vector ui->pushButton_3->setEnabled(nAlias > 0); m_bUpdating = false; } bool AliasDialog::Import(bool& bPartTypeOK) { m_errorStr.clear(); return m_pMainWindow->m_board.Import(m_pMainWindow->m_templateMgr, m_filename, m_errorStr, m_bTango, bPartTypeOK); } void AliasDialog::keyPressEvent(QKeyEvent* event) { #ifndef VEROROUTE_ANDROID m_pMainWindow->specialKeyPressEvent(event); #endif QDialog::keyPressEvent(event); event->accept(); } void AliasDialog::keyReleaseEvent(QKeyEvent* event) { #ifdef VEROROUTE_ANDROID if ( event->key() == Qt::Key_Back ) { QTimer::singleShot(0, m_pMainWindow, SLOT(HideAliasDialog())); return event->accept(); } #else m_pMainWindow->commonKeyReleaseEvent(event); #endif QDialog::keyReleaseEvent(event); event->accept(); } void AliasDialog::DeleteRow() { if ( m_iRow >= 0 && m_iRow < ui->tableWidget_2->rowCount() ) { const std::string aliasStr = ui->tableWidget_2->item(m_iRow, 1)->text().toStdString(); const std::string messageStr = "The alias\n" + aliasStr + "\nis about to be deleted. There is no undo for this operation. Continue?"; if ( QMessageBox::question(this, tr("Confirm delete alias"), tr(messageStr.c_str()), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No ) return; m_pMainWindow->m_templateMgr.RemoveAlias(aliasStr); ui->tableWidget_2->removeRow(m_iRow); m_iRow = -1; Update(); } } void AliasDialog::DeleteAllRows() { const std::string messageStr = "All aliases are about to be deleted. There is no undo for this operation. Continue?"; if ( QMessageBox::question(this, tr("Confirm delete all aliases"), tr(messageStr.c_str()), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No ) return; m_pMainWindow->m_templateMgr.RemoveAllAliases(); ui->tableWidget_2->setRowCount(0); m_iRow = -1; Update(); } void AliasDialog::CellPressed(int row, int /*col*/) // For alias table { m_iRow = row; ui->pushButton_2->setEnabled(m_iRow != -1); } void AliasDialog::CellChanged(int row, int /*col*/) // For alias table { if ( m_bUpdating ) return; const std::string importStr = ui->tableWidget_2->item(row, 0)->text().toStdString(); const std::string aliasStr = ui->tableWidget_2->item(row, 1)->text().toStdString(); // Allow invalid aliases to be entered at ths stage. Let ClearInvalidAliases() take care of them before (re)import. m_pMainWindow->m_templateMgr.AddAlias(aliasStr, importStr); } void AliasDialog::CellChangedTop(int row, int /*col*/) // For valid import strings table { if ( m_bUpdating ) return; // We want to allow copying of text from the valid import strings table, but not editing. // If user tries to change text in the table, the code below will revert it. std::list strList; // List of valid import strings m_pMainWindow->m_templateMgr.CalcValidImportStrings(strList); // Calculate list, and make sure each one is not listed as an alias int nImport(0); for (auto& strPair : strList) { if ( nImport == row ) { ui->tableWidget->item(row, 0)->setText(QString::fromStdString(strPair.m_importStr)); return Update(); } nImport++; } } VeroRoute/Src/finddialog.ui000644 001750 001750 00000004766 14216475650 016151 0ustar00alexalex000000 000000 FindDialog 0 0 360 120 360 100 360 120 Find Parts in Layout 10 9 341 101 Search by Name or Value 10 30 91 27 Qt::NoFocus Name 110 30 91 27 Qt::NoFocus Value 200 30 131 27 Qt::NoFocus Search for exact match instead of substring Exact Match 10 70 321 27 Qt::StrongFocus Search for parts containing this text VeroRoute/libraries/gEDA/veroroute_regulator/LP2950.sym000644 001750 001750 00000001455 13515171161 023161 0ustar00alexalex000000 000000 v 20130925 2 T 1700 800 5 10 0 0 0 0 1 numslots=0 P 1700 800 2000 800 1 0 1 { T 1800 900 5 10 1 1 0 0 1 pinnumber=1 T 1800 900 5 10 0 0 0 0 1 pinseq=1 T 1600 700 9 10 1 1 0 6 1 pinlabel=Out T 1800 900 5 10 0 0 0 0 1 pintype=pas } P 0 800 300 800 1 0 0 { T 200 900 5 10 1 1 0 6 1 pinnumber=3 T 200 900 5 10 0 0 0 0 1 pinseq=3 T 400 700 9 10 1 1 0 0 1 pinlabel=In T 200 900 5 10 0 0 0 0 1 pintype=pas } P 1000 0 1000 300 1 0 0 { T 1100 100 5 10 1 1 0 0 1 pinnumber=2 T 1100 100 5 10 0 0 0 0 1 pinseq=2 T 1100 100 5 10 0 0 0 0 1 pinlabel=2 T 1100 100 5 10 0 0 0 0 1 pintype=pas } B 300 300 1400 1000 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 T 700 1100 5 10 1 1 0 0 1 device=LP2950 T 1100 1400 8 10 1 1 0 6 1 refdes=U? T 1800 1400 8 10 0 0 0 6 1 footprint=TO92 T 1800 1400 8 10 0 0 0 6 1 description=Regulator 100mA Micropower VeroRoute/Src/android-sources/res/drawable-xhdpi/000755 001750 001750 00000000000 14405612071 022250 5ustar00alexalex000000 000000 VeroRoute/libraries/gEDA/veroroute_electromechanical/Switch_Onboard_SPDT.sym000644 001750 001750 00000001373 13515171160 027521 0ustar00alexalex000000 000000 v 20130925 2 T 300 700 8 10 0 0 0 0 1 numslots=0 P 300 700 0 700 1 0 1 { T 150 750 5 10 1 1 0 0 1 pinnumber=2 T 150 750 5 10 0 0 0 0 1 pinseq=2 T 150 750 5 10 0 0 0 0 1 pinlabel=2 T 150 750 5 10 0 0 0 0 1 pintype=pas } P 600 900 900 900 1 0 1 { T 750 950 5 10 1 1 0 0 1 pinnumber=1 T 750 950 5 10 0 0 0 0 1 pinseq=1 T 750 950 5 10 0 0 0 0 1 pinlabel=1 T 750 950 5 10 0 0 0 0 1 pintype=pas } P 600 500 900 500 1 0 1 { T 750 550 5 10 1 1 0 0 1 pinnumber=3 T 750 550 5 10 0 0 0 0 1 pinseq=3 T 750 550 5 10 0 0 0 0 1 pinlabel=3 T 750 550 5 10 0 0 0 0 1 pintype=pas } L 300 700 600 900 3 0 0 0 -1 -1 T 200 0 5 10 1 1 0 0 1 device=Name T 300 200 8 10 1 1 0 0 1 refdes=S? T 895 793 8 10 0 0 0 0 1 footprint=SWITCH_DT3 T 895 793 8 10 0 0 0 0 1 description=Onboard Switch VeroRoute/libraries/gEDA/veroroute_bbd/MN3207.sym000644 001750 001750 00000003301 13515171160 021666 0ustar00alexalex000000 000000 v 20130925 2 T 300 400 8 10 0 0 0 0 1 numslots=0 B 300 400 1800 1800 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 P 0 1000 300 1000 1 0 0 { T 205 1045 5 10 1 1 0 6 1 pinnumber=1 T 200 1000 5 10 0 0 0 0 1 pinseq=1 T 355 945 5 10 1 1 0 0 1 pinlabel=GND T 200 1000 5 10 0 0 0 0 1 pintype=pwr } P 0 1600 300 1600 1 0 0 { T 205 1645 5 10 1 1 0 6 1 pinnumber=3 T 200 1600 5 10 0 0 0 0 1 pinseq=3 T 355 1545 5 10 1 1 0 0 1 pinlabel=IN T 200 1600 5 10 0 0 0 0 1 pintype=pwr } P 900 2500 900 2200 1 0 0 { T 850 2295 5 10 1 1 90 0 1 pinnumber=5 T 900 2400 5 10 0 0 0 0 1 pinseq=5 T 950 2145 5 10 1 1 90 6 1 pinlabel=VDD T 900 2400 5 10 0 0 0 0 1 pintype=pwr } P 1500 2500 1500 2200 1 0 0 { T 1450 2295 5 10 1 1 90 0 1 pinnumber=4 T 1500 2400 5 10 0 0 0 0 1 pinseq=4 T 1550 2145 5 10 1 1 90 6 1 pinlabel=VGG T 1500 2400 5 10 0 0 0 0 1 pintype=pas } P 2400 1600 2100 1600 1 0 0 { T 2195 1645 5 10 1 1 0 0 1 pinnumber=8 T 2500 1600 5 10 0 0 0 0 1 pinseq=8 T 2045 1545 5 10 1 1 0 6 1 pinlabel=OUT2 T 2500 1600 5 10 0 0 0 0 1 pintype=out } P 2400 1000 2100 1000 1 0 0 { T 2195 1045 5 10 1 1 0 0 1 pinnumber=7 T 2500 1000 5 10 0 0 0 0 1 pinseq=7 T 2045 945 5 10 1 1 0 6 1 pinlabel=OUT1 T 2500 1000 5 10 0 0 0 0 1 pintype=out } P 900 100 900 400 1 0 0 { T 850 305 5 10 1 1 90 6 1 pinnumber=2 T 900 100 5 10 0 0 0 0 1 pinseq=2 T 950 455 5 10 1 1 90 0 1 pinlabel=CP1 T 900 100 5 10 0 0 0 0 1 pintype=clk } P 1500 100 1500 400 1 0 0 { T 1450 305 5 10 1 1 90 6 1 pinnumber=6 T 1500 100 5 10 0 0 0 0 1 pinseq=6 T 1550 455 5 10 1 1 90 0 1 pinlabel=CP2 T 1500 100 5 10 0 0 0 0 1 pintype=clk } T 1900 2455 5 10 1 1 0 0 1 device=MN3207 T 1900 2655 8 10 1 1 0 0 1 refdes=U? T 1600 2055 8 10 0 1 0 0 1 footprint=DIP8 T 1900 1845 8 10 0 1 0 0 1 description=1024-Stage BBD VeroRoute/libraries/gEDA/veroroute_diode/LED.sym000644 001750 001750 00000001673 13515171160 022013 0ustar00alexalex000000 000000 v 20130925 2 T 300 700 8 10 0 0 0 0 1 numslots=0 P 300 700 500 700 1 0 0 { T 405 745 5 8 0 1 0 6 1 pinnumber=1 T 400 745 5 8 0 0 0 6 1 pinseq=1 T 400 745 9 8 0 0 0 6 1 pinlabel=1 T 400 745 5 8 0 0 0 6 1 pintype=pas } P 1200 700 1000 700 1 0 0 { T 1095 745 5 8 0 1 0 0 1 pinnumber=2 T 1095 745 5 8 0 0 0 0 1 pinseq=2 T 1095 745 9 8 0 0 0 0 1 pinlabel=2 T 1095 745 5 8 0 0 0 0 1 pintype=pas } L 600 900 600 500 3 0 0 0 -1 -1 L 600 900 900 700 3 0 0 0 -1 -1 L 900 700 600 500 3 0 0 0 -1 -1 L 1000 700 900 700 3 0 0 0 -1 -1 L 600 700 500 700 3 0 0 0 -1 -1 L 900 900 900 500 3 0 0 0 -1 -1 L 800 1000 750 975 3 0 0 0 -1 -1 L 800 1000 775 950 3 0 0 0 -1 -1 L 700 900 800 1000 3 0 0 0 -1 -1 L 800 900 900 1000 3 0 0 0 -1 -1 L 900 1000 850 975 3 0 0 0 -1 -1 L 900 1000 875 950 3 0 0 0 -1 -1 T 900 400 5 10 1 1 180 0 1 device=LED T 900 1200 8 10 1 1 180 0 1 refdes=D? T 400 400 8 10 0 0 0 0 1 footprint=LED T 400 400 8 10 0 0 0 0 1 description=Light Emitting Diode VeroRoute/libraries/gEDA/veroroute_logic/4049.sym000644 001750 001750 00000002660 13515171161 022016 0ustar00alexalex000000 000000 v 20130925 2 T 1700 2700 5 10 0 0 0 0 1 slot=1 T 1700 700 5 10 0 0 0 0 1 numslots=6 T 1700 900 5 10 0 0 0 0 1 slotdef=1:3,2,1,8 T 1700 1100 5 10 0 0 0 0 1 slotdef=2:5,4,1,8 T 1700 1300 5 10 0 0 0 0 1 slotdef=3:7,6,1,8 T 1700 1500 5 10 0 0 0 0 1 slotdef=4:9,10,1,8 T 1700 1700 5 10 0 0 0 0 1 slotdef=5:11,12,1,8 T 1700 1900 5 10 0 0 0 0 1 slotdef=6:14,15,1,8 P 0 500 300 500 1 0 0 { T 200 550 5 8 1 1 0 6 1 pinnumber=3 T 200 450 5 8 0 0 0 0 1 pinseq=1 T 350 500 9 8 0 0 0 0 1 pinlabel=in T 350 500 5 8 0 0 0 0 1 pintype=in } P 1000 500 1200 500 1 0 1 { T 1000 550 5 8 1 1 0 0 1 pinnumber=2 T 1000 450 5 8 0 0 0 0 1 pinseq=2 T 850 500 9 8 0 0 0 0 1 pinlabel=out T 850 500 5 8 0 0 0 0 1 pintype=out } P 600 800 600 650 1 0 0 { T 730 775 5 8 1 1 180 0 1 pinnumber=1 T 600 900 5 8 0 0 0 0 1 pinseq=3 T 255 750 9 8 0 0 180 6 1 pinlabel=VDD T 600 900 5 8 0 0 0 0 1 pintype=pwr } P 600 200 600 350 1 0 0 { T 645 350 5 8 1 1 180 6 1 pinnumber=8 T 600 200 5 8 0 0 0 0 1 pinseq=4 T 545 375 9 8 0 0 180 0 1 pinlabel=VSS T 600 200 5 8 0 0 0 0 1 pintype=pwr } L 300 800 300 200 3 0 0 0 -1 -1 L 300 800 900 500 3 0 0 0 -1 -1 L 900 500 300 200 3 0 0 0 -1 -1 L 575 575 625 575 3 0 0 0 -1 -1 L 600 600 600 550 3 0 0 0 -1 -1 L 575 425 625 425 3 0 0 0 -1 -1 V 950 500 50 6 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 T 800 900 9 10 1 1 0 0 1 device=4049 T 1700 500 5 10 0 0 0 0 1 footprint=DIP16 T 300 900 8 10 1 1 0 0 1 refdes=U? T 1700 2300 5 10 0 0 0 0 1 description=Inverting Hex Buffer VeroRoute/libraries/gEDA/veroroute_regulator/LM79xx.sym000644 001750 001750 00000001453 13515171161 023374 0ustar00alexalex000000 000000 v 20130925 2 T 1700 800 5 10 0 0 0 0 1 numslots=0 P 1700 800 2000 800 1 0 1 { T 1800 900 5 10 1 1 0 0 1 pinnumber=3 T 1800 900 5 10 0 0 0 0 1 pinseq=3 T 1600 700 9 10 1 1 0 6 1 pinlabel=Out T 1800 900 5 10 0 0 0 0 1 pintype=pas } P 0 800 300 800 1 0 0 { T 200 900 5 10 1 1 0 6 1 pinnumber=2 T 200 900 5 10 0 0 0 0 1 pinseq=2 T 400 700 9 10 1 1 0 0 1 pinlabel=In T 200 900 5 10 0 0 0 0 1 pintype=pas } P 1000 0 1000 300 1 0 0 { T 1100 100 5 10 1 1 0 0 1 pinnumber=1 T 1100 100 5 10 0 0 0 0 1 pinseq=1 T 1100 100 5 10 0 0 0 0 1 pinlabel=1 T 1100 100 5 10 0 0 0 0 1 pintype=pas } B 300 300 1400 1000 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 T 700 1100 5 10 1 1 0 0 1 device=LM79xx T 1100 1400 8 10 1 1 0 6 1 refdes=U? T 1800 1400 8 10 0 0 0 6 1 footprint=TO220 T 1800 1400 8 10 0 0 0 6 1 description=Negative Regulator 1.5A VeroRoute/libraries/gEDA/veroroute_linear/Generic_SIP8.sym000644 001750 001750 00000003201 13515171161 023742 0ustar00alexalex000000 000000 v 20130925 2 T 300 0 8 10 0 0 0 0 1 numslots=0 B 300 0 1400 3200 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 P 0 3000 300 3000 1 0 0 { T 205 3045 5 10 1 1 0 6 1 pinnumber=1 T 200 3000 5 10 0 1 0 0 1 pinseq=1 T 355 2995 5 10 0 1 0 0 1 pinlabel=1 T 200 3000 5 10 0 1 0 0 1 pintype=pas } P 0 2600 300 2600 1 0 0 { T 205 2645 5 10 1 1 0 6 1 pinnumber=2 T 200 2600 5 10 0 1 0 0 1 pinseq=2 T 355 2545 5 10 0 1 0 0 1 pinlabel=2 T 200 2600 5 10 0 1 0 0 1 pintype=pas } P 0 2200 300 2200 1 0 0 { T 205 2245 5 10 1 1 0 6 1 pinnumber=3 T 200 2200 5 10 0 1 0 0 1 pinseq=3 T 355 2145 5 10 0 1 0 0 1 pinlabel=3 T 200 2200 5 10 0 1 0 0 1 pintype=pas } P 0 1800 300 1800 1 0 0 { T 205 1845 5 10 1 1 0 6 1 pinnumber=4 T 200 1800 5 10 0 1 0 0 1 pinseq=4 T 355 1745 5 10 0 1 0 0 1 pinlabel=4 T 200 1800 5 10 0 1 0 0 1 pintype=pas } P 0 1400 300 1400 1 0 0 { T 205 1445 5 10 1 1 0 6 1 pinnumber=5 T 200 1400 5 10 0 1 0 0 1 pinseq=5 T 355 1345 5 10 0 1 0 0 1 pinlabel=5 T 200 1400 5 10 0 1 0 0 1 pintype=pas } P 0 1000 300 1000 1 0 0 { T 205 1045 5 10 1 1 0 6 1 pinnumber=6 T 200 1000 5 10 0 1 0 0 1 pinseq=6 T 355 945 5 10 0 1 0 0 1 pinlabel=6 T 200 1000 5 10 0 1 0 0 1 pintype=pas } P 0 600 300 600 1 0 0 { T 205 645 5 10 1 1 0 6 1 pinnumber=7 T 200 600 5 10 0 1 0 0 1 pinseq=7 T 355 545 5 10 0 1 0 0 1 pinlabel=7 T 200 600 5 10 0 1 0 0 1 pintype=pas } P 0 200 300 200 1 0 0 { T 205 245 5 10 1 1 0 6 1 pinnumber=8 T 200 200 5 10 0 1 0 0 1 pinseq=8 T 355 145 5 10 0 1 0 0 1 pinlabel=8 T 200 200 5 10 0 1 0 0 1 pintype=pas } T 1200 3355 5 10 1 1 0 0 1 device=Name T 300 3355 8 10 1 1 0 0 1 refdes=U? T 1600 2055 8 10 0 1 0 0 1 footprint=SIP8 T 1900 1845 8 10 0 1 0 0 1 description=Generic 8 Pin SIP VeroRoute/Src/bomdialog.h000644 001750 001750 00000002261 14026034476 015600 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include class MainWindow; class Ui_BomDialog; class BomDialog : public QDialog { Q_OBJECT public: explicit BomDialog(MainWindow* parent = nullptr); ~BomDialog(); void Update(); protected: void keyPressEvent(QKeyEvent* event); void keyReleaseEvent(QKeyEvent* event); public slots: void WriteToFile(); private: Ui_BomDialog* ui; MainWindow* m_pMainWindow; QStringList m_tableHeader; }; VeroRoute/Src/hotkeysdialog.cpp000644 001750 001750 00000007445 14241511055 017045 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #include "hotkeysdialog.h" #include "ui_hotkeysdialog.h" #include "mainwindow.h" HotkeysDialog::HotkeysDialog(MainWindow* parent) : QDialog(parent) , ui(new Ui_HotkeysDialog) , m_pMainWindow(parent) { ui->setupUi(this); Setup(); } HotkeysDialog::~HotkeysDialog() { delete ui; } void HotkeysDialog::Setup() { typedef std::pair KEY_ACTION ; std::list list; list.push_back( KEY_ACTION("Ctrl + click-drag mouse", "Move whole layout") ); list.push_back( KEY_ACTION("R + click-drag mouse", "Select parts/tracks by area") ); list.push_back( KEY_ACTION("Ctrl+A", "Select all parts") ); list.push_back( KEY_ACTION("Shift + mouse button", "Add/Remove to selected parts") ); list.push_back( KEY_ACTION("Z", "Rotate selected parts counter-clockwise") ); list.push_back( KEY_ACTION("X", "Rotate selected parts clockwise") ); list.push_back( KEY_ACTION("V", "Copy and paste selected parts") ); list.push_back( KEY_ACTION("G", "Group selected parts") ); list.push_back( KEY_ACTION("U", "Un-group selected parts") ); list.push_back( KEY_ACTION("W", "Wipe all tracks") ); list.push_back( KEY_ACTION("L", "Switch layer (Top/Bottom)") ); list.push_back( KEY_ACTION("P + left mouse button", "Paint pin") ); list.push_back( KEY_ACTION("P + right mouse button", "Un-paint pin") ); list.push_back( KEY_ACTION("SPACE + left mouse button", "Paint track (excluding pins)") ); list.push_back( KEY_ACTION("SPACE + right mouse button", "Un-paint track (excluding pins)") ); list.push_back( KEY_ACTION("F + left mouse button", "Paint with flood-fill (all connected tracks + pins)") ); // Set up the table ui->tableWidget->clear(); ui->tableWidget->setRowCount(static_cast( list.size() )); ui->tableWidget->setColumnCount(2); ui->tableWidget->setColumnWidth(0,257); ui->tableWidget->setColumnWidth(1,400); m_tableHeader << "Action" << "Behaviour"; ui->tableWidget->setHorizontalHeaderLabels(m_tableHeader); ui->tableWidget->verticalHeader()->setVisible(false); ui->tableWidget->setEditTriggers(QAbstractItemView::AllEditTriggers); ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); ui->tableWidget->setSelectionMode(QAbstractItemView::NoSelection); ui->tableWidget->setShowGrid(true); // Populate the table with data int iRow(0); for (const auto& o : list) { auto pItem0 = new QTableWidgetItem(QString::fromStdString( o.first )); pItem0->setFlags(Qt::NoItemFlags); ui->tableWidget->setItem(iRow, 0, pItem0); auto pItem1 = new QTableWidgetItem(QString::fromStdString( o.second )); pItem1->setFlags(Qt::NoItemFlags); ui->tableWidget->setItem(iRow, 1, pItem1); iRow++; } } void HotkeysDialog::keyPressEvent(QKeyEvent* event) { #ifndef VEROROUTE_ANDROID m_pMainWindow->specialKeyPressEvent(event); #endif QDialog::keyPressEvent(event); event->accept(); } void HotkeysDialog::keyReleaseEvent(QKeyEvent* event) { #ifndef VEROROUTE_ANDROID m_pMainWindow->commonKeyReleaseEvent(event); #endif QDialog::keyReleaseEvent(event); event->accept(); } VeroRoute/libraries/gEDA/veroroute_bbd/MN3209.sym000644 001750 001750 00000003300 13515171160 021667 0ustar00alexalex000000 000000 v 20130925 2 T 300 400 8 10 0 0 0 0 1 numslots=0 B 300 400 1800 1800 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 P 0 1000 300 1000 1 0 0 { T 205 1045 5 10 1 1 0 6 1 pinnumber=1 T 200 1000 5 10 0 0 0 0 1 pinseq=1 T 355 945 5 10 1 1 0 0 1 pinlabel=GND T 200 1000 5 10 0 0 0 0 1 pintype=pwr } P 0 1600 300 1600 1 0 0 { T 205 1645 5 10 1 1 0 6 1 pinnumber=3 T 200 1600 5 10 0 0 0 0 1 pinseq=3 T 355 1545 5 10 1 1 0 0 1 pinlabel=IN T 200 1600 5 10 0 0 0 0 1 pintype=pwr } P 900 2500 900 2200 1 0 0 { T 850 2295 5 10 1 1 90 0 1 pinnumber=5 T 900 2400 5 10 0 0 0 0 1 pinseq=5 T 950 2145 5 10 1 1 90 6 1 pinlabel=VDD T 900 2400 5 10 0 0 0 0 1 pintype=pwr } P 1500 2500 1500 2200 1 0 0 { T 1450 2295 5 10 1 1 90 0 1 pinnumber=4 T 1500 2400 5 10 0 0 0 0 1 pinseq=4 T 1550 2145 5 10 1 1 90 6 1 pinlabel=VGG T 1500 2400 5 10 0 0 0 0 1 pintype=pas } P 2400 1600 2100 1600 1 0 0 { T 2195 1645 5 10 1 1 0 0 1 pinnumber=8 T 2500 1600 5 10 0 0 0 0 1 pinseq=8 T 2045 1545 5 10 1 1 0 6 1 pinlabel=OUT2 T 2500 1600 5 10 0 0 0 0 1 pintype=out } P 2400 1000 2100 1000 1 0 0 { T 2195 1045 5 10 1 1 0 0 1 pinnumber=7 T 2500 1000 5 10 0 0 0 0 1 pinseq=7 T 2045 945 5 10 1 1 0 6 1 pinlabel=OUT1 T 2500 1000 5 10 0 0 0 0 1 pintype=out } P 900 100 900 400 1 0 0 { T 850 305 5 10 1 1 90 6 1 pinnumber=2 T 900 100 5 10 0 0 0 0 1 pinseq=2 T 950 455 5 10 1 1 90 0 1 pinlabel=CP1 T 900 100 5 10 0 0 0 0 1 pintype=clk } P 1500 100 1500 400 1 0 0 { T 1450 305 5 10 1 1 90 6 1 pinnumber=6 T 1500 100 5 10 0 0 0 0 1 pinseq=6 T 1550 455 5 10 1 1 90 0 1 pinlabel=CP2 T 1500 100 5 10 0 0 0 0 1 pintype=clk } T 1900 2455 5 10 1 1 0 0 1 device=MN3209 T 1900 2655 8 10 1 1 0 0 1 refdes=U? T 1600 2055 8 10 0 1 0 0 1 footprint=DIP8 T 1900 1845 8 10 0 1 0 0 1 description=256-Stage BBD VeroRoute/libraries/gEDA/veroroute_transistor/Darlington_PNP_TIP105.sym000644 001750 001750 00000002551 13515171161 026310 0ustar00alexalex000000 000000 v 20130925 2 T 0 900 5 10 0 0 0 0 1 numslots=0 P 0 900 300 900 1 0 0 { T 100 1000 5 8 1 1 0 0 1 pinnumber=1 T 100 1000 5 8 0 0 0 0 1 pinseq=1 T 100 1000 5 8 0 0 0 0 1 pinlabel=1 T 100 1000 5 8 0 0 0 0 1 pintype=pas } P 1000 1700 1000 1400 1 0 0 { T 1100 1400 5 8 1 1 0 0 1 pinnumber=2 T 1100 1400 5 8 0 0 0 0 1 pinseq=2 T 1100 1400 5 8 0 0 0 0 1 pinlabel=2 T 1100 1400 5 8 0 0 0 0 1 pintype=pas } P 1000 0 1000 300 1 0 0 { T 1100 200 5 8 1 1 0 0 1 pinnumber=3 T 1100 200 5 8 0 0 0 0 1 pinseq=3 T 1100 200 5 8 0 0 0 0 1 pinlabel=3 T 1100 200 5 8 0 0 0 0 1 pintype=pas } L 500 1100 500 700 3 0 0 0 -1 -1 L 500 1000 700 1100 3 0 0 0 -1 -1 L 500 800 700 700 3 0 0 0 -1 -1 L 500 900 300 900 3 0 0 0 -1 -1 L 800 900 800 500 3 0 0 0 -1 -1 L 800 800 1000 900 3 0 0 0 -1 -1 L 800 600 1000 500 3 0 0 0 -1 -1 L 1000 900 1000 1200 3 0 0 0 -1 -1 L 1000 1200 700 1200 3 0 0 0 -1 -1 L 700 1100 700 1200 3 0 0 0 -1 -1 L 1000 500 1000 300 3 0 0 0 -1 -1 L 700 700 800 700 3 0 0 0 -1 -1 L 1000 1200 1000 1400 3 0 0 0 -1 -1 V 800 900 500 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 597,791 L 499,800 L 569,727 L 575,760 z H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 897,591 L 799,600 L 869,527 L 875,560 z T 1400 900 5 10 1 1 0 0 1 device=TIP105 T 1400 670 8 10 1 1 0 0 1 refdes=Q? T 1400 400 8 10 0 0 0 0 1 footprint=TO220 T 1400 400 8 10 0 0 0 0 1 description=PNP Darlington Transistor VeroRoute/libraries/TinyCAD/VeroRoute_Battery.TCLib000644 001750 001750 00000050000 13515171160 022441 0ustar00alexalex000000 000000 SQLite format 3@ ћћ.!%%‚tableSymbolSymbolCREATE TABLE [Symbol] ([SymbolID] INTEGER PRIMARY KEY,[Data] TEXT)ƒ8!†9tableNameNameCREATE TABLE [Name] ([NameID] INTEGER PRIMARY KEY,[Name] TEXT,[SymbolID] INTEGER,[Type] INTEGER,[Reference] TEXT,[ppp] INTEGER,[Description] TEXT,[ShowName] INTEGER,[ShowRef] INTEGER,[DefRotate] INTEGE ЧЧJ””9о[E]BAT_NCELL_3PINB?Battery N Cell 3 Pin[E]BAT_NCELL_2PINB?Battery N Cell 2 PinЖE]BAT_2CELL_2PINB?Battery 2 Cell 2 Pin[E]BAT_2CELL_3PINB?Battery 2 Cell 3 PinЖE]BAT_1CELL_2PINB?Battery 1 Cell 2 Pin[E]BAT_1CELL_37 5)9V-BATTERY B?Batteryёћіё‹–@ -10 0 400 0 0 0 0 Arial 000000 1 -1 ‹–@ -10 0 400 0 0 0 0 Arial 000000 1  jЦŒjМММxxxxxxжжж444Ђ)9PackageBATTERY_PCBti$$SPICE_EPILOG_PRIORITY5:i$$SPICE_PROLOG_PRIORITY5Ђ)9PackageBATTERY_PCBti$$SPICE_EPILOG_PRIORITY5:i$$SPICE_PROLOG_PRIORITY5D)9PackageBATTERY_PCBi$$SPICE_EPILOG_PRIORITY5мi$$SPICE_PROLOG_PRIORITY5Ђ)9PackageBATTERY_PCBti$$SPICE_EPILOG_PRIORITY5:i$$SPICE_PROLOG_PRIORITY5D)9PackageBATTERY_PCBi$$SPICE_EPILOG_PRIORITY5мi$$SPICE_PROLOG_PRIORITY5Ђ)9š )!PackagePADS28i$$SPICE_EPILOG_PRIORITY58i$$SPICE_PROLOG_PRIORITY5 ””OЫƒ8!†9tableNameNameCREATE TABLE [Name] ([NameID] INTEGER PRIMARY KEY,[Name] TEXT,[SymbolID] INTEGER,[Type] INTEGER,[Reference] TEXT,[ppp] INTEGER,[Descriptƒ8!†9tableNameNameCREATE TABLE [Name] ([NameID] INTEGER PRIMARY KEY,[Name] TEXT,[SymbolID] INTEGER,[Type] INTEGER,[Reference] TEXT,[ppp] INTEGER,[Description] TEXT,[ShowName] INTEGER,[ShowRef] INTEGER,[DefRotate] INTEGER).!%%‚tableSymbolSymbolCREATE TABLE [Symbol] ([SymbolID] INTEGER PRIMARY KEY,[Data] TEXT) юњєюмммИИИИИИІІІ”””   $    $ &&[‚2!11„tableAttributeAttributeCREATE TABLE [Attribute] ([AttributeID] INTEGER PRIMARY KEY,[NameID] INTEGER,[AttName] TEXT,[AttValue] TEXT,[ShowAtt] INTEGER)"!51aindexidx_NameIDAttributeCREATE INDEX [idx_NameID] ON [Attribute] ( [NameID] ) ЎЎWrt='0' number='3' show='3' length='25' number_pos='0' centre_name='0'> -10 0 400 0 0 0 0 Arial 000000 1 -1 ‹–@ -10 0 400 0 0 0 0 Arial 000000 1 -1  000000 ME> 000000 1 -1 000000 ЭЭояŠ” -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial -10 0 400 0 0 0 0 Arial 000000 1 -1 000000 ME> 000000 1 -1 000000 ME> 000000 1 -1 000000 ME> 000000 1 -1 000000 ME> 000000 1 -1 000000 ME> 000000 1 -1 000000 яя  t='0' number='2' show='2' length='20' number_pos='0' centre_name='0'> -10 0 400 0 0 0 0 Arial000000 VeroRoute/Src/veroroute.pro000644 001750 001750 00000012236 14430473030 016241 0ustar00alexalex000000 000000 #------------------------------------------------- # # Project created by QtCreator 2013-07-01T09:05:55 # #------------------------------------------------- QT += core gui network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += c++11 CONFIG += optimize_full TARGET = veroroute TEMPLATE = app SOURCES += bomdialog.cpp \ aliasdialog.cpp \ compdialog.cpp \ controldialog.cpp \ finddialog.cpp \ hotkeysdialog.cpp \ infodialog.cpp \ main.cpp \ mainwindow.cpp \ mainwindow_drawing.cpp \ mainwindow_events.cpp \ myscrollarea.cpp \ padoffsetdialog.cpp \ pindialog.cpp \ renderingdialog.cpp \ templatesdialog.cpp \ textdialog.cpp \ wiredialog.cpp \ Board.cpp \ Board_routing.cpp \ Board_components.cpp \ Board_import.cpp \ ColorManager.cpp \ CompTypes.cpp \ CompDefiner.cpp \ Component.cpp \ CurveList.cpp \ FootPrint.cpp \ GuiControl.cpp \ GWriter.cpp \ SimplexFont.cpp HEADERS += bomdialog.h \ aliasdialog.h \ controldialog.h \ compdialog.h \ finddialog.h \ hotkeysdialog.h \ infodialog.h \ mainwindow.h \ padoffsetdialog.h \ pindialog.h \ renderingdialog.h \ templatesdialog.h \ textdialog.h \ wiredialog.h \ myscrollarea.h \ AdjInfo.h \ AdjInfoManager.h \ Board.h \ ColorManager.h \ Common.h \ CompTypes.h \ CompDefiner.h \ CompElement.h \ CompManager.h \ Component.h \ ConnectionMatrix.h \ CurveList.h \ Element.h \ FootPrint.h \ Grid.h \ GroupManager.h \ GuiControl.h \ GPainter.h \ GWriter.h \ HistoryManager.h \ MyRGB.h \ NodeInfo.h \ NodeInfoManager.h \ Pin.h \ PolygonHelper.h \ Persist.h \ Rect.h \ RectManager.h \ Shape.h \ SimplexFont.h \ SpanningTreeHelper.h \ StringHelper.h \ Template.h \ TemplateManager.h \ TextRect.h \ TextManager.h \ TrackElement.h \ Transform.h \ VeroRouteAndroid.h \ Version.h \ VrtVersion.h FORMS += bomdialog.ui \ aliasdialog.ui \ compdialog.ui \ controldialog.ui \ finddialog.ui \ hotkeysdialog.ui \ infodialog.ui \ mainwindow.ui \ padoffsetdialog.ui \ pindialog.ui \ renderingdialog.ui \ templatesdialog.ui \ textdialog.ui \ wiredialog.ui RESOURCES = veroroute.qrc DESTDIR = .. DISTFILES += QMAKE_INSTALL_FILE = install -m 644 QMAKE_INSTALL_PROGRAM = install -m 755 # For Android builds, we don't want the whole unix section. Just the following section ... android { ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android-sources DISTFILES += android-sources/AndroidManifest.xml \ assets.files = ../tutorials/tutorial_0.vrt \ ../tutorials/tutorial_1.vrt \ ../tutorials/tutorial_2.vrt \ ../tutorials/tutorial_3.vrt \ ../tutorials/tutorial_4.vrt \ ../tutorials/tutorial_5.vrt \ ../tutorials/tutorial_6.vrt \ ../tutorials/tutorial_7.vrt \ ../tutorials/tutorial_8.vrt \ ../tutorials/tutorial_9.vrt \ ../tutorials/tutorial_10.vrt \ ../tutorials/tutorial_11.vrt \ ../tutorials/tutorial_12.vrt \ ../tutorials/tutorial_13.vrt \ ../tutorials/tutorial_14.vrt \ ../tutorials/tutorial_15.vrt \ ../tutorials/tutorial_16.vrt \ ../tutorials/tutorial_17.vrt \ ../tutorials/tutorial_18.vrt \ ../tutorials/tutorial_19.vrt \ ../tutorials/tutorial_20.vrt \ ../tutorials/tutorial_21.vrt \ ../tutorials/tutorial_22.vrt \ ../tutorials/tutorial_23.vrt \ ../tutorials/tutorial_24.vrt \ ../tutorials/tutorial_25.vrt \ ../tutorials/tutorial_26.vrt assets.path = /assets/tutorials/ INSTALLS += target assets } unix : !android { target.path = $${PREFIX}/bin/ target.files = ../veroroute manpage.path = $${PREFIX}/share/man/man1 manpage.files = ../veroroute.1 metainfo.path = $${PREFIX}/share/metainfo metainfo.files = ../veroroute.appdata.xml # If we've specified a PREFIX then replace the existing "../veroroute.desktop" # with one produced from "../veroroute.desktop.default" !isEmpty(PREFIX) { system(sed 's_/usr_$${PREFIX}_' ../veroroute.desktop.default > ../veroroute.desktop) } desktopentry.path = $${PREFIX}/share/applications desktopentry.files = ../veroroute.desktop pixmapA.path = $${PREFIX}/share/pixmaps pixmapA.files = ../veroroute.png pixmapB.path = $${PREFIX}/share/veroroute pixmapB.files = ../veroroute.png pixmapC.path = $${PREFIX}/share/icons/hicolor/72x72/apps pixmapC.files = ../veroroute.png tutorials.path = $${PREFIX}/share/veroroute/tutorials tutorials.files = ../tutorials/* gedasymbols.path = $${PREFIX}/share/gEDA/sym gedasymbols.files = ../libraries/gEDA/veroroute_* gedalib.path = $${PREFIX}/share/gEDA/gafrc.d gedalib.files = ../libraries/gEDA/veroroute-clib.scm INSTALLS += target manpage metainfo desktopentry pixmapA pixmapB pixmapC tutorials gedasymbols gedalib } VeroRoute/Src/renderingdialog.ui000644 001750 001750 00000057736 14433652154 017210 0ustar00alexalex000000 000000 RenderingDialog 0 0 330 630 330 630 830 630 Rendering Options 350 0 131 71 AntiAlias 490 0 190 71 Background 0 160 330 25 true Component Text Size Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 260 190 61 27 Text size for pin labels 5 11 9 70 190 61 27 Text size for part Name/Value labels 5 11 9 180 190 81 27 Pin labels 10 190 61 27 Label 0 230 330 25 true Track Widths (mil) Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 10 260 61 27 Pad Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 70 260 61 27 Pad width (1 mil = 0.001 inches) 50 98 1 90 260 260 61 27 Via pad width (1 mil = 0.001 inches) 16 80 1 50 180 260 81 27 Via Pad Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 10 290 61 27 Hole Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 70 290 61 27 Hole width (1 mil = 0.001 inches) 20 50 1 26 180 290 81 27 Via Hole Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 260 290 61 27 Via hole width (1 mil = 0.001 inches) 8 40 1 25 70 320 61 27 Track width (1 mil = 0.001 inches) 4 50 1 46 10 320 61 27 Track Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 260 320 61 27 Gap width for ground-fills (1 mil = 0.001 inches) 5 30 1 10 180 320 81 27 Gap Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 10 350 171 27 false Qt::TabFocus Use X-pattern of tags for all thermal reliefs Thermal X-pattern 10 380 171 27 false Qt::TabFocus Show closest tracks in view Show closest tracks 260 350 61 27 Thermal relief tag width (1 mil = 0.001 inches) 4 50 1 46 180 350 81 27 Thermal Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 10 410 311 27 true false Info: Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 10 440 311 27 true false Info: Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 180 570 61 27 Solder mask margin (1 mil = 0.001 inches) 0 10 1 4 10 570 161 27 Solder Mask Margin Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 180 600 61 27 Silkscreen line width (1 mil = 0.001 inches) 1 10 1 7 10 600 161 27 Silkscreen Line Width Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 180 510 61 27 Board edge margin (1 mil = 0.001 inches) 0 50 1 0 10 510 161 27 Board Edge Margin Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 180 540 61 27 Board edge margin (1 mil = 0.001 inches) 0 50 1 0 10 540 161 27 Ground Fill Perimeter Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 0 480 330 25 true PCB Parameters (mil) Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 180 100 81 27 Height 260 100 61 27 Height of target board 1 999 10 70 100 61 27 Width of target board 1 999 9 10 100 61 27 Width 10 130 311 27 false Qt::TabFocus Draw area outside the target board in a darker shade Shade off-board area 0 70 330 25 true Target Board Size (x100 mil) Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 70 30 51 27 false Qt::TabFocus On 10 30 61 27 false Qt::TabFocus Off 150 30 111 27 Brightness (%) 260 30 61 27 Height of target board 0 100 5 100 0 0 150 25 true Anti-alias Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 150 0 180 25 true Background Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 0 70 330 2 QFrame::Sunken 1 Qt::Horizontal 0 160 330 2 QFrame::Sunken 1 Qt::Horizontal 0 230 330 2 QFrame::Sunken 1 Qt::Horizontal 0 480 330 2 QFrame::Sunken 1 Qt::Horizontal antiAliasOff antiAliasOn spinBox_bright spinBox_width spinBox_height shade comptext comppins padWidth viapadWidth holeWidth viaholeWidth trackWidth gapWidth Xthermals tagWidth closeTracks edgeWidth fillWidth maskWidth silkWidth VeroRoute/libraries/gEDA/veroroute_battery/Battery.sym000644 001750 001750 00000001247 13515171160 023404 0ustar00alexalex000000 000000 v 20130925 2 T 500 700 8 10 0 0 0 0 1 numslots=0 P 500 700 700 700 1 0 0 { T 600 800 5 8 1 1 0 6 1 pinnumber=1 T 600 600 5 8 0 1 0 8 1 pinseq=1 T 700 700 9 8 1 1 0 0 1 pinlabel=+ T 500 400 5 8 0 0 0 0 1 pintype=pwr } P 1200 700 1000 700 1 0 0 { T 1100 800 5 8 1 1 0 0 1 pinnumber=2 T 1100 600 5 8 0 1 0 2 1 pinseq=2 T 1000 700 9 8 1 1 0 6 1 pinlabel=- T 1315 397 5 8 0 0 0 0 1 pintype=pwr } L 800 900 800 500 3 0 0 0 -1 -1 L 900 800 900 600 3 0 0 0 -1 -1 L 1000 700 900 700 3 0 0 0 -1 -1 L 700 700 800 700 3 0 0 0 -1 -1 T 800 300 5 10 1 1 0 0 1 device=9V T 800 1000 8 10 1 1 0 0 1 refdes=B? T 295 1200 8 10 0 0 0 0 1 footprint=PADS2 T 295 1200 8 10 0 0 0 0 1 description=Battery VeroRoute/Src/TrackElement.h000644 001750 001750 00000016102 14377762350 016230 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include "Persist.h" // A "TrackElement" object provides a local description of the track pattern at a grid point. // It stores the node ID at a grid point, along with an 8-bit code describing the // connections to the 8 surrounding points. // This connection code solves the "competing diagonals" problem. // So if there are 4 grid points painted with two node IDs (A and B) as follows // A B // B A // then setting the code appropriately at each point will allow // a single diagonal connection to exist, either (A-A) or (B-B). Q_DECL_CONSTEXPR static const int NUM_NBRS = 9; // (NBR_L to NBR_LB) + NBR_X // Indexes for the 8 neighbour elements in the same layer, starting on the left and going clockwise Q_DECL_CONSTEXPR static const int NBR_L(0), NBR_LT(1), NBR_T(2), NBR_RT(3), // Left, Left-Top, Top, Right-Top, NBR_R(4), NBR_RB(5), NBR_B(6), NBR_LB(7); // Right, Right-Bottom, Bottom, Left-Bottom Q_DECL_CONSTEXPR static const int NBR_X(8); // Index for the neighbour element in the layer above/below Q_DECL_CONSTEXPR static inline int Opposite(int NBR) // Helper to get opposite neighbour index { return ( NBR == NBR_X ) ? NBR_X : ( ( NBR + 4 ) % 8 ); } // Functions for mapping NBR indices to "code bits" and manipulating them Q_DECL_CONSTEXPR static inline bool ReadCodeBit(int NBR, int iCode) { return ( iCode & (1< user assigned the nodeId Q_DECL_CONSTEXPR static const char AUTOSET = 2; // ==> routing algorithm assigned the nodeId Q_DECL_CONSTEXPR static const char AUTOKEPT = (USERSET | AUTOSET); // ==> user assigned the nodeId, and routing algorithm agrees it is useful Q_DECL_CONSTEXPR static const char VEROSET = 4; // ==> auto assigned to create Vero strips Q_DECL_CONSTEXPR static const char RECTSET = 8; // ==> is within a user-defined rect Q_DECL_CONSTEXPR static const int BAD_NODEID = 0; // Invalid node ID (i.e. netlist ID) class TrackElement : public Persist, public Merge { friend class Element; public: TrackElement() {} TrackElement(const TrackElement& o) { *this = o; } virtual ~TrackElement() {} TrackElement& operator=(const TrackElement& o) { m_nodeId = o.m_nodeId; m_iCode = o.m_iCode; m_flag = o.m_flag; return *this; } bool operator==(const TrackElement& o) const // Compare persisted info { return m_nodeId == o.m_nodeId && m_iCode == o.m_iCode && m_flag == o.m_flag; } bool operator!=(const TrackElement& o) const { return !(*this == o); } void SetNodeId(int i) { m_nodeId = i; } void SetCode(int i) { m_iCode = i; } void SetFlag(char i) { m_flag = i; } const int& GetNodeId() const { return m_nodeId; } const int& GetCode() const { return m_iCode; } const char& GetFlag() const { return m_flag; } // Connectivity helpers void SetUsed(int iNbr, bool b) { if ( b ) SetCodeBit(iNbr, m_iCode); else ClearCodeBit(iNbr, m_iCode); } bool GetUsed(int iNbr) const { return ReadCodeBit(iNbr, m_iCode); } bool IsClash(int nodeId) const { return nodeId != BAD_NODEID && m_nodeId != BAD_NODEID && nodeId != m_nodeId; } int GetPerimeterCode(bool bDiagsOK, bool bMinDiags) const // Helper for the GUI "blobs" { int iCode = GetCode() & CODEBITS_LYR; // Take a copy of the connection code, and restrict to same-layer neighbours // Enforce any restrictions on diagonal connections acccording to the GUI options on diagonals const bool bL( ReadCodeBit(NBR_L, iCode) ), bT( ReadCodeBit(NBR_T, iCode) ), bR( ReadCodeBit(NBR_R, iCode) ), bB( ReadCodeBit(NBR_B, iCode) ); if ( ( !bDiagsOK && !(bL && bT) ) || ( bMinDiags && (bL != bT) ) ) ClearCodeBit(NBR_LT, iCode); if ( ( !bDiagsOK && !(bR && bT) ) || ( bMinDiags && (bR != bT) ) ) ClearCodeBit(NBR_RT, iCode); if ( ( !bDiagsOK && !(bL && bB) ) || ( bMinDiags && (bL != bB) ) ) ClearCodeBit(NBR_LB, iCode); if ( ( !bDiagsOK && !(bR && bB) ) || ( bMinDiags && (bR != bB) ) ) ClearCodeBit(NBR_RB, iCode); return iCode; } // Flag Helpers bool ReadFlagBits(char i) const { return ( m_flag & i ) != 0; } void MarkFlagBits(char i) { m_flag |= i; } void WipeFlagBits(char i) { m_flag &= ~i; } // Merge interface functions virtual void UpdateMergeOffsets(MergeOffsets& o) override { if ( m_nodeId != BAD_NODEID ) o.deltaNodeId = std::max(o.deltaNodeId, m_nodeId + 1); } virtual void ApplyMergeOffsets(const MergeOffsets& o) override { if ( m_nodeId != BAD_NODEID ) m_nodeId += o.deltaNodeId; } void Merge(const TrackElement& o) { *this = o; } // Persist interface functions virtual void Load(DataStream& inStream) override { inStream.Load(m_nodeId); inStream.Load(m_iCode); inStream.Load(m_flag); if ( inStream.GetVersion() < VRT_VERSION_11 ) ConvertLegacyFlag(); } virtual void Save(DataStream& outStream) override { outStream.Save(m_nodeId); outStream.Save(m_iCode); outStream.Save(m_flag); } private: void ConvertLegacyFlag() // Map legacy flag values to new bitfield based values { switch( m_flag ) { case 0: m_flag = USERSET; break; case 1: m_flag = AUTOKEPT; break; case 2: m_flag = AUTOSET; break; case 3: m_flag = VEROSET; break; default: assert(0); } } private: int m_nodeId = BAD_NODEID; // The netlist value assigned to the element (or BAD_NODEID if not set) int m_iCode = 0; // An 8-bit code describing connections to the 8 same-layer neighbours. Bit set ==> connection used char m_flag = USERSET; // For routing: USERSET/AUTOKEPT/AUTOSET/VEROSET/RECTSET }; VeroRoute/Src/images/erasegrid.png000644 001750 001750 00000010236 14206721677 017421 0ustar00alexalex000000 000000 ‰PNG  IHDR szzєbKGDџџџ НЇ“ pHYsФФ•+tIMEц;лЄ‡Z+IDATX  пяРЪср‰5ЦЬвџ:4. wЫџџџџХ*сФ ЦЬвџ:4.ЦАвџџџџџџџџџџџХ*ЦЬвџ:4.фџџџџџџџХ*Їнџ:4.фЦЬвZЋљ џџџџХ*Їнџ:4.фЦЬвZЋљџџџџџџџџџџХ*СЗЇнџ:4.фЦЬвџХ*џџџџХ*СЗц‹&џ:4.фЦЬвYp#џџџџџџџХ*ц‹&џ:4.фЦЬвYp#;жџџџџџџџХ*Їнџ:4.ф;жџІU:4.фЦЬвZЋљџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџІU:4.фYЊјџџџџџџџџџџџџџџџџџџЇV:4.фЦЬвЇVфЦЬвYЊјЇV:4.ффЦЬвYЊјk†ФФ0МЦЬвЦЬвYЊјk†ФVEЊМ<аDЦЬвџџџџk†ФVEЊЛт<аDYЊјVEФ0МYЊјџj…УVEЊЛт–{=џХ*ас0ђkРџЊЛт$єЫљџ5ас0ђkР™џЊЛт$є=^HџХ*ас0ђkР™џ$єreIЫљџ5;жџ=j…У$єreIџХ*ас0ђ;жџммм$$$Ыљџ5;ж0ђ;жџммммммџџЫљџ5џџџсЭb>>§њ+IENDЎB`‚VeroRoute/libraries/gEDA/veroroute_electromechanical/Switch_Offboard_SPDT.sym000644 001750 001750 00000001367 13515171160 027662 0ustar00alexalex000000 000000 v 20130925 2 T 300 700 8 10 0 0 0 0 1 numslots=0 P 300 700 0 700 1 0 1 { T 150 750 5 10 1 1 0 0 1 pinnumber=2 T 150 750 5 10 0 0 0 0 1 pinseq=2 T 150 750 5 10 0 0 0 0 1 pinlabel=2 T 150 750 5 10 0 0 0 0 1 pintype=pas } P 600 900 900 900 1 0 1 { T 750 950 5 10 1 1 0 0 1 pinnumber=1 T 750 950 5 10 0 0 0 0 1 pinseq=1 T 750 950 5 10 0 0 0 0 1 pinlabel=1 T 750 950 5 10 0 0 0 0 1 pintype=pas } P 600 500 900 500 1 0 1 { T 750 550 5 10 1 1 0 0 1 pinnumber=3 T 750 550 5 10 0 0 0 0 1 pinseq=3 T 750 550 5 10 0 0 0 0 1 pinlabel=3 T 750 550 5 10 0 0 0 0 1 pintype=pas } L 300 700 600 900 3 0 0 0 -1 -1 T 200 0 5 10 1 1 0 0 1 device=Name T 300 200 8 10 1 1 0 0 1 refdes=S? T 895 793 8 10 0 0 0 0 1 footprint=PADS3 T 895 793 8 10 0 0 0 0 1 description=Offboard Switch VeroRoute/Src/templatesdialog.ui000644 001750 001750 00000011201 14400222354 017167 0ustar00alexalex000000 000000 TemplatesDialog true 0 0 360 630 360 630 580 630 Parts Library 0 24 360 210 Qt::NoFocus Double click on a part to add it to the layout false 10 538 341 27 Qt::TabFocus Add selected parts in the current layout to the library Add from current layout 10 598 341 27 Qt::TabFocus Delete the selected library part. There is no undo option. Delete selected library part 0 258 360 271 Qt::NoFocus Double click on a part to add it to the layout false 11 568 161 27 Qt::TabFocus Update the library with parts from a VRT file Add from VRT 190 568 161 27 Qt::TabFocus Save the library to a VRT file Save to VRT 5 0 351 24 75 true Generic Parts Qt::AlignCenter 5 234 351 24 75 true Library Parts Qt::AlignCenter tableWidget_2 pushButton pushButton_3 pushButton_4 pushButton_2 tableWidget VeroRoute/tutorials/tutorial_16.vrt000644 001750 001750 00000150403 14433261505 017676 0ustar00alexalex000000 000000 9 іTUTORIAL 16 - TYPICAL LAYOUT PROCEDURE The typical circuit layout procedure is the following (assuming no netlist has been imported). 1) Add components to the grid and put them roughly as they appear in the schematic. 2) Enable auto-routing and paint in the component pins. Painting the pins is the one thing you have to get correct as you are effectively specifying the netlist by doing this. Once you have all the pins painted there should be no further need to paint them. 3) You can then manipulate the parts to try and minimise area. It is up to you to decide how to lay out the circuit. The program will do the boring work of preventing short-circuits and checking for open-circuits. 4) When there are no more broken nets and you are happy with the layout, hit the "Paste" button. You can then edit the tracks manually if you wish. Note that you do not have to use auto-routing, and the layout in this example was done manually. Try the following on the current layout: Hit "Wipe All Tracks" and set the track style to "Curved" and diagonals to "Min". Then enable auto-routing. See if you can minimise area by moving components such as the middle transistors to the left. Notice that the auto-routing code will not always use the wire jumpers, and sometimes uses them unwisely. You can remove the unused ones, and will have to manually paint ones that are not used as you wish. џџџџџџџџџџџZ.. 2< џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@)џџџџџ@2џџџџџ@3џџџџџ@4џџџџџџpџџџџџџџџџџСџџџџџџџџџџ pџџџџџџџџџџ Сџџџџџџџџџ@Eџџџџџџ @џџџџџџџџџџpџџџџџџџџџџСџџџџџџџџџ@Eџџџџџ@5џџџџџ@6џџџџџ@7џџџџџџpџџџџџџџџџС8џџџџџ!@9џџџџџ@:џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџџџџџGџџџџџџ |џџџџџџџџџџ ЧџџџџџџџџџџDџџџџџџџџџџ Dџџџџџџџџџџ|џџџџџџџџџџЧџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџ\Gџџџџџџ‡џџџџџџџџџ!+џџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDAџџџџџџ @џџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџ @џџџџџџџџџџ @џџџџџџџџџџ |џџџџџџџџџџ ЧџџџџџџџџџDAџџџџџџ Dџџџџџџџџџџ|џџџџџџџџџџЧџџџџџџџџџDFџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџLџџџџџџџџџpFџџџџџџСџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџ DџџџџџџDџџџџџџџџџDџџџџџџ Dџџџџџџџџџ D$џџџџџџ |џџџџџџџџџ Ч$џџџџџD џџџџџ D&џџџџџџ|џџџџџџџџџЧ&џџџџџDџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџ|џџџџџЧџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ фџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџ D%џџџџџџ |џџџџџџџџџ ч%џџџџџџџџџџџџџџџ D'џџџџџџ|џџџџџџџџџч'џџџџџџџџџџџџџџџџDџџџџџџџџџ"џџџџџџDџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ#џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ xџџџџџџџџџџ ѕџџџџџџџџџ ѓџџџџџ Сџџџџџ Dџџџџџ Dџџџџџ |џџџџџ їџџџџџџ Уџџџџџџџџџ Dџџџџџ| џџџџџїџџџџџџУџџџџџџџџџџDџџџџџџџџџџ@џџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџ@џџџџџџџџџџpџџџџџџџџџџСџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ |џџџџџџ пџџџџџџџџџџ Ÿџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ ?џџџџџџџџџ G џџџџџџ џџџџџџџџџџџџџџџџџџџџ?џџџџџџџџџGџџџџџџDџџџџџџџџџD"џџџџџџDџџџџџџџџџџDџџџџџџџџџdџџџџџ<џџџџџG#џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ <џџџџџџџџџџ OџџџџџџџџџџpџџџџџџџџџСџџџџџџpџџџџџџџџџёџџџџџџёџџџџџџџџџСџџџџџџ FџџџџџџџџџpџџџџџџёџџџџџџџџџСџџџџџџFџџџџџџџџџџDџџџџџџџџџHџџџџџџDџџџџџџџџџџDџџџџџџџџџtHџџџџџџУџџџџџџџџџџFџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџ fџџџџџџџџџ<џџџџџџGџџџџџџџџџ<џџџџџџ_џџџџџџџџџПџџџџџџGџџџџџџџџџџ Dџџџџџџџџџџ\џџџџџџџџџП џџџџџџGџџџџџџџџџDIџџџџџџDџџџџџџџџџ@IџџџџџџDџџџџџџџџџџDџџџџџџџџџџ<џџџџџџџџџџGџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџd*џџџџџџ 4џџџџџџџџџ  C,џџџџџ F,џџџџџ @,џџџџџџNџџџџџџџџџ @-џџџџџ F-џџџџџ  D-џџџџџџLџџџџџџџџџ @.џџџџџ F.џџџџџ D.џџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџ @/џџџџџ F/џџџџџ D/џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџtџџџџџУџџџџџџ џџџџџџџџџФџџџџџDџџџџџџDџџџџџџџџџD џџџџџDџџџџџџ DџџџџџџџџџD џџџџџDџџџџџD џџџџџџџџџџџФџџџџџџџџџ џџџџџФџџџџџџdџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ|џџџџџџџџџџЧџџџџџџџџџxџџџџџџХџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџ DџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџxџџџџџџџџџХ!џџџџџџxџџџџџџџџџџХџџџџџџџџџџtџџџџџџџџџџѓџџџџџџџџџџСџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ\џџџџџџџџџџ‡џџџџџџџџџ џџџџџџџџџџџџџџџџќџџџџџџџџџџџџџџџџџџџџџЧџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџpџџџџџСџџџџџpџџџџџёџџџџџџёџџџџџџџџџё џџџџџСџџџџџpџџџџџС џџџџџpџџџџџС џџџџџLџџџџџp!џџџџџџёџџџџџџџџџљџџџџџџ§џџџџџџџџџџџџџџџЧџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџBџџџџџџџџџџџџџџџџџџџџџџџџџBџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџCџџџџџџџџџџџџџџџџџџџџџџџџџCџџџџџDџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ(џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџBџџ,R2100kRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R19100kRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d7 Pad10 Tone3PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R18470kRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџШB Wire2 Wire2WireWireWF(12Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџџєC70.1uCCeramicCAP_CERAMIC NF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ, R13100kRResistorRESISTOR SF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R1720kRResistorRESISTORSF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџШC Wire3 Wire3WireWire WF(12Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџџєC8500pCCeramicCAP_CERAMIC NF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,R212k7RResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ, R14470kRResistorRESISTOR SF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R2010kRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R3390RRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d: Pad13Vol3PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ, R1210kRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R16390RRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џџџџџџџШA Wire1 Wire1WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџєC647nCCeramicCAP_CERAMIC NF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,R1512kRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R2322kRResistorRESISTORSF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џє C103n9CCeramicCAP_CERAMICSF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PџџџШE Wire5 Wire5WireWire WF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџє#C130.1uCCeramicCAP_CERAMICNF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PџєC10.1uCCeramicCAP_CERAMICSF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PџШI Wire9 Wire9WireWire WF(12П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџџџџџШF Wire6 Wire6WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџє!C1110nCCeramicCAP_CERAMICSF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PџєC40.1uCCeramicCAP_CERAMICWF(1 2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pd+Pad4OutPadPadPAD$WF(!1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџє"C120.1uCCeramicCAP_CERAMICNF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PџєC947nCCeramicCAP_CERAMIC NF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pd*Pad3InPadPadPAD џџџ№WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R9470kRResistorRESISTOR NF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєC5500pCCeramicCAP_CERAMIC NF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ P   L,Q1 2N5088QTO92TO92 EF(12 3Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i      L-Q2 2N5088QTO92TO92 WF(12 3Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   d)Pad2+9VPadPadPADџџџьWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпd(Pad1GndPadPadPADWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџ'D4 1N4148D Diode DIODE WF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џfD?у333332?у333332Пй™™™™™š?й™™™™™š@V€џfD?фЬЬЬЬЬЬ?фЬЬЬЬЬЬПй™™™™™š?й™™™™™š@V€џfD?ѕ™™™™™™?ѕ™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џfDџ&D3 1N4148D Diode DIODE EF(1 2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џfD?у333332?у333332Пй™™™™™š?й™™™™™š@V€џfD?фЬЬЬЬЬЬ?фЬЬЬЬЬЬПй™™™™™š?й™™™™™š@V€џfD?ѕ™™™™™™?ѕ™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џfDџ%D2 1N4148D Diode DIODEWF( 1 2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џfD?у333332?у333332Пй™™™™™š?й™™™™™š@V€џfD?фЬЬЬЬЬЬ?фЬЬЬЬЬЬПй™™™™™š?й™™™™™š@V€џfD?ѕ™™™™™™?ѕ™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џfDџ$D1 1N4148D Diode DIODEEF( 1 2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џfD?у333332?у333332Пй™™™™™š?й™™™™™š@V€џfD?фЬЬЬЬЬЬ?фЬЬЬЬЬЬПй™™™™™š?й™™™™™š@V€џfD?ѕ™™™™™™?ѕ™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џfDd6Pad9 Tone2PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R8100kRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d5Pad8 Tone1PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R710kRResistorRESISTOR NF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d4Pad7Sustain3PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R61kRResistorRESISTORWF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d3Pad6Sustain2PadPadPADSF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R512kRResistorRESISTORNF(1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ, R1012kRResistorRESISTOR NF(1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d8 Pad11Vol1PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпd9 Pad12Vol2PadPadPADџџџфNF(!1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ, R11390RRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R139kRResistorRESISTORSF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   L/Q4 2N5088QTO92TO92 WF(123Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џєC2500pCCeramicCAP_CERAMIC NF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ P џџџџџџџџџџШG Wire7 Wire7WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџєC30.1uCCeramicCAP_CERAMICWF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PџџШH Wire8 Wire8WireWire WF(12Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџџџ,R4470kRResistorRESISTOR NF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d2Pad5Sustain1PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R221MRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џШD Wire4 Wire4WireWire WF(12П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџ   L.Q3 2N5088QTO92TO92 WF(123Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   B@џџџўINVALID TracksWF(џџџ€џџџ€џџџ€џџџ€џџџџџџџџF#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Р@Р@@V€џVeroRoute/libraries/gEDA/veroroute_logic/000755 001750 001750 00000000000 14405612072 020660 5ustar00alexalex000000 000000 VeroRoute/libraries/gEDA/veroroute_transistor/PNP_TIP32.sym000644 001750 001750 00000001563 13515171161 024050 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=1 T 100 550 5 6 0 0 0 0 1 pinseq=1 T 100 550 5 6 0 0 0 0 1 pinlabel=1 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=2 T 400 850 5 6 0 0 0 0 1 pinseq=2 T 400 850 5 6 0 0 0 0 1 pinlabel=2 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=3 T 400 50 5 6 0 0 0 0 1 pinseq=3 T 400 50 5 6 0 0 0 0 1 pinlabel=3 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 297,341 L 199,350 L 269,277 L 275,310 z T 600 700 5 10 1 1 0 0 1 device=TIP32 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO220 T 600 400 8 10 0 0 0 0 1 description=PNP Transistor VeroRoute/libraries/gEDA/veroroute_electromechanical/Switch_Onboard_DPDT.sym000644 001750 001750 00000002462 13515171160 027502 0ustar00alexalex000000 000000 v 20130925 2 T 300 1400 8 10 0 0 0 0 1 numslots=0 P 300 1400 0 1400 1 0 1 { T 150 1450 5 10 1 1 0 0 1 pinnumber=3 T 150 1450 5 10 0 0 0 0 1 pinseq=3 T 150 1450 5 10 0 0 0 0 1 pinlabel=3 T 150 1450 5 10 0 0 0 0 1 pintype=pas } P 600 1600 900 1600 1 0 1 { T 750 1650 5 10 1 1 0 0 1 pinnumber=1 T 750 1650 5 10 0 0 0 0 1 pinseq=1 T 750 1650 5 10 0 0 0 0 1 pinlabel=1 T 750 1650 5 10 0 0 0 0 1 pintype=pas } P 600 1200 900 1200 1 0 1 { T 750 1250 5 10 1 1 0 0 1 pinnumber=5 T 750 1250 5 10 0 0 0 0 1 pinseq=5 T 750 1250 5 10 0 0 0 0 1 pinlabel=5 T 750 1250 5 10 0 0 0 0 1 pintype=pas } P 300 700 0 700 1 0 1 { T 150 750 5 10 1 1 0 0 1 pinnumber=4 T 150 750 5 10 0 0 0 0 1 pinseq=4 T 150 750 5 10 0 0 0 0 1 pinlabel=4 T 150 750 5 10 0 0 0 0 1 pintype=pas } P 600 900 900 900 1 0 1 { T 750 950 5 10 1 1 0 0 1 pinnumber=2 T 750 950 5 10 0 0 0 0 1 pinseq=2 T 750 950 5 10 0 0 0 0 1 pinlabel=2 T 750 950 5 10 0 0 0 0 1 pintype=pas } P 600 500 900 500 1 0 1 { T 750 550 5 10 1 1 0 0 1 pinnumber=6 T 750 550 5 10 0 0 0 0 1 pinseq=6 T 750 550 5 10 0 0 0 0 1 pinlabel=6 T 750 550 5 10 0 0 0 0 1 pintype=pas } L 300 1400 600 1600 3 0 0 0 -1 -1 L 300 700 600 900 3 0 0 0 -1 -1 T 200 0 5 10 1 1 0 0 1 device=Name T 300 200 8 10 1 1 0 0 1 refdes=S? T 895 193 8 10 0 0 0 0 1 footprint=SWITCH_DT6 T 895 193 8 10 0 0 0 0 1 description=Onboard Switch VeroRoute/libraries/gEDA/veroroute_transistor/NPN_BC239.sym000644 001750 001750 00000001562 13515171161 023766 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=1 T 400 850 5 6 0 0 0 0 1 pinseq=1 T 400 850 5 6 0 0 0 0 1 pinlabel=1 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=3 T 400 50 5 6 0 0 0 0 1 pinseq=3 T 400 50 5 6 0 0 0 0 1 pinlabel=3 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 403,209 L 501,200 L 431,273 L 425,240 z T 600 700 5 10 1 1 0 0 1 device=BC239 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=NPN Transistor VeroRoute/examples/000755 001750 001750 00000000000 14405612071 014552 5ustar00alexalex000000 000000 VeroRoute/Src/images/left.png000644 001750 001750 00000004306 13661712157 016404 0ustar00alexalex000000 000000 ‰PNG  IHDR Ўt‚щgAMAБ ќabKGDџ‡ЬП pHYs з зB(›xtIMEу+УўЎGIDATH <УїОн‘нўЏў џs ПЎ џTЮФлс ќ‘{ђ­у(єlœіTўщ ьяќ‘КЊэsўт љњџНЌчQ&{ОНџЪIENDЎB`‚VeroRoute/libraries/gEDA/veroroute_regulator/LM317.sym000644 001750 001750 00000001434 13515171161 023066 0ustar00alexalex000000 000000 v 20130925 2 T 1700 800 5 10 0 0 0 0 1 numslots=0 P 1700 800 2000 800 1 0 1 { T 1800 900 5 10 1 1 0 0 1 pinnumber=2 T 1800 900 5 10 0 0 0 0 1 pinseq=2 T 1600 700 9 10 1 1 0 6 1 pinlabel=Out T 1800 900 5 10 0 0 0 0 1 pintype=pas } P 0 800 300 800 1 0 0 { T 200 900 5 10 1 1 0 6 1 pinnumber=3 T 200 900 5 10 0 0 0 0 1 pinseq=3 T 400 700 9 10 1 1 0 0 1 pinlabel=In T 200 900 5 10 0 0 0 0 1 pintype=pas } P 1000 0 1000 300 1 0 0 { T 1100 100 5 10 1 1 0 0 1 pinnumber=1 T 1100 100 5 10 0 0 0 0 1 pinseq=1 T 1100 100 5 10 0 0 0 0 1 pinlabel=1 T 1100 100 5 10 0 0 0 0 1 pintype=pas } B 300 300 1400 1000 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 T 700 1100 5 10 1 1 0 0 1 device=LM317 T 1100 1400 8 10 1 1 0 6 1 refdes=U? T 1800 1400 8 10 0 0 0 6 1 footprint=TO220 T 1800 1400 8 10 0 0 0 6 1 description=Regulator VeroRoute/libraries/gEDA/veroroute_transistor/PNP_BC327.sym000644 001750 001750 00000001562 13515171161 023766 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=1 T 400 850 5 6 0 0 0 0 1 pinseq=1 T 400 850 5 6 0 0 0 0 1 pinlabel=1 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=3 T 400 50 5 6 0 0 0 0 1 pinseq=3 T 400 50 5 6 0 0 0 0 1 pinlabel=3 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 297,341 L 199,350 L 269,277 L 275,310 z T 600 700 5 10 1 1 0 0 1 device=BC327 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=PNP Transistor VeroRoute/libraries/gEDA/veroroute_linear/Generic_DIP12.sym000644 001750 001750 00000004560 13515171161 024007 0ustar00alexalex000000 000000 v 20130925 2 T 300 0 8 10 0 0 0 0 1 numslots=0 B 300 0 1400 2400 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 P 0 2200 300 2200 1 0 0 { T 205 2245 5 10 1 1 0 6 1 pinnumber=1 T 200 2200 5 10 0 1 0 0 1 pinseq=1 T 355 2195 5 10 0 1 0 0 1 pinlabel=1 T 200 2200 5 10 0 1 0 0 1 pintype=pas } P 0 1800 300 1800 1 0 0 { T 205 1845 5 10 1 1 0 6 1 pinnumber=2 T 200 1800 5 10 0 1 0 0 1 pinseq=2 T 355 1745 5 10 0 1 0 0 1 pinlabel=2 T 200 1800 5 10 0 1 0 0 1 pintype=pas } P 0 1400 300 1400 1 0 0 { T 205 1445 5 10 1 1 0 6 1 pinnumber=3 T 200 1400 5 10 0 1 0 0 1 pinseq=3 T 355 1345 5 10 0 1 0 0 1 pinlabel=3 T 200 1400 5 10 0 1 0 0 1 pintype=pas } P 0 1000 300 1000 1 0 0 { T 205 1045 5 10 1 1 0 6 1 pinnumber=4 T 200 1000 5 10 0 1 0 0 1 pinseq=4 T 355 945 5 10 0 1 0 0 1 pinlabel=4 T 200 1000 5 10 0 1 0 0 1 pintype=pas } P 0 600 300 600 1 0 0 { T 205 645 5 10 1 1 0 6 1 pinnumber=5 T 200 600 5 10 0 1 0 0 1 pinseq=5 T 355 545 5 10 0 1 0 0 1 pinlabel=5 T 200 600 5 10 0 1 0 0 1 pintype=pas } P 0 200 300 200 1 0 0 { T 205 245 5 10 1 1 0 6 1 pinnumber=6 T 200 200 5 10 0 1 0 0 1 pinseq=6 T 355 145 5 10 0 1 0 0 1 pinlabel=6 T 200 200 5 10 0 1 0 0 1 pintype=pas } P 2000 2200 1700 2200 1 0 0 { T 1795 2245 5 10 1 1 0 0 1 pinnumber=12 T 1800 2200 5 10 0 1 0 6 1 pinseq=12 T 1645 2195 5 10 0 1 0 6 1 pinlabel=12 T 1800 2200 5 10 0 1 0 6 1 pintype=pas } P 2000 1800 1700 1800 1 0 0 { T 1795 1845 5 10 1 1 0 0 1 pinnumber=11 T 1800 1800 5 10 0 1 0 6 1 pinseq=11 T 1645 1795 5 10 0 1 0 6 1 pinlabel=11 T 1800 1800 5 10 0 1 0 6 1 pintype=pas } P 2000 1400 1700 1400 1 0 0 { T 1795 1445 5 10 1 1 0 0 1 pinnumber=10 T 1800 1400 5 10 0 1 0 6 1 pinseq=10 T 1645 1395 5 10 0 1 0 6 1 pinlabel=10 T 1800 1400 5 10 0 1 0 6 1 pintype=pas } P 2000 1000 1700 1000 1 0 0 { T 1795 1045 5 10 1 1 0 0 1 pinnumber=9 T 1800 1000 5 10 0 1 0 6 1 pinseq=9 T 1645 995 5 10 0 1 0 6 1 pinlabel=9 T 1800 1000 5 10 0 1 0 6 1 pintype=pas } P 2000 600 1700 600 1 0 0 { T 1795 645 5 10 1 1 0 0 1 pinnumber=8 T 1800 600 5 10 0 1 0 6 1 pinseq=8 T 1645 595 5 10 0 1 0 6 1 pinlabel=8 T 1800 600 5 10 0 1 0 6 1 pintype=pas } P 2000 200 1700 200 1 0 0 { T 1795 245 5 10 1 1 0 0 1 pinnumber=7 T 1800 200 5 10 0 1 0 6 1 pinseq=7 T 1645 195 5 10 0 1 0 6 1 pinlabel=7 T 1800 200 5 10 0 1 0 6 1 pintype=pas } T 1200 2555 5 10 1 1 0 0 1 device=Name T 300 2555 8 10 1 1 0 0 1 refdes=U? T 1600 2055 8 10 0 1 0 0 1 footprint=DIP12 T 1900 1845 8 10 0 1 0 0 1 description=Generic 12 Pin DIP8 VeroRoute/libraries/gEDA/veroroute_transistor/Darlington_NPN_TIP100.sym000644 001750 001750 00000002552 13515171161 026302 0ustar00alexalex000000 000000 v 20130925 2 T 0 900 5 10 0 0 0 0 1 numslots=0 P 0 900 300 900 1 0 0 { T 100 1000 5 8 1 1 0 0 1 pinnumber=1 T 100 1000 5 8 0 0 0 0 1 pinseq=1 T 100 1000 5 8 0 0 0 0 1 pinlabel=1 T 100 1000 5 8 0 0 0 0 1 pintype=pas } P 1000 1700 1000 1400 1 0 0 { T 1100 1400 5 8 1 1 0 0 1 pinnumber=2 T 1100 1400 5 8 0 0 0 0 1 pinseq=2 T 1100 1400 5 8 0 0 0 0 1 pinlabel=2 T 1100 1400 5 8 0 0 0 0 1 pintype=pas } P 1000 0 1000 300 1 0 0 { T 1100 200 5 8 1 1 0 0 1 pinnumber=3 T 1100 200 5 8 0 0 0 0 1 pinseq=3 T 1100 200 5 8 0 0 0 0 1 pinlabel=3 T 1100 200 5 8 0 0 0 0 1 pintype=pas } L 500 1100 500 700 3 0 0 0 -1 -1 L 500 1000 700 1100 3 0 0 0 -1 -1 L 500 800 700 700 3 0 0 0 -1 -1 L 500 900 300 900 3 0 0 0 -1 -1 L 800 900 800 500 3 0 0 0 -1 -1 L 800 800 1000 900 3 0 0 0 -1 -1 L 800 600 1000 500 3 0 0 0 -1 -1 L 1000 900 1000 1200 3 0 0 0 -1 -1 L 1000 1200 700 1200 3 0 0 0 -1 -1 L 700 1100 700 1200 3 0 0 0 -1 -1 L 1000 500 1000 300 3 0 0 0 -1 -1 L 700 700 800 700 3 0 0 0 -1 -1 L 1000 1200 1000 1400 3 0 0 0 -1 -1 V 800 900 500 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 903,509 L 1001,500 L 931,573 L 925,540 z H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 603,709 L 701,700 L 631,773 L 625,740 z T 1400 900 5 10 1 1 0 0 1 device=TIP100 T 1400 670 8 10 1 1 0 0 1 refdes=Q? T 1400 400 8 10 0 0 0 0 1 footprint=TO220 T 1400 400 8 10 0 0 0 0 1 description=NPN Darlington Transistor VeroRoute/Src/Common.h000644 001750 001750 00000003271 14553541067 015101 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once // Comment out following 3 lines on debug builds to enable assert() #ifndef NDEBUG #define NDEBUG #endif // Uncomment next line to allow test SOICs using component editor //#define _TEST_SOIC // Uncomment next line to allow grid debug info via F4 key //#define _GRID_DEBUG #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "qcompilerdetection.h" // For Q_DECL_CONSTEXPR Q_DECL_CONSTEXPR static const double DBL_PI = 3.14159265358979323846; Q_DECL_CONSTEXPR static const double DBL_PI_4 = DBL_PI / 4.0; Q_DECL_CONSTEXPR static const double RADIANS_PER_DEGREE = DBL_PI / 180.0; Q_DECL_CONSTEXPR static const double DEGREES_PER_RADIAN = 180.0 / DBL_PI; VeroRoute/Src/images/addchord.png000644 001750 001750 00000001011 13734462467 017217 0ustar00alexalex000000 000000 ‰PNG  IHDR szzєbKGDљCЛ pHYsФФ•+tIMEф ##RЛ Г–IDATXУЭ–=jУ@…gЬ щдhk“*Pа%rШ\ТD—0ЈP-7юBвНё’бьњYй0иfэїэМблe”%Щz~ЈяZ}}О1m\;§EпЕЈі5UћšŸоqs€[знŒє Sheet 1

18V Electric Mistress / Reworked LFO & VCO Alex Lawrow 1.0 1 1 of 1 1 12-Mar-2018
-10 0 400 0 0 0 0 Arial -13 6 400 0 0 0 0 Arial -13 6 400 0 0 0 0 Arial -13 6 400 0 0 0 0 Arial 000000 1 FF0000 1 -1 000000 0 AFFFFF 100k R? Resistor 1 $$SPICE_PROLOG_PRIORITY 5 000002 0.00000,0.00000 $$SPICE_EPILOG_PRIORITY 5 000002 0.00000,0.00000 Package RESISTOR 000001 0.00000,0.00000 82n C? Film 1 $$SPICE_PROLOG_PRIORITY 5 000002 0.00000,0.00000 $$SPICE_EPILOG_PRIORITY 5 000002 0.00000,0.00000 Package CAP_FILM 000001 0.00000,0.00000 TL072 U? Dual Op Amp (DIP) 2 $$SPICE_PROLOG_PRIORITY 5 000002 0.00000,0.00000 $$SPICE_EPILOG_PRIORITY 5 000002 0.00000,0.00000 Package DIP8 000001 0.00000,0.00000 + + - - OUTPUT + - OUTPUT 20k-B RT? Trimpot (On-board) 1 10k-A RV? Potentiometer (Off-board) 1 $$SPICE_PROLOG_PRIORITY 5 000002 0.00000,0.00000 $$SPICE_EPILOG_PRIORITY 5 000002 0.00000,0.00000 Package PADS3 000001 0.00000,0.00000 2N5088/2N5089 Q? Transistor NPN 1 $$SPICE_PROLOG_PRIORITY 5 000002 0.00000,0.00000 $$SPICE_EPILOG_PRIORITY 5 000002 0.00000,0.00000 Package TO92 000001 0.00000,0.00000 PAD J? Connection Pad 1 $$SPICE_PROLOG_PRIORITY 5 000002 0.00000,0.00000 $$SPICE_EPILOG_PRIORITY 5 000002 0.00000,0.00000 Package PAD 000001 0.00000,0.00000 1u C? Electrolytic, Pitch 100 mil, Diameter 200 mil 1 $$SPICE_PROLOG_PRIORITY 5 000002 0.00000,0.00000 $$SPICE_EPILOG_PRIORITY 5 000002 0.00000,0.00000 Package CAP_ELECTRO_200 000001 0.00000,0.00000 SW-SPDT SW? SPDT (Off-Board) 1 $$SPICE_PROLOG_PRIORITY 5 000002 0.00000,0.00000 $$SPICE_EPILOG_PRIORITY 5 000002 0.00000,0.00000 Package PADS3 000001 0.00000,0.00000 1N4148 D? Diode 1 $$SPICE_PROLOG_PRIORITY 5 000002 0.00000,0.00000 $$SPICE_EPILOG_PRIORITY 5 000002 0.00000,0.00000 Package DIODE 000001 0.00000,0.00000 20k-B RT? Trimpot (On-board) 1 $$SPICE_PROLOG_PRIORITY 5 000002 0.00000,0.00000 $$SPICE_EPILOG_PRIORITY 5 000002 0.00000,0.00000 Package TRIM_VERT 000001 0.00000,0.00000 2N5086/2N5087 Q? Transistor PNP 1 $$SPICE_PROLOG_PRIORITY 5 000002 0.00000,0.00000 $$SPICE_EPILOG_PRIORITY 5 000002 0.00000,0.00000 Package TO92 000001 0.00000,0.00000 LM311 U? Comparator 1 $$SPICE_PROLOG_PRIORITY 5 000002 0.00000,0.00000 $$SPICE_EPILOG_PRIORITY 5 000002 0.00000,0.00000 Package DIP8 000001 0.00000,0.00000 + - V- COL OUT EMIT OUT V+ BALANCE BAL/STRB CD4013 U? Dual D-Type Flip-FLop 2 $$SPICE_PROLOG_PRIORITY 5 000002 0.00000,0.00000 $$SPICE_EPILOG_PRIORITY 5 000002 0.00000,0.00000 Package DIP14 000001 0.00000,0.00000 CLOCK VDD D VSS RESET SET Q Q* CLOCK D RESET SET Q Q* LM78Lxx U? Regulator 100mA 1 $$SPICE_PROLOG_PRIORITY 5 000002 0.00000,0.00000 $$SPICE_EPILOG_PRIORITY 5 000002 0.00000,0.00000 Package TO92 000001 0.00000,0.00000 Gnd Out In SAD1024 U? Dual 512-Stage BDD 2 $$SPICE_PROLOG_PRIORITY 5 000002 0.00000,0.00000 $$SPICE_EPILOG_PRIORITY 5 000002 0.00000,0.00000 Package DIP16 000001 0.00000,0.00000 GND CP1 IN VBB VDD CP2 OUT OUT* NC NC NC CP1 IN CP2 OUT OUT* 2u2 C? Electrolytic, Pitch 100 mil, Diameter 250 mil 1 $$SPICE_PROLOG_PRIORITY 5 000002 0.00000,0.00000 $$SPICE_EPILOG_PRIORITY 5 000002 0.00000,0.00000 Package CAP_ELECTRO_250 000001 0.00000,0.00000 1 0 000000 000000 000000 000000 208000 000000 000080 208020 FFFFFF FFFFFF FF0000 FF0000 Filter matrix Sweep VeroRoute/libraries/gEDA/veroroute_transistor/NPN_BC182.sym000644 001750 001750 00000001562 13515171161 023763 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=1 T 400 850 5 6 0 0 0 0 1 pinseq=1 T 400 850 5 6 0 0 0 0 1 pinlabel=1 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=3 T 400 50 5 6 0 0 0 0 1 pinseq=3 T 400 50 5 6 0 0 0 0 1 pinlabel=3 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 403,209 L 501,200 L 431,273 L 425,240 z T 600 700 5 10 1 1 0 0 1 device=BC182 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=NPN Transistor VeroRoute/Src/CurveList.cpp000644 001750 001750 00000006005 14415574351 016121 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #include "CurveList.h" Curve::Curve(const QPoint& p, GPEN ePen, int width) : m_ePen(ePen), m_width(width) { push_back(p); } Curve::Curve(const QPolygon& polygon, GPEN ePen, int width) : m_ePen(ePen), m_width(width) { for (const auto& p : polygon) push_back(p); // DO NOT COMPRESS BY DEFAULT. That's only OK for open line segments } void Curve::Compress() // Removes redundant points { unique(); while ( size() > 2 ) { bool bChanged(false); auto A = begin(); auto B = A; ++B; auto C = B; ++C; for (; C != end(); ++A, ++B, ++C) { if ( A->x() == B->x() && B->x() == C->x() ) // Vertical { if ( ( B->y() >= A->y() && B->y() <= C->y() ) || ( B->y() >= C->y() && B->y() <= A->y() ) ) { (*B) = (*A); // .. make B == A so we can remove it as not unique bChanged = true; } } else if ( A->y() == B->y() && B->y() == C->y() ) // Horizontal { if ( ( B->x() >= A->x() && B->x() <= C->x() ) || ( B->x() >= C->x() && B->x() <= A->x() ) ) { (*B) = (*A); // .. make B == A so we can remove it as not unique bChanged = true; } } } if ( !bChanged ) return; unique(); } } bool Curve::Splice(Curve* pB) // Tries to splice curve B to this { if ( m_ePen != pB->m_ePen ) return false; // Pens must match if ( m_width != pB->m_width ) return false; // Widths must match if ( empty() || pB->empty() ) return false; // Curves must have points // Try to get back of 'this' matching front of 'pB', then splice 'pB' to 'this' if ( front() == pB->back() ) { reverse(); pB->reverse(); } else if ( front() == pB->front() ) { reverse(); } else if ( back() == pB->back() ) { pB->reverse(); } if ( back() == pB->front() ) { splice(end(), *pB); Compress(); return true; } return false; } void CurveList::Clear() { for (auto& p : *this) p->clear(); clear(); } void CurveList::Sort() { sort( Curve::HasLargerPen() ); } void CurveList::SpliceAll() { Sort(); // Sort list of curves by pen width and type bool bDone(false); // Keep splicing curves together till no more splices are possible. while ( !bDone ) { bDone = true; for (auto iterA = begin(); iterA != end(); ++iterA) { auto iterB = iterA; ++iterB; for (; iterB != end(); ++iterB) if ( (*iterA)->Splice(*iterB) ) bDone = false; } } } VeroRoute/Src/myscrollarea.h000644 001750 001750 00000005521 14371053356 016343 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include #include #include #include // Wrapper to send mouse wheel and key press events to the mainwindow instead of the scroll bars class MyScrollArea : public QScrollArea { Q_OBJECT public: MyScrollArea(QWidget* parent = nullptr); ~MyScrollArea() {} void SetRequestTopLeftView(bool b) { m_bRequestTopLeftView = b; } void SetRequestCentreView(bool b) { m_bRequestCentreView = b; } void CentreView() { if ( !m_bRequestTopLeftView && !m_bRequestCentreView ) return; auto* pH = horizontalScrollBar(); auto* pV = verticalScrollBar(); if ( m_bRequestTopLeftView ) { const bool bChanged = ( pH->value() != pH->minimum() ) || ( pV->value() != pV->minimum() ); if ( bChanged ) { pH->setValue( pH->minimum() ); pV->setValue( pV->minimum() ); m_bRequestTopLeftView = false; } } if ( m_bRequestCentreView ) { const int iHcentre = ( pH->minimum() + pH->maximum() ) / 2; const int iVcentre = ( pV->minimum() + pV->maximum() ) / 2; const bool bChanged = ( pH->value() != iHcentre ) || ( pV->value() != iVcentre ); if ( bChanged ) { pH->setValue(iHcentre); pV->setValue(iVcentre); m_bRequestCentreView = false; } } } protected: void resizeEvent(QResizeEvent* event) { QScrollArea::resizeEvent(event); CentreView(); } void wheelEvent(QWheelEvent* event) { if ( m_parent ) QCoreApplication::sendEvent(m_parent, event); } void keyPressEvent(QKeyEvent* event) { if ( m_parent ) QCoreApplication::sendEvent(m_parent, event); } void keyReleaseEvent(QKeyEvent* event ) { if ( m_parent ) QCoreApplication::sendEvent(m_parent, event); } bool viewportEvent(QEvent* event); private: qreal GetSpread(const QList& points) const; private: QWidget* m_parent; std::chrono::steady_clock::time_point m_lastTouchBegin; bool m_bRequestCentreView = false; bool m_bRequestTopLeftView = false; bool m_bTouchCancelled = false; bool m_bDoubleClickCancelled = false; long long m_releaseDuration_ms = 0; qreal m_dSpread = 0; int m_maxPoints = 0; }; VeroRoute/Src/pindialog.h000644 001750 001750 00000002437 14371045544 015617 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include class MainWindow; class Ui_PinDialog; class Component; class PinDialog : public QWidget { Q_OBJECT public: explicit PinDialog(QWidget* parent = nullptr); ~PinDialog(); void SetMainWindow(MainWindow* p); void Update(); protected: void keyPressEvent(QKeyEvent* event); void keyReleaseEvent(QKeyEvent* event); public slots: void CellChanged(int row, int col); private: Component* GetUserComp() const; // Helper Ui_PinDialog* ui; MainWindow* m_pMainWindow; QStringList m_tableHeader; }; VeroRoute/CHANGELOG.txt000644 001750 001750 00000105110 14565711452 014774 0ustar00alexalex000000 000000 V2.38 New feature: New View menu item to allow tracks to be colored in Mono mode. V2.37 Draw components using PCB style when in Mono mode. Bug fix: In PCB mode, the GUI could select and move text boxes, even though they are not displayed. Improvement: No longer double-click to modify pin layer preference. Added a toolbar button to allow pin layer preferences to be changed using single clicks. Improvement: Added "Auto-set Pin Layer Preferences" option to Layers menu. V2.36 Improvement: Automatically force text-box text to black or white when in Mono mode. V2.35 New feature: Added View menu item to toggle between Inverse/Normal Mono mode. New feature: Added Ground Fill Perimeter parameter to PCB parameters. Made the Board Edge Margin (PCB parameter) apply to all view types, and account for it when drawing to screen. Bug fix: Writing to PDF was not centering the page correctly. Bug fix: Metric Gerber files were not as compressed as they could be. Improvement: If closing via X-button or windows toolbar, ask for confirmation if layout has been modified. V2.34 Bug fix: Component editor was not storing pin info correctly, so pins of placed part not protected by regular track painting. Improvement: Added "Yes To All" option for overwriting library parts when adding to library from VRT/layout. V2.33 Bug fix: Label offsets were not persisted by the Component Editor. Bug fix: If not forcing X-thermals, the code for producing additional thermal relief tags was missing extra checks for tags in the diagonal direction. Bug fix: File -> Open (merge into current) could show the newly loaded board with PCB style shapes while in Color mode. Bug fix: Autocrop and Margin controls were not immediately updating the board size info in the status bar. Bug fix: The Generic Parts list in the Parts Library should not mention the number of default pins (e.g. should say DIP not DIP8). Bug fix: Vias within the ground fill were not rendered correctly, especially if forcing X-thermals. Bug fix: Code for placing board holes (i.e. unusable locations) was only checking that the bottom layer was not painted instead of all layers. Bug fix: Could get duplicate target points in the routing list. Improvement: Allow non-custom library parts (e.g. T092) to be overwritten if the Import string has not changed but the Prefix string has. Improvement: Allow editing of a library part without placing it, by selecting it in the Parts Library then switching to Component Editor mode. New feature: Added support for some SOICs (8,14,16,20,24,28 pin). See Tutorial 26. V2.32 Bug fix: When adding a new library part, should allow overwrite of an existing library part with matching Type string and matching (non-empty) Import string, but different Value string. Added veroroute.appdata.xml metainfo to installation. V2.31 New feature: Part Aliases dialog for easier import of netlists with unknown footprint/package types. Improvement: Allow library parts to be overwritten. V2.30 Gerber Generator version 1.0. Write drill file using XNC format as defined in Ucamco specification. Draw pads as squares in PCB mode. Increased size of LED symbol. V2.29 Increased routing algorithm speed by 30%. Replaced "Templates" terminology with "Parts Library" and updated tutorials. V2.28 Bug fix: Code for X-thermals not properly handling isolated ground pad on 2-layer board. V2.27 Bug fix: Bug in component manager leads to incorrect warning about circuit not being saved (even if it has been). Disabled use of double-click for rotating parts. V2.26 Removed infrequently used icons from the toolbar. Added tutorial info on text boxes. V2.25 Bug fix: Major bug. Double-clicking on a user-defined template to add the part to the layout can give the wrong footprint unless the part was created using component editor. Bug fix: Some actions in the Key/Mouse Actions Dialog were removed in V2.20 but still listed. V2.24 Bug fix: Broken Nets list was not updating the main view if user scrolled to a list item instead of clicking on it. V2.23 New feature: Option to force thermal reliefs to use an X-shaped pattern of tags. Speeded-up code for spanning-trees and connection matrices. V2.22 Bug fix: Fix extent of protrusion into ground-fill by extra thermal reliefs. Bug fix: Error in how extra thermal reliefs considered in minimum track separation. V2.21 Bug fix: Unreliable redraw when double-click, especially on Android tablet interface. Bug fix: Was possible to paint/erase pins and paint flood in non-Color mode. Bug fix: Should allow pin layer preference to be set, even if pin has no netlist ID assigned. Bug fix: Extra checks needed when saving files on Android, as the system might add extra characters after the filename suffix. Improvement: Double-click to change pin layer preference should also select netlist ID of the pin. V2.20 Bug fix: Don't allow Vero tracks with Mono/PCB mode. They should be mutually exclusive. Bug fix: Disable distance tool in Component Editor Mode. Bug fix: Pin Labels editor was not writing changes to Undo/Redo history. Bug fix: "Select Parts by Area" was not correctly accounting for footprint overlap with the highlighted area. Bug fix: Component Editor was not drawing L/R aligned pin labels in the correct place. Bug fix: Templates dialog was not correctly checking for duplicate entries. Bug fix: Templates dialog could delete the wrong template without warning if the user scrolls to select the template instead of clicking on it. Bug fix: B.O.M. could put parts with the same Value but different Type onto the same row. Bug fix: B.O.M. not immediately updating on component add. Bug fix: Load of VRT files was not checking for zero version number. Bug fix: Double clicking on a generic part in the Templates dialog (to add it to the layout) was not setting the default name/value. Bug fix: File->New was not forcing a single-layer board to be created. Bug fix: Stripes on flying wires were not always rendered properly on unix builds. Bug fix: Component Editor Mode was not working if "flip view" options were enabled in Circuit Layout Mode. New feature: Complete reworking of how connectivity info is displayed (no more red lines all over the tracks). Instead show missing connections with a minimal set of air-wires. Improvement: Removed the "flip view" options from the toolbar (they were too easy to hit by mistake on a tablet screen). They are only in the View menu now. Improvement: No longer use "T" key to change pin layer preference for 2-layer PCBs. Instead double-click on a pin when in PCB mode. Improvement: Show board dimensions in status bar instead of title bar. Improvement: Added "Surface" combo box to component editor so it can be set without relying on use of mouse wheel in the view. Improvement: No longer set PCB pad offsets with cursor keys. Instead click on a pin for 1 second, then release to launch Pad Offset Dialog. Improvement: Single toolbar with bigger icons and buttons that change according to mode (Circuit Layout/Component Editor). Improvement: Added toolbar icons for "Delete" and "Copy". Improvement: Allow "Copy" operation to work on shapes in Component Editor Mode. Improvement: Auto-centre the view when switching to Component Editor Mode. Improvement: Double-click on selected components rotates them (if you dont click on a pin). Improvement: More efficent undo/redo history logging. Improvement: Allow competing diagonals to be resolved by regular paint procedure (i.e. paint on the crossing after painting the ends of the diagonal). Improvement: No more selection/desection of netlist ID by single clicks. You must now double-click on a track/pin to select, and double-click on a blank area to deselect. Stops confusing behaviour such as a netlist of interest becoming deselected when you try to move some other part. Improvement: Only allow painting/unpainting of pins (and paint by flood fill) when in Color mode. Improvement: Added Layers menu item for resetting all pin layer preferences. Improvement: On a 2-layer board, if you have a floating component (because the tracks on the layers do not match the floating pins) and you go to erase the tracks under those floating pins so that the component can drop into place, then auto-erase the tracks on the other board layer also if necessary. This saves the user having to switch layers to erase the tracks manually. Improvement: Force docking of major dialogs (necessary for Android usability). Replaced all sliders in the GUI with check boxes or spin controls. Use of the "P" key is now strictly for painting/erasing component pins. Not regular grid points or wires. Updated the tutorials. V2.19 Bug fix: The grid did not properly resize itself when the user tried to add a component or text box that was wider/taller than the current grid size, leading to a corrupted layout. V2.18 Bug fix: Pin layer preference logic for PCBs was not properly handling diagonal connections, so diagonally adjacent pins that were electrically connected might not have a connection drawn on either layer. New feature: Extra thermal relief tags are produced by default when producing PCBs with ground pours. V2.17 Improvement: When using ground-fill, the width of the thermal relief tags connecting pads to the ground-fill can be set in the Rendering Options. V2.16 Bug fix: When vias are enabled, connectivity info was wiped when zooming or changing sliders, leading to erroneous hatched lines being displayed. Improvement: The Pin Label dialog can now also be used in Component Editor mode. V2.15 Improvement: Added background brightness to Rendering Options. V2.14 Improvement: Added vertical alignment options to text boxes. V2.13 Bug fix: Code to fix corruption can mess up competing diagonals on boards that are OK. V2.12 Bug fix: Corrected tab order in Rendering Options and Component Editor dialogs. Updated Tutorial 18 with info on applying pad offsets. V2.11 Bug fix: The routing changes in V2.09 introduced a bug in the connectivity checking of layouts with wires, so fully connected nets that use wires could sometimes be wrongly listed as "Bad Nodes". V2.10 Bug fix: Show closest tracks did not draw all locations due to rounding errors. Bug fix: Flying wires not drawn properly to offset pads. Improvement: If all pads on a component are shifted by the same amount, then give the component outline and text the same shift. Improvement: Show rectangular area sizes and pad offsets in both mil and mm. Improvement: Allow pad offsets to change in 1 mil steps instead of 5 mil. New feature: Added distance tool for measuring distance between holes/grid points (to help set pad offsets) V2.09 Improvement: Routing algorithm speed increased. V2.08 Bug fix: Autorouting in non-fast mode corrupts how adjacent nodeIDs on the grid are tracked, leading to many adjacent nets being given the same color. Improvement: Speed up how flying wires are handled during connectivity checking. Improvement: Speed up code for tracking adjacent nodeIDs on the grid. Improvement: Speed up routing in non-fast mode by 5% to 10%. Improvement: Allow "Paste" when auto-routing to be restricted to grey areas. Improvement: Moving/rotating grey areas while auto-routing will ignore auto-routed tracks in the grey areas instead of pasting them. V2.07 Improvement: Faster algorithm for building the list of broken nodes. Improvement: Copying a part with no name and no value should produce a part with no name and no value. New feature: Flying wires. Automatically generated between "Pad (Flying Wire)" objects. V2.06 Bug fix: In Rendering Options, the "Show closest tracks" box was not being hidden when minimum separation was same as Gap size. Bug fix. In Fat Tracks mode with diagonals, tracks in the view were not all of correct width, but the ones in Gerber export were. Bug fix: In Fat Tracks mode with diagonals, the track separation algorithm was not handling all cases properly. Bug fix: In Fat Tracks mode, Gerber export should create an aperture for pads even if there are no parts in the circuit. Improvement: Allow reset pin layer preference ("T" + right button) while moving mouse instead of having to do single clicks. V2.05 Bug fix: Code for filling parts with color not correctly handling shape transformations. Bug fix: Track separation info in the Rendering dialog not updating when auto-routing toggled. Bug fix: Components with lines outside the footprint area could be rendered off screen leading to an invalid set of Gerber files (e.g. GTO file having points outside the boundary in the GKO file). Improvement: Total rewrite of minimum track separation for improved accuracy. Improvement: Show points for all layers when displaying locations of minimum track separation. New feature: In PCB mode, individual pad locations can be shifted by up to 50 mil using Ctrl + Arrow keys. V2.04 Bug fix: Since 2.02, VeroRoute freezes if the grid is made 1 column wide. Omit deprecated G codes from Gerber export, and allow Gerber export in mm or inches. Allow circuit panning/grid resize by grabbing the grid with the right mouse button (ctrl key optional). Improve GUI behaviour in Tutorials by passing key presses from the Info dialog to the main window. V2.03 Bug fix: Wire rendering broken in 2.02. New feature. Can specify layer preference on component pins of 2-layer PCBs. Updated tutorials. V2.02 Bug fix: Fill slider should be enabled when track slider is set to Off. Bug fix: Calculation of minimum track separation was not correct when using fat tracks style. Bug fix: Changed render order in Color/Mono mode to fix issues with how custom sizes pads are drawn. Track width changes: Minimum allowed track widths lowered to 4 mil. Minimum allowed via hole lowered to 8 mil. Minimum allowed via pad lowered to 16 mil. Maximum custom pad size increased to 130 mil. Maximum custom hole size increased to 100 mil. New feature: Add ability to show locations of minimum track separation. Updated tutorials. V2.01 Bug fix: Chains of wires sharing holes sometimes not colored completely. Added ability to define custom pad/hole size in component editor. Added ability to add veroboard labels (numbers or letters). Improved algorithm for solder bridges. Don't show a solder bridge if a wire is already doing that job. V2.00 Bug fix: Poor-man's 2-layer Gerber export was not handling crossing wires. Bug fix: Isolated nodes were rendered to Gerber with pad-width instead of track-width. Bug fix: Isolated nodes were rendered to top layer for poor-man's 2-layer Gerber export. Improvement: Allow TAB to change focus of dialog controls. Improvement: Reworked some icons that did not work well with dark themes. Removed menu item to fix corruption. Old corrupted VRTS are now auto-fixed on load. V1.99 Code changes to help prevent layout from becoming corrupted. V1.98 Put in extra checks to stop potential crashes arising from a corrupted layout. Added file menu option to fix a corrupted layout. V1.97 Bug fix: In Color mode, diagonal track portions were drawn too long if using custom track color. Disabled code for drawing extra thermal relief tags (so a filled PCB will be easier to solder). V1.96 New feature: In Color mode, color each wire according to its NodeId. V1.95 Bug fix: Thermal relief tags not calculated properly for pads with custom size. New feature: Allow user to specify a color for any NodeID. Improvement: Show info on Bad/Floating nodes in a single list. For consistency between view types, draw hashed lines for broken connections in red instead of yellow. V1.94 Bug fix: When ground-filling with no specified nodeId, do not draw thermal relief tags to unassigned pins. New feature: Find parts in layout by Name or Value. Improvement: Made Rendering Options dialog better handle 11pt font. V1.93 Make control dialog better handle large font. Draw pads for unassigned pins in Mono/PCB mode. V1.92 Bug fix: Delete selected template would sometimes remove wrong template. V1.91 Bug fix: Allow 2-pin DIPs. Bug fix: Mouse click not always selecting most relevant shape in component editor mode. Improvement: Draw some parts (e.g. resistors/diodes/DIPs) differently in PCB mode when appropriate. V1.90 Bug fix: While auto-routing, unpainting the board under a part would not always let it fall into place. Bug fix: Hole-usage was not handled properly for non-wires. Improvement: Increase max allowed hole size for parts from 40 mil to 50 mil. V1.89 Bug fix: Gerber export in V1.88 was writing unusable drill file, and not handling variable pad/hole widths correctly. V1.88 Roll back of change made in V1.85: Top solder mask now works in same way as bottom solder mask. Bug fix: Fix problem with docked dialogs passing mouse clicks to the main window. Improvement: Various minor fixes, improvements and simplificatons to Gerber Export code. Improvement: Changed diode cathode marking so it is less likely to be erased on a PCB. Improvement: Show actual minimum track separation (instead of the guaranteed minimum). New feature: Show minimum ground fill width to help avoid isolated ground "islands". New feature: Allow custom pad and hole sizes to be set on each part. V1.87 Bug fix: 300 mil electrolytic cap was missing line marking negative side. Improvement: When modifying shapes in component editor, allow unit steps with the mouse wheel. Improvement: Allow flipped views in PCB mode but don't allow export/editing when flipped. Lots of minor GUI tweaks such as disabling certain buttons according to display mode. Added the Bourns 3362 series to the set of trimmers in the Templates dialog. V1.86 Bug fix: V1.85 was sometimes hiding pin outlines (e.g. when track slider was set to Off). Bug fix: Switching to Component Editor mode from PCB mode gave black background. Bug fix: Placing a wire in 2-layer mode did not handle both wire ends properly. Improvement: Added button to Templates dialog to save all templates to a VRT file. Improvement: For ground-fills, auto-generate additional tags for thermal reliefs. Functionality change: To avoid track breaks, markers in Mono mode only make holes in ground-fills. Functionality change: Disabled show/hide of docked widgets by right mouse-click on menu bar. Added command line options (-h, --help, -v, --version). Added manpage as part of unix installation. V1.85 Bug fix: Refresh problem. Broken and Floating lists could show zombie entries when the control dialog is docked. Bug fix: Rendering problem. In Mono and Color modes, some zoom levels would leave gaps between pixmaps and draw offset diagonals. Bug fix: In Mono and Color modes, it was not possible to set via-pad and via-hole sizes. Improvement: Allow larger zoom level. Improvement: To avoid problems with some PCB companies, made the top solder mask cover most (but not all) of each pad/via. Improvement: When rendering the top layer in PCB mode, make it better represent the fact that a portion of each pad/via is visible. Improvement: When writing the drill file, use XNC/Excellon Format 2. V1.84 Bug fix: Repainting pins on layer 2 did not update grid connections properly, and could crash when the part is moved. V1.83 Bug fix: Pin dialog should be hidden in component editor mode. Bug fix: Vias were only drawn with correct size in PCB mode. Improvement: Zoom with respect to mouse position rather than centre of view. Improvement: When adding to part templates from current circuit, only consider currently selected parts. Improvement: Reduce minimum allowed track width from 30 mil to 12 mil. New feature: Allow use vias to be enabled/disabled under Layers menu. New feature: Added new "Thin" track style for more traditional look and smaller Gerber files. V1.82 Bug fix: Merge should not update the filename used for saving. V1.81 Bug fix: Hiding the top toolbar made mouse clicks map to the wrong grid locations. Bug fix: Right clicking on the top toolbar allowed control and component editor dialogs to be displayed together. Added shell script to uninstall on Linux and updated README.txt with info on uninstall procedure. V1.80 Added second board layer. Made the Control and Component Editor dialogs dockable and docked by default. Updated the tutorials to describe 2-layer functionality. V1.79 New feature: File menu allows Gerber export as either 1-layer or 2-layer. Removed NPTH/PTH selection since it is implied by the export type (1-layer/2-layer). Changed hatched lines in Mono mode from yellow to red. Hide vias in PCB mode (as they are ignored at the moment). Help->Support now opens forum in browser. Added "Clear recent files list" to File menu. V1.78 Bug fix: Unpainted wire ends were being drawn as painted. Improvement: Added default label offsets to small Electrolytic Caps so they don't lie over pin holes. Stop offsetting pad labels by default (it was too confusing manipulating them like that). V1.77 Bug fix: Text rendering to PDF was broken by changes for PCB text. Improvement: Text size setting in Renderer Dialog affects PCB text size also. Improvement: Added more PCB parameters (for Gerber) to Rendering Dialog. Moved all Gerber related viewing from Mono mode to new PCB mode on the Track slider. V1.76 Improvement: In Mono mode, all text boxes are now automatically mirrored for toner-transfer. Improvement: In Mono mode, all component outlines and component text are rendered to match Gerber output. V1.75 Partial bug fix: Rendering components to PDF would always show them filled (even if "Fill" slider was off). Fixed to show only outline if "Fill" slider is off. New feature: Added info to rendering dialog showing the minimum guaranteed track separation based on the current (pad, track, gap, diagonal mode, ground fill) settings. New feature: Allow Gerber export when in Mono mode (Beta). V1.74 Better treatment of part labels under part rotation. Offset labels for Pads/Connectors by default. V1.73 New feature: Make pin label alignment (Left,Centre,Right) editable in pin labels dialog. V1.72 Bug fix: Flood fill not preserving status of grid under wires. V1.71 Bug fix: Component editor not checking connectors (strip/blocks) for reserved import strings. V1.70 Bug fix: Handle selection of rotated shapes in component editor. Bug fix: Make netlist import handle connectors (strip/blocks) with different numbers of pins. V1.69 New feature: Allow netlist import in OrcadPCB2 format (so KiCad can be used as schematic editor). V1.68 Bug fix: Component Editor not drawing footprint area with dashed line. V1.67 Bug fix: Rotating a track pattern did not correctly handle competing diagonals. Bug fix: Couldn't use keys to move/rotate a track pattern unless components were also selected. V1.66 New feature: Allow shapes to be filled with colors. V1.65 Bug fix: Wire hole-sharing under an IC only worked with wire-crossing enabled. Improvement: Render wires as rounded rectangles so hole-sharing looks clearer. V1.64 Bug fix: Fixed algorithm for stacking wires. New feature: Allow 2 wires to share a hole. Added "Wire Options" dialog to set allowed wire operations. V1.63 Bug fix: 1.62 could crash or corrupt the layout if stacking wires under an IC. V1.62 Bug fix: Don't allow parts/tracks selected by area to be manipulated if a control slider is hiding some of the selection. Bug fix: Don't show selected area if both control sliders are moved to Off. New feature: Allow wires to cross, and allow up to two wires to be stacked next to each other (but no hole sharing yet). V1.61 Improvement: Auto-router respects manually painted track between two pins. Allow manual over-painting of auto-routed track, and show all auto-routed tracks with hatched lines (including the current selection). Split "Paste" and "Tidy" buttons, and only allow "Tidy" on completed circuits. V1.60 Bug fix: Since V1.58, connected tracks were not always rendered properly. Improvement: Added option to disable "Fast" routing (to try reduce Bad Nodes). V1.59 Improvement: Added Key/Mouse Actions dialog under Help menu. V1.58 Improvement: Faster routing and connectivity checking. V1.57 Improvement: Faster routing algorithm. V1.56 Tweaked dialog layouts to better handle 11 point fonts. V1.55 Improvement: List recent VRT files in File menu. V1.54 Added Zoom buttons to toolbar. Changed executable name, folder names, and file names to lowercase. Made program search for "tutorials" folder in standard locations. V1.53 Improvement: Added Undo/Redo buttons to toolbar. Improvement: Allow Undo/Redo in Component Editor mode. V1.52 Bug fix: Missing Templates folder would disable Undo/Redo. Bug fix: Changing component type using Control Dialog (e.g. from Diode to LED) not working properly. History and Templates folders now auto-created in OS/application specific locations. V1.51 Bug fix: Floating track pattern could not be placed over unpainted wires on the board. Improvement: Made buttons to move component labels use a smaller step size. V1.50 Bug fix: Clicking on a floating track pattern should not place floating components. Moved the Pad/Track/Hole/Gap controls to the Rendering Options dialog. Updated the tutorials. V1.49 Restrict labels to 2 orientations. (Left to right, or bottom to top). Improvement: Add rendering options to show target board area. V1.48 Bug fix: Possible crash during auto-routing while moving wires. Improvement: Speed up algorithm for routing/connectivity checking. V1.47 Bug fix: Version 1.46 would produce duplicate shapes when loading parts from VRT. Bug fix: Changing DIP width wasn't changing the component outline. New feature: Component editor can define "holes" (i.e. non-paintable grid points). V1.46 Bug fix: Fixed error in loaded old VRTs with strip connectors. V1.45 Bug fix: Prevent mouse from dragging shapes off screen in the component editor. Bug fix: Fix shape selection in the component editor. V1.44 Bug fix: Fixed bad TRCD Relay. New feature: Added component editor. V1.43 Bug fix: Stop potential crash when defining areas for part/track selection. Improvement: Add toolbar button to select part/tracks by area. V1.42 Improvement: Added Rendering dialog controls for component text size. Bug fix: Correct footprints for GTR-2 relays. Improved outline sizes for relays and Bourns trimpots. V1.41 Bug fix: Menu and toolbars were being blanked while drawing rectangles with the "R" key. Bug fix: The status of the diagonals mode was not always restored when toggling between vero and non-vero styles. Improvement: Prevent copying of textboxes with no text. Improvement: Show text box outline in dark grey instead of black, so it can be seen in ground-fill mode. Improvement: When zooming in/out, try to keep the view showing the same centre point. Improvement: Draw pin labels in black instead of grey so they are easier to read. V1.40 Minor improvements: Automatically delete textboxes with no text. Show board size in mm in the window title bar. Show drawn rectangle size in mm in the status bar. Color toolbar icons to differentiate track styles / diagonal modes. V1.39 Moved some controls from the control dialog to the toolbar. Reduced heights of control dialog and templates dialog. V1.38 Added more component types: TO-39 package, pin strips, terminal blocks, inductor, wide film cap, fuse holder, relays. V1.37 Bug fix: Trying to undo "Delete text" could cause a crash. New feature: Text color can now be chosen. New feature: Hitting "V" key will copy+paste a selected text box. V1.36 Bug fix: Buttons in Text Label Editor weren't always reflecting text style. Bug fix: Prevent user from selecting text boxes in "Hide Text" mode. New feature: Added painting by "flood-fill". V1.35 New feature: Replace "Mirror" with "Flip-H" and "Flip-V" options. New feature: Add->Text menu item for putting labels on the grid. V1.34 Bug fix: Merge was not clearing existing user-defined areas. New feature: Added margin control for auto-crop. New feature: While the user draws a rectangle, show its size in the status bar. V1.33 New feature: Allow horizontal veroboard strips. Tweaked color assignment algorithm. V1.32 New feature: "File->Open (merge into current)". V1.31 Improvement: User-defined areas select tracks as well as components. V1.30 Improvement: Duplicating components copies their Value too if it's different to the name. Added more component types. (Relays, Switches, Trimpots). Changed default lengths of resistors and diodes to 400 mil. Updated gEDA/TinyCAD import code for RESISTOR/DIODE/CAP_CERAMIC/CAP_FILM so that appending an optional integer number to the footprint name sets the length in 100s of mil. (e.g. RESISTOR3 = 300mil) Updated gEDA library with resistors and caps of different lengths. Added ability to select components/wipe tracks within area (hold down "R" to draw areas). V1.29 Added Crystal component type and gEDA library symbol. V1.28 Improvements: Added "Toggle Grid" and "Toggle Mirror" as View menu items. List part types in B.O.M. Allow pin labels for TO packages as well as DIPs, SIPs. New feature: Added "Parts/Templates Dialog" so user can build a parts library for ICs and TO packages (avoids defining pin labels with each new circuit). Double-clicking on any listed part adds it to the circuit. V1.27 Bug fix: Deleting a component was not immediately updating the Bad Nodes lists. Bug fix: V1.26 allowed components to be dragged while user was painting pins. V1.26 Bug fix: Holding down "P" and SPACE at the same time would allow mouse move to modify component pins. Usability tweak: Holding down SPACE now allows un-painting the board under a placed component pin, or painting the board under the pin to match the existing NodeId on the pin. V1.25 Usability tweaks: Slow down the grid auto-pan/resize when moving components with the mouse. Selecting a NodeID in the "Broken" list should also highlight it in the "Floating" list if it's there. Added a Spin FV-1 IC and serial EEPROM to the gEDA library. V1.24 Added IC Pin Labels dialog. V1.23 Fixed memory leak on shutdown. Updated Tutorial 19 with info on creating a registry key for MS Windows. Added more JFETs to the symbol libraries. V1.22 Added command line options to specify VRT file and path to VeroRoute home directory. Support drag and drop of VRT files from file explorer. Allow multiple VeroRoute instances to run at the same time. Improved error reporting during netlist import. Added color saturation slider. Changed rendering behaviour when clicking on an item in the Broken list. Added gEDA symbol libraries. V1.21 Improved rendering speed by avoiding pointless repaints. Control dialog rearranged so a checkbox controls ground-fill. Draw foil capacitors with thinner shape to better match the footprint. Draw floating component text in red. Made export to PDF centre on grid bounds instead of circuit bounds. Write status bar messages. V1.20 Added Grid checkbox. PDF shows bounding box and can show grid. Increased max pins per component to 255. When writing to file, append ". vrt", ".pdf", ".png" to filename as needed. V1.19 Add separate "Paste" and "Paste+Tidy" buttons for auto-routing. Updated tutorials. V1.18 Bug fix: Info dialog edits weren't treated as changes so "Save" was broken, but "Save As" was OK. V1.17 Added ground-fill. V1.16 Fixed mouse-wheel behaviour on windows. Added View menu option to show IC pins as numbers. V1.15 Added more Edit menu items. Check for Tutorials and History folders at start-up. V1.14 Added Help menu item to check if a new version is available. V1.13 Bug fixes: PDF write was broken since V1.10. "Add" menu item was enabled when view was mirrored. V1.12 Fixed TinyCAD package names for NP capacitors. Make netlist import allow spaces in Name and Value fields. V1.11 Fixed crash on importing unknown package. Increased maximum number of pins per component to over 200. V1.10 Added import of netlist from TinyCAD schematic. Hide old Import/Export. V1.01 Added scroll bars. Place new components in top-left of visible view and float them if needed. V1.00 Disable component text buttons when appropriate. Tidy code. Drop Beta. V0.999 Bug fix: Fix possible crash if adding new wire while auto-routing is enabled. V0.998 Bug fix: After "Paste" auto-routed wire, color should stay on board when wire moved. V0.997 Added part type combo. Added width buttons for DIP gap resizing instead of "E","R" keys. V0.996 Bug fix: Deleting grouped components could cause a crash later. Allow DIP gap resizing with "E","R" keys. V0.995 Check if circuit has been saved before launching Tutorials. Don't auto-raise Info window on Undo/Redo. V0.994 Bug fix: Erasing under floating pins while auto-routing. V0.993 Routing improvement. V0.992 Improve routing. V0.991 Bug fix: Redraw when toggling track styles. V0.99 Added new part types including multi-pole switches. V0.981 Bug fix: Undo/Redo. V0.98 Added Undo/Redo. V0.97 Added new part types. Improved TO-92 outline. Auto-centre when writing to PDF. V0.96 Show File menu-shortcuts. Fixed tutorial description of polarised component Export. V0.95 Added save to PNG. V0.94 Added B.O.M. V0.93 Try auto-generate unique Name when adding new part. V0.92 Add Ctrl shortcuts for File menu options. Changed tutorials. Fixed origId bug. V0.91 Fixed bad write to PDF. Allow backspace to work as delete. V0.90 First release to Sourceforge. VeroRoute/Src/images/text.png000644 001750 001750 00000000645 13734467270 016444 0ustar00alexalex000000 000000 ‰PNG  IHDR йsВbKGDЊ#2 pHYsФФ•+tIMEф  ЎVє6IDATHЧн•БJФ@†Пн„,в–^ЃЕ­/aыЛииј ОР5ккйжb!6ržЈ'šпf7Щ^/ЙЕrвь™џ™љ™H3ў ѕ +тRn.yтŒ)№ЦАбk9"“Jџ~ŸяЎфkу_˜qТ[Ќ“БЫЇѓNиcШm2і™QЖžТ1Ш№ьят^жъ Ю%уL*ˆОоk `^щК jыЯЊЖO2-5qКPЊМЅаЗ|”—ДDЎЪ#xй„ џLыкЊ1hUс2|w‘Ф?јjъB€<Ры Y et™]иXб5P,@›Т` иt—žkG’ИрНВЙ‘к%œз–u2m‚H0ЦС`5$,–„У_wЬђ5k o?…q–(щze‰IENDЎB`‚VeroRoute/libraries/gEDA/000755 001750 001750 00000000000 14405612071 015450 5ustar00alexalex000000 000000 VeroRoute/libraries/gEDA/veroroute_passive/Capacitor_Electrolytic_250mil.sym000644 001750 001750 00000001420 13515171161 027503 0ustar00alexalex000000 000000 v 20130925 2 T 200 700 5 10 0 0 0 0 1 numslots=0 P 200 700 400 700 1 0 0 { T 350 750 5 8 1 1 0 6 1 pinnumber=1 T 350 750 5 8 0 0 0 6 1 pinseq=1 T 350 750 5 8 0 0 0 6 1 pinlabel=1 T 350 750 5 8 0 0 0 6 1 pintype=pas } P 1100 700 900 700 1 0 0 { T 950 750 5 8 1 1 0 0 1 pinnumber=2 T 950 750 5 8 0 0 0 0 1 pinseq=2 T 950 750 5 8 0 0 0 0 1 pinlabel=2 T 950 750 5 8 0 0 0 0 1 pintype=pas } L 600 900 600 500 3 0 0 0 -1 -1 L 900 700 700 700 3 0 0 0 -1 -1 L 600 700 400 700 3 0 0 0 -1 -1 A 1400 700 700 165 30 3 0 0 0 -1 -1 L 489 900 489 800 3 0 0 0 -1 -1 L 540 849 440 849 3 0 0 0 -1 -1 T 500 300 5 10 1 1 0 0 1 device=2u2 T 500 1000 8 10 1 1 0 0 1 refdes=C? T 500 700 8 10 0 0 0 0 1 footprint=CAP_ELECTRO_250 T 500 700 8 10 0 0 0 0 1 description=Electrolytic Capacitor (250 mil diameter) VeroRoute/libraries/gEDA/veroroute_transistor/Darlington_PNP_TIP106.sym000644 001750 001750 00000002551 13515171161 026311 0ustar00alexalex000000 000000 v 20130925 2 T 0 900 5 10 0 0 0 0 1 numslots=0 P 0 900 300 900 1 0 0 { T 100 1000 5 8 1 1 0 0 1 pinnumber=1 T 100 1000 5 8 0 0 0 0 1 pinseq=1 T 100 1000 5 8 0 0 0 0 1 pinlabel=1 T 100 1000 5 8 0 0 0 0 1 pintype=pas } P 1000 1700 1000 1400 1 0 0 { T 1100 1400 5 8 1 1 0 0 1 pinnumber=2 T 1100 1400 5 8 0 0 0 0 1 pinseq=2 T 1100 1400 5 8 0 0 0 0 1 pinlabel=2 T 1100 1400 5 8 0 0 0 0 1 pintype=pas } P 1000 0 1000 300 1 0 0 { T 1100 200 5 8 1 1 0 0 1 pinnumber=3 T 1100 200 5 8 0 0 0 0 1 pinseq=3 T 1100 200 5 8 0 0 0 0 1 pinlabel=3 T 1100 200 5 8 0 0 0 0 1 pintype=pas } L 500 1100 500 700 3 0 0 0 -1 -1 L 500 1000 700 1100 3 0 0 0 -1 -1 L 500 800 700 700 3 0 0 0 -1 -1 L 500 900 300 900 3 0 0 0 -1 -1 L 800 900 800 500 3 0 0 0 -1 -1 L 800 800 1000 900 3 0 0 0 -1 -1 L 800 600 1000 500 3 0 0 0 -1 -1 L 1000 900 1000 1200 3 0 0 0 -1 -1 L 1000 1200 700 1200 3 0 0 0 -1 -1 L 700 1100 700 1200 3 0 0 0 -1 -1 L 1000 500 1000 300 3 0 0 0 -1 -1 L 700 700 800 700 3 0 0 0 -1 -1 L 1000 1200 1000 1400 3 0 0 0 -1 -1 V 800 900 500 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 597,791 L 499,800 L 569,727 L 575,760 z H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 897,591 L 799,600 L 869,527 L 875,560 z T 1400 900 5 10 1 1 0 0 1 device=TIP106 T 1400 670 8 10 1 1 0 0 1 refdes=Q? T 1400 400 8 10 0 0 0 0 1 footprint=TO220 T 1400 400 8 10 0 0 0 0 1 description=PNP Darlington Transistor VeroRoute/examples/vero.vrt000644 001750 001750 00000221564 14002643030 016264 0ustar00alexalex000000 000000 +z18V Electric Mistress with Reworked LFO & VCO This is an improved version of the classic 18V Electro-Harmonix Electric Mistress flanger used by David Gilmour and Andy Summers. I reworked the VCO and LFO so that the circuit has the same sound and control behaviour as the original but without all the problems. In particular it is much less noisy and does not have the volume drop when engaged. The layout also takes up about a quarter of the space. A detailed explanation of the changes can be found at: http://www.diystompboxes.com/smfforum/index.php?topic=119933 bџџџџ\22< џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ/@џџџџџџџџџџpџџџџџџџџџџёџџџџџџџџџџёџџџџџџџџџџёџџџџџџџџџСTџџџџџџpџџџџџџџџџџСџџџџџџџџџ@TџџџџџџpџџџџџџџџџџёџџџџџџџџџСUџџџџџџ1@џџџџџџџџџџ2@џџџџџџџџџџpџџџџџџџџџџёџџџџџџџџџџсџџџџџџџџџUџџџџџ.џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџ 18џџџџџџ Aџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ/Dџџџџџџџџџџ|џџџџџџџџџ џ>џџџџџ џ>џџџџџ џ>џџџџџ Ч>џџџџџ |>џџџџџ ч>џџџџџ >џџџџџ м>џџџџџџŸџџџџџџџџџ 4џџџџџ 14џџџџџ 24џџџџџ \4џџџџџ П4џџџџџ w4џџџџџ ѓ4џџџџџџёџџџџџџџџџџ бџџџџџџџџџ ‘:џџџџџџ џџџџџџџџџџ 1џџџџџџџџџ A8џџџџџџ Fџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ/Dџџџџџџџџџџ|џџџџџџџџџџпџџџџџџџџџџŸџџџџџџџџџџ?џџџџџџџџџGџџџџџџџџџџџџџџџџ7џџџџџџџџџџ[џџџџџџџџџџџџџџџџџџџџаџџџџџџџџџџБџџџџџџџџџџAџџџџџџџџџџ-@џџџџџџџџџџLџџџџџџџџџџ@џџџџџџџџџ~џџџџџџпџџџџџџџџџџŸџџџџџџџџџџ џџџџџџџџџ 'p:џџџџџџ 'ёџџџџџџџџџџ'СџџџџџџџџџFGџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ/Dџџџџџџџџџџ|џџџџџџџџџџЯџџџџџџџџџџ+@џџџџџџџџџ@+џџџџџџFџџџџџџџџџџ@џџџџџџџџџџ@џџџџџџџџџџNџџџџџџџџџџXџџџџџџџџџџџџџџџџџџџ@+џџџџџF_џџџџџџ-DџџџџџџџџџџDџџџџџџџџџD_џџџџџџ|џџџџџџџџџџЯџџџџџџџџџ#p.џџџџџџ#Сџџџџџџџџџџ'|џџџџџџџџџ'џ6џџџџџџ'ЧџџџџџџџџџџDџџџџџџџџџD6џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ/Dџџџџџџџџџџ|џџџџџџџџџ Ч>џџџџџ +D>џџџџџ >џџџџџ >џџџџџ Ф>џџџџџ D>џџџџџ d>џџџџџ  >џџџџџџ.`џџџџџџџџџ 4џџџџџ 4џџџџџ -D4џџџџџ d4џџџџџ 4џџџџџ м4џџџџџ ‡4џџџџџџ#|џџџџџџџџџџ#Чџџџџџџџџџџ'<џџџџџџџџџ'_;џџџџџ '‡5џџџџџ Ф5џџџџџ D5џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ/Dџџџџџџџџџ| џџџџџџЧџџџџџџџџџџ+Dџџџџџџџџџ)@ џџџџџџXџџџџџџџџџџ…џџџџџџџџџџDџџџџџџџџџџtџџџџџџџџџуџџџџџ.3џџџџџ.Aџџџџџ.Bџџџџџџ-DџџџџџџџџџџtџџџџџџџџџџћџџџџџџџџџџЭџџџџџџџџџ$@Bџџџџџ #/џџџџџ #/џџџџџ "Р/џџџџџџ'Nџџџџџџџџџџ Xџџџџџџџџџџ …џџџџџџџџџ7џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ/Dџџџџџџџџџџ|џџџџџџџџџџЧџџџџџџџџџџ+Dџџџџџџџџџџ)dџџџџџџџџџ  ?џџџџџ )Р?џџџџџ D?џџџџџџ|џџџџџџџџџџїџџџџџџџџџџѓџџџџџџџџџџёџџџџџџџџџ С@џџџџџџ-Dџџџџџџџџџџ\џџџџџџџџџ Ÿ@џџџџџ2џџџџџџ$Фџџџџџџџџџџ%@џџџџџџџџџџ"Xџџџџџџџџџџ"…џџџџџџџџџџ'џџџџџџџџџ L9џџџџџ p9џџџџџџСџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ /dџџџџџџ<џџџџџџџџџ Gџџџџџџ +Dџџџџџџџџџ )tџџџџџџ)лџџџџџџџџџџ)…џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ?џџџџџџџџџџ_џџџџџџџџџџŸџџџџџџџџџ @џџџџџџ-ФџџџџџџџџџџLџџџџџџџџџ $@џџџџџ$2џџџџџ $0џџџџџ %D0џџџџџ " 0џџџџџџ№џџџџџџџџџџСџџџџџџџџџџ Dџџџџџџџџџџ <џџџџџџџџџџGџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ /4џџџџџџ/cџџџџџџџџџYџџџџџџ+Dџџџџџџџџџџ)|џџџџџџџџџџ)Яџџџџџџџџџ@Yџџџџџџ@џџџџџџџџџџpџџџџџџџџџСџџџџџn3џџџџџ-Aџџџџџ -@џџџџџџ-џџџџџџџџџџфџџџџџџџџџ ,@џџџџџ,1Cџџџџџџ,Aџџџџџџџџџџ%DџџџџџџџџџX(џџџџџН#џџџџџџGџџџџџџџџџџDџџџџџџџџџ@#џџџџџF7џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ `џџџџџџ/6џџџџџџџџџ /Cџџџџџџ +Dџџџџџџџџџ )џџџџџџ)џџџџџџџџџџDџџџџџџџџџ Dџџџџџџ |џџџџџџџџџ Чџџџџџџtџџџџџџџџџџѓџџџџџџџџџ С@џџџџџџxџџџџџџџџџџеџџџџџџџџџ Г@џџџџџACџџџџџџ,Fџџџџџџџџџџ%Dџџџџџџџџџџ џџџџџџџџџ@WџџџџџџFџџџџџџџџџWџџџџџDOџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ4џџџџџџџџџџCџџџџџџџџџџ/fџџџџџџџџџ+^џџџџџџ@џџџџџџџџџ+@^џџџџџdFџџџџџџџџџџџ\џџџџџџџџџџ‡џџџџџџџџџџ<џџџџџџџџџџџџџџџџџџџЧ,џџџџџџ|џџџџџџџџџџЯџџџџџџџџџ!@,џџџџџџFџџџџџџџџџџ,Dџџџџџџџџџџ%Dџџџџџџџџџџ(`џџџџџџџџџ џџџџџ џџџџџ *Рџџџџџ џџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@ џџџџџџFџџџџџџџџџџ/џџџџџџџџџ/ џџџџџD]џџџџџџ+dџџџџџџџџџџ4џџџџџџџџџџCџџџџџџџџџџLџџџџџџџџџ@]џџџџџ@џџџџџџ~џџџџџџџџџџЧџџџџџџџџџ\џџџџџџ‡џџџџџџџџџ!-џџџџџџDџџџџџџџџџџ,Dџџџџџџџџџ%D-џџџџџ((џџџџџ(Xџџџџџџ*иџџџџџџџџџџ*…џџџџџџџџџ(РXџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџ Dџџџџџџџџџ џџџџџџџџџџџФџџџџџџџџџџ+Tџџџџџџџџџ+ƒџџџџџџЦџџџџџџџџџ Dџџџџџ џџџџџ џџџџџџ|џџџџџџџџџЧVџџџџџџLџџџџџџџџџ@Vџџџџџџ@џџџџџџџџџџdџџџџџџџџџ,Kџџџџџ%1џџџџџ*p!џџџџџџ*йџџџџџџџџџџ*џџџџџџџџџџ(Xџџџџџџџџџџ(…џџџџџџџџџФ*џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџ Dџџџџџџџџџ џџџџџ9џџџџџџEџџџџџџџџџџ+LџџџџџџџџџXџџџџџ …Iџџџџџџ џџџџџџџџџ  pIџџџџџџ Сџџџџџџџџџџ|џџџџџџџџџџЧџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџtџџџџџџџџџџѓџџџџџџџџџџСџџџџџџџџџџ*|џџџџџџџџџ *Яџџџџџ @џџџџџ (Lџџџџџ xџџџџџџХџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ <џџџџџџ Фџџџџџџџџџ &<џџџџџ&=џџџџџџFџџџџџџџџџџ+DџџџџџџџџџL=џџџџџ@\џџџџџџ @џџџџџџџџџџ |џџџџџџџџџџ чџџџџџџџџџ\џџџџџџџџџџџџџџџџDџџџџџџџџџ  џџџџџ Ф џџџџџ \ џџџџџџПџџџџџџџџџџGџџџџџџџџџџ*џџџџџџџџџ* џџџџџџФџџџџџџџџџџ(Dџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ 8џџџџџџ Eџџџџџџџџџ џџџџџџџџџџџФџџџџџџџџџџ+DџџџџџџџџџџџџџџџФџџџџџџџџџџ dџџџџџџџџџ <џџџџџџ wџџџџџџџџџџ Уџџџџџџџџџ@џџџџџџDџџџџџџџџџџxџџџџџџџџџџХџџџџџџџџџџLџџџџџџџџџ0@Kџџџџџ1џџџџџР!џџџџџx%џџџџџџХџџџџџџџџџџ(Dџџџџџџџџџ@%џџџџџ@*џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ @ џџџџџџ Fџџџџџџџџџ  ` џџџџџџџџџџџџџџџџџџџџџ+Dџџџџџџџџџxџџџџџ Хџџџџџ  tџџџџџ  Уџџџџџ  џџџџџ џџџџџџDџџџџџџџџџџDџџџџџџџџџ|џџџџџџЧџџџџџџџџџD"џџџџџџ0DџџџџџџџџџџXџџџџџџџџџ…"џџџџџќJџџџџџџЧџџџџџџџџџџ(DџџџџџџџџџDJџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџDџџџџџџџџџџ Tџџџџџџџџџ “џџџџџ Zџџџџџџ+dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Zџџџџџџ џџџџџџџџџџ аџџџџџџџџџ џџџџџџDџџџџџџџџџџDџџџџџџџџџ<џџџџџџGџџџџџџџџџџDџџџџџџџџџџ0DџџџџџџџџџџLџџџџџџџџџџXџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ(DџџџџџџџџџDPџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџDџџџџџџџџџџ Lџџџџџџџџџ pџџџџџ С[џџџџџџ+tџџџџџџџџџџ+ѓџџџџџџџџџџ+Сџџџџџџџџџ @[џџџџџџ Xџџџџџџџџџџ џџџџџџџџџРџџџџџџDџџџџџџџџџџDџџџџџџџџџ @џџџџџ FHџџџџџ DHџџџџџџ0DџџџџџџџџџџDџџџџџџџџџ L&џџџџџ p&џџџџџ С'џџџџџ (D'џџџџџџDџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџ Dџџџџџџџџџ |џџџџџџ Чџџџџџџџџџџ+\џџџџџџџџџ+Ÿџџџџџ +џџџџџ  Dџџџџџ  Lџџџџџ xџџџџџџхџџџџџџџџџ џџџџџџ Фџџџџџџџџџ  DџџџџџџDџџџџџџџџџџDџџџџџџџџџџ0DџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџ|џџџџџџџџџџЧџџџџџџџџџџ(DџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџNџџџџџџ џџџџџџџџџ   џџџџџџ џџџџџџџџџ +  џџџџџMџџџџџ Dџџџџџџ џџџџџџџџџ  DџџџџџџџџџџџџџџџLџџџџџџџџџџџџџџџEџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџ0Sџџџџџ)џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ(Rџџџџџ Qџџџџџ$џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџdd) Range1 Range1PadPadPADNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,.R272k7RResistorRESISTORSF(#12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R12M2RResistorRESISTOR EF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџџџџџџџџџџџџџџџџџџџџ'aVero Numbers1Vero Numbers1Vero NumbersVero NumbersNF(    џџџџџџџџ    @IC3 TL062ICDIPDIP EF(1*234*56(78П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€   џџ, R1718kRResistorRESISTOREF(1*2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,!R1810kRResistorRESISTOR NF(*12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  X C347nCFilmCAP_FILMWF(1 2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДP џ  XC647nCFilmCAP_FILM WF(/1)2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџџ,R44k7RResistorRESISTOREF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R1510kRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R164k7RResistorRESISTOR WF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R5470RRResistorRESISTORWF(1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R66k8RResistorRESISTORWF( 1+2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,#R2039kRResistorRESISTOR EF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ, R910kRResistorRESISTOREF()12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R131MRResistorRESISTOREF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dF G_OutGndPadPadPAD  NF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџџџШ] Wire10 Wire10WireWire WF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџџ,R14470kRResistorRESISTORWF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ, R1010kRResistorRESISTOR EF(/12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  X<C1047nCFilmCAP_FILMEF(&12Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџџ,"R195k6RResistorRESISTOREF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  X C41nCFilmCAP_FILMEF(+1 2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџџ,-R253k3RResistorRESISTOR EF(%%1!!2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџџШ\ Wire9 Wire9WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџШV Wire3 Wire3WireWire WF(12П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџ   'C1510uC(Electrolytic 200 milCAP_ELECTRO_200EF(((12П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџџ,7R3147RRResistorRESISTORSF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dEG_InGndPadPadPADNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп џ  XC11100nCFilmCAP_FILMEF(12Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДP џ  XC73n3CFilmCAP_FILMWF(1)2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДP        џџџџџџџџџџџџџџџџ        @>IC2SAD1024ICDIPDIPWF(1+2345678910111213141516РЬЬЬЬЬЭ@ЬЬЬЬЬЭП§™™™™™š?§™™™™™š@V€   РЬЬЬЬЬЭРЬЬЬЬЬЭП§™™™™™šПа@V€   РЬЬЬЬЬЭРЬЬЬЬЬЭ?а?§™™™™™š@V€   РЬЬЬЬЬЭ@ЬЬЬЬЬЭ?§™™™™™š?§™™™™™š@V€   @ЬЬЬЬЬЭРЬЬЬЬЬЭП§™™™™™šП§™™™™™š@V€   @ЬЬЬЬЬЭ@ЬЬЬЬЬЭ?§™™™™™šП§™™™™™š@V€   РffffffР ЬЬЬЬЬЭПа?аРV€@V€      &C1410uC(Electrolytic 200 milCAP_ELECTRO_200WF(12П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџџџџџШU Wire12 Wire12WireWire WF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџdOutOutPadPadPAD џџџєNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R7100kRResistorRESISTOR EF(1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   А/RT4 10k-BRTVerticalTRIM_VERTWF(#1#2"3Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§џШ^ Wire13 Wire13WireWire WF(++1++2П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџ   LQ1 2N5088QTO92TO92 EF(123Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i    џ  XC12100nCFilmCAP_FILM WF(12Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџ џ   џ џ „8C19100uC(Electrolytic 250 milCAP_ELECTRO_250NF(12Пє?єПє?є@V€ŠŠф?юИQы…И?юИQы…ИПщ™™™™™š?щ™™™™™š@V€ŠŠфПє?єПє?є@V€ŠŠфџџ,AR29220RRResistorRESISTOR SF(--1.2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџШX Wire5 Wire5WireWire WF(((1((2Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџџџ,*R2439kRResistorRESISTOR SF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџџШY Wire6 Wire6WireWire WF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџџџџџџШ+ Wire1 Wire1WireWireWF(12Р @ ПЙ™™™™™š?Й™™™™™š@V€пџџР @ ПЙ™™™™™š?Й™™™™™š@V€пџџџџџШZ Wire7 Wire7WireWireWF( 1 2Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџџџШ[ Wire8 Wire8WireWireWF( 1 2Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџџ,D1 1N4001D Diode DIODE WF(1!2Пўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfD?ё™™™™™™?ё™™™™™™Пй™™™™™š?й™™™™™š@V€џfD?ђffffff?ђffffffПй™™™™™š?й™™™™™š@V€џfD?§™™™™™™?§™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfDџШW Wire4 Wire4WireWire WF(12П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџџџ,(R2127kRResistorRESISTOR SF((12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,%R2210kRResistorRESISTORWF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџШT Wire2 Wire2WireWireWF(12Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџ   АRT2 10k-BRTVerticalTRIM_VERTNF(/1/23Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§   А?RT11k-BRTVerticalTRIM_VERTEF(1)23Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§ џџџџџџџџџџШ Wire11 Wire11WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџ    џџџџџџџџ    @@IC4 LM311ICDIPDIP SF(1,2$3456-78П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€   dP Rate3 Rate3PadPadPADџџџєNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdS Range2 Range2PadPadPADNF(01ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпd$SW1SW1PadPadPADNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdRSW3SW3PadPadPADNF((1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdO Rate2 Rate2PadPadPAD џџџєNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R11470RRResistorRESISTORWF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџџџBD2 1N4148D Diode DIODE EF($$1.2Р333333@333333Пй™™™™™š?й™™™™™š@V€џfD@ЬЬЬЬЬЬ@ЬЬЬЬЬЬПй™™™™™š?й™™™™™š@V€џfD@333333@333333Пй™™™™™š?й™™™™™š@V€џfD@ЬЬЬЬЬЭ@ЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џfDР333333@333333Пй™™™™™š?й™™™™™š@V€џfDџџ,JR2333kRResistorRESISTORWF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,KR30220kRResistorRESISTOR SF(01,2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  XC947nCFilmCAP_FILMEF(12Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДP   HC1310uC(Electrolytic 200 milCAP_ELECTRO_200WF(12П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџџШ_ Wire14 Wire14WireWire WF(12Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџ   L0Q2 2N5087QTO92TO92EF("1%2$3Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i    џ  XC1100nCFilmCAP_FILM WF(1 2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџџ6D3 1N4001D Diode DIODEEF(1'2Пўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfD?ё™™™™™™?ё™™™™™™Пй™™™™™š?й™™™™™š@V€џfD?ђffffff?ђffffffПй™™™™™š?й™™™™™š@V€џfD?§™™™™™™?§™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfDdInInPadPadPADNF( 1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdM Color2 Color2PadPadPADNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп    џџџџџџџџ    @IC1 TL072ICDIPDIPWF(++1 2 34 5 6 78П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€   dN Color3 Color3PadPadPADNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп   А RT3 20k-BRTVerticalTRIM_VERTWF(123Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§џџ,R813kRResistorRESISTOR EF(+12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§єCC17100nCCeramicCAP_CERAMIC NF(,12ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ P џ  XDC84n7CFilmCAP_FILMWF(1 2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДP џ  XC547nCFilmCAP_FILM WF(12Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPdGGndGndPadPadPADNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdQSW2/Range3SW2/Range3PadPadPAD$NF( 1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџ џ   џ џ „:C18220uC(Electrolytic 250 milCAP_ELECTRO_250SF('12Пє?єПє?є@V€ŠŠф?юИQы…И?юИQы…ИПщ™™™™™š?щ™™™™™š@V€ŠŠфПє?єПє?є@V€ŠŠфџ џ   џ џ „9C20100uC(Electrolytic 250 milCAP_ELECTRO_250EF(12Пє?єПє?є@V€ŠŠф?юИQы…И?юИQы…ИПщ™™™™™š?щ™™™™™š@V€ŠŠфПє?єПє?є@V€ŠŠфџџ,=R12470RRResistorRESISTORWF(&12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d;18V18VPadPadPAD џџџќNF('1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdL Color1 Color1PadPadPAD NF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп   L5U1 78L12QTO92TO92EF(12'3Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џџ,3R2810kRResistorRESISTOR NF(.12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R25k6RResistorRESISTOR WF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџџџџџџџџџџџџџџџџџџџџ'bVero Numbers2Vero Numbers2Vero NumbersVero NumbersNF(       џџџџџџџџџџџџџџ       @4IC5 CD4013ICDIPDIP WF(12-3456789101121211314Р ЬЬЬЬЬЭ@ ЬЬЬЬЬЭП§™™™™™š?§™™™™™š@V€   Р ЬЬЬЬЬЭР ЬЬЬЬЬЭП§™™™™™šПа@V€   Р ЬЬЬЬЬЭР ЬЬЬЬЬЭ?а?§™™™™™š@V€   Р ЬЬЬЬЬЭ@ ЬЬЬЬЬЭ?§™™™™™š?§™™™™™š@V€   @ ЬЬЬЬЬЭР ЬЬЬЬЬЭП§™™™™™šП§™™™™™š@V€   @ ЬЬЬЬЬЭ@ ЬЬЬЬЬЭ?§™™™™™šП§™™™™™š@V€   Р ЬЬЬЬЬЭРЬЬЬЬЬЭПа?аРV€@V€   џџџџџџџџџџџџџџџџџџџџџџџџџ'cVero Letters2Vero Letters2Vero LettersVero LettersWF(џџ,R3100kRResistorRESISTOR WF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,1R2622kRResistorRESISTOR SF(1%2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџџџџџџџџџџџџџџџџџџџџџџџџ'`Vero Letters1Vero Letters1Vero LettersVero LettersWF( џ  XIC22n7CFilmCAP_FILMWF(1 2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPє2C16470pCCeramicCAP_CERAMICSF($12ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PB@џџџўINVALID TracksWF(bџџџ€џџџ€џџџ€џџџ€џџџџџџџџF#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Р@Р@@V€џVeroRoute/tutorials/tutorial_17.vrt000644 001750 001750 00000224066 14433262431 017705 0ustar00alexalex000000 000000 9WоTUTORIAL 17 - THE FILE AND WINDOWS MENUS 17.1 OPENING & SAVING FILES Use "File -> Open", "File -> Save" or "File -> Save As" on the main menu. VeroRoute has its own custom format using the ".vrt" suffix. When saving to a file, the ".vrt" suffix is automatically appended to the filename as needed. 17.2 IMPORTING A NETLIST FROM A SCHEMATIC TinyCAD is a free schematic editor for Windows that can be downloaded from SourceForge. gEDA is a suite of free EDA tools on Linux, that contains a schematic editor "gschem" and a command line netlister "gnetlist". Since VeroRoute v1.10 it is possible to produce a schematic using TinyCAD, export the netlist to a file in Protel 1 format, and then import the file to VeroRoute. Since VeroRoute v1.22 a symbol library for gEDA has also been included. These symbols can be used to produce a schematic in "gschem" (the gEDA schematic editor) and the netlister "gnetlist" can then be used to produce a netlist in Tango format for import to VeroRoute. TinyCAD (or gEDA) must first have the VeroRoute symbols added to its libraries, and the schematic must be produced using those symbols in order for VeroRoute to understand the package/footprint descriptions. See the document "Using TinyCAD with VeroRoute.pdf" which can be downloaded from the Files section of the VeroRoute webpage on Sourceforge. https://sourceforge.net/projects/veroroute/files/. To configure gEDA for use with VeroRoute, see the file "Using_gEDA_with_VeroRoute.txt" in the "Libraries/gEDA" folder where VeroRoute has been installed. It is worth looking at the TinyCAD pdf document too since it has some information on making your own symbols that will also be relevant to gEDA. The netlist file produced by TinyCAD/gEDA can be imported into VeroRoute using "File -> Import netlist -> Protel1/Tango" on the main menu. From VeroRoute v1.69, it is also possible to import netlists in OrcadPCB2 format using "File -> Import netlist -> OrcadPCB2". So one can now produce a schematic in KiCad, export the netlist in OrcadPCB2 format, and then import the netlist into VeroRoute. No VeroRoute symbols are provided for use with KiCad, but you can use the "Part Aliases" dialog in VeroRoute to map footprint names in the netlist file to things that VeroRoute understands. When a netlist file is first read for import, VeroRoute will list any unknown footprint/package names that it encounters in the bottom table of the "Part Aliases" dialog. You must provide a valid "Import String" for each row of that table, thus telling VeroRoute the part types to use, and then hit "Re-Import". The table in the top of the dialog lists the import strings that VeroRoute understands. Note that there are two possible import strings for diodes (DIODE, DIODE_IPC), and for LEDs (LED, LED_IPC). These differ in the convention used for labelling anode and cathode in the netlist. If you are importing a netlist produced by KiCad then you should use the DIODE_IPC and LED_IPC import strings, since KiCad follows the IPC standards of using pin 1 for cathode and pin2 for anode (which is the opposite of VeroRoute). Also note that the PADS import string (followed by an appropriate number) can be used to import any package as a set of separate "Pad" objects in VeroRoute. Download the document "Using TinyCAD with VeroRoute.pdf" as it describes how footprints with variable numbers of pins are handled. 17.3 EXPORTING AS PDF This is under "File -> Export as PDF" on the main menu. It should output 1-1 on A4 paper, so one grid step on the layout is 0.1 inches on paper. There are no scaling options available. It is recommended to do a trial run with just 4 suitably spaced pads that are one inch apart. You may need to set options in your PDF viewer to get things to print at the correct scale. 17.4 EXPORTING AS PNG This is under "File -> Export as PNG" on the main menu. This will export the displayed layout and grid as a PNG image file. 17.5 EXPORTING AS GERBER There are two options under the "File" menu that are only enabled when in PCB  mode. "Export as Gerber (1-layer)": This produces a PCB with a copper layer on the bottom of the board, a silkscreen on the top of the board, and non-plated through holes (NPTH). If you have wires (jumpers) in your design then you will need them on the manufactured board also. "Export as Gerber (2-layer)": If you have a single board layer then this option produces a PCB with a copper layer on the bottom of the board, a copper layer on the top of the board with tracks to replace your wires (jumpers), a silkscreen on the top of the board, and plated through holes (PTH). Since all the wires (jumpers) in your design become tracks on the top of the board, you will not need jumpers on the manufactured board. Note that if you have designed you layout in VeroRoute using two board layers (see Tutorial 18) then you will probably not require any wires, but if you include any then they will not be converted into tracks. You will be asked to select the prefix for the set of Gerber files. If you enter the prefix "FuzzBox", then it will create a set of output Gerber files called "FuzzBox.GBL", "FuzzBox.GBS", etc. Make sure to set the rendering options (described below) so that you have a suitable set of track parameters for your PCB. 17.6 PCB PARAMETERS (IN RENDERING OPTIONS DIALOG) All the following parameters affect the Gerber output and therefore the PCB board design. Note that the "Solder Mask Margin" and "Board Edge Margin" will not affect what you see on the screen in VeroRoute. The following are recommended default settings: Component Text Size = 10 Pad Width = 64 Track Width = 24 Hole Width = 34 Gap = 12 (if you are using a ground fill) Solder Mask Margin = 4 (or 0 if using JLCPCB). Silkscreen Line Width = 7 Board Edge Margin = 20 (is the distance of the board outline from the copper). A part can be given a custom pad and hole size by selecting the Custom  check box in the Control Dialog. For example, TO220 packages require larger holes so for those parts increase the pad width to 70 mil and the hole width to 40 mil. *** Pay attention to the "Current minimum track separation" reported in the dialog. This is calculated from your current layout. You should make sure it is not smaller than the requirements of your PCB manufacturer. Note that the maximum displayed value is limited to 100 mil. If using ground-fill will a low "Gap" value then the minimum track separation will often equal the "Gap" value. If not using ground-fill, or if the minimum track separation is smaller than the "Gap" value, then the rendering dialog will display a "Show closest tracks" checkbox. Checking this box will draw orange squares in the layout to indicate where the track separation is smallest. The orange squares consider all board layers, not just the currently displayed layer. The orange squares will be of larger size and have thicker lines if they refer to the currently displayed layer. Hit the "L" key a few times now to see what happens when you switch layer. It is advised not to leave the "Show closest tracks" option enabled while performing your layout as the view will take longer to draw and be more cluttered. *** Similarly, if using ground-fill you should pay attention to the "Current minimum ground-fill width" reported in the dialog. If this is too small then the manufactured board could have isolated islands in the ground-fill that are not connected to anything. So try to keep the value positive. If the value is smaller than the minimum track width supported by your PCB manufacturer, then you should examine the ground fill for isolated islands, since VeroRoute does not yet check for those automatically. 17.7 RENDERING OPTIONS Select "Windows!’Rendering Options" on the main menu to set the rendering options, or use the "mil" button on the toolbar. It is recommended to set anti-aliasing to "On", especially if writing to PDF. The "Target Board Dimensions" section allows you to specify a target board size and to highlight that in the view of the layout (except in Mono/PCB mode). For example, if you enter a target board size of 15x10 and check "Shade off-board area", then all points lying outside the central 15x10 grid squares (i.e. the off-board points) will have the background shown in a slightly darker shade instead of in white. You can still place parts in the off-board area and auto-routing will still work there. Remember that click-dragging the mouse in a part of the layout with no components will move the entire layout. So you can use that functionality to see if your layout can fit within the target board area. 17.8 BILL OF MATERIALS (B.O.M.) Select "Windows -> B.O.M" on the main menu to show the Bill Of Materials dialog. The table automatically updates as parts are added/removed from the layout. The B.O.M. can be written to a TAB separated text file, the contents of which can be easily pasted into Excel or another spreadsheet program. 17.9 PIN LABELS EDITOR Select "Windows -> Pin Labels Editor" on the main menu, or use the toolbar button. The dialog is only populated when a single part (with editable pin labels) is selected in the main window. The default pin labels are simply the pin numbers on the part. The pin label alignment with respect to the pin hole can be set by entering "L/C/R" for (Left/Right/Centre) in the the Align column. Note that an IC can only have its length changed while it has default pin labels, and default pin label alignment. To move a label left/right with respect to the text direction you can add spaces after/before the label. For example by entering " IN" or "IN " instead of "IN". 17.10 PARTS LIBRARY Select "Windows -> Parts Library" on the main menu, or use the toolbar button. Double-clicking on any listed item in the dialog will add a part of that type to the layout. There are two lists in the dialog. The top list of "Generic Parts" cannot be edited. It has all the components that VeroRoute provides by default. It includes all parts listed under the "Add" menu item, as well as some additional parts such as Relays, and several types of Bourns trim-pots. The bottom list of "Library Parts" can be edited, but may only contain the following types of part: TO-92 TO-18 TO-39 TO-220 DIP DIP (Rectifier) SIP Custom (i.e. parts created by the Component Editor) Apart from allowing custom parts, the main purpose of this list is to differentiate between parts that have the same package type but different meanings for the pins. For example, the PNP transistors BC327 and 2N5087 have the same TO-92 package type, but BC327 has pin1 as the collector, while 2N5087 has pin 1 as the emitter. Having both transistors as library parts (and using appropriate C,B,E pin labels) avoids any confusion. You can add parts from your layout to the library by first selecting them in the layout (so that they are drawn in bold) and then hitting the "Add from current layout" button. You can also add parts to the library directly from a VRT file using the "Add from VRT" button. You can save your parts library as a VRT file (for example to make a backup of your library) using the "Save to VRT" button.џџџџџџџџџџџ @"""2< џPџџџџџџџџџџ‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ!џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџPџџџџџџџџџџ‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ!џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџLџџџџџџџџџ Bџџџџџџџџџџџџџџџ Fџџџџџџџџџџџџџџџ !Iџџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџџџџџџџ Cџџџџџџџџџџџџџџџ HџџџџџџџџџџџџџџџџLџџџџџџџџџ @Gџџџџџџџџџџџџџџџ  @Aџџџџџџџџџџџџџџџ EџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ!џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџ $џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџ@?џџџџџџџџџџџџџџџ?џџџџџџџџџџџџџџџџџџџџџџџџџџ!џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ"џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ BџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџ  џџџџџџџџџџџџџџџ  џџџџџџџџџџџџџџџџџџџџџ!џџџџџџџџџџ"џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ"џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџdџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџdџџџџџџџџџ 0 џџџџџџAџџџџџџџџџ 0 џџџџџџAџџџџџџџџџџџџџџџџџџџџџџџџџBџџџџџџџџџBџџџџџџџџџџџџџџџ 08џџџџџџAџџџџџџџџџџџџџџ@џџџџџџDџџџџџџџџџџTџџџџџџџџџƒџџџџџџџџџџџџџџџџ DџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџF"џџџџџџџџџџџџџџџџџџџџџџџџџ @џџџџџџDџџџџџџџџџџDџџџџџџџџџ џџџџџ 8џџџџџџfџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџLџџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџџџџџџџџџџџџџџџџџdџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџDџџџџџџџџџџdџџџџџџџџџ џџџџџ 8џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџџџџџ џџџџџџ Dџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ3џџџџџџџџџџaџџџџџџџџџџџџџџџџџџџ џџџџџџDџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџPџџџџџџџџџџџџџџ€џџџџџџФџџџџџџџџџџDџџџџџџџџџ`џџџџџ  џџџџџџ џџџџџџџџџџџџџџџџџџџ џџџџџџ Pџџџџџџџџџ џџџџџ`"џџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџфџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџь>џџџџџ  џџџџџџџџџџџџџџџџџџџџџdџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџ Lџџџџџџџџџ@ џџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџ 8џџџџџџUџџџџџџџџџџ“џџџџџџџџџ џџџџџџиџџџџџџџџџџ•џџџџџџџџџџ џџџџџџџџџџџџџџџ!џџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџ dџџџџџџџџџџџџџџџPџџџџџџџџџџ‘џџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџNџџџџџџџџџџџџџџџџџџџ џџџџџџ џџџџџџџџџ€>џџџџџ  џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџ џџџџџџџџџ џџџџџџЬџџџџџџџџџџџџџџџџџџџ Pџџџџџџ ‘џџџџџџџџџ  џџџџџџDџџџџџџџџџџџџџџџџџџџ џџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџ"@ џџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџ џџџџџџ1џџџџџџџџџџAџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ  џџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџ@џџџџџ@џџџџџџџџџџџџџџџџџџџџџџџџџ`џџџџџ"$џџџџџџџџџџџџџџџџџџџџџџџџџ#џџџџџ  џџџџџџџџџџџџџџџџFџџџџџџџџџ џџџџџџџџџџџџџџџ @џџџџџџџџџџџџџџџџџџџџџџџџџ 0џџџџџ  aџџџџџџ џџџџџџџџџ џџџџџ#џџџџџџDџџџџџџџџџџџџџџџџџџџ #џџџџџџ4џџџџџџџџџџCџџџџџџџџџџ"bџџџџџџџџџ !џџџџџџ!1џџџџџџџџџ !Aџџџџџџџџџџџџџџџџdџџџџџџџџџ џџџџџџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџџџџџџџрџџџџџ  %џџџџџџ џџџџџџџџџ  &џџџџџџџџџџџџџџџ $џџџџџџџџџџџџџџџ @)џџџџџ b)џџџџџ )џџџџџџ"џџџџџџџџџ "џџџџџџџџџџџџџџџ!џџџџџџџџџџџџџџџџ4џџџџџџџџџCџџџџџџџџџџџџџџџ  !џџџџџџџџџџџџџџџ (џџџџџџџџџџџџџџџ %џџџџџџџџџџџџџџџ &џџџџџџџџџџџџџџџ $џџџџџџџџџџџџџџџ 9џџџџџџџџџџџџџџџ Jџџџџџџџџџџџџџџџ :џџџџџџџџџџџџџџџџџџџџџџџџџ #*џџџџџџџџџџџџџџџ +џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ!џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџаџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ€џџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџPџџџџџџџџџџ‘џџџџџџџџџџџџџџџџџџџџ1џџџџџџџџџџQџџџџџџџџџџ‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџˆџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџLџџџџџџџџџџ`џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџNџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџ4џџџџџџџџџџSџџџџџџџџџџџџџџџџџџџџ$џџџџџџџџџџџџџџџџџџџџPџџџџџџџџџџ‘џџџџџџџџџџ џџџџџџџџџџPџџџџџџџџџџ‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ!џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџ џџџџџџџџџџ.џџџџџџџџџџ0џџџџџџџџџџAџџџџџџџџџџџџџџџџџџџџLџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŒџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ"џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџBџџџџџџџџџџFџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџˆџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ˜џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџBџџџџџџџџџџ@џџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ„џџџџџџџџџџфџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџHџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџHџџџџџџџџџџXџџџџџџџџџџ•џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџФџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџPџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ!џџџџџџџџџџџџџџџџџџџџ`џџџџџџџџџџ џџџџџџџџџџ @џџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџdџџџџџџџџџџ џџџџџџџџџџdџџџџџџџџџџ џџџџџџџџџџ0џџџџџџџџџџQџџџџџџџџџџ™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ1џџџџџџџџџџAџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџ€џџџџџџџџџџџџџџџџџџџџbџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ DџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџ4џџџџџџџџџџCџџџџџџџџџџTџџџџџџџџџџƒџџџџџџџџџџџџџџџџџџџџNџџџџџџџџџџџџџџџџџџџџHџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџFџџџџџџџџџџPџџџџџџџџџџ‰џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ DџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџLџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџџdџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџ @џџџџџџџџџџDџџџџџџџџџџ џџџџџџџџџџФџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ$џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ"@џџџџџџџџџџPџџџџџџџџџџ‘џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ ФџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџXџџџџџџџџџџ…џџџџџџџџџџ`џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ"џџџџџџџџџџџџџџџџџџџџ"џџџџџџџџџџЬџџџџџџџџџџџџџџџџџџџџ#@џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ @џџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџ 0џџџџџџџџџџ AџџџџџџџџџџLџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ3џџџџџџџџџџaџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџ9џџџџџџџџџџEџџџџџџџџџџ!џџџџџџџџџџ#Dџџџџџџџџџџ!@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџџdџџџџџџџџџџџџџџџџџџџџрџџџџџџџџџџ џџџџџџџџџџфџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ6џџџџџџџџџџCџџџџџџџџџџbџџџџџџџџџџџџџџџџџџџџfџџџџџџџџџџ"џџџџџџџџџџ#dџџџџџџџџџџ!џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ#џџџџџџџџџџ#џџџџџџџџџџ#џџџџџџџџџџџџџџџџџџџџџџџџџџџџџ<џџ#D2 1N4148D Diode DIODEEF(12П№?№Пй™™™™™š?й™™™™™š@V€џfD?шQы…ИR?шQы…ИRПй™™™™™š?й™™™™™š@V€џfD?ъ=pЃз >?ъ=pЃз >Пй™™™™™š?й™™™™™š@V€џfD?ь(ѕТ\)?ь(ѕТ\)Пй™™™™™š?й™™™™™š@V€џfD?юzсGЎ?юzсGЎПй™™™™™š?й™™™™™š@V€џfDП№?№Пй™™™™™š?й™™™™™š@V€џfDџџ,R18220RRResistorRESISTOR EF(12ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@V€‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУПеТ\(ѕУ@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭ?еТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@NРN‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@n@^‚Я§  Т$D3REDDLEDLED џџџјNF(12Пь?ьПь?ь@>Р>џfDПь?ьПь?ь@>Р>џfDџџ,R1510kRResistorRESISTOR WF(12ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@V€‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУПеТ\(ѕУ@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭ?еТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@NРN‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@n@^‚Я§ † +0V0VPadSquarePadџџџђWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЮ?мЬЬЬЬЬЮ@V€џџпџџ,R2100kRResistorRESISTORNF(12ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@V€‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУПеТ\(ѕУ@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭ?еТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@NРN‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@n@^‚Я§џ† 0 RatioRatio 1M-ATextPCB TextWF(@V€џПр?рПр?р@V€ћџ‡ † :0V0VPadSquarePadџџџђWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЮ?мЬЬЬЬЬЮ@V€џџпџџ,R20100RRResistorRESISTOR WF("1##2ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@V€‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУПеТ\(ѕУ@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭ?еТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@NРN‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@n@^‚Я§ † JFSFSPadSquarePad џџџђWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЮ?мЬЬЬЬЬЮ@V€џџпџџD5 1N4148D Diode DIODE EF( 12П№?№Пй™™™™™š?й™™™™™š@V€џfD?шQы…ИR?шQы…ИRПй™™™™™š?й™™™™™š@V€џfD?ъ=pЃз >?ъ=pЃз >Пй™™™™™š?й™™™™™š@V€џfD?ь(ѕТ\)?ь(ѕТ\)Пй™™™™™š?й™™™™™š@V€џfD?юzсGЎ?юzсGЎПй™™™™™š?й™™™™™š@V€џfDП№?№Пй™™™™™š?й™™™™™š@V€џfD џ  X C74n7CFilmCAP_FILM SF(12Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДP   C810uC(Electrolytic 200 milCAP_ELECTRO_200 NF(!!1"2П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџџ,R61MRResistorRESISTOREF(12ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@V€‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУПеТ\(ѕУ@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭ?еТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@NРN‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@n@^‚Я§ † !InInPadSquarePad WF( 1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЮ?мЬЬЬЬЬЮ@V€џџп  Т&D6REDDLEDLEDSF(1 2Пь?ьПь?ь@>Р>џfDПь?ьПь?ь@>Р>џfD † D11PadSquarePad WP21ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЮ?мЬЬЬЬЬЮ@V€џџпџџ,R41MRResistorRESISTORWF( 12ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@V€‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУПеТ\(ѕУ@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭ?еТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@NРN‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@n@^‚Я§џ† 4 AttackAttack 10k-ATextPCB Text WF(@V€џПр?рПр?р@V€ћџ‡џџ,R3100kRResistorRESISTORSF(12ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@V€‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУПеТ\(ѕУ@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭ?еТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@NРN‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@n@^‚Я§џџ,R131MRResistorRESISTOR EF(12ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@V€‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУПеТ\(ѕУ@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭ?еТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@NРN‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@n@^‚Я§џє?C51uCCeramicCAP_CERAMICEF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ P † E33PadSquarePad WP21ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЮ?мЬЬЬЬЬЮ@V€џџпџџ,R51kRResistorRESISTORWF( 1 2ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@V€‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУПеТ\(ѕУ@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭ?еТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@NРN‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@n@^‚Я§џџ,R9220RRResistorRESISTOR WF(12ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@V€‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУПеТ\(ѕУ@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭ?еТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@NРN‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@n@^‚Я§ † C22PadSquarePad WP21ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЮ?мЬЬЬЬЬЮ@V€џџпџџ,R133RRResistorRESISTOR EF(12ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@V€‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУПеТ\(ѕУ@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭ?еТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@NРN‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@n@^‚Я§ † 99V9VPadSquarePad џџџђWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЮ?мЬЬЬЬЬЮ@V€џџп † (0V0VPadSquarePadWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЮ?мЬЬЬЬЬЮ@V€џџпџџ,R121kRResistorRESISTOR EF(12ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@V€‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУПеТ\(ѕУ@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭ?еТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@NРN‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@n@^‚Я§џє>C6100pCCeramicCAP_CERAMIC NF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ P † A22PadSquarePad WP2 1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЮ?мЬЬЬЬЬЮ@V€џџпџџ,R224k7RResistorRESISTOR EF(12ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@V€‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУПеТ\(ѕУ@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭ?еТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@NРN‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@n@^‚Я§џџ,R11470kRResistorRESISTOR EF(12ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@V€‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУПеТ\(ѕУ@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭ?еТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@NРN‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@n@^‚Я§   C147uC(Electrolytic 200 milCAP_ELECTRO_200 SF(12П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџє C41uCCeramicCAP_CERAMIC EF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PџџD4 1N4148D Diode DIODE WF( 1 2П№?№Пй™™™™™š?й™™™™™š@V€џfD?шQы…ИR?шQы…ИRПй™™™™™š?й™™™™™š@V€џfD?ъ=pЃз >?ъ=pЃз >Пй™™™™™š?й™™™™™š@V€џfD?ь(ѕТ\)?ь(ѕТ\)Пй™™™™™š?й™™™™™š@V€џfD?юzсGЎ?юzсGЎПй™™™™™š?й™™™™™š@V€џfDП№?№Пй™™™™™š?й™™™™™š@V€џfD † F22PadSquarePad WP21ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЮ?мЬЬЬЬЬЮ@V€џџп        џџџџџџџџџџџџџџџџ        @U2LM13700ICDIPDIPNF(1 23456 7!!8910111213141516РЬЬЬЬЬЭ@ЬЬЬЬЬЭП№?№@V€   РЬЬЬЬЬЭРЬЬЬЬЬЭП№Па@V€   РЬЬЬЬЬЭРЬЬЬЬЬЭ?а?№@V€   РЬЬЬЬЬЭ@ЬЬЬЬЬЭ?№?№@V€   @ЬЬЬЬЬЭРЬЬЬЬЬЭП№П№@V€   @ЬЬЬЬЬЭ@ЬЬЬЬЬЭ?№П№@V€   РffffffР ЬЬЬЬЬЭПа?аРV€@V€   џџ,R1710kRResistorRESISTOR EF(12ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@V€‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУПеТ\(ѕУ@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭ?еТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@NРN‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@n@^‚Я§ † *OutOutPadSquarePadџџџ№WF(##1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЮ?мЬЬЬЬЬЮ@V€џџп       џџџџџџџџџџџџџџ       @U1 TL074ICDIPDIPNF(123456 7891011121314Р ЬЬЬЬЬЭ@ ЬЬЬЬЬЭП№?№@V€   Р ЬЬЬЬЬЭР ЬЬЬЬЬЭП№Па@V€   Р ЬЬЬЬЬЭР ЬЬЬЬЬЭ?а?№@V€   Р ЬЬЬЬЬЭ@ ЬЬЬЬЬЭ?№?№@V€   @ ЬЬЬЬЬЭР ЬЬЬЬЬЭП№П№@V€   @ ЬЬЬЬЬЭ@ ЬЬЬЬЬЭ?№П№@V€   Р ЬЬЬЬЬЭРЬЬЬЬЬЭПа?аРV€@V€    † I33PadSquarePad WP21ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЮ?мЬЬЬЬЬЮ@V€џџп   C210uC(Electrolytic 200 milCAP_ELECTRO_200 SF(12П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџџ, R21100kRResistorRESISTOR EF(1"2ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@V€‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУПеТ\(ѕУ@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭ?еТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@NРN‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@n@^‚Я§ џ  XC310nCFilmCAP_FILMEF(1 2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДP † G11PadSquarePad WP21ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЮ?мЬЬЬЬЬЮ@V€џџпџџ,R144k7RResistorRESISTOR SF(12ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@V€‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУПеТ\(ѕУ@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭ?еТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@NРN‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@n@^‚Я§џџ,R1610kRResistorRESISTOR EF(12ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@V€‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУПеТ\(ѕУ@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭ?еТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@NРN‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@n@^‚Я§   L8Q1 BC327QTO92TO92 џџџяNF(123Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џџ"D1 1N4001D Diode DIODESD&12П№?№Пй™™™™™š?й™™™™™š@V€џfD?шQы…ИR?шQы…ИRПй™™™™™š?й™™™™™š@V€џfD?ъ=pЃз >?ъ=pЃз >Пй™™™™™š?й™™™™™š@V€џfD?ь(ѕТ\)?ь(ѕТ\)Пй™™™™™š?й™™™™™š@V€џfD?юzсGЎ?юzсGЎПй™™™™™š?й™™™™™š@V€џfDП№?№Пй™™™™™š?й™™™™™š@V€џfD † B11PadSquarePad WP21ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЮ?мЬЬЬЬЬЮ@V€џџп † H33PadSquarePad WP21ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЮ?мЬЬЬЬЬЮ@V€џџпџџ,R7220RRResistorRESISTORWF(12ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@V€‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУПеТ\(ѕУ@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭ?еТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@NРN‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@n@^‚Я§  Т%D7REDDLEDLEDџџџјNF( 12Пь?ьПь?ь@>Р>џfDПь?ьПь?ь@>Р>џfDџџ,R8100RRResistorRESISTORSF( 12ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@V€‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУПеТ\(ѕУ@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭ?еТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@NРN‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@n@^‚Я§џџ,R101kRResistorRESISTOREF(12ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@V€‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУПеТ\(ѕУ@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭ?еТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@NРN‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@n@^‚Я§џ† 1 LevelLevel 10k-ATextPCB TextWF(@V€џПр?рПр?р@V€ћџ‡џџ,R194k7RResistorRESISTOREF(1!2ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@V€‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭПеТ\(ѕУПеТ\(ѕУ@V€‚Я§ПфЬЬЬЬЬЭ?фЬЬЬЬЬЭ?еТ\(ѕУ?еТ\(ѕУ@V€‚Я§Пё™™™™™šПрПй™™™™™š?й™™™™™™@NРN‚Я§?р?ё™™™™™šПй™™™™™š?й™™™™™™@n@^‚Я§   L)Q2 BS170QTO92TO92 џџџ№WF(123Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   B@џџџўINVALID TracksWF(џџџ€џџџ€џџџ€џџџ€џџџџџџџџF(PadPadSquarePadSQUAREPAD ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЮ?мЬЬЬЬЬЮ@V€џџпVeroRoute/libraries/gEDA/veroroute_transistor/PNP_BC556.sym000644 001750 001750 00000001562 13515171161 023772 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=1 T 400 850 5 6 0 0 0 0 1 pinseq=1 T 400 850 5 6 0 0 0 0 1 pinlabel=1 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=3 T 400 50 5 6 0 0 0 0 1 pinseq=3 T 400 50 5 6 0 0 0 0 1 pinlabel=3 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 297,341 L 199,350 L 269,277 L 275,310 z T 600 700 5 10 1 1 0 0 1 device=BC556 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=PNP Transistor VeroRoute/Src/images/layerpref.png000644 001750 001750 00000010623 14561223062 017432 0ustar00alexalex000000 000000 ‰PNG  IHDR szzє жzTXtRaw profile type exifxк­Yi–4Љ ќЯ)|vСqиєžoру;$ШЌЌъъљfќме]Й‘ ЄP( ЭњЯПйќ ?бњbbЂ’kЮ?БЦъNŠн?UПњ­?ў<Тѕл}s?№Иp ћ’кiпp?Н^ИЦp§§О)ч‰/ЇЃѓръ0ШШ2к|‰ћ~пwёtTз>ЩЕагд~LЇЁšrўњщT-ВћкpщЛѓеХУm‘P’]?Іsў˜ga^{v-fx4DЉГне vИ<шkТ_Т9щЇтSlГ!ŸvиŽЯpеyD…‹nКци-=7`bєЫŽоє^ фЋAтхуи"6CAА†_&міЗ-NЧ­:оp#O‡ІоЁ3‡W~§˜ПzјO>†yˆ‹œ-ЗЏ`—\У ‰œ|ЃтјФ-ЉƒЏЯ П}рPE“КЙ`‚ЭінEOю…­ qh—pм)ф Эг\„БŒqАй…фВГф=9?ЈСrф‰яˆ€KЩOщcйђHŒwШi[Ÿ|іrм„@Є!6Ш)+ЦќP,РPK!Х”RN”ŠI5ЕrЬ)чLYHЎQ H‰2ЊдJ(БЄ’ •RjiезL5WЊЅжкš7 5єеаОсNї=єиSЯzщЕЗјŒ8вШƒFuДщg˜ ‰™'Э2ыlЫ™ІXqЅ•­Въj ЌqрШ‰3ЎмюЈЈўјќƒЈЙ5Џ‘’vtG w бе…:I3DЬG‡ˆ“D€і3[\Œ^"'1Ге#)’‡‘IbcІ“ˆ!„q9ŸинБ{EюoХЭЄђЗтцџ9#ЁћDЮ t?уі%jSъмаˆэ,Ÿк€ь0Ѕ4ућЊƒ3l—KЉo[’яfqяш ™J_НђœЖс+пЃ‡RИѓBkSЌО/—}хХІ­лY*#nг3… Їw`cŸƒk[{Р§NdkД1ЃёЬЁч23У{reХBп[™уaэЏGѓЇzФєу™лŽ’)ƒg|є6aj3IТ#brв6#X olЯЌD ѓ˜‰уХЙі >_t†rдGh˜w.m­с€Н團kЭХyЉвЪŽSXp~;“@ўp–]лЃЫРНBЊЄ2ЙM`БУІд[хHЇ“ЁЬ,,`Т'T8qѓ0"fњ,#ЂјЬ>u’œ}Oтёэ‚%“iЅ>$F˜bxFг^С4ПDѓгќ1Xjž л=їдOЛќШ4kа@Š{Œњ'…к#“˜cXЁ—xЅЩr§Ѕ•sGэциJNМ`юb“к\ Ž@j‘51ђq€[+ёpaV„SТщˆПК>˜‹>DњLyйr3TЯЭ Œ€еЌиAtS t›‹ П rI4Ѕ‹$85Шqђ’ѕ4ІKЫsZ­‘•C%šгцъЉ1Ђ„аŽIYцnТГ5Х !ќРИ`Й:щ™w—po-тЈф1}‚3;rpт `„vБžьxa™5лЬ8ŽWkёzšTкeњ˜%ШC 3ЌАЭС­c-KІAbОЏЂќ‘M№АBФЊБанрЕЊєщЂп<Ap<[РuЩЌŠњЖН(ъ{eˆЫ‹ЗCЧРфыZAбŽыР}д’’Qџ78)5;Lѓ ) Wл*'Фajš­3 Mє‘яQсЯJА(зDОзрR №zСЋnфхіK:Ї Ъ#—lOЂп я“Сѕ3"fI Мь;›}5 ЯЩДНРK(<`5jФкoII*КхЦ еСэKbJг xvМI!с…W•œ‚ЙˆB‹Њ Vkє.§IАQЙwA ЌF/iS'Ed-|Д_ї}4Л+оrš}Ёkц-аЭ šRN Ÿт.ЬHїbЦВpъ“‘УkžТO№ёА@ЇOТšXЉ€м.B ‚AщЇиЭˆћќяЂ žкyё}&7IФ:'ъІ.D з‘3шu\:SсvјБиыИ9УkЅ…CљŒ\РAO\”+Ш.ѓБ9іŠPydbV˜$Є”КЄ&xu`.Ї№‘?ф9~LѕУолю!@/U!ZЙp 8ZШ@]L х~ШFjjNХ)ЈЮxpкСзZЛ5р'Z€ч]_Œ\Ÿ•]4Сёc€цЅ‚_AY)И^<7бN:s–ЅYЊТўТ С|Ё>Є0†ЏM(МQ е RD/ юU„0vЪKЦХ…F4bžФа Ф&ˆїRJWрЪ(R м–}P`:а‡‰ХBБЯHDa`vР ц ”C†qрЩ:ЁшЯФˆф^1Т@%œY~цГNr'Ъњ=AЕ€:т•дš.іdсЖл"0о’et,ь‚рYBhfV”К™Z[H#PŒЬЌ‹*šBВњ%эЌ‚G?+œ‚IN—ЅУ"ђЂžW›*І p‹e››),жuёђ€RƒdGвDлQfŸ'х@Лo‹ƒД)Iё3Ј~S! ИŠ{T…‚ёДјЕz‹7xЎiэѓ,EЄПЋЉTяЄЎЁШiэ"YX?/ _yІV9bRеŠд Bъц.O…Ш­мХчF‹:И†ƒоЊI$L]•Љ%$ЏZ&pŽŸUPцœЄ…&МyЦшЊ ѓ1]ЯgˆŸ$ЎT^‡>‚№jЧ№xЛ˜$Ћea ОРZƒЫЛю‚l€f“РQФ™[F<'VCAмќ0тбhТњЌ%Х“‘`=K=FЬ‘@ Rф!юVЕЇVьt ”)v§VŒgСтпW+цsЙrФѓЮwхќдЭZaД"­ВЧдqkФм §ёќдЕк5 IОQюhsЗнХd'2–b[Tb•­ѕЭўўЪE(W—ШЖгVPZі#‰†ќ–іWQлќ M8шMOшI…ŠюЂЂii aMнУˆЛрH?ѓ0ОTh Lžv}^D%ˆђ„AеC7…Нo­ІUzZШM!/а”#†ЙP7FъЪЅDБkкНІ-RиZХr›ЛXЗ@Љa­|І,pЌрgбˆ,}d•zg WДЮ%•vLі…ŒA=ƒЯБ„:{*В9ш|uBўнц8Rђхц/y)ž|Ќ™ПјУќtШ|ЬПЭh]ЦMдˆS6 Ьšz~­рe‡‡…х‹j7ІЃF1Ћx["о–Џ[С”љxt‹Б{?ф}зA†ЈЏ ‚‘хЎ[ћЂžъоАUWHа=гШџU2EнЖШВеѕцoЕydЇ‹њ–3рбž3•<Р(UœlС„5e&Ш0йIВf(>ŸdъЖОі…ѕж9šљВg!ђшЬwК№Ъw5щ‹РSjСљ3–СцZОЋ|ŽztъхxыгЛ+џ+”п ‹6˜e‡ oы!ПпЖ‡эо~mkŸшЏ’ѕъЎЈddЅЏkzПд{ТYu;АˆI›92gfњu—лˆˆGгъnУ—§бGЭЛітэQЃ7Ч™_)яzёљЯЊэ‚ƒdЉ~”цкKQLьD6Ž#ПОъН–2ѓЌpђWݘ§P 9„iCCPICC profilexœ}‘=HУ@Х_SЅE*‚vuШPЌˆŠ8jŠP!д ­:˜\?ЁIC’тт(ИќXЌ:И8ыър*‚ ЮNŠ.Rтџ’B‹Žћёюоую дЫL5;ЦUГŒd<&І3Ћbр‚шХefъs’”€чјК‡ЏwQžх}юЯбЭ™ №‰ФГL7,т тщMKчМOfE9K|NN€u•И‘eЏ{М;иолПgš§§pprІВr[bKGDџЫЦмкbз pHYsФФ•+tIMEш<я ЎIDATXУ­—Ё’т@†џоŠBЌлЊˆН'@Ї u‰{‚{€Г€9‹иЌРЎЩbяqHpЩ)ЊаМС Њж ВO$&“žЩpЛ]…€„|їtџ3ЁзёRЬvc6[Oі„ŽР&ъ˜™?ZH`ТpоНY]cf^Oі4лUeо/ чŽЛѓЋffЊе…љ/!7мвˆxi•ЙYHрЬv р­ўžH,їІмY"пІК”эьѓи"’*kzFЕOp5А(DЎ@jЩtmЏ?скР)ї6pџHёжРв2щ"юФ›nыф^И!„ˆП‘ЬlіTtк/Ÿ€”ЊЯics[Ј9v7тC-Jj@3ћги|эвІ?сTK†РЬ„‰iоО ‡€§їЖ€:юjг fЖЯЙ Ю*мџШF4пO€ЩЎэ –Н@ TГЏцОїV˜е чћ `N•ˆ>3qЦјХов‰s]и4›g#о?VЂ„\OіH­ЭЂ—Гu3N!ћ/жЧRЋPзZb}ЬЈЮ^UŸєLѓ. */ #pragma once #include "Element.h" // For BAD_COMPID, TRAX_COMPID // The class that manages grouping/ungrouping of components. // Every group has a "groupId", and every component has a "compId". // The manager maintains a list of pairs, ordered by increasing groupId. // For any component, the highest groupId that it is paired with (its "sibling group") // contains all the component's siblings. // The very first group in the list (with groupId of 0) is called the "user-group", and // only ever contains the component(s) that are currently selected by the user in the view. // If the user only has a single component selected, then the "user-group" only contains // that component. // Using the SHIFT key to multi-select components puts them all in the "user-group". // On pressing "G", all the components in the "user-group" are put into a new group with a // group ID that is larger than all others. // On pressing "U" to ungroup components, then if all the components in the "user-group" // are siblings, the sibling group is destroyed. class Board; Q_DECL_CONSTEXPR static const int USER_GROUPID = 0; // Kept at the beginning of the list Q_DECL_CONSTEXPR static const int BAD_GROUPID = -1; // Never allowed in the list. class GroupManager : public Persist, public Merge { public: GroupManager() {} virtual ~GroupManager() {} GroupManager(const GroupManager& o) { *this = o; } GroupManager& operator=(const GroupManager& o) { m_list.clear(); for (const auto& oo : o.m_list) m_list.push_back( std::pair(oo.first, oo.second) ); return *this; } bool operator==(const GroupManager& o) const // Compare persisted info { if ( GetSize() != o.GetSize() ) return false; bool bOK(true); auto iter1 = m_list.begin(); auto iter2 = o.m_list.begin(); while( iter1 != m_list.end() && bOK ) { bOK = ( iter1->first == iter2->first ) && ( iter1->second == iter2->second ); ++iter1; ++iter2; } return bOK; } bool operator!=(const GroupManager& o) const { return !(*this == o); } void Clear() { m_list.clear(); } size_t GetSize() const { return m_list.size(); } bool GetIsUserComp(int compId) const // Check if the component is in the user-group { if ( compId == TRAX_COMPID ) return true; for (auto iter = m_list.begin(); iter != m_list.end() && iter->first == USER_GROUPID; ++iter) if ( iter->second == compId ) return true; return false; } int GetNumUserComps() const { return GetNumGroupComps(USER_GROUPID); } // Get number of user-group components int GetUserCompId() const // Get the only component in the user-group { assert( GetNumUserComps() == 1 ); return m_list.begin()->second; } void ResetUserGroup(int compId) // Reset the user-group with the comp (and its siblings) { if ( compId == TRAX_COMPID ) return; RemoveGroup(USER_GROUPID); // Wipe the user-group ... UpdateUserGroup(compId); // ... then put the comp (and its siblings) in it } void UpdateUserGroup(int compId) // Add/Remove comp (and its siblings) to user-group { if ( compId == TRAX_COMPID ) return; if ( !GetIsUserComp(compId) ) return AddToUserGroup(compId); // Comp not in group, so add it if ( GetNumUserComps() > 1 ) return RemoveFromUserGroup(compId); // Comp is not the last, so remove it ... } int GetNewGroupId() { Compact(); return m_list.back().first + 1; } // Get new groupId bigger than all others bool CanGroup() const { return GetNumUserComps() > 1 && GetSiblingGroupId() == USER_GROUPID; } bool CanUnGroup() const { return GetNumUserComps() > 1 && GetSiblingGroupId() != USER_GROUPID; } void Group() // When user hits "G" { if ( !CanGroup() ) return; // User-group components are already grouped so quit const int newGroupId = GetNewGroupId(); // Make new groupId bigger than all others if ( newGroupId == INT_MAX ) return; // Fail if we've reached the max allowed groupId for (auto iter = m_list.begin(); iter != m_list.end() && iter->first == USER_GROUPID; ++iter) Add(newGroupId, iter->second); // Copy comps from the user-group to the new group } void UnGroup(int compId) // When user hits "U" { if ( !CanUnGroup() ) return; // User-group components are not grouped so quit RemoveGroup( GetSiblingGroupId() ); // Wipe the sibling group RemoveGroup(USER_GROUPID); // Wipe the user-group ... UpdateUserGroup(compId); // ... and put the specified comp (and its siblings) in it } void RemoveComp(int compId) // Remove all entries with the specified compId { if ( compId == TRAX_COMPID ) return; while(true) // Keep going till we've erased all relevant entries { bool bErased(false); for (auto iter = m_list.begin(), iterEnd = m_list.end(); iter != iterEnd && !bErased; ++iter) if ( iter->second == compId ) { m_list.erase(iter); bErased = true; } if ( !bErased ) return; } } void Add(int groupId, int compId) { if ( groupId == BAD_GROUPID || compId == BAD_COMPID || compId == TRAX_COMPID ) return; const std::pair entry(groupId, compId); if ( std::find(m_list.begin(), m_list.end(), entry) != m_list.end() ) return; // Entry exists if ( groupId == USER_GROUPID ) m_list.push_front(entry); else m_list.push_back(entry); } void Remove(int groupId, int compId) { if ( groupId == BAD_GROUPID || compId == BAD_COMPID || compId == TRAX_COMPID ) return; const std::pair entry(groupId, compId); const auto iterFind = std::find(m_list.begin(), m_list.end(), entry); if ( iterFind != m_list.end() ) m_list.erase(iterFind); // Erase entry if it exists } // Merge interface functions virtual void UpdateMergeOffsets(MergeOffsets& o) override { o.deltaGroupId = GetNewGroupId(); // This compacts the current groupIds for (const auto& oo : m_list) o.deltaCompId = std::max(o.deltaCompId, oo.second + 1); } virtual void ApplyMergeOffsets(const MergeOffsets& o) override { Compact(); // Compact BEFORE applying the offsets for (auto& oo : m_list) { if ( oo.first != USER_GROUPID ) oo.first += o.deltaGroupId; // Don't apply merge offsets to the user group oo.second += o.deltaCompId; } } void Merge(const GroupManager& o) { RemoveGroup(USER_GROUPID); // Wipe existing user group. It will be replaced by the one in 'o' for (const auto& oo : o.m_list) { if ( !GetEntryIsOK(oo) ) continue; // The merge offsets must have blown the compId or groupId limits if ( oo.first == USER_GROUPID ) m_list.push_front( std::pair(oo.first, oo.second) ); else m_list.push_back( std::pair(oo.first, oo.second) ); } } // Persist interface functions virtual void Load(DataStream& inStream) override { Clear(); unsigned int iSize(0); int groupId(0), compId(0); inStream.Load(iSize); for (unsigned int i = 0; i < iSize; i++) { inStream.Load(groupId); inStream.Load(compId); const std::pair entry(groupId, compId); m_list.push_back(entry); } } virtual void Save(DataStream& outStream) override { const unsigned int iSize = static_cast( GetSize() ); outStream.Save(iSize); for (const auto& o : m_list) { outStream.Save(o.first); outStream.Save(o.second); } } void GetUserCompIds(std::list& userCompIds) const // Get a copy of the component IDs for the user group { userCompIds.clear(); for (auto iter = m_list.begin(); iter != m_list.end() && iter->first == USER_GROUPID; ++iter) userCompIds.push_back(iter->second); } private: int GetSiblingGroupId(int compId) const // Get highest groupId that the comp belongs to { for (auto riter = m_list.rbegin(); riter != m_list.rend(); ++riter) // Loop groups in reverse order if ( riter->second == compId ) return riter->first; return BAD_GROUPID; } void AddToUserGroup(int compId) // Add comp (and its siblings) to user-group { const int iSiblingGroupId = GetSiblingGroupId(compId); if ( iSiblingGroupId <= USER_GROUPID ) return Add(USER_GROUPID, compId); // No siblings. Add comp only. for (auto iter = m_list.begin(); iter != m_list.end() && iter->first <= iSiblingGroupId; ++iter) if ( iter->first == iSiblingGroupId ) Add(USER_GROUPID, iter->second); } int GetNumGroupComps(int groupId) const // Get number of components with specified groupId { int count(0); for (auto iter = m_list.begin(); iter != m_list.end() && iter->first <= groupId; ++iter) if ( iter->first == groupId ) count++; return count; } void RemoveGroup(int groupId) // Remove all entries with the specified groupId { auto iterBegin = m_list.begin(); // Slide iterBegin to the first entry with the correct group while( iterBegin != m_list.end() && iterBegin->first != groupId ) ++iterBegin; auto iterEnd = iterBegin; // Slide iterEnd past the last entry with the correct group while( iterEnd != m_list.end() && iterEnd->first == groupId ) ++iterEnd; if ( iterBegin != iterEnd ) m_list.erase(iterBegin, iterEnd); } int GetSiblingGroupId() const // Considers all components in the user-group { int iSiblingGroupId(BAD_GROUPID); for (auto iter = m_list.begin(); iter != m_list.end() && iter->first == USER_GROUPID; ++iter) { if ( iSiblingGroupId == BAD_GROUPID ) iSiblingGroupId = GetSiblingGroupId(iter->second); else if ( iSiblingGroupId != GetSiblingGroupId(iter->second) ) return USER_GROUPID; // Some comps in the user-group are not siblings } return iSiblingGroupId; // > USER_GROUPID only if all comps in the user-group are siblings } void RemoveFromUserGroup(int compId) // Remove comp (and its siblings) from user-group { const int iSiblingGroupId = GetSiblingGroupId(compId); if ( iSiblingGroupId <= USER_GROUPID ) return Remove(USER_GROUPID, compId); // No siblings. Remove comp only. for (auto iter = m_list.begin(); iter != m_list.end() && iter->first <= iSiblingGroupId; ++iter) if ( iter->first == iSiblingGroupId ) Remove(USER_GROUPID, iter->second); } bool GetEntryIsOK(const std::pair& o) const { return o.first >= USER_GROUPID && o.first < INT_MAX && o.second != BAD_COMPID && o.second != TRAX_COMPID; } void Compact() // Make groupId's increment by 1 { int newGroupId(0); // Start at lowest groupId for (const auto& o : m_list) { const int groupId = o.first; if ( groupId == newGroupId + 1 ) newGroupId++; else if ( groupId > newGroupId + 1 ) // Remap groupId if it has increased by more than 1 { newGroupId++; for (auto i = m_list.begin(); i != m_list.end() && i->first <= groupId; ++i) if ( i->first == groupId ) i->first = newGroupId; } } } private: std::list> m_list; // List of pairs, ordered by increasing groupId }; VeroRoute/Src/Transform.h000644 001750 001750 00000004033 14431367775 015630 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include "Common.h" #include // Class to transform a QPointF (i.e. translate/rotate it w.r.t. the origin) enum class TRANSFORM { NONE = 0, SCALE, TRANSLATE, ROTATE }; struct Transform { Transform(TRANSFORM eType, qreal a = 0, qreal b = 0) : m_eType(eType), m_A(a), m_B(b) {} ~Transform() {} Transform(const Transform& o) { *this = o; } Transform& operator=(const Transform& o) { m_eType = o.m_eType; m_A = o.m_A; m_B = o.m_B; return *this; } void Do(QPointF& o) const // Transform the passed in point { qreal dRadians(0), C(0), S(0); const qreal x = o.x(); // Take a copy (not a reference) const qreal y = o.y(); // Take a copy (not a reference) switch( m_eType ) { case TRANSFORM::SCALE: o.setX(x * m_A); o.setY(y * m_B); return; case TRANSFORM::TRANSLATE: o.setX(x + m_A); o.setY(y + m_B); return; case TRANSFORM::ROTATE: dRadians = m_A * RADIANS_PER_DEGREE; C = cos(dRadians); S = sin(dRadians); o.setX(x*C - y*S); o.setY(x*S + y*C); return; default: assert(m_eType == TRANSFORM::NONE); return; } } const TRANSFORM& GetType() const { return m_eType; } private: TRANSFORM m_eType = TRANSFORM::TRANSLATE; // Transform type qreal m_A = 0; // Parameter 1 qreal m_B = 0; // Parameter 2 }; VeroRoute/Src/CompDefiner.h000644 001750 001750 00000050730 14417013700 016031 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include "Grid.h" #include "Shape.h" class Component; // Class used to build a description of a custom component // The following flags are used to form a bitfield that determine how pins may be drawn Q_DECL_CONSTEXPR static const uchar PIN_RECT = 1; // Draw pin as a rectangle instead of circle (e.g. for switches/relays) Q_DECL_CONSTEXPR static const uchar PIN_LABELS = 2; // Allow pin labels to be drawn Q_DECL_CONSTEXPR static const uchar PIN_CUSTOM = 4; // Allow over-ride of pad and hole size Q_DECL_CONSTEXPR static const int BAD_ID = -1; // Quicker to use struct than a std::pair struct IntShape { IntShape(int i, const Shape& s) : first(i), second(s) {} IntShape(const IntShape& o) { *this = o; } IntShape& operator=(const IntShape& o) { first = o.first; second = o.second; return *this; } bool operator<(const IntShape& o) const { if ( second != o.second ) return second < o.second; return first < o.first; } bool operator==(const IntShape& o) const { return first == o.first && second == o.second; } bool operator!=(const IntShape& o) const { return !(*this == o); } int first; Shape second; }; class TemplateManager; class CompDefiner : public Persist { public: CompDefiner() { Clear(); } virtual ~CompDefiner() {} CompDefiner(const CompDefiner& o) { *this = o; } void Populate(const Component& o); // Set up using an existing component void Clear() { m_currentPinId = m_currentShapeId = BAD_ID; m_iPinFlags = 0; m_iPadWidth = 70; m_iHoleWidth = 35; m_bAllowFlyWire = false; m_valueStr = m_prefixStr = m_typeStr = m_importStr = ""; m_iLabelOffsetRow = m_iLabelOffsetCol = 0; m_grid.Allocate(1,4,4); m_grid.Clear( Pin(BAD_PINCHAR, SURFACE_FULL, HOLE_FREE) ); m_pinLabels.clear(); m_pinAligns.clear(); m_mapShapes.clear(); AddRect(); // Provide a Rect by default } CompDefiner& operator=(const CompDefiner& o) { m_currentPinId = o.m_currentPinId; m_currentShapeId = o.m_currentShapeId; m_iPinFlags = o.m_iPinFlags; m_iPadWidth = o.m_iPadWidth; m_iHoleWidth = o.m_iHoleWidth; m_bAllowFlyWire = o.m_bAllowFlyWire; m_valueStr = o.m_valueStr; m_prefixStr = o.m_prefixStr; m_typeStr = o.m_typeStr; m_importStr = o.m_importStr; m_iLabelOffsetRow = o.m_iLabelOffsetRow; m_iLabelOffsetCol = o.m_iLabelOffsetCol; m_grid = o.m_grid; AllocatePins( o.GetNumPins() ); std::copy(o.m_pinLabels.begin(), o.m_pinLabels.end(), m_pinLabels.begin()); std::copy(o.m_pinAligns.begin(), o.m_pinAligns.end(), m_pinAligns.begin()); m_mapShapes.clear(); for (const auto& mapObj : o.m_mapShapes) m_mapShapes.push_back(mapObj); return *this; } size_t GetNumPins() const { return m_pinLabels.size(); } void AllocatePins(size_t numPins) { m_pinLabels.clear(); m_pinLabels.resize(numPins, ""); m_pinAligns.clear(); m_pinAligns.resize(numPins, Qt::AlignHCenter); SetDefaultPinLabels(); } void ReAllocatePins(size_t maxPinNumber) { // Take copy of old array values std::vector labels; labels.resize(GetNumPins()); std::vector aligns; aligns.resize(GetNumPins()); std::copy(m_pinLabels.begin(), m_pinLabels.end(), labels.begin()); std::copy(m_pinAligns.begin(), m_pinAligns.end(), aligns.begin()); AllocatePins(maxPinNumber); // Use old values in new arrays std::copy(labels.begin(), labels.end(), m_pinLabels.begin()); std::copy(aligns.begin(), aligns.end(), m_pinAligns.begin()); } void SetDefaultPinLabels() { for (size_t i = 0, iSize = GetNumPins(); i < iSize; i++) m_pinLabels[i] = CompTypes::GetDefaultPinLabel(i); } bool operator==(const CompDefiner& o) const // Compare persisted info { bool bOK = m_currentPinId == o.m_currentPinId && m_currentShapeId == o.m_currentShapeId && m_iPinFlags == o.m_iPinFlags && m_iPadWidth == o.m_iPadWidth && m_iHoleWidth == o.m_iHoleWidth && m_bAllowFlyWire == o.m_bAllowFlyWire && m_valueStr == o.m_valueStr && m_prefixStr == o.m_prefixStr && m_typeStr == o.m_typeStr && m_importStr == o.m_importStr && m_iLabelOffsetRow == o.m_iLabelOffsetRow && m_iLabelOffsetCol == o.m_iLabelOffsetCol && m_grid == o.m_grid && m_pinLabels.size() == o.m_pinLabels.size() && m_pinAligns.size() == o.m_pinAligns.size() && m_mapShapes.size() == o.m_mapShapes.size(); if ( !bOK ) return false; for (size_t i = 0, iSize = m_pinLabels.size(); i < iSize; i++) if ( m_pinLabels[i] != o.m_pinLabels[i] ) return false; for (size_t i = 0, iSize = m_pinAligns.size(); i < iSize; i++) if ( m_pinAligns[i] != o.m_pinAligns[i] ) return false; for (auto iterA = m_mapShapes.begin(), iterB = o.m_mapShapes.begin(); iterA != m_mapShapes.end() && iterB != o.m_mapShapes.end(); ++iterA, ++iterB) if ( (*iterA) != (*iterB) ) return false; return true; } bool operator!=(const CompDefiner& o) const { return !(*this == o); } bool SetCurrentPinId(int i) { const bool bChanged = ( m_currentPinId != i ); m_currentPinId = i; return bChanged; } bool SetCurrentShapeId(int i) { const bool bChanged = ( m_currentShapeId != i ); m_currentShapeId = i; return bChanged; } bool SetPinFlags(uchar i) { const bool bChanged = ( m_iPinFlags != i ); m_iPinFlags = i; return bChanged; } bool SetPadWidth(int i) { const bool bChanged = ( m_iPadWidth != i ); m_iPadWidth = i; if ( bChanged && GetHoleWidth() > i-8 ) SetHoleWidth( i-8 ); // 8 ==> minimum annular ring = 4 mil return bChanged; } bool SetHoleWidth(int i) { const bool bChanged = ( m_iHoleWidth != i ); m_iHoleWidth = i; if ( bChanged && GetPadWidth() < i+8 ) SetPadWidth( i+8 ); // 8 ==> minimum annular ring = 4 mil return bChanged; } bool SetAllowFlyWire(bool b) { const bool bChanged = ( m_bAllowFlyWire != b ); m_bAllowFlyWire = b; return bChanged; } bool SetValueStr(const std::string& s) { const bool bChanged = ( m_valueStr != s ); m_valueStr = s; return bChanged; } bool SetPrefixStr(const std::string& s) { const bool bChanged = ( m_prefixStr != s ); m_prefixStr = s; return bChanged; } bool SetTypeStr(const std::string& s) { const bool bChanged = ( m_typeStr != s ); m_typeStr = s; return bChanged; } bool SetImportStr(const std::string& s) { const bool bChanged = ( m_importStr != s ); m_importStr = s; return bChanged; } bool SetLabelOffsetRow(int i) { const bool bChanged = ( m_iLabelOffsetRow != i ); m_iLabelOffsetRow = i; return bChanged; } bool SetLabelOffsetCol(int i) { const bool bChanged = ( m_iLabelOffsetCol != i ); m_iLabelOffsetCol = i; return bChanged; } bool SetGrid(const PinGrid& o) { const bool bChanged = ( m_grid != o ); m_grid = o; return bChanged; } void SetPinLabel(size_t iPinIndex, const std::string& s) { if ( iPinIndex < m_pinLabels.size() ) m_pinLabels[iPinIndex] = s; } void SetPinAlign(size_t iPinIndex, int i) { if ( iPinIndex < m_pinAligns.size() ) m_pinAligns[iPinIndex] = i; } void AddShape(int id, const Shape& o) { assert( id != BAD_ID ); m_mapShapes.push_back( IntShape(id, o) ); } const int& GetCurrentPinId() const { return m_currentPinId; } const int& GetCurrentShapeId() const { return m_currentShapeId; } const uchar& GetPinFlags() const { return m_iPinFlags; } const int& GetPadWidth() const { return m_iPadWidth; } const int& GetHoleWidth() const { return m_iHoleWidth; } const bool& GetAllowFlyWire() const { return m_bAllowFlyWire; } const std::string& GetValueStr() const { return m_valueStr; } const std::string& GetPrefixStr() const { return m_prefixStr; } const std::string& GetTypeStr() const { return m_typeStr; } const std::string& GetImportStr() const { return m_importStr; } const int& GetLabelOffsetRow() const { return m_iLabelOffsetRow; } const int& GetLabelOffsetCol() const { return m_iLabelOffsetCol; } const PinGrid& GetGrid() const { return m_grid; } const std::string& GetPinLabel(size_t iPinIndex) const { static const std::string emptyStr(""); return ( iPinIndex < m_pinLabels.size() ) ? m_pinLabels[iPinIndex] : emptyStr; } const int& GetPinAlign(size_t iPinIndex) const { static int defaultAlign(Qt::AlignHCenter); return ( iPinIndex < m_pinAligns.size() ) ? m_pinAligns[iPinIndex] : defaultAlign; } std::list& GetShapes() { return m_mapShapes; } Q_DECL_CONSTEXPR static inline int GetMinMargin() { return 12; } // The margin around the footprint on the screen int GetScreenRows() const { return 2 * GetMinMargin() + GetGridRows(); } int GetScreenCols() const { return 2 * GetMinMargin() + GetGridCols(); } // Footprint size and extents int GetGridRows() const { return m_grid.GetRows(); } int GetGridCols() const { return m_grid.GetCols(); } int GetGridRowMin() const { return GetMinMargin(); } int GetGridColMin() const { return GetMinMargin(); } int GetGridRowMax() const { return GetGridRowMin() + GetGridRows() - 1; } int GetGridColMax() const { return GetGridColMin() + GetGridCols() - 1; } void GetGridCentre(double& dCentreRow, double& dCentreCol) const // Footprint centre w.r.t. screen { dCentreRow = 0.5 * ( GetGridRowMin() + GetGridRowMax() ); dCentreCol = 0.5 * ( GetGridColMin() + GetGridColMax() ); } Pin& GetCurrentPin() { assert( m_currentPinId != BAD_ID ); return *m_grid.GetAt(m_currentPinId); } Shape& GetCurrentShape() { assert( m_currentShapeId != BAD_ID ); for (auto& s : m_mapShapes) if ( s.first == m_currentShapeId ) return s.second; assert(0); return m_mapShapes.begin()->second; } void MoveCurrentShape(double dDown, double dRight); size_t GetNumTruePins() const { size_t count(0); for (int i = 0, iSize = m_grid.GetSize(); i < iSize; i++) if ( m_grid.GetAtConst(i)->GetIsPin() ) count++; return count; } size_t GetMaxPinNumber() const { size_t maxPinNumber(0); for (int i = 0, iSize = m_grid.GetSize(); i < iSize; i++) { const auto& p = m_grid.GetAtConst(i); if ( p->GetIsPin() ) maxPinNumber = std::max(maxPinNumber, p->GetPinIndex() + 1); } return maxPinNumber; } void Build(const TemplateManager& templateMgr, Component& comp) const; bool SetPinNumber(int i) { if ( GetCurrentPinId() == BAD_ID ) return false; auto& o = GetCurrentPin(); o.SetPinIndex( static_cast(i - 1) ); o.SetSurface(SURFACE_FULL); o.SetHoleUse(HOLE_FULL); ReAllocatePins( GetMaxPinNumber() ); return true; } bool IncPinNumber(bool bInc) { if ( GetCurrentPinId() == BAD_ID ) return false; auto& o = GetCurrentPin(); const size_t iPinIndex = o.GetPinIndex(); // If we end up with a valid pinIndex (>= 0 and <= 254) then set HOLE_FULL, else set HOLE_FREE if ( bInc ) { if ( iPinIndex == BAD_PININDEX ) { switch( o.GetSurface() ) { case SURFACE_HOLE: o.SetSurface(SURFACE_FREE); o.SetHoleUse(HOLE_FREE); return true; case SURFACE_FREE: o.SetSurface(SURFACE_FULL); o.SetHoleUse(HOLE_FREE); return true; case SURFACE_FULL: o.SetPinIndex(0); o.SetHoleUse(HOLE_FULL); return true; default: assert(0); return false; // Don't yet handle SURFACE_GAP / SURFACE_PLUG } } if ( iPinIndex < 254 ) // We're limited to (0 <= pinIndex <= 254) { o.SetPinIndex(iPinIndex+1); return true; } return false; } else { if ( iPinIndex == BAD_PININDEX ) { switch( o.GetSurface() ) { case SURFACE_HOLE: return false; case SURFACE_FREE: o.SetSurface(SURFACE_HOLE); o.SetHoleUse(HOLE_FREE); return true; case SURFACE_FULL: o.SetSurface(SURFACE_FREE); o.SetHoleUse(HOLE_FREE); return true; default: assert(0); return false; // Don't yet handle SURFACE_GAP / SURFACE_PLUG } } else if ( iPinIndex > 0 ) { o.SetPinIndex(iPinIndex-1); o.SetHoleUse(HOLE_FULL); } else // iPinIndex == 0 { o.SetPinIndex(BAD_PININDEX); o.SetHoleUse(HOLE_FREE); } return true; } } bool SetSurface(const std::string& str) { if ( GetCurrentPinId() == BAD_ID ) return false; auto& o = GetCurrentPin(); for (const auto& mapObj : Pin::GetMapSurfaceStrings()) { if ( mapObj.second == str ) { const bool bChanged = o.GetSurface() != mapObj.first; if ( bChanged ) o.SetSurface(mapObj.first); return bChanged; } } return false; } bool SetType(const std::string& str) { if ( GetCurrentShapeId() == BAD_ID ) return false; auto& o = GetCurrentShape(); for (const auto& mapObj : Shape::GetMapShapeStrings()) { if ( mapObj.second == str ) { const bool bChanged = o.GetType() != mapObj.first; if ( bChanged ) o.SetType(mapObj.first); return bChanged; } } return false; } bool SetPinType(const std::string& str) { const bool bRect = ( str == "Rectangle" ); if ( bRect ) return SetPinFlags( GetPinFlags() | PIN_RECT ); // Set bit else return SetPinFlags( GetPinFlags() & ~PIN_RECT ); // Clear bit } bool SetCX(double d) { if ( GetCurrentShapeId() == BAD_ID ) return false; GetCurrentShape().SetCX(d); return true; } bool SetCY(double d) { if ( GetCurrentShapeId() == BAD_ID ) return false; GetCurrentShape().SetCY(d); return true; } bool SetDX(double d) { if ( GetCurrentShapeId() == BAD_ID ) return false; GetCurrentShape().SetDX(d); return true; } bool SetDY(double d) { if ( GetCurrentShapeId() == BAD_ID ) return false; GetCurrentShape().SetDY(d); return true; } bool SetA1(double d) { if ( GetCurrentShapeId() == BAD_ID ) return false; GetCurrentShape().SetA1(d); return true; } bool SetA2(double d) { if ( GetCurrentShapeId() == BAD_ID ) return false; GetCurrentShape().SetA2(d); return true; } bool SetA3(double d) { if ( GetCurrentShapeId() == BAD_ID ) return false; GetCurrentShape().SetA3(d); return true; } bool SetLine(bool b) { if ( GetCurrentShapeId() == BAD_ID ) return false; GetCurrentShape().SetDrawLine(b); return true; } bool SetFill(bool b) { if ( GetCurrentShapeId() == BAD_ID ) return false; GetCurrentShape().SetDrawFill(b); return true; } bool SetFillColor(const MyRGB& r) { if ( GetCurrentShapeId() == BAD_ID ) return false; GetCurrentShape().SetFillColor(r); return true; } bool GetCanLower() const { const int& id = GetCurrentShapeId(); return ( id != BAD_ID ) && ( id != m_mapShapes.begin()->first ); } bool GetCanRaise() const { const int& id = GetCurrentShapeId(); return ( id != BAD_ID ) && ( id != m_mapShapes.rbegin()->first ); } bool Lower() { assert( GetCanLower() ); auto iterPrior = m_mapShapes.begin(); auto iter = iterPrior; ++iter; for (; iter != m_mapShapes.end(); ++iter, iterPrior++) if ( iter->first == GetCurrentShapeId() ) { std::swap(*iter, *iterPrior); return true; } return false; } bool Raise() { assert( GetCanRaise() ); auto iterPrior = m_mapShapes.rbegin(); auto iter = iterPrior; ++iter; for (; iter != m_mapShapes.rend(); ++iter, iterPrior++) if ( iter->first == GetCurrentShapeId() ) { std::swap(*iter, *iterPrior); return true; } return false; } int AddLine() { return AddDefaultShape(SHAPE::LINE); } int AddRect() { return AddDefaultShape(SHAPE::RECT); } int AddRoundedRect() { return AddDefaultShape(SHAPE::ROUNDED_RECT); } int AddEllipse() { return AddDefaultShape(SHAPE::ELLIPSE); } int AddArc() { return AddDefaultShape(SHAPE::ARC); } int AddChord() { return AddDefaultShape(SHAPE::CHORD); } int AddDefaultShape(SHAPE eType) { const double dX = 0.5 * GetGridCols(); const double dY = 0.5 * GetGridRows(); if ( eType == SHAPE::ARC || eType == SHAPE::CHORD ) return AddShape( Shape(eType, true, false, -dX, dX, -dY, dY, 0, 90) ); else return AddShape( Shape(eType, true, false, -dX, dX, -dY, dY) ); } // Helpers int CopyShape(); int DestroyShape(); int GetNewShapeId() const; bool SetWidth(int i); bool SetHeight(int i); int GetPinId(int row, int col) const; // Pick the most relevant pin at the location int GetShapeId(double dRowIn, double dColIn) const; // Pick the most relevant shape at the location bool GetIsValid(const TemplateManager& templateMgr) const; // Persist functions virtual void Load(DataStream& inStream) override { inStream.Load(m_currentPinId); inStream.Load(m_currentShapeId); inStream.Load(m_iPinFlags); m_iPadWidth = 70; m_iHoleWidth = 35; if ( inStream.GetVersion() >= VRT_VERSION_39 ) { inStream.Load(m_iPadWidth); // Added in VRT_VERSION_39 inStream.Load(m_iHoleWidth); // Added in VRT_VERSION_39 } m_bAllowFlyWire = false; if ( inStream.GetVersion() >= VRT_VERSION_47 ) inStream.Load(m_bAllowFlyWire); // Added in VRT_VERSION_47 inStream.Load(m_valueStr); inStream.Load(m_prefixStr); inStream.Load(m_typeStr); inStream.Load(m_importStr); m_iLabelOffsetRow = m_iLabelOffsetCol = 0; if ( inStream.GetVersion() >= VRT_VERSION_54 ) { inStream.Load(m_iLabelOffsetRow); // Added in VRT_VERSION_54 inStream.Load(m_iLabelOffsetCol); // Added in VRT_VERSION_54 } m_grid.Load(inStream); unsigned int numPins(0); if ( inStream.GetVersion() >= VRT_VERSION_51 ) inStream.Load(numPins); // Added in VRT_VERSION_51 AllocatePins(numPins); if ( inStream.GetVersion() >= VRT_VERSION_51 ) { for (unsigned int i = 0; i < numPins; i++) { inStream.Load(m_pinLabels[i]); // Added in VRT_VERSION_51 inStream.Load(m_pinAligns[i]); // Added in VRT_VERSION_51 } } unsigned int numShapes(0); inStream.Load(numShapes); m_mapShapes.clear(); for (unsigned int i = 0; i < numShapes; i++) { int shapeId(BAD_ID); Shape tmp; inStream.Load(shapeId); tmp.Load(inStream); m_mapShapes.push_back( IntShape(shapeId, tmp) ); } } virtual void Save(DataStream& outStream) override { outStream.Save(m_currentPinId); outStream.Save(m_currentShapeId); outStream.Save(m_iPinFlags); outStream.Save(m_iPadWidth); // Added in VRT_VERSION_39 outStream.Save(m_iHoleWidth); // Added in VRT_VERSION_39 outStream.Save(m_bAllowFlyWire);// Added in VRT_VERSION_47 outStream.Save(m_valueStr); outStream.Save(m_prefixStr); outStream.Save(m_typeStr); outStream.Save(m_importStr); outStream.Save(m_iLabelOffsetRow); // Added in VRT_VERSION_54 outStream.Save(m_iLabelOffsetCol); // Added in VRT_VERSION_54 m_grid.Save(outStream); const unsigned int numPins = static_cast( GetNumPins() ); outStream.Save(numPins); // Added in VRT_VERSION_51 for (unsigned int i = 0; i < numPins; i++) { outStream.Save(m_pinLabels[i]); // Added in VRT_VERSION_51 outStream.Save(m_pinAligns[i]); // Added in VRT_VERSION_51 } const unsigned int numShapes = static_cast( m_mapShapes.size() ); outStream.Save(numShapes); for (auto& mapObj : m_mapShapes) { int shapeId = mapObj.first; Shape& shape = mapObj.second; outStream.Save(shapeId); shape.Save(outStream); } } private: int AddShape(const Shape& o) { const int id = GetNewShapeId(); if ( id != BAD_ID ) AddShape(id, o); return id; } private: // GUI control int m_currentPinId; // Current index into m_grid int m_currentShapeId; // Current selected shape // Component description uchar m_iPinFlags; // 1 ==> PIN_RECT, 2 ==> PIN_LABELS, 4 ==> PIN_CUSTOM int m_iPadWidth; // Used if the PIN_CUSTOM flag is set int m_iHoleWidth; // Used if the PIN_CUSTOM flag is set bool m_bAllowFlyWire; // true ==> Allow flying wire to pins std::string m_valueStr; // Value label (e.g. "MN3004") std::string m_prefixStr; // Prefix string (e.g. "IC") std::string m_typeStr; // Component type (e.g. "BBD") std::string m_importStr; // For Planet/Tango import int m_iLabelOffsetRow; // Label offset in units of 1/16 of a grid square int m_iLabelOffsetCol; // Label offset in units of 1/16 of a grid square PinGrid m_grid; std::vector m_pinLabels; // Pin labels std::vector m_pinAligns; // Pin label alignments (Qt::AlignLeft,Qt::AlignRight,Qt::AlignHCenter) std::list m_mapShapes; // "Map" of shapeId to Shape. Coordinates are RELATIVE to footprint centre. }; VeroRoute/libraries/gEDA/veroroute_passive/Capacitor_Ceramic_100mil.sym000644 001750 001750 00000001277 13515171161 026410 0ustar00alexalex000000 000000 v 20130925 2 T 200 700 5 10 0 0 0 0 1 numslots=0 P 200 700 400 700 1 0 0 { T 350 750 5 8 1 1 0 6 1 pinnumber=1 T 350 750 5 8 0 0 0 6 1 pinseq=1 T 350 750 5 8 0 0 0 6 1 pinlabel=1 T 350 750 5 8 0 0 0 6 1 pintype=pas } P 1100 700 900 700 1 0 0 { T 950 750 5 8 1 1 0 0 1 pinnumber=2 T 950 750 5 8 0 0 0 0 1 pinseq=2 T 950 750 5 8 0 0 0 0 1 pinlabel=2 T 950 750 5 8 0 0 0 0 1 pintype=pas } L 600 900 600 500 3 0 0 0 -1 -1 L 900 700 700 700 3 0 0 0 -1 -1 L 600 700 400 700 3 0 0 0 -1 -1 L 700 900 700 500 3 0 0 0 -1 -1 T 500 300 5 10 1 1 0 0 1 device=820p T 500 1000 8 10 1 1 0 0 1 refdes=C? T 0 100 8 10 0 0 0 0 1 footprint=CAP_CERAMIC1 T 0 100 8 10 0 0 0 0 1 description=Ceramic Capacitor (100 mil length) VeroRoute/Src/TextManager.h000644 001750 001750 00000011405 14377762523 016074 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include "TextRect.h" #include "GuiControl.h" // For BAD_TEXTID class TextManager : public Persist, public Merge { friend class Board; public: TextManager() {} virtual ~TextManager() {} void Clear() { m_mapIdtoText.clear(); } TextManager(const TextManager& o) { *this = o; } TextManager& operator=(const TextManager& o) { m_mapIdtoText.clear(); m_mapIdtoText.insert(o.m_mapIdtoText.begin(), o.m_mapIdtoText.end()); return *this; } bool operator==(const TextManager& o) const // Compare persisted info { bool bOK = ( m_mapIdtoText.size() == o.m_mapIdtoText.size() ); if ( bOK ) { for (const auto& mapObj : m_mapIdtoText) { const int& iTextId = mapObj.first; const TextRect& rectA = mapObj.second; const auto iterOther = o.m_mapIdtoText.find( iTextId ); if ( iterOther == o.m_mapIdtoText.end() ) return false; const TextRect& rectB = iterOther->second; bOK = ( rectA == rectB ); if ( !bOK ) return false; } } return bOK; } bool operator!=(const TextManager& o) const { return !(*this == o); } int AddNewRect(int row, int col) { TextRect tmp(row, row+2, col, col+8); // Find the first unused textId. int textId(0); while ( GetTextRectExists(textId) && textId != INT_MAX ) textId++; if ( textId == INT_MAX ) return BAD_TEXTID; // Reached text box limit !!! m_mapIdtoText[textId] = tmp; // tmp is ***copied*** into the map return textId; } void MoveRect(int iTextId, int deltaRow, int deltaCol) { GetTextRectById(iTextId).Move(deltaRow, deltaCol); } void UpdateRect(int iTextId, int row, int col) { auto& rect = GetTextRectById(iTextId); rect.m_rowMax = std::max(rect.m_rowMin, row); rect.m_colMax = std::max(rect.m_colMin, col); } void MoveAll(int iDown, int iRight) { for (auto& mapObj : m_mapIdtoText) mapObj.second.Move(iDown, iRight); } const TextRect& GetTextRectById(int textId) const { static TextRect dummy; auto iter = m_mapIdtoText.find(textId); return ( iter != m_mapIdtoText.end() ) ? iter->second : dummy; } TextRect& GetTextRectById(int textId) { return m_mapIdtoText[textId]; } const std::unordered_map& GetMapIdToText() const { return m_mapIdtoText; } void DestroyRect(int iTextId) { const auto iter = m_mapIdtoText.find(iTextId); if ( iter != m_mapIdtoText.end() ) m_mapIdtoText.erase(iter); } Rect GetBounding() const { Rect bounding; for (const auto& mapObj : m_mapIdtoText) bounding |= mapObj.second; return bounding; } // Merge interface functions virtual void UpdateMergeOffsets(MergeOffsets& o) override { for (auto& mapObj : m_mapIdtoText) mapObj.second.UpdateMergeOffsets(o); } virtual void ApplyMergeOffsets(const MergeOffsets& o) override { for (auto& mapObj : m_mapIdtoText) mapObj.second.ApplyMergeOffsets(o); } void Merge(const TextManager& o) { int iMaxId(BAD_TEXTID); for (const auto& mapObj : m_mapIdtoText) iMaxId = std::max(iMaxId, static_cast(mapObj.first)); for (const auto& mapObj : o.m_mapIdtoText) { iMaxId++; m_mapIdtoText[ iMaxId ] = mapObj.second; } } // Persist interface functions virtual void Load(DataStream& inStream) override { Clear(); unsigned int iSize(0); inStream.Load(iSize); m_mapIdtoText.clear(); for (unsigned int i = 0; i < iSize; i++) { TextRect tmp; tmp.Load(inStream); int iTextId = static_cast(i); if ( inStream.GetVersion() >= VRT_VERSION_15 ) inStream.Load(iTextId); // Added in VRT_VERSION_15 m_mapIdtoText[ iTextId ] = tmp; } } virtual void Save(DataStream& outStream) override { const unsigned int iSize = static_cast( m_mapIdtoText.size() ); outStream.Save(iSize); for (auto& mapObj : m_mapIdtoText) { TextRect& rect = mapObj.second; rect.Save(outStream); outStream.Save(mapObj.first); // Added in VRT_VERSION_15 } } private: bool GetTextRectExists(int textId) const { return m_mapIdtoText.find(textId) != m_mapIdtoText.end(); } private: std::unordered_map m_mapIdtoText; // The text boxes (indexed by textId) }; VeroRoute/Src/pindialog.ui000644 001750 001750 00000002016 14217061436 015773 0ustar00alexalex000000 000000 PinDialog 0 0 230 630 230 630 230 630 Pin Labels 0 0 230 632 Qt::NoFocus true tableWidget VeroRoute/Src/images/delete.png000644 001750 001750 00000001360 14214432140 016673 0ustar00alexalex000000 000000 ‰PNG  IHDR szzєbKGDџџџ НЇ“ pHYsУУЧoЈdtIMEц8$ИE}IDATXУЕW=г@}у‚?АОйюі $’:hh.mR#!!h“ž_€ьŠбQЁГК‚ДйЅq,н/`(n –Гу\В]ДЮМ™7ofvЊLЏ њƒB9SтФЇNє9(g ЊRpоКП"ЦЃS8RezMŒeѓ›‚vЉцаЧФx­œyuЄˆS&фf{8ЛT_„.š[C7Ÿ1с"tЧ@ХжЬћ ьR§ЛNtzhЎ%№ы№a#OwрRјь6ЖuЂ_LЭЗЇBŠWg[ГЂ>‘ЮћиšЇCрiЕФX4"'ЖМЧўїиš;=b+H)лcЎœБџГ 'я1bdmCCџa 8ГfБ/ƒО<юїˆЎO”3†X#ЦJ9Г ыpXЩK&Ќeу\0QŸ“ хL!ТјrЪ'VЁ%ЦЌІа‰ЦXRЮԘO/Ч€f Sb<>дм&3а.3НQуч›б№П.7ТГ:бЯъ@k Œš Lx7ж :BфŸ<вq_9ѓэ`<јVЗФШbk(&ОЬ@ |T+оЅњ€,d*Ж&žЬ€Ї]j0YЗЦ{њ„Њ2}9ЩM*Dl0ЪыпЁџм­Нх@•ъ\ ЁШN,F—uЂяѕ:P'z)MП!№Nл^ N|№g-€ЯЧ€Зœи0š€ЗЊLџиЋ‚>ХгЙ,abМTЮМ§Ч€4j™А9МЌ`їMЃ‡ШЏeГрjkV7й М(%=|j>ХB2ђiї1’DwЬа?FC"~u/ќђш‹ЉаЪˆ3  _ы›SЌфЪ™ВЃ‡+b,ў§ХBŠt‘'IENDЎB`‚VeroRoute/libraries/gEDA/veroroute_transistor/Darlington_NPN_TIP101.sym000644 001750 001750 00000002552 13515171161 026303 0ustar00alexalex000000 000000 v 20130925 2 T 0 900 5 10 0 0 0 0 1 numslots=0 P 0 900 300 900 1 0 0 { T 100 1000 5 8 1 1 0 0 1 pinnumber=1 T 100 1000 5 8 0 0 0 0 1 pinseq=1 T 100 1000 5 8 0 0 0 0 1 pinlabel=1 T 100 1000 5 8 0 0 0 0 1 pintype=pas } P 1000 1700 1000 1400 1 0 0 { T 1100 1400 5 8 1 1 0 0 1 pinnumber=2 T 1100 1400 5 8 0 0 0 0 1 pinseq=2 T 1100 1400 5 8 0 0 0 0 1 pinlabel=2 T 1100 1400 5 8 0 0 0 0 1 pintype=pas } P 1000 0 1000 300 1 0 0 { T 1100 200 5 8 1 1 0 0 1 pinnumber=3 T 1100 200 5 8 0 0 0 0 1 pinseq=3 T 1100 200 5 8 0 0 0 0 1 pinlabel=3 T 1100 200 5 8 0 0 0 0 1 pintype=pas } L 500 1100 500 700 3 0 0 0 -1 -1 L 500 1000 700 1100 3 0 0 0 -1 -1 L 500 800 700 700 3 0 0 0 -1 -1 L 500 900 300 900 3 0 0 0 -1 -1 L 800 900 800 500 3 0 0 0 -1 -1 L 800 800 1000 900 3 0 0 0 -1 -1 L 800 600 1000 500 3 0 0 0 -1 -1 L 1000 900 1000 1200 3 0 0 0 -1 -1 L 1000 1200 700 1200 3 0 0 0 -1 -1 L 700 1100 700 1200 3 0 0 0 -1 -1 L 1000 500 1000 300 3 0 0 0 -1 -1 L 700 700 800 700 3 0 0 0 -1 -1 L 1000 1200 1000 1400 3 0 0 0 -1 -1 V 800 900 500 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 903,509 L 1001,500 L 931,573 L 925,540 z H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 603,709 L 701,700 L 631,773 L 625,740 z T 1400 900 5 10 1 1 0 0 1 device=TIP101 T 1400 670 8 10 1 1 0 0 1 refdes=Q? T 1400 400 8 10 0 0 0 0 1 footprint=TO220 T 1400 400 8 10 0 0 0 0 1 description=NPN Darlington Transistor VeroRoute/licenses/license_Qt.txt000644 001750 001750 00000216460 13515171162 017403 0ustar00alexalex000000 000000 GENERAL ------- Qt is available under a commercial license with various pricing models and packages that meet a variety of needs. Commercial Qt license keeps your code proprietary where only you can control and monetize on your end productт€™s development, user experience and distribution. You also get great perks like additional functionality, productivity enhancing tools, world-class support and a close strategic relationship with The Qt Company to make sure your product and development goals are met. Qt has been created under the belief of open development and providing freedom and choice to developers. To support that, The Qt Company also licenses Qt under open source licenses, where most of the functionality is available under LGPLv3 or LGPLv2.1. It should be noted that some components are available only under LGPLv3. In order to preserve the true meaning of open development and uphold the spirit of free software, it is imperative that the rules and regulations of open source licenses are followed. If you use Qt under open-source licenses, you need to make sure that you comply with all the licenses of the components you use. Qt also contains some 3rd party components that are available under different open-source licenses. Please refer to the documentation for more details on 3rd party licenses used in Qt. GPLv3 and LGPLv3 ---------------- GNU LESSER GENERAL PUBLIC LICENSE The Qt Toolkit is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). Contact: http://www.qt.io/licensing You may use, distribute and copy the Qt GUI Toolkit under the terms of GNU Lesser General Public License version 3, which supplements GNU General Public License Version 3. Both of the licenses are displayed below. ------------------------------------------------------------------------- GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 3 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, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ------------------------------------------------------------------------- GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright ТЉ 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, т€œthis Licenseт€ refers to version 3 of the GNU Lesser General Public License, and the т€œGNU GPLт€ refers to version 3 of the GNU General Public License. т€œThe Libraryт€ refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An т€œApplicationт€ is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A т€œCombined Workт€ is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the т€œLinked Versionт€. The т€œMinimal Corresponding Sourceт€ for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The т€œCorresponding Application Codeт€ for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License т€œor any later versionт€ applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. LGPLv2.1 -------- GNU LESSER GENERAL PUBLIC LICENSE The Qt Toolkit is Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). Contact: http://www.qt.io/licensing You may use, distribute and copy applicable parts of the Qt GUI Toolkit under the terms of GNU Lesser General Public License version 2.1, which is displayed below. ------------------------------------------------------------------------- GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! VeroRoute/Src/finddialog.h000644 001750 001750 00000003000 14371045544 015734 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include class MainWindow; class Ui_FindDialog; class FindDialog : public QDialog { Q_OBJECT public: explicit FindDialog(MainWindow* parent = nullptr); ~FindDialog(); public slots: void ToggleName(bool b); void ToggleExact(bool b); void TextChanged(const QString& str); protected: void showEvent(QShowEvent* event); void hideEvent(QHideEvent* event); void closeEvent(QCloseEvent* event); void keyPressEvent(QKeyEvent* event); void keyReleaseEvent(QKeyEvent* event); private: Ui_FindDialog* ui; MainWindow* m_pMainWindow; bool m_bName = true; // true/false ==> name/value bool m_bExact = false; // true/false ==> exact match/substring match bool m_bCanFind = true; // false ==> Don't find QString m_str; }; VeroRoute/libraries/gEDA/Using_gEDA_with_VeroRoute.txt000644 001750 001750 00000004073 13515171161 023170 0ustar00alexalex000000 000000 In order for VeroRoute to import a netlist produced by gEDA, the symbols used in the gEDA schematic must have attributes (such as footprint names and pin numbers) that are consistent with the conventions used in VeroRoute. 1) What is in this folder? ========================== The "veroroute_" folders contain the VeroRoute Symbols for gEDA. The file "veroroute-clib.scm" is the corresponding config file. 2) Configuring gEDA with the VeroRoute symbols ============================================== You will need to use the command line and have administrator privileges. The "veroroute_" folders must be copied to the location where gEDA keeps its symbols. So if the "veroroute_" folders are in "/home/alex/VeroRoute/Libraries/gEDA/" then you would do sudo cp -rf /home/alex/VeroRoute/Libraries/gEDA/veroroute_* /usr/share/gEDA/sym/ and then copy the config file as follows sudo cp /home/alex/VeroRoute/Libraries/gEDA/veroroute-clib.scm /usr/share/gEDA/gafrc.d/ 3) Exporting the netlist ======================== Once you have made a schematic using the VeroRoute Symbols, you should export the netlist in Tango format (which is very similar to Protel 1 format) using the command line. So if the schematic is called "mycircuit.sch" you would type: gnetlist mycircuit.sch -g tango This will create the file "output.net" which can be imported into VeroRoute. 4) Making your own symbols ========================== There are a few things that you need to do to produce symbols that will export correctly. a) Give them a "refdes" attribute. This will become the "Name" in VeroRoute. b) Give them a "device" attribute. This will become the "Value" in VeroRoute. Do not use the "value" attribute in gEDA. Always use the "device" attribute to represent value. c) Give them a "footprint" attribute that VeroRoute understands. See the provided symbols for examples. d) Use pin numbers that match the VeroRoute pin numbers. See the provided symbols for examples. You can add a "description" attribute if it helps you work with the symbol in gEDA but this will not be exported. VeroRoute/examples/README.txt000644 001750 001750 00000000221 13515171160 016243 0ustar00alexalex000000 000000 This folder contains a circuit schematic and its corresponding netlist. The vrt files are veroboard and PCB layouts using the imported netlist. VeroRoute/Src/CompElement.h000644 001750 001750 00000005015 14421535262 016051 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include "Pin.h" #include "TrackElement.h" class CompElement : public Pin, public TrackElement { friend class Element; public: CompElement() : Pin(), TrackElement() {} CompElement(const CompElement& o) : Pin(o), TrackElement(o) { *this = o; } virtual ~CompElement() override {} CompElement& operator=(const CompElement& o) { Pin::operator=(o); // Call operator= in base class TrackElement::operator=(o); // Call operator= in base class return *this; } bool operator==(const CompElement& o) const // Compare persisted info { return Pin::operator==(o) && TrackElement::operator==(o); } bool operator!=(const CompElement& o) const { return !(*this == o); } // Merge interface functions virtual void UpdateMergeOffsets(MergeOffsets& o) override { Pin::UpdateMergeOffsets(o); // Does nothing TrackElement::UpdateMergeOffsets(o); } virtual void ApplyMergeOffsets(const MergeOffsets& o) override { Pin::ApplyMergeOffsets(o); // Does nothing TrackElement::ApplyMergeOffsets(o); } void Merge(const CompElement& o) { Pin::Merge(o); TrackElement::Merge(o); } // Persist interface functions virtual void Load(DataStream& inStream) override { if ( inStream.GetVersion() < VRT_VERSION_25 ) { int compId; // Dummy bool bIsMark; // Dummy Pin::Load(inStream); // Load() base class inStream.Load(compId); assert( compId == -1 ); TrackElement::Load(inStream); // Load() base class inStream.Load(bIsMark); assert( bIsMark == false ); } else { Pin::Load(inStream); // Load() base class TrackElement::Load(inStream); // Load() base class } } virtual void Save(DataStream& outStream) override { Pin::Save(outStream); // Save() base class TrackElement::Save(outStream); // Save() base class } }; VeroRoute/libraries/gEDA/veroroute_transistor/NPN_TIP41.sym000644 001750 001750 00000001563 13515171161 024046 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=1 T 100 550 5 6 0 0 0 0 1 pinseq=1 T 100 550 5 6 0 0 0 0 1 pinlabel=1 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=2 T 400 850 5 6 0 0 0 0 1 pinseq=2 T 400 850 5 6 0 0 0 0 1 pinlabel=2 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=3 T 400 50 5 6 0 0 0 0 1 pinseq=3 T 400 50 5 6 0 0 0 0 1 pinlabel=3 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 403,209 L 501,200 L 431,273 L 425,240 z T 600 700 5 10 1 1 0 0 1 device=TIP41 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO220 T 600 400 8 10 0 0 0 0 1 description=NPN Transistor VeroRoute/libraries/gEDA/veroroute_transistor/PNP_BC328.sym000644 001750 001750 00000001562 13515171161 023767 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=1 T 400 850 5 6 0 0 0 0 1 pinseq=1 T 400 850 5 6 0 0 0 0 1 pinlabel=1 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=3 T 400 50 5 6 0 0 0 0 1 pinseq=3 T 400 50 5 6 0 0 0 0 1 pinlabel=3 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 297,341 L 199,350 L 269,277 L 275,310 z T 600 700 5 10 1 1 0 0 1 device=BC328 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=PNP Transistor VeroRoute/Src/images/addrect.png000644 001750 001750 00000000551 13734464731 017061 0ustar00alexalex000000 000000 ‰PNG  IHDR szzєbKGDљCЛ pHYsФФ•+tIMEф 7ГЏтіIDATXУэVБ Т0|O2ДИЙЄs„Bqђњ~ЄaЂАsЛИ‰у9H!M#IвЂН1/$ЧнЛМ0Є$‡cKЎ@DєИŸ˜cc/4К‚ЪKRyIщіŒшbcvТємг†=С‰К@ххG›]y'1Л )Gно+вшjА9„Т>и&њ-˜?мuƒ…DYYuџ=Œ"˜ю_о?Ўexˆˆ˜н6sрI`=`3Š’}CZ1ЊfйЄ№ЗЂ˜МdWзюBлb†Ыzˆ|іжwп |sбяYрK…5+|Jєг)і40Œ!3џŸ"Іє.<ьiV#ЩЏњеIENDЎB`‚VeroRoute/libraries/gEDA/veroroute_linear/Generic_DIP8.sym000644 001750 001750 00000003224 13515171161 023730 0ustar00alexalex000000 000000 v 20130925 2 T 300 0 8 10 0 0 0 0 1 numslots=0 B 300 0 1400 1600 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 P 0 1400 300 1400 1 0 0 { T 205 1445 5 10 1 1 0 6 1 pinnumber=1 T 200 1400 5 10 0 1 0 0 1 pinseq=1 T 355 1395 5 10 0 1 0 0 1 pinlabel=1 T 200 1400 5 10 0 1 0 0 1 pintype=pas } P 0 1000 300 1000 1 0 0 { T 205 1045 5 10 1 1 0 6 1 pinnumber=2 T 200 1000 5 10 0 1 0 0 1 pinseq=2 T 355 945 5 10 0 1 0 0 1 pinlabel=2 T 200 1000 5 10 0 1 0 0 1 pintype=pas } P 0 600 300 600 1 0 0 { T 205 645 5 10 1 1 0 6 1 pinnumber=3 T 200 600 5 10 0 1 0 0 1 pinseq=3 T 355 545 5 10 0 1 0 0 1 pinlabel=3 T 200 600 5 10 0 1 0 0 1 pintype=pas } P 0 200 300 200 1 0 0 { T 205 245 5 10 1 1 0 6 1 pinnumber=4 T 200 200 5 10 0 1 0 0 1 pinseq=4 T 355 145 5 10 0 1 0 0 1 pinlabel=4 T 200 200 5 10 0 1 0 0 1 pintype=pas } P 2000 1400 1700 1400 1 0 0 { T 1795 1445 5 10 1 1 0 0 1 pinnumber=8 T 1800 1400 5 10 0 1 0 6 1 pinseq=8 T 1645 1395 5 10 0 1 0 6 1 pinlabel=8 T 1800 1400 5 10 0 1 0 6 1 pintype=pas } P 2000 1000 1700 1000 1 0 0 { T 1795 1045 5 10 1 1 0 0 1 pinnumber=7 T 1800 1000 5 10 0 1 0 6 1 pinseq=7 T 1645 995 5 10 0 1 0 6 1 pinlabel=7 T 1800 1000 5 10 0 1 0 6 1 pintype=pas } P 2000 600 1700 600 1 0 0 { T 1795 645 5 10 1 1 0 0 1 pinnumber=6 T 1800 600 5 10 0 1 0 6 1 pinseq=6 T 1645 595 5 10 0 1 0 6 1 pinlabel=6 T 1800 600 5 10 0 1 0 6 1 pintype=pas } P 2000 200 1700 200 1 0 0 { T 1795 245 5 10 1 1 0 0 1 pinnumber=5 T 1800 200 5 10 0 1 0 6 1 pinseq=5 T 1645 195 5 10 0 1 0 6 1 pinlabel=5 T 1800 200 5 10 0 1 0 6 1 pintype=pas } T 1200 1755 5 10 1 1 0 0 1 device=Name T 300 1755 8 10 1 1 0 0 1 refdes=U? T 1600 2055 8 10 0 1 0 0 1 footprint=DIP8 T 1900 1845 8 10 0 1 0 0 1 description=Generic 8 Pin DIP VeroRoute/libraries/gEDA/veroroute_transistor/NPN_BC183.sym000644 001750 001750 00000001562 13515171161 023764 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=1 T 400 850 5 6 0 0 0 0 1 pinseq=1 T 400 850 5 6 0 0 0 0 1 pinlabel=1 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=3 T 400 50 5 6 0 0 0 0 1 pinseq=3 T 400 50 5 6 0 0 0 0 1 pinlabel=3 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 403,209 L 501,200 L 431,273 L 425,240 z T 600 700 5 10 1 1 0 0 1 device=BC183 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=NPN Transistor VeroRoute/veroroute.desktop.default000644 001750 001750 00000000755 14400337066 020016 0ustar00alexalex000000 000000 [Desktop Entry] Categories=Engineering;Electronics; Comment=Qt based Veroboard/Perfboard/PCB layout and routing application # TRANSLATORS: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! Keywords=veroboard;stripboard;perfboard;pcb;layout;routing;eda;circuit;electronics; Exec=/usr/bin/veroroute Icon=veroroute Name=VeroRoute Path=/usr/share/veroroute/ StartupNotify=false Terminal=false Type=Application Version=1.0 VeroRoute/Src/GWriter.cpp000644 001750 001750 00000055327 14433664500 015573 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #include "Version.h" #include "Board.h" #include "GWriter.h" #include #include #include #include Q_DECL_CONSTEXPR static const bool FULL_LINE = false; // Set to true to force each Gerber line to be written in long format Q_DECL_CONSTEXPR static const bool XNC_FORMAT = true; // true ==> XNC Format, false ==> Excellon Format 1 or 2 Q_DECL_CONSTEXPR static const bool EXCELLON2_FORMAT = true; // true ==> Excellon Format 2, false ==> Excellon Format 1. Ignored if XNC_FORMAT. // Wrapper for a stream to a Gerber file void GStream::Clear() { m_eType = GFILE::GBL; m_ePen = GPEN::NONE; m_penWidth = 0; m_ePenList.clear(); m_ePolarity = GPOLARITY::UNKNOWN; m_pBoard = nullptr; m_bVias = false; m_iLastX = INT_MAX; m_iLastY = INT_MAX; m_bMetric = false; ClearBuffers(false); // false ==> skip GetOK() checks } void GStream::Close() { if ( m_file.isOpen() ) m_file.close(); } bool GStream::Open(const QString& fileName, GFILE eType, bool bMetric, const Board& board, bool bVias, bool bSOIC, bool bSOIC16, bool bConfirmEachFile) { Clear(); m_eType = eType; m_bMetric = bMetric; m_pBoard = &board; m_bVias = bVias; m_bSOIC = bSOIC; m_bSOIC16 = bSOIC16; QString str(fileName); QString suffix; switch( m_eType ) { case GFILE::GKO: suffix = ".GKO"; break; case GFILE::GBL: suffix = ".GBL"; break; case GFILE::GBS: suffix = ".GBS"; break; case GFILE::GBO: suffix = ".GBO"; break; case GFILE::GTL: suffix = ".GTL"; break; case GFILE::GTS: suffix = ".GTS"; break; case GFILE::GTO: suffix = ".GTO"; break; case GFILE::DRL: suffix = ".DRL"; break; } str += suffix; if ( bConfirmEachFile ) { // Ask user to confirm each Gerber file (to get write permission from Android) str = StringHelper::GetTidyFileName(str); QFileDialog fileDialog(nullptr, str); fileDialog.setAcceptMode(QFileDialog::AcceptSave); fileDialog.setNameFilter(suffix); fileDialog.setDefaultSuffix(suffix); if ( fileDialog.exec() ) { QStringList fileNames = fileDialog.selectedFiles(); if ( !fileNames.isEmpty() ) str = fileNames.at(0); } } m_file.setFileName( str ) ; const bool bOK = m_file.open(QIODevice::WriteOnly); if ( m_file.isOpen() ) m_os.setDevice(&m_file); return bOK; } void GStream::WriteHeader(const QString& UTC) // Write header for current stream { if ( !m_file.isOpen() ) return; assert( m_pBoard->GetGRIDPIXELS() == 1000 ); // ==> 4 decimal places per inch QString strLayer = "Layer: "; QString strProgram = "VeroRoute V" + QString(szVEROROUTE_VERSION); QString strUTC = QString::fromStdString( UTC.toStdString() ); QString strGen = QString("Gerber Generator version 1.1"); switch(m_eType) { case GFILE::GKO: strLayer += "BoardOutline"; break; case GFILE::GBL: strLayer += "BottomLayer"; break; case GFILE::GBS: strLayer += "BottomSolderMaskLayer"; break; case GFILE::GBO: strLayer += "BottomSilkLayer"; break; case GFILE::GTL: strLayer += "TopLayer"; break; case GFILE::GTS: strLayer += "TopSolderMaskLayer"; break; case GFILE::GTO: strLayer += "TopSilkLayer"; break; case GFILE::DRL: strLayer += ( m_pBoard->GetHoleType() == HOLETYPE::PTH ) ? "Drill_PTH" : "Drill_NPTH"; break; } Comment(strLayer); Comment(strProgram); Comment(strUTC); Comment(strGen); if ( m_eType == GFILE::DRL ) { m_os << "M48"; EndLine(); // M48 is start of header if ( m_bMetric ) { m_os << "METRIC"; // Millimetres // Excellon only lists 3.2, 4.2, or 3.3 metric formats (so 4.6 format can only work for XNC format) !!! if ( !XNC_FORMAT ) m_os << ",LZ,0000.000000"; // Leading zeros INCLUDED. 4 integer and 6 decimal EndLine(); } else { m_os << "INCH"; // Inches if ( !XNC_FORMAT ) m_os << ",LZ,00.0000"; // Leading zeros INCLUDED. 2 integer and 4 decimal EndLine(); } MakeDrills(); m_os << "%"; EndLine(); // Rewind Stop. Often used instead of M95 for end of header. m_os << ( XNC_FORMAT || EXCELLON2_FORMAT ? "G05" : "G81" ); EndLine(); // Turn on drill if ( !XNC_FORMAT ) { m_os << "G90"; EndLine(); } // Absolute mode } else { Comment("Scale: 100 percent, Rotated: No, Reflected: No"); if ( m_bMetric ) { Comment("Dimensions in mm"); Comment("Leading zeros omitted, Absolute positions, 4 integer and 6 decimal"); m_os << "%MOMM*%"; QtEndline(); // MOMM ==> Millimetres m_os << "%FSLAX46Y46*%"; QtEndline(); } else { Comment("Dimensions in inches"); Comment("Leading zeros omitted, Absolute positions, 2 integer and 4 decimal"); m_os << "%MOIN*%"; QtEndline(); // MOIN ==> Inches m_os << "%FSLAX24Y24*%"; QtEndline(); } MakeApertures(); } LinearInterpolation(); SetPolarity(GPOLARITY::DARK, false); // false ==> skip GetOK() checks } void GStream::WriteFooter() { if ( !m_file.isOpen() ) return; switch( m_eType ) { case GFILE::DRL: m_os << "M30"; EndLine(); return; // End of file default: m_os << "M02"; EndLine(); return; // End of file } } void GStream::MakeDrills() { assert( m_file.isOpen() && m_eType == GFILE::DRL ); int holeDefault; // Default hole width std::list holes; m_pBoard->GetHoleWidths_MIL(holes, holeDefault); const int viahole = m_pBoard->GetVIAHOLE_MIL(); // Build drill list int code = 1; // Start with drill T01 for (const auto& hole : holes) m_ePenList.push_back( GPenInfo(GPEN::PAD_HLE, hole, code++, "Pad Hole = ", hole != holeDefault) ); if ( m_bVias ) m_ePenList.push_back( GPenInfo(GPEN::VIA_HLE, viahole, code++, "Via Hole = ") ); // Write drill list to file const bool bLZ( !XNC_FORMAT ); // true ==> Include leading zeros for (const auto& o : m_ePenList) { QString codeStr("T"); if ( o.m_iCode < 10 ) codeStr += "0"; // Add leading zero codeStr += QString::fromStdString( std::to_string(o.m_iCode) ); if ( m_bMetric ) { m_os << ";" << o.m_comment << MilToMM(o.m_iWidth, bLZ) << " MM"; EndLine(); m_os << codeStr << "C" << MilToMM(o.m_iWidth, bLZ); EndLine(); } else { m_os << ";" << o.m_comment << MilToInch(o.m_iWidth, bLZ) << " INCH"; EndLine(); m_os << codeStr << "C" << MilToInch(o.m_iWidth, bLZ); EndLine(); } } } void GStream::MakeApertures() // Make "pens" for current stream { assert( m_file.isOpen() && m_eType != GFILE::DRL); int padDefault; // Default pad width std::list pads; m_pBoard->GetPadWidths_MIL(pads, padDefault); const int via = m_pBoard->GetVIAPAD_MIL(); const int trk = m_pBoard->GetTRACK_MIL(); const int tag = m_pBoard->GetTAG_MIL(); const int gap = m_pBoard->GetGAP_MIL(); const int msk = m_pBoard->GetMASK_MIL(); const int slk = m_pBoard->GetSILK_MIL(); const int gko = 10; // Draw border in 10 mil pen const int trkIC = m_pBoard->GetTRACK_IC_MIL(); const int minIC = m_pBoard->GetMIN_IC_MIL(); // Build aperture list int code = 10; // Start with aperture D10 switch( m_eType ) { case GFILE::GKO: m_ePenList.push_back( GPenInfo(GPEN::GKO, gko, code++, "") ); break; case GFILE::GBL: case GFILE::GTL: for (const auto& pad : pads) m_ePenList.push_back( GPenInfo(GPEN::PAD, pad, code++, " is for pads", pad != padDefault) ); if ( m_bVias ) m_ePenList.push_back( GPenInfo(GPEN::VIA, via, code++, " is for via-pads") ); if ( true ) m_ePenList.push_back( GPenInfo(GPEN::TRK, trk, code++, " is for tracks") ); if ( true ) m_ePenList.push_back( GPenInfo(GPEN::TAG, tag, code++, " is for tracks") ); if ( m_eType == GFILE::GTL && m_bSOIC ) { m_ePenList.push_back( GPenInfo(GPEN::TRK_IC, trkIC, code++, " is for SOIC tracks") ); if ( m_bSOIC16 ) m_ePenList.push_back( GPenInfo(GPEN::MIN_IC, minIC, code++, " is for thin SOIC tracks") ); } // Ground fill pens ... if ( !m_pBoard->GetGroundFill() ) break; for (const auto& pad : pads) m_ePenList.push_back( GPenInfo(GPEN::PAD_GAP, pad + 2 * gap, code++, " is for separating pads from fill", pad != padDefault) ); if ( m_bVias ) m_ePenList.push_back( GPenInfo(GPEN::VIA_GAP, via + 2 * gap, code++, " is for separating via-pads from fill") ); if ( true ) m_ePenList.push_back( GPenInfo(GPEN::TRK_GAP, trk + 2 * gap, code++, " is for separating tracks from fill") ); if ( m_eType == GFILE::GTL && m_bSOIC ) { m_ePenList.push_back( GPenInfo(GPEN::TRK_IC_GAP, trkIC + 2 * gap, code++, " is for separating SOIC tracks from fill") ); if ( m_bSOIC16 ) m_ePenList.push_back( GPenInfo(GPEN::MIN_IC_GAP, minIC + 2 * gap, code++, " is for separating thin SOIC tracks from fill") ); } break; case GFILE::GBS: case GFILE::GTS: for (const auto& pad : pads) m_ePenList.push_back( GPenInfo(GPEN::PAD_MSK, pad + 2 * msk, code++, " is for pads", pad != padDefault) ); if ( m_bVias ) m_ePenList.push_back( GPenInfo(GPEN::VIA_MSK, via + 2 * msk, code++, " is for via-pads") ); break; case GFILE::GTO: case GFILE::GBO: m_ePenList.push_back( GPenInfo(GPEN::SLK, slk, code++, "") ); break; case GFILE::DRL: break; } // Write aperture list to file for (const auto& o : m_ePenList) { QString codeStr("D"); assert(o.m_iCode >= 10); if ( o.m_iCode < 10 ) codeStr += "0"; // Add leading zero codeStr += QString::fromStdString( std::to_string(o.m_iCode) ); if ( !o.m_comment.isEmpty() ) { QString str = "Aperture " + codeStr + o.m_comment; Comment( str ); } if ( m_bMetric ) m_os << "%AD" << codeStr << "C," << MilToMM(o.m_iWidth) << "*%"; else m_os << "%AD" << codeStr << "C," << MilToInch(o.m_iWidth) << "*%"; QtEndline(); } } void GStream::LinearInterpolation() { if ( !m_file.isOpen() || m_eType == GFILE::DRL ) return; m_os << "G01"; EndLine(); } void GStream::Comment(const QString& str) { if ( !m_file.isOpen() ) return; if ( m_eType == GFILE::DRL ) m_os << ";" << str; else m_os << "G04 " << str << " "; EndLine(); } void GStream::EndLine() { if ( !m_file.isOpen() ) return; if ( m_eType != GFILE::DRL ) m_os << "*"; QtEndline(); } void GStream::QtEndline() { if ( !m_file.isOpen() ) return; #if QT_VERSION >= QT_VERSION_CHECK(5,14,0) m_os << Qt::endl; #else m_os << endl; #endif } bool GStream::GetOK() const { if ( m_pBoard == nullptr ) return false; switch( m_eType ) { case GFILE::GKO: return m_pBoard->GetCurrentLayer() == 0; case GFILE::GBL: return m_pBoard->GetCurrentLayer() == 0 || m_pBoard->GetLyrs() == 1; case GFILE::GBS: return m_pBoard->GetCurrentLayer() == 0 || m_pBoard->GetLyrs() == 1; case GFILE::GBO: return m_pBoard->GetCurrentLayer() == 0 || m_pBoard->GetLyrs() == 1; case GFILE::GTL: return m_pBoard->GetCurrentLayer() == 1 || m_pBoard->GetLyrs() == 1; case GFILE::GTS: return m_pBoard->GetCurrentLayer() == 1 || m_pBoard->GetLyrs() == 1; case GFILE::GTO: return m_pBoard->GetCurrentLayer() == 1 || m_pBoard->GetLyrs() == 1; default: return m_pBoard->GetCurrentLayer() == 0 && m_eType == GFILE::DRL; } } void GStream::SetPolarity(GPOLARITY ePolarity, bool bCheckOK) { if ( !m_file.isOpen() || m_ePolarity == ePolarity || m_eType == GFILE::DRL ) return; if ( bCheckOK && !GetOK() ) return; m_ePolarity = ePolarity; switch( m_ePolarity ) { case GPOLARITY::UNKNOWN: return; case GPOLARITY::DARK: m_os << "%LPD*%"; QtEndline(); return; case GPOLARITY::CLEAR: m_os << "%LPC*%"; QtEndline(); return; } } void GStream::Drill(const QPoint& p) { if ( !GetOK() || !m_file.isOpen() || m_eType != GFILE::DRL ) return; m_os << "X"; WriteDrillOrdinate( p.x() ); m_os << "Y"; WriteDrillOrdinate( p.y() ); QtEndline();; } void GStream::AddPad(const QPointF& pF, GPEN ePen, int w) // Add to m_pads buffer for later writing to file { if ( !GetOK() ) return; QPoint p; GetQPoint(pF, p); m_pads.push_back( new Curve(p, ePen, w) ); } void GStream::AddViaPad(const QPointF& pF, GPEN ePen) // Add to m_viapads buffer for later writing to file { if ( !GetOK() ) return; QPoint p; GetQPoint(pF, p); m_viapads.push_back( new Curve(p, ePen) ); } void GStream::AddTrack(const QPolygonF& pF, GPEN ePen) // Add to m_tracks buffer for later writing to file { if ( !GetOK() ) return; QPolygon p; GetQPolygon(pF, p); m_tracks.push_back( new Curve(p, ePen) ); } void GStream::AddVariTrack(const QPolygonF& pF, GPEN ePenHV, GPEN ePen) // Add to m_tracks buffer for later writing to file { if ( !GetOK() ) return; QPolygon p; GetQPolygon(pF, p); QPolygon temp; auto A = p.cbegin(); auto B = A; ++B; for (; B != p.cend(); A++, B++) { temp.clear(); temp << *A << *B; const bool bHV = ( A->x() == B->x() || A->y() == B->y() ); m_tracks.push_back( new Curve(temp, bHV ? ePenHV : ePen) ); } } void GStream::AddLoop(const QPolygonF& pF, GPEN ePen) // Add to m_loops buffer for later writing to file { if ( !GetOK() ) return; assert( pF.size() >= 3 ); if ( pF.size() < 3 ) return; // Loop must have at least 3 points QPolygon p; GetQPolygon(pF, p); m_loops.push_back( new Curve(p, ePen) ); } void GStream::AddRegion(const QPolygonF& pF) // Add to m_regions buffer for later writing to file { if ( !GetOK() ) return; assert( pF.size() >= 3 ); if ( pF.size() < 3 ) return; // Region must have at least 3 points QPolygon p; GetQPolygon(pF, p); m_regions.push_back( new Curve(p, GPEN::NONE) ); } void GStream::AddHole(const QPointF& pF, GPEN ePen, int w) // Add to m_holes buffer for later writing to file { if ( !GetOK() ) return; QPoint p; GetQPoint(pF, p); m_holes.push_back( new Curve(p, ePen, w) ); } void GStream::ClearBuffers(bool bCheckOK) { if ( bCheckOK && !GetOK() ) return; m_pads.Clear(); m_viapads.Clear(); m_tracks.Clear(); m_loops.Clear(); m_regions.Clear(); m_holes.Clear(); } void GStream::DrawBuffers() { if ( !GetOK() ) return; m_regions.Sort(); m_loops.Sort(); m_tracks.SpliceAll(); // Includes a Sort(). Only tracks (not loops) are spliced m_pads.Sort(); m_viapads.Sort(); m_holes.Sort(); for (const auto& o : m_regions) Region(*o); for (const auto& o : m_loops) OutLine(*o, true); // true ==> closed for (const auto& o : m_tracks) OutLine(*o, false); // false ==> not closed for (const auto& o : m_pads) OutLine(*o, false); // false ==> not closed for (const auto& o : m_viapads) OutLine(*o, false); // false ==> not closed for (const auto& o : m_holes) OutLine(*o, false); // false ==> not closed } void GStream::Region(const Curve& curve) // A filled closed curve (with zero width pen) { if ( !m_file.isOpen() || m_eType == GFILE::DRL ) return; assert( curve.m_ePen == GPEN::NONE ); if ( curve.size() < 3 ) return; // Region must have >= 3 points m_os << "G36"; EndLine(); // "Begin region" OutLine(curve, true); // true ==> force close m_os << "G37"; EndLine(); // "End region" } void GStream::OutLine(const Curve& curve, bool bForceClose) // Outline of a curve { if ( curve.empty() ) return; SetPen(curve.m_ePen, curve.m_width); const size_t N = curve.size(); if ( N == 1 ) return Flash( curve.front() ); if ( N == 2 ) return Line( curve.front(), curve.back() ); const auto& front = curve.front(); Move(front); // Move pen to start of curve auto iter = curve.begin(); ++iter; for (auto iterEnd = curve.end(); iter != iterEnd; ++iter) Draw(*iter); // Draw line to next point in curve if ( bForceClose && front != curve.back() ) Draw( front ); } void GStream::SetPen(GPEN ePen, int w) { if ( !m_file.isOpen() ) return; assert( m_pBoard ); int penWidth(w); const bool bCustom = ( penWidth != 0 ); if ( bCustom ) { switch( ePen ) { case GPEN::PAD: case GPEN::PAD_HLE: break; case GPEN::PAD_GAP: penWidth += 2 * m_pBoard->GetGAP_MIL(); break; case GPEN::PAD_MSK: penWidth += 2 * m_pBoard->GetMASK_MIL(); break; default: assert(0); // Only pads support variable width at the moment } } if ( m_ePen == ePen && m_penWidth == penWidth ) return; // No change m_ePen = ePen; m_penWidth = penWidth; if ( m_ePen == GPEN::NONE ) return; for (const auto& o : m_ePenList) { if ( o.m_ePen == ePen && ( o.m_iWidth == penWidth || ( !bCustom && !o.m_bCustom ) ) ) { m_os << ( m_eType == GFILE::DRL ? "T" : "D" ); if ( o.m_iCode < 10 ) m_os << "0"; // Add leading zero m_os << o.m_iCode; EndLine(); return; } } assert(0); // No such pen } void GStream::Flash(const QPoint& p) { if ( !m_file.isOpen() ) return; if ( m_eType == GFILE::DRL ) return Drill(p); WriteXY(p, FULL_LINE); m_os << "D03"; // Always specify D03 code EndLine(); } void GStream::Move(const QPoint& p) { if ( !m_file.isOpen() || m_eType == GFILE::DRL ) return; if ( m_iLastX == p.x() && m_iLastY == p.y() ) return; WriteXY(p, FULL_LINE); m_os << "D02"; // Always specify D02 code EndLine(); } void GStream::Draw(const QPoint& p) { if ( !m_file.isOpen() || m_eType == GFILE::DRL ) return; if ( m_iLastX == p.x() && m_iLastY == p.y() ) return; WriteXY(p, FULL_LINE); m_os << "D01"; // Always specify D01 code EndLine(); } void GStream::Line(const QPoint& pA, const QPoint& pB) { Move(pA); Draw(pB); } void GStream::WriteXY(const QPoint& p, bool bFullLine) { // p has deciMil units (since GRIDPIXELS == 1000 for Gerber Export) if ( !m_file.isOpen() ) return; const int ix = ( m_bMetric ) ? ( 2540 * p.x() ) : p.x(); // metric ==> convert deciMil to nanometres const int iy = ( m_bMetric ) ? ( 2540 * p.y() ) : p.y(); // metric ==> convert deciMil to nanometres if ( bFullLine || m_iLastX != p.x() ) m_os << "X" << ix; if ( bFullLine || m_iLastY != p.y() ) m_os << "Y" << iy; m_iLastX = p.x(); m_iLastY = p.y(); } void GStream::WriteDrillOrdinate(int iDeciMils) { if ( !m_file.isOpen() || m_eType != GFILE::DRL ) return; m_os << ( iDeciMils >= 0 ? "+" : "-" ); // Write sign if ( XNC_FORMAT ) { if ( m_bMetric ) m_os << MilToMM(iDeciMils/10, false); // false ==> no leading zeros else m_os << MilToInch(iDeciMils/10, false); // false ==> no leading zeros return; } if ( m_bMetric ) // Writes mm in format AAAABBBBBB { // Millimetres in 4.6 format, 1 deciMil = 0000.002540 mm const int iAbs = abs(2540 * iDeciMils); // Absolute value in nanometres if ( iAbs < 1000000000 ) m_os << "0"; if ( iAbs < 100000000 ) m_os << "0"; if ( iAbs < 10000000 ) m_os << "0"; if ( iAbs < 1000000 ) m_os << "0"; if ( iAbs < 100000 ) m_os << "0"; if ( iAbs < 10000 ) m_os << "0"; if ( iAbs < 1000 ) m_os << "0"; if ( iAbs < 100 ) m_os << "0"; if ( iAbs < 10 ) m_os << "0"; m_os << iAbs; } else // Writes inches in format AABBBB { // Inches in 2.4 format, 1 deciMil = 00.0001 inches const int iAbs = abs(iDeciMils); // Absolute value in deciMil if ( iAbs < 100000 ) m_os << "0"; if ( iAbs < 10000 ) m_os << "0"; if ( iAbs < 1000 ) m_os << "0"; if ( iAbs < 100 ) m_os << "0"; if ( iAbs < 10 ) m_os << "0"; m_os << iAbs; } } QString GStream::MilToInch(int iMil, bool bLZ) const // Get inches in format AA.BBBB (for defining drills and apertures) { QString str; const int i = iMil * 10; // deciMil const int inches = i / 10000; const int remain = i - 10000 * inches; assert( inches < 100 && remain < 10000 ); // i.e. AA.BBBB if ( bLZ && inches < 10 ) str += "0"; // bLZ ==> Add leading zeros str += QString::fromStdString( std::to_string(inches) + "." ); if ( remain < 1000 ) str += "0"; if ( remain < 100 ) str += "0"; if ( remain < 10 ) str += "0"; str += QString::fromStdString( std::to_string(remain) ); return str; } QString GStream::MilToMM(int iMil, bool bLZ) const // Get mm in format AAAA.BBBBBB (for defining drills and apertures) { QString str; const int i = iMil * 25400; // nanometres const int mm = i / 1000000; const int remain = i - 1000000 * mm; assert( mm < 10000 && remain < 1000000 ); // i.e. AAAA.BBBBBB if ( bLZ && mm < 1000 ) str += "0"; // bLZ ==> Add leading zeros if ( bLZ && mm < 100 ) str += "0"; // bLZ ==> Add leading zeros if ( bLZ && mm < 10 ) str += "0"; // bLZ ==> Add leading zeros str += QString::fromStdString( std::to_string(mm) + "." ); if ( remain < 100000 ) str += "0"; if ( remain < 10000 ) str += "0"; if ( remain < 1000 ) str += "0"; if ( remain < 100 ) str += "0"; if ( remain < 10 ) str += "0"; str += QString::fromStdString( std::to_string(remain) ); return str; } void GStream::GetQPoint(const QPointF& in, QPoint& out) const { // GRIDPIXELS == 100 means each integer ordinate is 1 mil assert( m_pBoard && m_pBoard->GetGRIDPIXELS() == 1000 ); // Confirm each integer ordinate == 0.0001 inches int gndL, gndR, gndT, gndB; m_pBoard->GetGroundFillBounds(gndL, gndR, gndT, gndB); const int iEdge = static_cast( m_pBoard->GetEdgeWidth() ); const int iHeight(gndB - gndT + (iEdge<<1)); out.setX( static_cast(in.x()) ); out.setY( iHeight - static_cast(in.y()) ); // Gerber y-axis goes up screen } void GStream::GetQPolygon(const QPolygonF& in, QPolygon& out) const { out.resize( in.size() ); for (int i = 0, iSize = in.size(); i < iSize; i++) GetQPoint(in[i], out[i]); } // Wrapper for handling a set of Gerber files bool GWriter::Open(const QString& fileName, const Board& board, bool bVias, bool bSOIC, bool bSOIC16, bool bTwoLayerGerber, bool bMetric, bool bConfirmEachFile) { QDateTime local(QDateTime::currentDateTime()); QString UTC = local.toTimeSpec(Qt::UTC).toString(Qt::ISODate); // Open all Gerber files for writing bool bOK(!fileName.isEmpty()); for (int i = 0; i < NUM_STREAMS && bOK; i++) { if ( GFILE(i) == GFILE::GBO ) continue; // Don't write this layer yet // Produce all files (even for single layer export). // Files that are not needed will be empty. This is to avoid zombie files. // e.g. User does 2 layer export, then later does single layer export with the same Gerber prefix. // We want the second export to wipe the GTL and GTS data from the first export. bool bDoFileClose(false); // For single layer export, we'll open the GTL and GTS files, then immediately close them so nothing will be written to them. if ( GFILE(i) == GFILE::GTL ) bDoFileClose = !bTwoLayerGerber; if ( GFILE(i) == GFILE::GTS ) bDoFileClose = !bTwoLayerGerber; bOK = m_os[i].Open(fileName, GFILE(i), bMetric, board, bVias, bSOIC, bSOIC16, bConfirmEachFile); if ( bDoFileClose ) m_os[i].Close(); else m_os[i].WriteHeader(UTC); } if ( !bOK ) Close(); return bOK; } void GWriter::Close() // Write footers, and close all file streams { for (int i = 0; i < NUM_STREAMS; i++) { m_os[i].WriteFooter(); m_os[i].Close(); } } GStream& GWriter::GetStream(GFILE eType) { return m_os[static_cast(eType)]; } VeroRoute/Src/android-sources/res/drawable-mdpi/000755 001750 001750 00000000000 14405612071 022065 5ustar00alexalex000000 000000 VeroRoute/libraries/gEDA/veroroute_transistor/Darlington_PNP_TIP107.sym000644 001750 001750 00000002551 13515171161 026312 0ustar00alexalex000000 000000 v 20130925 2 T 0 900 5 10 0 0 0 0 1 numslots=0 P 0 900 300 900 1 0 0 { T 100 1000 5 8 1 1 0 0 1 pinnumber=1 T 100 1000 5 8 0 0 0 0 1 pinseq=1 T 100 1000 5 8 0 0 0 0 1 pinlabel=1 T 100 1000 5 8 0 0 0 0 1 pintype=pas } P 1000 1700 1000 1400 1 0 0 { T 1100 1400 5 8 1 1 0 0 1 pinnumber=2 T 1100 1400 5 8 0 0 0 0 1 pinseq=2 T 1100 1400 5 8 0 0 0 0 1 pinlabel=2 T 1100 1400 5 8 0 0 0 0 1 pintype=pas } P 1000 0 1000 300 1 0 0 { T 1100 200 5 8 1 1 0 0 1 pinnumber=3 T 1100 200 5 8 0 0 0 0 1 pinseq=3 T 1100 200 5 8 0 0 0 0 1 pinlabel=3 T 1100 200 5 8 0 0 0 0 1 pintype=pas } L 500 1100 500 700 3 0 0 0 -1 -1 L 500 1000 700 1100 3 0 0 0 -1 -1 L 500 800 700 700 3 0 0 0 -1 -1 L 500 900 300 900 3 0 0 0 -1 -1 L 800 900 800 500 3 0 0 0 -1 -1 L 800 800 1000 900 3 0 0 0 -1 -1 L 800 600 1000 500 3 0 0 0 -1 -1 L 1000 900 1000 1200 3 0 0 0 -1 -1 L 1000 1200 700 1200 3 0 0 0 -1 -1 L 700 1100 700 1200 3 0 0 0 -1 -1 L 1000 500 1000 300 3 0 0 0 -1 -1 L 700 700 800 700 3 0 0 0 -1 -1 L 1000 1200 1000 1400 3 0 0 0 -1 -1 V 800 900 500 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 597,791 L 499,800 L 569,727 L 575,760 z H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 897,591 L 799,600 L 869,527 L 875,560 z T 1400 900 5 10 1 1 0 0 1 device=TIP107 T 1400 670 8 10 1 1 0 0 1 refdes=Q? T 1400 400 8 10 0 0 0 0 1 footprint=TO220 T 1400 400 8 10 0 0 0 0 1 description=PNP Darlington Transistor VeroRoute/libraries/gEDA/veroroute_transistor/PNP_BC557.sym000644 001750 001750 00000001562 13515171161 023773 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=1 T 400 850 5 6 0 0 0 0 1 pinseq=1 T 400 850 5 6 0 0 0 0 1 pinlabel=1 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=3 T 400 50 5 6 0 0 0 0 1 pinseq=3 T 400 50 5 6 0 0 0 0 1 pinlabel=3 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 297,341 L 199,350 L 269,277 L 275,310 z T 600 700 5 10 1 1 0 0 1 device=BC557 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=PNP Transistor VeroRoute/tutorials/tutorial_0.vrt000644 001750 001750 00000301021 14433261215 017577 0ustar00alexalex000000 000000 9bUse the Previous and Next buttons below to navigate the tutorials. Tutorial 1 - Modes of Operation Tutorial 2 - Docked Dialogs Tutorial 3 - The Grid 3.1 Resizing the grid 3.2 Zooming the grid Tutorial 4 - Control Dialog - View Controls 4.1 Track display options 4.2 Component display options 4.3 Saturation 4.4 Fill 4.5 Auto-crop 4.6 Margin Tutorial 5 - Control Dialog - Part Controls 5.1 Selecting a part 5.2 Name & value edit boxes 5.3 Type combo box 5.4 Rotate buttons 5.5 Length buttons 5.6 Width buttons 5.7 Label move/centre buttons 5.8 Custom pad/hole sizes Tutorial 6 - Adding & Removing Parts 6.1 Moving a part in the layout 6.2 Deleting a part from the layout 6.3 Adding a part to the layout 6.4 Copying parts within a layout 6.5 Markers 6.6 Text Boxes 6.7 Vero numbers & letters Tutorial 7 - Floating Parts Tutorial 8 - Grouping & Ungrouping Parts 8.1 Multi-selecting parts 8.2 Grouping and ungrouping Tutorial 9 - Prevention of Short-Circuits Tutorial 10 - Connections between Adjacent Grid Points Tutorial 11 - Track Styles Tutorial 12 - Diagonal Modes & Track Widths 12.1 Diagonal modes 12.2 Track Width Controls Tutorial 13 - Visualising & Fixing Connectivity 13.1 Selecting a net 13.2 Broken nets Tutorial 14 - Making Connections 14.1 Painting component pins 14.2 Painting the grid 14.3 Erasing 14.4 Selecting the netlist ID for painting 14.5 Painting wires 14.6 Painting tracks & pins with flood fill 14.7 Toggling between competing diagonals Tutorial 15 - Auto-Routing Tutorial 16 - Typical Layout Procedure Tutorial 17 - The File and Windows Menus 17.1 Opening & saving files 17.2 Importing a netlist from a schematic 17.3 Exporting as PDF 17.4 Exporting as PNG 17.5 Exporting as Gerber 17.6 PCB parameters 17.7 Rendering options 17.8 Bill Of Materials (B.O.M.) 17.9 Pin Labels Editor 17.10 Parts library Tutorial 18 - Example Tutorial 19 - Exercise: Visualising & Fixing Connectivity Tutorial 20 - Exercise: Manipulating curves Tutorial 21 - Producing 2-Layer Boards 21.1 Working with 2 layers 21.2 Manipulating parts with two layers 21.3 Selecting tracks by area 21.4 Connections between layers 21.5 Removing unwanted vias 21.6 Pin layer preference 21.7 Applying offsets to pad/hole locations Tutorial 22 - Ground-Fills Tutorial 23 - Flying Wires Tutorial 24 - Component Editor Mode 24.1 Component Definition Controls 24.2 Pin rendering and labels 24.3 Footprint dimensions 24.4 Manipulating shapes 24.5 Setting pin numbers & surface occupancy 24.6 Modifying library parts Tutorial 25 - Drag & Drop Support / Command Line Options Tutorial 26 - Working with SOICsџџџџџџџџџџџK--#2TN )&џџџџџџџџџџџ@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџPџџџџџџџџџџ‘џџџџџџџџџџџџџџџџџџџџ!џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџLџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџBџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџdџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ„џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ рџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ!џџџџџџџџџџџџџџџџџџџџPџџџџџџџџџџБџџџџџџџџџџAџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ!џџџџџџџџџџџџџџџџџџџџTџџџџџџџџџџ“џџџџџџџџџџ1џџџџџџџџџџIџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ!џџџџџџџџџџџџџџџџџџџџ @џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ @џџџџџџџџџџ 8џџџџџџџџџџ Uџџџџџџџџџџ “џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ !џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџhџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџТџџџџџџџџџџLџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџHџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџBџџџџџџџџџџLџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ&џџџџџџџџџџџџџџџџџџџџHџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџBџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџџ Nџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ hџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ ТџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџTџџџџџџџџџџ“џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџBџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Tџџџџџџџџџџ “џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ$џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ„џџџџџџџџџџ,џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ$џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ„џџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџ$џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ„џџџџџџџџџџ $џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Єџџџџџџџџџџџџџџџџџџџџ $џџџџџџџџџџџџџџџџџџџџ €џџџџџџџџџџ ,џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Pџџџџџџџџџџ ‘џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџ  Fџџџџџ oџџџџџџ џџџџџџџџџџ џџџџџџџџџџ 1џџџџџџџџџџ Qџџџџџџџџџџ ‘џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџ ^џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ  lEџџџџџ +Eџџџџџџ+џџџџџџџџџџ+џџџџџџџџџ +Fџџџџџџ+џџџџџџџџџџ+џџџџџџџџџ+1Dџџџџџџ+Aџџџџџџџџџџ Nџџџџџџџџџ,@Dџџџџџ&@=џџџџџџџџџџџџџџџџџџџџџџџџџ%=џџџџџџ%џџџџџџџџџџ%џџџџџџџџџџ%џџџџџџџџџџ%!џџџџџџџџџ40Tџџџџџџ4Aџџџџџџџџџџџџџџџџџџџ5€Tџџџџџ :rџџџџџ:iџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Tџџџџџџџџџџ “џџџџџџџџџ _џџџџџџџџџџџџџџџ -@Fџџџџџ.Qџџџџџ .Cџџџџџ*@Aџџџџџ+Bџџџџџ  ;џџџџџ ,Ф;џџџџџ &d;џџџџџ %;џџџџџ % `џџџџџџ џџџџџџџџџ &`џџџџџ &?џџџџџџ џџџџџџџџџ '€?џџџџџ %BUџџџџџџ 4Fџџџџџџџџџ 5Uџџџџџџџџџџџџџџџџ џџџџџџџџџ 8€aџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Lџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ-Dџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ*„џџџџџџџџџџ,џџџџџџџџџџ,џџџџџџџџџџ,џџџџџџџџџџ&џџџџџџџџџџ&џџџџџџџџџџ&џџџџџџџџџ& >џџџџџџџџџџџџџџџџџџџџџџџџџ'H>џџџџџ@eџџџџџџ%Dџџџџџџџџџџ4Dџџџџџџџџџ8eџџџџџџ8џџџџџџџџџ 8 rџџџџџ 7€aџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ  Duџџџџџ ;0uџџџџџ;Alџџџџџџџџџџџџџџџџ-Фџџџџџџџџџџџџџџџџџџџ *Cџџџџџџ,ˆџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ(џџџџџџџџџџ(џџџџџџџџџ(@џџџџџџџџџџџџџџџџџџџџџџџџџ'@џџџџџФcџџџџџџ%Dџџџџџџџџџџ4$џџџџџџџџџ7cџџџџџ 7sџџџџџ7 dџџџџџ 9@aџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ dџџџџџџџџџџ џџџџџџџџџ ;pџџџџџ-Gџџџџџ-Hџџџџџџџџџџџџџџџ ,Pџџџџџ)Aџџџџџ)Bџџџџџ );џџџџџ (;џџџџџ ( ;џџџџџ ;џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ%џџџџџџџџџџ%$џџџџџџџџџџџџџџџџџџџ4b[џџџџџџ џџџџџџџџџџџџџџџџџџџ9bџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Tџџџџџџџџџџ “џџџџџџџџџ  pџџџџџџџџџџџџџџџџаџџџџџџџџџџ‘џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџ3аMџџџџџџ3‘џџџџџџџџџ 3Lџџџџџ /PLџџџџџ /‘Lџџџџџџ/џџџџџџџџџ/Vџџџџџџ‚џџџџџџџџџџ%"џџџџџџџџџ44Vџџџџџ 4Csџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ  LIџџџџџ pIџџџџџ бpџџџџџџЙџџџџџџџџџџMџџџџџџџџџ1Nџџџџџ 1Pџџџџџџџџџџџџџџџ 2Yџџџџџ2Sџџџџџџџџџџџџџџџџ3˜џџџџџџџџџ3 Sџџџџџџџџџџџџџџџџџџџџџџџџџџ/Ьџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџ6Wџџџџџџ6!џџџџџџџџџџ%"џџџџџџџџџ4Wџџџџџ `dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџ `GџџџџџHџџџџџ №Oџџџџџџ бџџџџџџџџџџ Бџџџџџџџџџџ aџџџџџџџџџ3Rџџџџџџ3 џџџџџџџџџџџџџџџџџџџ/Rџџџџџџ/џџџџџџџџџџ/џџџџџџџџџ /Kџџџџџџ Шџџџџџџџџџ $Kџџџџџ $!8џџџџџџ џџџџџџџџџ  8џџџџџ 6Xџџџџџџ %"џџџџџџџџџ  4Xџџџџџ Cbџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ дџџџџџџџџџ  ›xџџџџџ  vџџџџџ  џџџџџ @џџџџџ  Yџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџ  Jџџџџџ Jџџџџџџџџџџ%џџџџџ ! 7џџџџџ  7џџџџџ $27џџџџџ $A7џџџџџ  B7џџџџџ  @7џџџџџ %B7џџџџџ  F7џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Tџџџџџџџџџџ “џџџџџџџџџџ 9џџџџџџџџџџ Mџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџdџџџџџџџџџ"џџџџџ" џџџџџџџџџџџџџџџџPџџџџџџџџџ‘ џџџџџџ џџџџџџџџџџџџџџџџџџџџ!џџџџџџџџџџџџџџџџџџџџBџџџџџџџџџџ!BџџџџџџџџџџBџџџџџџџџџ $9џџџџџџ Dџџџџџџџџџџ Dџџџџџџџџџџ %Dџџџџџџџџџ  D9џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Lџџџџџџџџџ@џџџџџ џџџџџџ &џџџџџџџџџ  xџџџџџ vџџџџџ !џџџџџ џџџџџ џџџџџџџџџџџџџџџ#џџџџџџLџџџџџџџџџџџџџџџџџџџˆ#џџџџџ  џџџџџџџџџџџџџџџџBџџџџџџџџџD\џџџџџџ!Dџџџџџџџџџd\џџџџџџџџџџџџџџџџ Dџџџџџџџџџџ Dџџџџџџџџџџ%Dџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ DџџџџџџџџџD]џџџџџџџџџџџџџџџџBџџџџџџџџџџ Bџџџџџџџџџџ"џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ!џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџHџџџџџџџџџ]џџџџџ џџџџџџџџџџ„џџџџџ D7џџџџџ !D7џџџџџ 7џџџџџ 7џџџџџ  $7џџџџџ  $7џџџџџ %7џџџџџ  D7џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџ џџџџџ@(џџџџџџDџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџџbџџџџџџџџџџџџџџџџџџџ (џџџџџ2.џџџџџ Ayџџџџџџ Dџџџџџџџџџ Dyџџџџџџџџџџџџџџџ @џџџџџџHџџџџџџџџџ`/џџџџџ$џџџџџџ!$џџџџџџџџџџџџџџџџџџџ0џџџџџA{џџџџџ B{џџџџџџ Bџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџ Dwџџџџџџ Dџџџџџџџџџ  Dwџџџџџ@0џџџџџ1џџџџџ џџџџџ  џџџџџ џџџџџ џџџџџ џџџџџ „џџџџџ €џџџџџџФџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџ !џџџџџ  @џџџџџ Fџџџџџ  Dџџџџџ  Dџџџџџ  Dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџ„ џџџџџDџџџџџ  џџџџџџџџџџ@ џџџџџџџџџџџџџџџџџџџџџџџџџ"џџџџџџџџџџџџџџџџˆџџџџџџџџџџhџџџџџџџџџ"џџџџџ4џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ $џџџџџџ„џџџџџџџџџџ фџџџџџџџџџ $џџџџџџ Фџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџ џџџџџџџџџџџџџџџџ„џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџфџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ €џџџџџџ ˆџџџџџџџџџџ џџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ Иџџџџџџџџџџ Uџџџџџџџџџџ Лџџџџџџџџџџ Eџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџџџџџџџџџџџџџџџџˆџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџиџџџџџџџџџџ•џџџџџџџџџ џџџџџ ˆџџџџџ џџџџџ €џџџџџ  Рџџџџџ @џџџџџ Pџџџџџ4џџџџџ@џџџџџ`џџџџџџџџџџ џџџџџ Рџџџџџ  џџџџџ @џџџџџ  Nџџџџџ @џџџџџ  Fџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ $џџџџџџџџџџ(џџџџџџџџџ0 џџџџџaџџџџџ џџџџџ џџџџџр џџџџџџџџџџџџџџџџџџџџџˆџџџџџџџџџ 8џџџџџ Eџџџџџџdџџџџџџџџџ џџџџџџџџџџџџџџџџ$џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ„џџџџџџ „џџџџџџџџџџ„џџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ "џџџџџџџџџnџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ цџџџџџџџџџnџџџџџ)џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ ˆџџџџџџџџџ)џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ#2џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ^d_GGPadPadPAD WF( 1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп   IC1233uC(Electrolytic 200 milCAP_ELECTRO_200EF(1 2П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠф џ  XKC1447nCFilmCAP_FILMEF($1/2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPdMCOL3COL3PadPadPADWF(31ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџџ,9R1810kRResistorRESISTORWF($$1 2ПњсGЎzс?њсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§Р\(ѕТПјQы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?јQы…ИR@\(ѕТПй™™™™™š?й™™™™™™@V€‚Я§ПњсGЎzс?њсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПњсGЎzс?њсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§Р\(ѕТПјQы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?јQы…ИR@\(ѕТПй™™™™™š?й™™™™™™@m @_Р‚Я§d^GGPadPadPAD WF( 1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп   LpIC5 78L12QTO92TO92SF(1 2;3Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i     МC202u2C.Electrolytic NP 200 mil$CAP_ELECTRO_200_NP EF(12П№?№П№?№@V€ŠŠфП№?№П№?№@V€ŠŠфџџ,BR23100kRResistorRESISTOR SF())1+2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   JC13100uC(Electrolytic 200 milCAP_ELECTRO_200EF(1 2П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџџ,GR2530kRResistorRESISTORNF(-1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџџШ"W1W1WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџ џџџџџџџџџџџШ]W14W14WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџџ,R41k8RResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,VR3010kRResistorRESISTORWF(//142ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d1 RANGE2 RANGE2PadPadPAD WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп        џџџџџџџџџџџџџџџџ        @7IC3SAD1024ICDIPDIPџџџќEF( 1%%2 3 4$5$67!89!101112 13 14%15 16РЬЬЬЬЬЭ@ЬЬЬЬЬЭП§™™™™™š?§™™™™™š@V€   РЬЬЬЬЬЭРЬЬЬЬЬЭП§™™™™™šПа@V€   РЬЬЬЬЬЭРЬЬЬЬЬЭ?а?§™™™™™š@V€   РЬЬЬЬЬЭ@ЬЬЬЬЬЭ?§™™™™™š?§™™™™™š@V€   @ЬЬЬЬЬЭРЬЬЬЬЬЭП§™™™™™šП§™™™™™š@V€   @ЬЬЬЬЬЭ@ЬЬЬЬЬЭ?§™™™™™šП§™™™™™š@V€   РffffffР ЬЬЬЬЬЭПа?аРV€@V€   џШ\W13W13WireWireWF(12П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџ џџџџџџџџџШnW11W11WireWireEF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџџ, R1039kRResistorRESISTOREF(1"2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  XXC1747nCFilmCAP_FILMWF(61 2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџџ, R610kRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  XUC1647nCFilmCAP_FILM WF(%152Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДP   LQ1 2N5087QTO92TO92NF(123Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џџ,R16100kRResistorRESISTORSF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  XyC250nCFilmCAP_FILMWF(12Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџџ,TR2913kRResistorRESISTOR EF(5142ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d/RATERATEPadPadPADWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ, R712kRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  XYC1847nCFilmCAP_FILM NF(21 2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДP џџџџџџџџШ)W8W8WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџdNCOL2COL2PadPadPAD WF(11ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп џ  XxC1100nCFilmCAP_FILM NF( 12Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџџ,R15470kRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   LaQ2 2N5089QTO92TO92 SF(917283Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џџ,R1333kRResistorRESISTORSF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  XvC4220nCFilmCAP_FILM NF( 12Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџџ,HR2622kRResistorRESISTOR NF(-12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R171MRResistorRESISTORWF(1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,>R204k7RResistorRESISTOR EF('1&&2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ, R9150RResistorRESISTOR SF(1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d[Pad4OUTPadPadPADWF(41ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdl18V18VPadPadPADWF(;1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ, R8680RResistorRESISTOR SF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  XPC1547nCFilmCAP_FILM NF(,,112Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџШ4W12W12WireWireSF(12П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџ   EC1110uC(Electrolytic 200 milCAP_ELECTRO_200 EF(++1 2П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџџ,@R21470RResistorRESISTORWF((1'2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   АFT1100kRTVerticalTRIM_VERT SF(-1++2 3Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§dQININPadPadPAD WF(.1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп   АLT2100kRTVerticalTRIM_VERTEF(//1/233Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§d SW2SW2PadPadPAD WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R114k7RResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§doGGPadPadPAD WF( 1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџD1 1N4148D Diode DIODEEF(12Пўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfD?ё™™™™™™?ё™™™™™™Пй™™™™™š?й™™™™™š@V€џfD?ђffffff?ђffffffПй™™™™™š?й™™™™™š@V€џfD?§™™™™™™?§™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfDџџ,cR33R33RResistorRESISTORWF(172ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џ џ   џ џ „uC22200uC(Electrolytic 250 milCAP_ELECTRO_250 EF(;1 2Пє?єПє?є@V€ŠŠф?юИQы…И?юИQы…ИПщ™™™™™š?щ™™™™™š@V€ŠŠфПє?єПє?є@V€ŠŠфџџ,R1210kRResistorRESISTORSF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,=R196k8RResistorRESISTOR WF(&1%%2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R14k7RResistorRESISTORWF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,bR32R32RResistorRESISTORNF(91 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  XsC21100nCFilmCAP_FILMSF(4172Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџџШ$W3W3WireWireWF( 1 2Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџ џ  X8C83n3CFilmCAP_FILMWF($1 2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџџШ#W2W2WireWireWF(12Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџdOCOL1COL1PadPadPAD WF( 1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп џ  XrC3100nCFilmCAP_FILM SF(81:2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДP   C70u5C(Electrolytic 200 milCAP_ELECTRO_200 EF(1 2П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠф џ  X`C19x1nCFilmCAP_FILM EF(&1%2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДP    џџџџџџџџ    @;IC4 TL072ICDIPDIP EF(%1&2,3 4)5(6(78П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€   d2 RANGE3 RANGE3PadPadPADWF(#1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,WR31470RResistorRESISTOREF(4162ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџџџџШ(W7W7WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџџ,R14680kRResistorRESISTORSF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ џ  XwC5220nCFilmCAP_FILMWF(1 2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPџџ,dR34R34RResistorRESISTORNF(71 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R210kRResistorRESISTOR WF(1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,RR277k5RResistorRESISTOREF(//132ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,eR35R35RResistorRESISTOR WF(182ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R34k7RResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,SR28470RResistorRESISTOREF(33122ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d.RATERATEPadPadPADWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпє{C23 x100pCCeramicCAP_CERAMICWF(1 2ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ P       џџџџџџџџџџџџџџ       @IC2 CD4013ICDIPDIPWF(12 34 56 7 8 9 1011 12!1314Р ЬЬЬЬЬЭ@ ЬЬЬЬЬЭП§™™™™™š?§™™™™™š@V€   Р ЬЬЬЬЬЭР ЬЬЬЬЬЭП§™™™™™šПа@V€   Р ЬЬЬЬЬЭР ЬЬЬЬЬЭ?а?§™™™™™š@V€   Р ЬЬЬЬЬЭ@ ЬЬЬЬЬЭ?§™™™™™š?§™™™™™š@V€   @ ЬЬЬЬЬЭР ЬЬЬЬЬЭП§™™™™™šП§™™™™™š@V€   @ ЬЬЬЬЬЭ@ ЬЬЬЬЬЭ?§™™™™™šП§™™™™™š@V€   Р ЬЬЬЬЬЭРЬЬЬЬЬЭПа?аРV€@V€   џџ,R52k2RResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§diOUTOUTPadPadPAD WF(:1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџп џ  X?C947nCFilmCAP_FILM EF('1&2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДP џ  XCC10100nCFilmCAP_FILM NF(.1*2Пї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДPПї333333?ї333333ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€ДP       џџџџџџџџџџџџџџ       @IC1 LM339ICDIPDIP EF(1234567891011 121314Р ЬЬЬЬЬЭ@ ЬЬЬЬЬЭП§™™™™™š?§™™™™™š@V€   Р ЬЬЬЬЬЭР ЬЬЬЬЬЭП§™™™™™šПа@V€   Р ЬЬЬЬЬЭР ЬЬЬЬЬЭ?а?§™™™™™š@V€   Р ЬЬЬЬЬЭ@ ЬЬЬЬЬЭ?§™™™™™š?§™™™™™š@V€   @ ЬЬЬЬЬЭР ЬЬЬЬЬЭП§™™™™™šП§™™™™™š@V€   @ ЬЬЬЬЬЭ@ ЬЬЬЬЬЭ?§™™™™™šП§™™™™™š@V€   Р ЬЬЬЬЬЭРЬЬЬЬЬЭПа?аРV€@V€   џєC6470pCCeramicCAP_CERAMICEF(1 2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,AR225k6RResistorRESISTOR NF(**1)2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d0 RANGE1 RANGE1PadPadPAD WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,DR24100kRResistorRESISTOR WF(++1,2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dSW1SW1PadPadPAD WF("1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпB@џџџўINVALID TracksWF(џџџ€џџџ€џџџ€џџџ€џџџџџџџџF#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Р@Р@@V€џVeroRoute/tutorials/tutorial_18.vrt000644 001750 001750 00000442471 14433261606 017713 0ustar00alexalex000000 000000 9жTUTORIAL 18 - EXAMPLE "NZF Flanger" by DrAlx on diystompboxes.com. This is an example showing how a combination of "Fat" and "Diagonals (Max)" track styles can be used to lay down wide tracks that fill almost the whole board. To produce a skinnier version of this layout, hit the "Tidy" button and this will remove the unnecessary portions. Notice how using the "Fat" or "Thin" track styles can give sharp bends. So change the track style to "Curved" and see how this smooths things out.џџџџџџџџџџџX** 2< '!џpџџџџџџџџџёЉџџџџџџСџџџџџџџџџЛ@ЉџџџџџџDpџџџџџџџџџџDёџџџџџџџџџџDбџџџџџџџџџџD‘џџџџџџџџџџD1џџџџџџџџџџDAџџџџџџџџџџ0џџџџџџџџџџqџџџџџџџџџСџџџџџБџџџџџџБџџџџџџџџџџБџџџџџџџџџџБџџџџџџџџџџБџџџџџџџџџџБџџџџџџџџџџБ1џџџџџџџџџџБqџџџџџџџџџџБёџџџџџџџџџџБбџџџџџџџџџББбџџџџџџБqџџџџџџџџџџБСџџџџџџџџџ0бџџџџџџqџџџџџџџџџџбџџџџџџџџџџБџџџџџџџџџџqџџџџџџџџџџСџџџџџџџџџџˆ@џџџџџџџџџџ|џџџџџџџџџџВџџџџџџЧџџџџџџџџџџЛDџџџџџџџџџDВџџџџџџDџџџџџџџџџ D џџџџџџГpџџџџџџџџџ ГСˆџџџџџ DFˆџџџџџ M@ˆџџџџџ ~ˆџџџџџ ЧŠџџџџџ M@Šџџџџџ GpŠџџџџџ GСŠџџџџџ C@Šџџџџџ B@Šџџџџџ C@Šџџџџџ B@ŠџџџџџџБ~џџџџџџџџџџБџџџџџџџџџџџБЯџџџџџџџџџ@џџџџџџБ>џџџџџџџџџџБGџџџџџџџџџ‚@џџџџџџџџџџџџџџџџџџџџџџџџџ ‡Рџџџџџџ~џџџџџџџџџџЧџџџџџџџџџџˆDџџџџџџџџџџ\џџџџџџџџџŸџџџџџџџџџџџџџџџџЛDџџџџџџџџџГ`џџџџџД#џџџџџ Д џџџџџџГмџџџџџџџџџџГ‡џџџџџџџџџџDџџџџџџџџџMТџџџџџџ<џџџџџџџџџџGџџџџџџџџџMDТџџџџџџG|џџџџџџџџџџGЧџџџџџџџџџCDСџџџџџџBdџџџџџџџџџCСџџџџџџBФџџџџџџџџџБ|џџџџџџБпџџџџџџџџџџБ‡џџџџџџџџџDџџџџџƒ@џџџџџџБFџџџџџџџџџџ‚Dџџџџџџџџџ‡џџџџџџ‡џџџџџџџџџ ‡џџџџџџ|џџџџџџџџџџЧџџџџџџџџџџˆDџџџџџџџџџџlџџџџџџџџџК0§џџџџџџКAџџџџџџџџџџЛDџџџџџџџџџџГџџџџџџџџџџГџџџџџџџџџ Г џџџџџџГ џџџџџџџџџџБ@џџџџџџџџџC@љџџџџџџ­@џџџџџџџџџџE@џџџџџџџџџџFџџџџџџџџџџMDџџџџџџџџџџG|џџџџџџџџџџGЧџџџџџџџџџCљџџџџџџBTџџџџџџџџџџB›џџџџџџџџџџBџџџџџџџџџџБќџџџџџџџџџџБЯџџџџџџџџџ „`џџџџџ џџџџџ ƒџџџџџБDЫџџџџџџ‚dџџџџџџџџџ0ЫџџџџџџAџџџџџџџџџ @џџџџџџ|џџџџџџџџџЧПџџџџџˆDLџџџџџџtџџџџџџџџџџУџџџџџџџџџКFГџџџџџџЛDџџџџџџџџџДpГџџџџџДё#џџџџџџДёџџџџџџџџџџДСџџџџџџџџџ Бdˆџџџџџ Cˆџџџџџ ­Dˆџџџџџ EDˆџџџџџ dŠџџџџџ MŠџџџџџ GŠџџџџџ GŠџџџџџ @Šџџџџџ B Šџџџџџ A€Šџџџџџ БXŠџџџџџџБНџџџџџџџџџБg†џџџџџџ„4џџџџџџџџџ„C†џџџџџ@НџџџџџџБDџџџџџџџџџџ‚4џџџџџџџџџџ‚CџџџџџџџџџFНџџџџџџDџџџџџџџџџџ|џџџџџџџџџџЧџџџџџџџџџџˆDџџџџџџџџџџ|џџџџџџџџџџЧџџџџџџџџџџКDџџџџџџџџџЛDАџџџџџџДџџџџџџџџџџДџџџџџџџџџДАџџџџџџДџџџџџџџџџБ4юџџџџџџБCџџџџџџџџџ­DюџџџџџEDŒџџџџџџtџџџџџџџџџџгџџџџџџџџџ‘Œџџџџџ Кџџџџџ Кџџџџџ AHКџџџџџ †@Кџџџџџ БLКџџџџџ A@Кџџџџџ БVКџџџџџ Бƒќџџџџџ „Цќџџџџџ ќџџџџџ Бќџџџџџ†Р§џџџџџ‚ћџџџџџ‚џџџџџФAџџџџџџ|џџџџџџџџџџЧџџџџџџџџџˆDAџџџџџџ<џџџџџџџџџG§џџџџџ КDќџџџџџ Лќџџџџџ –@ќџџџџџџ˜pџџџџџџџџџџ˜СџџџџџџџџџО@пџџџџџџ@џџџџџџџџџџБFџџџџџџџџџ­DпџџџџџED‹џџџџџџ\џџџџџџџџџџџџџџџџџџџБp‹џџџџџџБёџџџџџџџџџџБсџџџџџџџџџAџџџџџџ†DџџџџџџџџџџБdџџџџџџџџџAџџџџџџБЬџџџџџџџџџ „xџџџџџџ „Хџџџџџџџџџџ †pџџџџџџџџџ †йџџџџџџ†…џџџџџџџџџџ№џџџџџџџџџџйџџџџџџџџџџ…џџџџџџџџџџќџџџџџџџџџџЧџџџџџџџџџџˆDџџџџџџџџџО@ѕџџџџџџFџџџџџџџџџџКDџџџџџџџџџџ@џџџџџџџџџџ–Dџџџџџџџџџџ˜\џџџџџџџџџџ˜‡џџџџџџџџџОѕџџџџџџDџџџџџџџџџџБdџџџџџџџџџ­џџџџџџEDџџџџџџџџџџLџџџџџџџџџМ@џџџџџџБ\џџџџџџџџџџБŸџџџџџџџџџџБ7џџџџџџџџџџБcџџџџџџџџџ† џџџџџџБєџџџџџџџџџџБћџџџџџџџџџџБХџџџџџџџџџџ„џџџџџџџџџџ„џџџџџџџџџ†\ џџџџџџ†џџџџџџџџџџјџџџџџџџџџџнџџџџџџџџџџџџџџџџџџџxiџџџџџџнџџџџџџџџџџ‡џџџџџџџџџˆФiџџџџџџОDџџџџџџџџџџdџџџџџџџџџКџџџџџџФџџџџџџџџџџ–Dџџџџџџџџџ ˜LKџџџџџ —pKџџџџџ —СKџџџџџџdџџџџџџџџџџБ4џџџџџџџџџБCџџџџџџEDџџџџџџџџџџDџџџџџџџџџџМDџџџџџџџџџБlџџџџџ СКџџџџџ ТКџџџџџ БvКџџџџџ БћКџџџџџ Б§Кџџџџџ БџКџџџџџ БЧКџџџџџ pќџџџџџ сќџџџџџ † ќџџџџџ јќџџџџџ§§џџџџџЯћџџџџџ‘@‚џџџџџџ|џџџџџџџџџЯсџџџџџˆxсџџџџџџˆХџџџџџџџџџџОDџџџџџџџџџџTџџџџџџџџџџЛџџџџџџџџџEQџџџџџџ–Dџџџџџџџџџ˜Sџџџџџџ—\џџџџџџџџџџ—‡џџџџџџџџџџ4џџџџџџџџџџcџџџџџџџџџБџџџџџEџџџџџџDџџџџџџџџџМDыџџџџџџБtџџџџџџџџџџБУџџџџџџџџџМ@ыџџџџџџБ|џџџџџџџџџџ Бпџџџџџџџџџџ БŸџџџџџџџџџџБџџџџџџџџџБмџџџџџммџџџџџџ—џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ‘Фџџџџџџџџџџ|џџџџџџџџџџ Чџџџџџџџџџџ ˆ|џџџџџџџџџџˆЧџџџџџџџџџџОDџџџџџџџџџџLџџџџџџџџџ@џџџџџџFџџџџџџџџџџ–Dџџџџџџџџџ“@Vџџџџџџ—Lџџџџџџџџџ@Vџџџџџz@UџџџџџџvџџџџџџџџџѓРџџџџџџСџџџџџџџџџ dўџџџџџ Мўџџџџџ Бўџџџџџ Бџџџџџ МџџџџџџБџџџџџџџџџ БЖџџџџџ аЖџџџџџџ‘џџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ‘аџџџџџџџџџџ‘‘џџџџџџџџџџ‘џџџџџџџџџџ‘џџџџџџџџџџ‘џџџџџџџџџџ‘џџџџџџџџџџ|џџџџџџџџџ чhџџџџџ ˆ<hџџџџџџˆGџџџџџџџџџџОDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџDJџџџџџџ–Dџџџџџџџџџџ“Dџџџџџџџџџ—DJџџџџџџDџџџџџџџџџџzDџџџџџџџџџџ\џџџџџџџџџ П5џџџџџџgџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџ  џџџџџџџџџџРџџџџџџџџџџ‘Pџџџџџџџџџџ‘™џџџџџџџџџџ‘ џџџџџџџџџŠРџџџџџџ‰pџџџџџџџџџџ‰СџџџџџџџџџРpџџџџџџРСџџџџџџџџџџџџџџџџџџџџ 7џџџџџџџџџџ CџџџџџџџџџџˆFџџџџџџџџџџОDџџџџџџџџџџDџџџџџџџџџDLџџџџџџDџџџџџџџџџџ–Dџџџџџџџџџ“DLџџџџџ—DџџџџџџDџџџџџџџџџzџџџџџџЬџџџџџџџџџ  `5џџџџџџ6џџџџџџџџџџsџџџџџџџџџџбџџџџџџџџџџ‘џџџџџџџџџџ1џџџџџџџџџџqџџџџџџџџџџбџџџџџџџџџџБџџџџџџџџџџYџџџџџџџџџџ…џџџџџџџџџџ‘ЬџџџџџџџџџŠpџџџџџџŠљџџџџџџџџџџŠХџџџџџџџџџ‰|џџџџџџ‰чџџџџџџџџџР<џџџџџџРGџџџџџџџџџ$Pџџџџџ$MџџџџџџFџџџџџџџџџџˆDџџџџџџџџџџОDџџџџџџџџџџDџџџџџџџџџ8џџџџџџDџџџџџџџџџ –DIџџџџџ “DIџџџџџ —DIџџџџџџџџџџџxџџџџџџџџџџХџџџџџџџџџ tџџџџџ Уџџџџџџ~џџџџџџџџџџЯџџџџџџџџџ0џџџџџџAџџџџџџџџџ ~&џџџџџ Я&џџџџџ @&џџџџџџNџџџџџџџџџџ‘Xџџџџџџџџџџ‘…џџџџџџџџџŠ|џџџџџџŠпџџџџџџџџџџЇџџџџџџџџџ‰|џџџџџџ‰зџџџџџџџџџ‰ƒџџџџџџРFџџџџџџџџџџ$Lџџџџџџџџџ(@џџџџџџDџџџџџџџџџџˆDџџџџџџџџџџОDџџџџџџџџџџDџџџџџџџџџ•@MџџџџџџDџџџџџџџџџџ–Dџџџџџџџџџ“Mџџџџџџ—џџџџџџџџџИ@uџџџџџџџџџџџџџџџџџџџџџџџџџ мuџџџџџ ‡ џџџџџџ|џџџџџџџџџџЧџџџџџџџџџ @ џџџџџџFџџџџџџџџџџ|џџџџџџџџџџЧџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџ‘Lџџџџџџџџџ›@!џџџџџџŠ|џџџџџџџџџџŠЯџџџџџџџџџ@!џџџџџџ‰\џџџџџџџџџџ‰џџџџџџџџџ#РџџџџџџРDџџџџџџџџџџ$Dџџџџџџџџџ(DџџџџџџDџџџџџџџџџџˆDџџџџџџџџџџОDџџџџџџџџџџDџџџџџџџџџ•;џџџџџџDџџџџџџџџџџ–DџџџџџџџџџџЗpџџџџџџџџџЗС№џџџџџИёџџџџџџ Pџџџџџџџџџџ Йџџџџџџџџџџ Mџџџџџџџџџ ` џџџџџџџџџџџџџџџџџџџџџџџџџ D џџџџџџDџџџџџџџџџџ|џџџџџџџџџџЧџџџџџџџџџ џџџџџџџџџџџџџџџџ‘Фџџџџџџџџџ›D џџџџџŠ\ џџџџџџЇџџџџџџџџџџФџџџџџџџџџ‰L џџџџџ#8џџџџџџ#EџџџџџџџџџџРDџџџџџџџџџ$Dџџџџџџ(DџџџџџџџџџџDџџџџџџџџџџˆDџџџџџџџџџџОDџџџџџџџџџџDџџџџџџџџџ”`7џџџџџџџџџџџџџџџџ–dџџџџџџџџџЗ<7џџџџџЗGjџџџџџ”@jџџџџџџ Lџџџџџџџџџ @ џџџџџџ Fџџџџџџџџџџ џџџџџџџџџ 3 џџџџџџ Aџџџџџџџџџџ Dџџџџџџџџџџdџџџџџџџџџџ<џџџџџџџџџџGџџџџџџџџџ š@џџџџџ ‘xџџџџџ ‘Хџџџџџ ›џџџџџџŠlџџџџџџџџџ .џџџџџ .џџџџџ ‰.џџџџџ  .џџџџџ #.џџџџџ Р.џџџџџ $.џџџџџџ(ФџџџџџџџџџџDџџџџџџџџџџˆDџџџџџџџџџџОDџџџџџџџџџџdџџџџџџџџџ”46џџџџџџ”Cџџџџџџџџџџ–Tџџџџџџџџџ –ƒџџџџџ Зџџџџџ ”Dџџџџџ  џџџџџџ Dџџџџџџџџџџ Dџџџџџџџџџџ–Pџџџџџџџџџ –.џџџџџ  .џџџџџ  .џџџџџ 4.џџџџџџCџџџџџџџџџџFџџџџџџџџџџšDџџџџџџџџџџ‘|џџџџџџџџџџ‘Чџџџџџџџџџ@џџџџџџŠџџџџџџџџџџŠ3џџџџџџџџџџŠQџџџџџџџџџџŠБџџџџџџџџџџŠaџџџџџџџџџ2џџџџџAџџџџџџ(xџџџџџџџџџџ(ХџџџџџџџџџDџџџџџџˆDџџџџџџџџџџОDџџџџџџџџџџtџџџџџџџџџџуџџџџџџџџџ”хџџџџџџ–Lџџџџџџџџџџpџџџџџџџџџџсџџџџџџџџџ”хџџџџџџРџџџџџџџџџџ Dџџџџџџџџџџ Dџџџџџџџџџџ–LџџџџџџџџџџpџџџџџџџџџџёџџџџџџџџџџёџџџџџџџџџџСџџџџџџџџџџFџџџџџџџџџџDџџџџџџџџџšєџџџџџџ‘<џџџџџџџџџџ‘GџџџџџџџџџџDџџџџџџџџџšPєџџџџџš<џџџџџџŠЮџџџџџџџџџš <џџџџџџŠ6џџџџџџџџџџŠCџџџџџџџџџџџџџџџџџџџџ(\џџџџџџџџџџ(‡џџџџџџџџџџDџџџџџџџџџџˆDџџџџџџџџџџОDџџџџџџџџџџ\џџџџџџџџџџ—џџџџџџџџџфџџџџџџ–Dџџџџџџџџџфџџџџџџџџџџџџџџџџ;џџџџџџџџџEџџџџџџ Dџџџџџџџџџџ Dџџџџџџџџџџ–Dџџџџџџџџџџџџџџџџџџџџџџџџџ?џџџџџџџџџG џџџџџџDџџџџџџџџџD џџџџџ €@џџџџџ -`џџџџџ ‘џџџџџ DџџџџџџšLџџџџџџџџџ Š.џџџџџ Š.џџџџџ ŒР.џџџџџ šB.џџџџџ Š.џџџџџ &Р.џџџџџ (L.џџџџџ%@NџџџџџџDџџџџџџџџџџˆDџџџџџџџџџџОDџџџџџџџџџџLџџџџџџџџџx@6џџџџџџn@џџџџџџџџџџ–Dџџџџџџџџџ n@џџџџџ  @џџџџџ  @џџџџџ Fџџџџџџ Dџџџџџџџџџџ Dџџџџџџџџџџ–dџџџџџџџџџ 0.џџџџџ A.џџџџџ @.џџџџџ F.џџџџџџDџџџџџџџџџDџџџџџџ€Dџџџџџџџџџџ-tџџџџџџџџџџ-УџџџџџџџџџDџџџџџšD!џџџџџџŒpџџџџџџџџџџŒљџџџџџџџџџŒХ!џџџџџџšDџџџџџџџџџ&xџџџџџџ&Хџџџџџџџџџџ(Dџџџџџџџџџ%џџџџџџФџџџџџџџџџџˆDџџџџџџџџџџОDџџџџџџџџџџDџџџџџџџџџxDяџџџџџnDџџџџџџ–Dџџџџџџџџџnџџџџџ Ф џџџџџџ DџџџџџџџџџџDџџџџџџџџџ D џџџџџ Dџџџџџџ–tџџџџџџџџџџ–уџџџџџџџџџџџџџџD!џџџџџџDџџџџџџџџџџDџџџџџџџџџD!џџџџџ€dPџџџџџ-Oџџџџџ-(џџџџџф*џџџџџš)џџџџџŒ"џџџџџџŒџџџџџџџџџ Œ#џџџџџџšDџџџџџџџџџ &6џџџџџџ&џџџџџџџџџ (7џџџџџџxџџџџџџџџџџХџџџџџџџџџџˆDџџџџџџџџџОDџџџџџџDџџџџџџџџџxџџџџџnD.џџџџџџ–Dџџџџџџџџџ x.џџџџџџ Хџџџџџџџџџ D џџџџџџDџџџџџџџџџџ Dџџџџџџџџџ  џџџџџ–<"џџџџџџ–wџџџџџџџџџџ–УџџџџџџџџџD"џџџџџџDџџџџџџџџџџDџџџџџџџџџџ Dџџџџџџџџџџ €4џџџџџџџџџџ€Cџџџџџџџџџџxџџџџџџџџџџѕџџџџџџџџџџѓџџџџџџџџџџёџџџџџџџџџџёџџџџџџџџџ С#џџџџџџšdџџџџџџџџџ '6џџџџџџ'џџџџџџџџџ '7џџџџџџ|џџџџџџџџџџЧџџџџџџџџџџˆDџџџџџџџџџџОџџџџџџџџџџDџџџџџџџџџџЙ@џџџџџџџџџnDџџџџџџ–Dџџџџџџџџџџ <џџџџџџџџџ Gџџџџџџ DџџџџџџџџџDџџџџџџ DџџџџџџџџџџPџџџџџџџџџџџџџџџ–оџџџџџџџџџџ–‡џџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџ Dиџџџџџ –@иџџџџџџ€Fџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ?џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ Чџџџџџџџџџџ štџџџџџџџџџџšѓџџџџџџџџџџšёџџџџџџџџџšСrџџџџџџ|џџџџџџџџџџЧџџџџџџџџџˆDrџџџџџn@џџџџџџDџџџџџџџџџЙDџџџџџџnDџџџџџџџџџџ–Dџџџџџџџџџ@-џџџџџџ fџџџџџџџџџ -џџџџџDџџџџџџ DџџџџџџџџџLTџџџџџџ–xџџџџџџџџџџ–ЭџџџџџџџџџpnџџџџџџСџџџџџџџџџDnџџџџџџDџџџџџџџџџџ Dџџџџџџџџџџ –Dџџџџџџџџџџ€dџџџџџџџџџ(џџџџџ*џџџџџ)џџџџџ"џџџџџџџџџџџџџџџ qџџџџџ šqџџџџџџšџџџџџџџџџџšџџџџџџџџџšйџџџџџ<йџџџџџџGџџџџџџџџџџˆDџџџџџџџџџnDџџџџџџDџџџџџџџџџџЙDџџџџџџџџџnџџџџџџ–фџџџџџџџџџRџџџџџџ џџџџџџџџџ ,џџџџџџџџџџџџџџџ ,џџџџџџџџџџџ–ќџџџџџџџџџџ–чџџџџџџџџџџџџџџ+џџџџџџџџџџџџџџџ+џџџџџцџџџџџ–фцџџџџџџ€џџџџџџџџџџ€џџџџџџџџџџ€џџџџџџџџџџ€џџџџџџџџџџ€џџџџџџџџџџ€џџџџџџџџџџ €џџџџџџџџџџ €џџџџџџџџџџ€џџџџџџџџџџ€џџџџџџџџџџ€1џџџџџџџџџџ€AџџџџџџџџџџFџџџџџџџџџџˆDџџџџџџџџџnџџџџџџDџџџџџџџџџџЙDџџџџџџџџџџ–Xџџџџџџџџџџ–•џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџџ–џџџџџџџџџ–кџџџџџџ€FџџџџџџџџџџDџџџџџџџџџˆDкџџџџџџП@џџџџџџџџџџDџџџџџџџџџџЙDџџџџџџџџџџ–Lџџџџџџџџџџpџџџџџџџџџџёџџџџџџџџџџбџџџџџџџџџџ‘џџџџџџџџџџ1џџџџџџџџџџAџџџџџџџџџџЋ0џџџџџџџџџџЋqџџџџџџџџџЋСџџџџџВџџџџџџВџџџџџџџџџџВџџџџџџџџџџВџџџџџџџџџџВџџџџџџџџџџВџџџџџџџџџџВ1џџџџџџџџџџВqџџџџџџџџџџВёџџџџџџџџџџВбџџџџџџџџџВБЯџџџџџџВqџџџџџџџџџџВСџџџџџџџџџ0Яџџџџџџqџџџџџџџџџџбџџџџџџџџџ џџџџџџ€DџџџџџџџџџD џџџџџџˆDџџџџџџџџџПDџџџџџDџџџџџџЙDџџџџџџџџџџ–Dџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџЕpџџџџџџџџџ ЕСџџџџџ Fџџџџџ @џџџџџ Ћ~џџџџџ ЋЧџџџџџ @џџџџџ 9pџџџџџ 9Сџџџџџ @џџџџџ 8@џџџџџ @џџџџџ 8@џџџџџџВ~џџџџџџџџџџВџџџџџџџџџџџВЯџџџџџџџџџ0@%џџџџџџВ>џџџџџџџџџџВGџџџџџџџџџ1@%џџџџџџџџџџџџџџџџџџџџџџџџџ 2РEџџџџџџ€DџџџџџџџџџџDџџџџџџџџџџˆDџџџџџџџџџџПDџџџџџџџџџDџџџџџџЙDџџџџџџџџџџ–DџџџџџџџџџЕ`џџџџџW$џџџџџ WџџџџџџЕмџџџџџџџџџџЕ‡џџџџџџџџџџџџџџџџџџџVџџџџџџЋ<џџџџџџџџџџЋGџџџџџџџџџDVџџџџџџ9|џџџџџџџџџџ9ЧџџџџџџџџџD_џџџџџџ8dџџџџџџџџџ_џџџџџџ8ФџџџџџџџџџВ|$џџџџџџВпџџџџџџџџџџВ‡џџџџџџџџџ0D$џџџџџ3@&џџџџџџВFџџџџџџџџџџ1Dџџџџџџџџџ2&џџџџџџ2џџџџџџџџџ 2Eџџџџџџ€DџџџџџџџџџџDџџџџџџџџџџˆDџџџџџџџџџџПDџџџџџџџџџџDџџџџџџџџџџЙDџџџџџџџџџџ–dџџџџџџџџџџЕџџџџџџџџџџЕџџџџџџџџџ ЕџџџџџџЕ џџџџџџџџџџВ@џџџџџџџџџ@fџџџџџџЎ@џџџџџџџџџџ_@џџџџџџџџџџЋFџџџџџџџџџџDџџџџџџџџџџ9|џџџџџџџџџџ9Чџџџџџџџџџfџџџџџџ8Tџџџџџџџџџџ8›џџџџџџџџџџ8џџџџџџџџџџВќџџџџџџџџџџВЯџџџџџџџџџ 4`Bџџџџџ 0Bџџџџџ 3BџџџџџВDЬџџџџџџ1dџџџџџџџџџž0ЬџџџџџџžAџџџџџџџџџ Ћ@Eџџџџџџ€DџџџџџџџџџџDџџџџџџџџџџˆDџџџџџџџџџџПDџџџџџџџџџџDџџџџџџџџџџЙDџџџџџџџџџџ–4џџџџџџџџџџ–CџџџџџџџџџWp$џџџџџџWёџџџџџџџџџџWСџџџџџџџџџ Вdџџџџџ џџџџџ ЎDџџџџџ _Dџџџџџ Ћdџџџџџ џџџџџ 9џџџџџ 9џџџџџ 6@џџџџџ 8 џџџџџ 7€џџџџџ ВXџџџџџџВНџџџџџџџџџВg„џџџџџџ44џџџџџџџџџ4C„џџџџџž@FџџџџџџВDџџџџџџџџџџ14џџџџџџџџџџ1CџџџџџџџџџžFFџџџџџџЋDџџџџџџџџџџ€DџџџџџџџџџџDџџџџџџџџџџˆDџџџџџџџџџџПDџџџџџџџџџџDџџџџџџџџџџЙDџџџџџџџџџ@џџџџџџ–FџџџџџџџџџџW\џџџџџџџџџWŸџџџџџџWџџџџџџџџџВ4эџџџџџџВCџџџџџџџџџЎDэџџџџџ_DШџџџџџџЋtџџџџџџџџџџЋгџџџџџџџџџЋ‘Шџџџџџ Ћџџџџџ 6џџџџџ 7Hџџџџџ Ќ@џџџџџ ВLџџџџџ 7@џџџџџ ВVџџџџџ Вƒџџџџџ 4Цџџџџџ žџџџџџ ВџџџџџЌР'џџџџџ1>џџџџџžƒџџџџџЋФИџџџџџџ€DџџџџџџџџџџDџџџџџџџџџˆDИџџџџџџПDџџџџџџџџџџDџџџџџџџџџ ЙDњџџџџџ Dњџџџџџ –њџџџџџџWЬџџџџџџџџџџ@џџџџџџџџџП@оџџџџџџ@џџџџџџџџџџВFџџџџџџџџџЎDоџџџџџ_DЧџџџџџџЋ\џџџџџџџџџџЋџџџџџџџџџВpЧџџџџџџВёџџџџџџџџџџВсџџџџџџџџџ7ЊџџџџџџЌDџџџџџџџџџџВdџџџџџџџџџ7ЊџџџџџџВЬџџџџџџџџџ 4x?џџџџџџ 4Хџџџџџџџџџџ Ќpџџџџџџџџџ Ќй?џџџџџџЌ…џџџџџџџџџџЋ№џџџџџџџџџџЋйџџџџџџџџџџЋ…џџџџџџџџџџ€ФџџџџџџџџџџDџџџџџџџџџџˆDџџџџџџџџџПіџџџџџџФџџџџџџџџџџЙDџџџџџџџџџџDџџџџџџџџџџWXџџџџџџџџџџW…џџџџџџџџџџфџџџџџџџџџПіџџџџџџФџџџџџџџџџџВdџџџџџџџџџЎџџџџџџ_DџџџџџџџџџџЋLџџџџџџџџџН@џџџџџџВ\џџџџџџџџџџВŸџџџџџџџџџџВ7џџџџџџџџџџВcџџџџџџџџџЌ1џџџџџџВєџџџџџџџџџџВћџџџџџџџџџџВХџџџџџџџџџџ4џџџџџџџџџџ4џџџџџџџџџЌ\1џџџџџџЌџџџџџџџџџџЋјџџџџџџџџџџЋнџџџџџџџџџџЋџџџџџџџџџџ€иџџџџџџџџџџ€…џџџџџџџџџџФџџџџџџџџџџˆDџџџџџџџџџџxџџџџџџџџџџХџџџџџџџџџЙDИџџџџџџDџџџџџџџџџW ИџџџџџџјџџџџџџџџџџѕџџџџџџџџџџћџџџџџџџџџџхџџџџџџџџџџВ4џџџџџџџџџВCџџџџџџ_DџџџџџџџџџџЋDџџџџџџџџџџНDџџџџџџџџџВlџџџџџ Уџџџџџ Фџџџџџ Вvџџџџџ Вћџџџџџ В§џџџџџ Вџџџџџџ ВЧџџџџџ Ћpџџџџџ Ћсџџџџџ Ќ џџџџџ ЋјџџџџџЋ§'џџџџџЋЯ>џџџџџ€Xƒџџџџџџ€џџџџџџџџџџјџџџџџџџџџџХџџџџџџџџџџˆDџџџџџџџџџџ|џџџџџџџџџџчџџџџџџџџџЙћџџџџџџDџџџџџџџџџџxџџџџџџџџџ§ћџџџџџџџџџџџџџџџџџџџџџџџџџџџџїџџџџџџџџџџуџџџџџџџџџВ џџџџџ_ џџџџџџЋDџџџџџџџџџНDьџџџџџџВtџџџџџџџџџџВУџџџџџџџџџН@ьџџџџџџВ|џџџџџџџџџџ Впџџџџџџџџџџ ВŸџџџџџџџџџџВџџџџџџџџџВнџџџџџЋмнџџџџџџЋ—џџџџџџџџџџЋџџџџџџџџџџЋџџџџџџџџџџЋџџџџџџџџџџЋџџџџџџџџџџ€ џџџџџџџџџџјџџџџџџџџџџ§џџџџџџџџџџЧџџџџџџџџџџˆDџџџџџџџџџџ|џџџџџџџџџџїџџџџџџџџџџуџџџџџџџџџЋџџџџџџќџџџџџџџџџџЋџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїџџџџџџџџџџѓџџџџџџџџџџСџџџџџџџџџ Ћdџџџџџџ Нџџџџџџ Вџџџџџџ Вџџџџџ НџџџџџџВџџџџџџџџџ ВZџџџџџ ЋаZџџџџџџЋ‘џџџџџџџџџџЋџџџџџџџџџџЋ џџџџџџџџџџ№џџџџџџџџџџёџџџџџџџџџџёџџџџџџџџџџёџџџџџџџџџџёџџџџџџџџџџљџџџџџџџџџџ§џџџџџџџџџџџџџџџџџџџџџЧџџџџџџџџџџˆDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЋџџџџџџџџџџЋџџџџџџџџџџЋџџџџџџџџџџЋџџџџџџџџџџЋџџџџџџџџџџЋџџџџџџџџџџ Ћџџџџџџџџџџ Ћ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџˆџџџџџџџџџНџШСW18W18WireWireWF(CC1CC2П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџџџ,R3810kRResistorRESISTORWF(#1(2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,&R503k9RResistorRESISTOREF(2132ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dПGGPadPadPADџџџ№WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,!R35120kRResistorRESISTORWF(š1Œ2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џє,C347nCCeramicCAP_CERAMICEF( 1 2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ P    џџџџџџџџ    @IC4 BL3207ICDIPDIPWF(В12Ў3_4Ћ567Е8П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€   єC39100nCCeramicCAP_CERAMIC WF(1Б2ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PџєVC1747nCCeramicCAP_CERAMIC WF(“12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,ШR111kRResistorRESISTOR EF(Ћ1_2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,!R4382kRResistorRESISTOREF(1›2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџџШНW19W19WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџ   LќQ2 2N3904QTO92TO92WF(К1Л2–3Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џџџџџџШљW22W22WireWire WF(CC1CC2Р @ ПЙ™™™™™š?Й™™™™™š@V€пџџР @ ПЙ™™™™™š?Й™™™™™š@V€пџџ   #C1910uC(Electrolytic 200 milCAP_ELECTRO_200NF(Œ12П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџє.C41nCCeramicCAP_CERAMICEF( 1n2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,ƒR5110kRResistorRESISTOR NF(ž1€2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џє+C210nCCeramicCAP_CERAMICWF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ, R4210kRResistorRESISTOREF(‰1Š2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџџџџџШfW17W17WireWire WF(12Р @ ПЙ™™™™™š?Й™™™™™š@V€пџџР @ ПЙ™™™™™š?Й™™™™™š@V€пџџdL9V9VPadPadPAD џџџ№WF(ˆ1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџєюC12100pCCeramicCAP_CERAMICWF(Б1­2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PџџџШW27W27WireWire# WF(ВВ1ВВ2Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџџ,LR3210kRResistorRESISTOR EF(“12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєC42220nCCeramicCAP_CERAMICSF(n1О2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ P    џџџџџџџџ    @ќIC10 LM311NICDIPDIPEF(Б12„3Б456†78П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€   џџџШW26W26WireWire WF(ББ1ББ2Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџ   АKRT1 200k-BRTVerticalTRIM_VERTEF(—1—2˜3Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§џџШVW1W1WireWire WF(12Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџџџџџџШW29W29WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџџ,)R4527kRResistorRESISTORNF(š12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d№33PadPadPADWF(З1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdN Rate3 Rate3PadPadPADWF(%1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ, R4433kRResistorRESISTOREF(›12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,uR3010kRResistorRESISTOREF( 1И2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§    џџџџџџџџ    @IC1 LM833NICDIPDIPWF(n1 2 34 5”6З7–8П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€   џџ,ЧR1214kRResistorRESISTOR! WF(_1В2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџШW32W32WireWireWF(AA1AA2Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџџџ,бR6410RRResistorRESISTOREF(1Б2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   5C2710uC(Electrolytic 200 milCAP_ELECTRO_200 SF( 12П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџШ<W41W41WireWireWF(šš1šš2П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџ   C4110uC(Electrolytic 200 milCAP_ELECTRO_200%EF(Н1В2П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџџџџџџШіW22W22WireWire"WF(ПП1ПП2Р @ ПЙ™™™™™š?Й™™™™™š@V€пџџР @ ПЙ™™™™™š?Й™™™™™š@V€пџџџ џ   џ џ „иC30470uC(Electrolytic 250 milCAP_ELECTRO_250EF(–12Пє?єПє?є@V€ŠŠф?юИQы…И?юИQы…ИПщ™™™™™š?щ™™™™™š@V€ŠŠфПє?єПє?є@V€ŠŠфџџ,R13100kRResistorRESISTOREF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R553k9RResistorRESISTOREF(‡1ƒ2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R4010kRResistorRESISTOR WF(Š1Р2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dP Depth2 Depth2PadPadPADNF(€1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџШьW21W21WireWire$ WF(НН1НН2Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџ   6C2133uC(Electrolytic 200 milCAP_ELECTRO_200NF(&1'2П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфd;11PadPadPADWF(•1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R65100kRResistorRESISTOR" WF(Ў1Н2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R2100kRResistorRESISTOR WF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џШ#W31W31WireWireNF(ДД1ДД2П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџ    џџџџџџџџ    @.IC3 LM833NICDIPDIP WF(12345 6 7–8П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€   єjC11820pCCeramicCAP_CERAMICEF(”1З2ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PџџШW30W30WireWireWF(12Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџџєЫC26100nCCeramicCAP_CERAMICEF(1Б2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,‹R2314kRResistorRESISTOR WF(E1Б2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   А&RT2 10k-BRTVerticalTRIM_VERT WF(123Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§џєэC6100pCCeramicCAP_CERAMIC WF(В1Ў2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PџєИC810nCCeramicCAP_CERAMIC#WF(Й1W2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ P   А RT9 10k-BRTVerticalTRIM_VERTNF(D1Д2Г3Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§џџџШFW40W40WireWireWF(žž1žž2Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџdQ Regen1 Regen1PadPadPAD џџџ№WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџШ W27W27WireWireWF(12П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџєйC33100nCCeramicCAP_CERAMICWF(š12ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ P   7C2233uC(Electrolytic 200 milCAP_ELECTRO_200NF((1'2П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџџD1 1N4148D Diode DIODE EF(‰1Š2Пўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfD?ё™™™™™™?ё™™™™™™Пй™™™™™š?й™™™™™š@V€џfD?ђffffff?ђffffffПй™™™™™š?й™™™™™š@V€џfD?§™™™™™™?§™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfDџџџШхW18W18WireWireWF(””1””2Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџџ,$R491M2RResistorRESISTOREF(01В2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dРGGPadPadPAD WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R393k9RResistorRESISTOREF(%1&2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєC16220nCCeramicCAP_CERAMICNF(К12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџ џ   џ џ „qC32470uC(Electrolytic 250 milCAP_ELECTRO_250EF(š12Пє?єПє?є@V€ŠŠф?юИQы…И?юИQы…ИПщ™™™™™š?щ™™™™™š@V€ŠŠфПє?єПє?є@V€ŠŠфџџ,"R36100kRResistorRESISTORSF(1Œ2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R14100kRResistorRESISTOREF(Е12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   АRT4 20k-BRTVerticalTRIM_VERTSF(1‡2‡3Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§џџ,MR3110kRResistorRESISTORWF(•1“2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџџШєW21W21WireWireWF(šš1šš2Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџdR Regen2 Regen2PadPadPAD WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџШ W26W26WireWireWF(12П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџџџ>D3 1N4001D Diode DIODE SF(Ћ112Пўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfD?ё™™™™™™?ё™™™™™™Пй™™™™™š?й™™™™™š@V€џfD?ђffffff?ђffffffПй™™™™™š?й™™™™™š@V€џfD?§™™™™™™?§™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfDџ џ   џ џ „ЖC37470uC(Electrolytic 250 milCAP_ELECTRO_250 EF(1Б2Пє?єПє?є@V€ŠŠф?юИQы…И?юИQы…ИПщ™™™™™š?щ™™™™™š@V€ŠŠфПє?єПє?є@V€ŠŠфџџ, R74k7RResistorRESISTOREF( 1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R541M2RResistorRESISTORWF(Б12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џШ_W10W10WireWireWF(12П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџ   C4310uC(Electrolytic 200 milCAP_ELECTRO_200 EF(М1Б2П№?№П№?№@V€ŠŠф?шЃз =pЄ?шЃз =pЄПфzсGЎ{?фzсGЎ{@V€ŠŠфП№?№П№?№@V€ŠŠфџџ,ћR1810kRResistorRESISTOR$EF(1Й2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§єC13100nCCeramicCAP_CERAMIC WF(Б1E2ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ P    џџџџџџџџ    @IC7 LM311NICDIPDIP EF(В1ž243В4Ћ5Ћ6Ќ7Ћ8П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€   џџШТW19W19WireWire WF(MM1MM2Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџџџћD5 1N4001D Diode DIODESF(1‚2Пўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfD?ё™™™™™™?ё™™™™™™Пй™™™™™š?й™™™™™š@V€џfD?ђffffff?ђffffffПй™™™™™š?й™™™™™š@V€џfD?§™™™™™™?§™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfDџџ,R3727kRResistorRESISTORWF(#1$2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєЋC9330pCCeramicCAP_CERAMIC%WF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,rR6010RRResistorRESISTOREF(ˆ1š2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєC2022nCCeramicCAP_CERAMIC WF(Р1$2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,ИR6110RRResistorRESISTOR EF(ˆ1Ћ2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џє„C2347pCCeramicCAP_CERAMICWF(В142Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ P       џџџџџџџџџџџџџџ       @КIC11CD4013BICDIPDIPWF(С1Т2Б3Б4Б5Б6Б7Б8A9Б10†11A121314Р ЬЬЬЬЬЭ@ ЬЬЬЬЬЭП§™™™™™š?§™™™™™š@V€   Р ЬЬЬЬЬЭР ЬЬЬЬЬЭП§™™™™™šПа@V€   Р ЬЬЬЬЬЭР ЬЬЬЬЬЭ?а?§™™™™™š@V€   Р ЬЬЬЬЬЭ@ ЬЬЬЬЬЭ?§™™™™™š?§™™™™™š@V€   @ ЬЬЬЬЬЭР ЬЬЬЬЬЭП§™™™™™šП§™™™™™š@V€   @ ЬЬЬЬЬЭ@ ЬЬЬЬЬЭ?§™™™™™šП§™™™™™š@V€   Р ЬЬЬЬЬЭРЬЬЬЬЬЭПа?аРV€@V€   џџ,R33470RRResistorRESISTOR EF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§ємC38100nCCeramicCAP_CERAMIC EF(1Б2ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ Pџџ,R66100kRResistorRESISTOR EF(М1­2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџШW24W24WireWireWF(nn1nn2Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџџџ,AR6310RRResistorRESISTORWF(1ˆ2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєГC1410nCCeramicCAP_CERAMICWF(К1Д2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ, R9100kRResistorRESISTORWF( 1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R5362kRResistorRESISTOREF(‚12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєC40220nCCeramicCAP_CERAMICNF(n1П2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,АR283k9RResistorRESISTOREF(Д1Л2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§    џџџџџџџџ    @IC6 LM358ICDIPDIPWF(€1-2‘34›5‘6‘7š8П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€   џџ,'R5210kRResistorRESISTOR NF(Ќ1Ћ2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dS Regen3 Regen3PadPadPAD џџџшEF(˜1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ, R510kRResistorRESISTOR EF( 1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   АRT7 10k-BRTVerticalTRIM_VERTNF(1W2Е3Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§       џџџџџџџџџџџџџџ       @IC8CD4013BICDIPDIP WF(У1Ф2В3В4В5В6В7В879В10Ќ11712613Ћ14Р ЬЬЬЬЬЭ@ ЬЬЬЬЬЭП§™™™™™š?§™™™™™š@V€   Р ЬЬЬЬЬЭР ЬЬЬЬЬЭП§™™™™™šПа@V€   Р ЬЬЬЬЬЭР ЬЬЬЬЬЭ?а?§™™™™™š@V€   Р ЬЬЬЬЬЭ@ ЬЬЬЬЬЭ?§™™™™™š?§™™™™™š@V€   @ ЬЬЬЬЬЭР ЬЬЬЬЬЭП§™™™™™šП§™™™™™š@V€   @ ЬЬЬЬЬЭ@ ЬЬЬЬЬЭ?§™™™™™šП§™™™™™š@V€   Р ЬЬЬЬЬЭРЬЬЬЬЬЭПа?аРV€@V€   є C7100nCCeramicCAP_CERAMIC$ WF(В1_2ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ Pџџ,R414k7RResistorRESISTOR EF((1‰2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R25100kRResistorRESISTOREF(Г12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џШфW17W17WireWireWF(12П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџ   LBQ4 2N5087QTO92TO92EF(310243Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i      АўRT8 50k-BRTVerticalTRIM_VERT WF(1М2Б3Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§џџ,7R2010kRResistorRESISTORWF(”1З2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,оR10100kRResistorRESISTOR!WF(П1Ў2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§        џџџџџџџџџџџџџџџџ        @ŠIC12CD4049BICDIPDIP WF(1M2G3G45B6A7Б8B9C10B11C12G13G14M1516РЬЬЬЬЬЭ@ЬЬЬЬЬЭП§™™™™™š?§™™™™™š@V€   РЬЬЬЬЬЭРЬЬЬЬЬЭП§™™™™™šПа@V€   РЬЬЬЬЬЭРЬЬЬЬЬЭ?а?§™™™™™š@V€   РЬЬЬЬЬЭ@ЬЬЬЬЬЭ?§™™™™™š?§™™™™™š@V€   @ЬЬЬЬЬЭРЬЬЬЬЬЭП§™™™™™šП§™™™™™š@V€   @ЬЬЬЬЬЭ@ЬЬЬЬЬЭ?§™™™™™šП§™™™™™š@V€   РffffffР ЬЬЬЬЬЭПа?аРV€@V€   џџ,пR21100kRResistorRESISTORWF(О1­2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџШЊW36W36WireWire!WF(771772Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџ   АџRT6 50k-BRTVerticalTRIM_VERT% EF(В1Н2Ћ3Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§d844PadPadPAD WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџШW22W22WireWireWF(nn1nn2П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџџџ?D4 1N4148D Diode DIODE!WF(41Ќ2Пўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfD?ё™™™™™™?ё™™™™™™Пй™™™™™š?й™™™™™š@V€џfD?ђffffff?ђffffffПй™™™™™š?й™™™™™š@V€џfD?§™™™™™™?§™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfDџџ,ŒR221kRResistorRESISTOR EF(1E2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§єсC29100nCCeramicCAP_CERAMICEF(ˆ12ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PџџџџџШ W28W28WireWireWF(††1††2Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџџџШW29W29WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџ   АERT3 20k-BRTVerticalTRIM_VERTSF(Ћ12223Пј?јПр?р@V€Pk§Пј?јПр?р@V€Pk§џџD2 1N4148D Diode DIODE WF(Š1‰2Пўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfD?ё™™™™™™?ё™™™™™™Пй™™™™™š?й™™™™™š@V€џfD?ђffffff?ђffffffПй™™™™™š?й™™™™™š@V€џfD?§™™™™™™?§™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfDєцC31100nCCeramicCAP_CERAMICWF(1–2ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PџєnC1100pCCeramicCAP_CERAMIC EF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,R581kRResistorRESISTOR EF(1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,*R463k9RResistorRESISTORSF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dё55PadPadPADWF(И1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdO Depth1 Depth1PadPadPADNF(-1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџєC18220nCCeramicCAP_CERAMIC WF(—1z2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,JR3410kRResistorRESISTOR WF(1—2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§dUOutOutPadPadPAD WF(z1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,"R6756kRResistorRESISTOR WF(–12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,R12M2RResistorRESISTOREF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџШыW20W20WireWire WF(ММ1ММ2Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџџ џ   џ џ „ZC34470uC(Electrolytic 250 milCAP_ELECTRO_250$EF(Ћ1В2Пє?єПє?є@V€ŠŠф?юИQы…И?юИQы…ИПщ™™™™™š?щ™™™™™š@V€ŠŠфПє?єПє?є@V€ŠŠфџџ,!R6856kRResistorRESISTORWF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§        џџџџџџџџџџџџџџџџ        @IC9CD4049BICDIPDIP WF(Ћ129394658677В889108111291391415Ћ16РЬЬЬЬЬЭ@ЬЬЬЬЬЭП§™™™™™š?§™™™™™š@V€   РЬЬЬЬЬЭРЬЬЬЬЬЭП§™™™™™šПа@V€   РЬЬЬЬЬЭРЬЬЬЬЬЭ?а?§™™™™™š@V€   РЬЬЬЬЬЭ@ЬЬЬЬЬЭ?§™™™™™š?§™™™™™š@V€   @ЬЬЬЬЬЭРЬЬЬЬЬЭП§™™™™™šП§™™™™™š@V€   @ЬЬЬЬЬЭ@ЬЬЬЬЬЭ?§™™™™™šП§™™™™™š@V€   РffffffР ЬЬЬЬЬЭПа?аРV€@V€   џџџШW31W31WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџџD6 1N4148D Diode DIODEWF(„1†2Пўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfD?ё™™™™™™?ё™™™™™™Пй™™™™™š?й™™™™™š@V€џfD?ђffffff?ђffffffПй™™™™™š?й™™™™™š@V€џfD?§™™™™™™?§™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfDџџ, R6470RRResistorRESISTOR EF( 1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,ВR24100kRResistorRESISTORWF(1D2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   LQ5 2N5087QTO92TO92EF(ƒ12„3Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џџ,R85k6RResistorRESISTOREF( 1n2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џє†C2547pCCeramicCAP_CERAMICWF(Б1„2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,§R2910kRResistorRESISTORNF(К12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,6R1910kRResistorRESISTORNF(”1x2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§    џџџџџџџџ    @ˆIC2 BL3207ICDIPDIPWF(Б1C2­3E45M6D7Г8П§™™™™™š?§™™™™™šП§™™™™™š?§™™™™™š@V€   П§™™™™™šП§™™™™™šП§™™™™™šПа@V€   П§™™™™™šП§™™™™™š?а?§™™™™™š@V€   П§™™™™™š?§™™™™™š?§™™™™™š?§™™™™™š@V€   ?§™™™™™šП§™™™™™šП§™™™™™šП§™™™™™š@V€   ?§™™™™™š?§™™™™™š?§™™™™™šП§™™™™™š@V€   РЬЬЬЬЬЭПљ™™™™™šПа?аРV€@V€   єнC35100nCCeramicCAP_CERAMIC$WF(В1Ћ2ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PџШ$W32W32WireWireNF(WW1WW2П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџџџ,R31MRResistorRESISTOR EF(1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,§R5710kRResistorRESISTORSF(1†2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,%R4862kRResistorRESISTORWF(0112ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєЉC15330pCCeramicCAP_CERAMICEF(Л12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ P   LњQ1 2N3404QTO92TO92!WF(Й12–3Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џџ, R42k7RResistorRESISTOR EF( 1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєЬC24100nCCeramicCAP_CERAMICWF(В1ž2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PџџџџџџШѕW21W21WireWireWF(ОО1ОО2Р @ ПЙ™™™™™š?Й™™™™™š@V€пџџР @ ПЙ™™™™™š?Й™™™™™š@V€пџџ       џџџџџџџџџџџџџџ       @.IC5 LM324ICDIPDIPWF(Š1Š2Œ3š4Š5&6(7$8Р9#1011‰121314Р ЬЬЬЬЬЭ@ ЬЬЬЬЬЭП§™™™™™š?§™™™™™š@V€   Р ЬЬЬЬЬЭР ЬЬЬЬЬЭП§™™™™™šПа@V€   Р ЬЬЬЬЬЭР ЬЬЬЬЬЭ?а?§™™™™™š@V€   Р ЬЬЬЬЬЭ@ ЬЬЬЬЬЭ?§™™™™™š?§™™™™™š@V€   @ ЬЬЬЬЬЭР ЬЬЬЬЬЭП§™™™™™šП§™™™™™š@V€   @ ЬЬЬЬЬЭ@ ЬЬЬЬЬЭ?§™™™™™šП§™™™™™š@V€   Р ЬЬЬЬЬЭРЬЬЬЬЬЭПа?аРV€@V€      LIQ3 2N3904QTO92TO92 EF(—1“2–3Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џєC10220nCCeramicCAP_CERAMICNF(x1Й2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PdTInInPadPadPAD WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпdGGPadPadPADWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R173k9RResistorRESISTOR WF(1W2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџiD7Zener_9.1VD Diode DIODEWF(1ˆ2Пўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfD?ё™™™™™™?ё™™™™™™Пй™™™™™š?й™™™™™š@V€џfD?ђffffff?ђffffffПй™™™™™š?й™™™™™š@V€џfD?§™™™™™™?§™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПўffffff?ўffffffПй™™™™™š?й™™™™™š@V€џfDdM Rate2 Rate2PadPadPAD WF($1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпєC36100nCCeramicCAP_CERAMIC WF(Ћ1В2ПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PПьЬЬЬЬЬЭ?ьЬЬЬЬЬЭПй™™™™™š?й™™™™™š@V€џ PџџџџџШ1W38W38WireWire"WF(ЌЌ1ЌЌ2Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџdя22PadPadPADWF(x1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,(R472k2RResistorRESISTORSF(1-2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џ џ   џ џ „hC28470uC(Electrolytic 250 milCAP_ELECTRO_250 EF(ˆ12Пє?єПє?є@V€ŠŠф?юИQы…И?юИQы…ИПщ™™™™™š?щ™™™™™š@V€ŠŠфПє?єПє?є@V€ŠŠфџџ,кR5910RRResistorRESISTORWF(–1ˆ2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ,ЯR6210RRResistorRESISTOREF(1В2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џє-C52n2CCeramicCAP_CERAMICEF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,‚R5610kRResistorRESISTORNF(1‘2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§B@џџџўINVALID TracksWF(џџџ€џџџ€џџџ€џџџ€џџџџџџџџF#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Р@Р@@V€џVeroRoute/libraries/gEDA/veroroute_transistor/NPN_2N2222.sym000644 001750 001750 00000001563 13515171161 024034 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=3 T 400 850 5 6 0 0 0 0 1 pinseq=3 T 400 850 5 6 0 0 0 0 1 pinlabel=3 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=1 T 400 50 5 6 0 0 0 0 1 pinseq=1 T 400 50 5 6 0 0 0 0 1 pinlabel=1 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 403,209 L 501,200 L 431,273 L 425,240 z T 600 700 5 10 1 1 0 0 1 device=2N2222 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=NPN Transistor VeroRoute/libraries/gEDA/veroroute_linear/Generic_DIP14.sym000644 001750 001750 00000005335 13515171161 024012 0ustar00alexalex000000 000000 v 20130925 2 T 300 0 8 10 0 0 0 0 1 numslots=0 B 300 0 1400 2800 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 P 0 2600 300 2600 1 0 0 { T 205 2645 5 10 1 1 0 6 1 pinnumber=1 T 200 2600 5 10 0 1 0 0 1 pinseq=1 T 355 2595 5 10 0 1 0 0 1 pinlabel=1 T 200 2600 5 10 0 1 0 0 1 pintype=pas } P 0 2200 300 2200 1 0 0 { T 205 2245 5 10 1 1 0 6 1 pinnumber=2 T 200 2200 5 10 0 1 0 0 1 pinseq=2 T 355 2145 5 10 0 1 0 0 1 pinlabel=2 T 200 2200 5 10 0 1 0 0 1 pintype=pas } P 0 1800 300 1800 1 0 0 { T 205 1845 5 10 1 1 0 6 1 pinnumber=3 T 200 1800 5 10 0 1 0 0 1 pinseq=3 T 355 1745 5 10 0 1 0 0 1 pinlabel=3 T 200 1800 5 10 0 1 0 0 1 pintype=pas } P 0 1400 300 1400 1 0 0 { T 205 1445 5 10 1 1 0 6 1 pinnumber=4 T 200 1400 5 10 0 1 0 0 1 pinseq=4 T 355 1345 5 10 0 1 0 0 1 pinlabel=4 T 200 1400 5 10 0 1 0 0 1 pintype=pas } P 0 1000 300 1000 1 0 0 { T 205 1045 5 10 1 1 0 6 1 pinnumber=5 T 200 1000 5 10 0 1 0 0 1 pinseq=5 T 355 945 5 10 0 1 0 0 1 pinlabel=5 T 200 1000 5 10 0 1 0 0 1 pintype=pas } P 0 600 300 600 1 0 0 { T 205 645 5 10 1 1 0 6 1 pinnumber=6 T 200 600 5 10 0 1 0 0 1 pinseq=6 T 355 545 5 10 0 1 0 0 1 pinlabel=6 T 200 600 5 10 0 1 0 0 1 pintype=pas } P 0 200 300 200 1 0 0 { T 205 245 5 10 1 1 0 6 1 pinnumber=7 T 200 200 5 10 0 1 0 0 1 pinseq=7 T 355 145 5 10 0 1 0 0 1 pinlabel=7 T 200 200 5 10 0 1 0 0 1 pintype=pas } P 2000 2600 1700 2600 1 0 0 { T 1795 2645 5 10 1 1 0 0 1 pinnumber=14 T 1800 2600 5 10 0 1 0 6 1 pinseq=14 T 1645 2595 5 10 0 1 0 6 1 pinlabel=14 T 1800 2600 5 10 0 1 0 6 1 pintype=pas } P 2000 2200 1700 2200 1 0 0 { T 1795 2245 5 10 1 1 0 0 1 pinnumber=13 T 1800 2200 5 10 0 1 0 6 1 pinseq=13 T 1645 2195 5 10 0 1 0 6 1 pinlabel=13 T 1800 2200 5 10 0 1 0 6 1 pintype=pas } P 2000 1800 1700 1800 1 0 0 { T 1795 1845 5 10 1 1 0 0 1 pinnumber=12 T 1800 1800 5 10 0 1 0 6 1 pinseq=12 T 1645 1795 5 10 0 1 0 6 1 pinlabel=12 T 1800 1800 5 10 0 1 0 6 1 pintype=pas } P 2000 1400 1700 1400 1 0 0 { T 1795 1445 5 10 1 1 0 0 1 pinnumber=11 T 1800 1400 5 10 0 1 0 6 1 pinseq=11 T 1645 1395 5 10 0 1 0 6 1 pinlabel=11 T 1800 1400 5 10 0 1 0 6 1 pintype=pas } P 2000 1000 1700 1000 1 0 0 { T 1795 1045 5 10 1 1 0 0 1 pinnumber=10 T 1800 1000 5 10 0 1 0 6 1 pinseq=10 T 1645 995 5 10 0 1 0 6 1 pinlabel=10 T 1800 1000 5 10 0 1 0 6 1 pintype=pas } P 2000 600 1700 600 1 0 0 { T 1795 645 5 10 1 1 0 0 1 pinnumber=9 T 1800 600 5 10 0 1 0 6 1 pinseq=9 T 1645 595 5 10 0 1 0 6 1 pinlabel=9 T 1800 600 5 10 0 1 0 6 1 pintype=pas } P 2000 200 1700 200 1 0 0 { T 1795 245 5 10 1 1 0 0 1 pinnumber=8 T 1800 200 5 10 0 1 0 6 1 pinseq=8 T 1645 195 5 10 0 1 0 6 1 pinlabel=8 T 1800 200 5 10 0 1 0 6 1 pintype=pas } T 1200 2955 5 10 1 1 0 0 1 device=Name T 300 2955 8 10 1 1 0 0 1 refdes=U? T 1600 2055 8 10 0 1 0 0 1 footprint=DIP14 T 1900 1845 8 10 0 1 0 0 1 description=Generic 14 Pin DIP VeroRoute/libraries/gEDA/veroroute_passive/Capacitor_Film.sym000644 001750 001750 00000001267 13515171161 024651 0ustar00alexalex000000 000000 v 20130925 2 T 200 700 5 10 0 0 0 0 1 numslots=0 P 200 700 400 700 1 0 0 { T 350 750 5 8 1 1 0 6 1 pinnumber=1 T 350 750 5 8 0 0 0 6 1 pinseq=1 T 350 750 5 8 0 0 0 6 1 pinlabel=1 T 350 750 5 8 0 0 0 6 1 pintype=pas } P 1100 700 900 700 1 0 0 { T 950 750 5 8 1 1 0 0 1 pinnumber=2 T 950 750 5 8 0 0 0 0 1 pinseq=2 T 950 750 5 8 0 0 0 0 1 pinlabel=2 T 950 750 5 8 0 0 0 0 1 pintype=pas } L 600 900 600 500 3 0 0 0 -1 -1 L 900 700 700 700 3 0 0 0 -1 -1 L 600 700 400 700 3 0 0 0 -1 -1 L 700 900 700 500 3 0 0 0 -1 -1 T 500 300 5 10 1 1 0 0 1 device=82n T 500 1000 8 10 1 1 0 0 1 refdes=C? T 0 100 8 10 0 0 0 0 1 footprint=CAP_FILM T 0 100 8 10 0 0 0 0 1 description=Film Capacitor (default length) VeroRoute/Src/NodeInfoManager.h000644 001750 001750 00000011275 14377670762 016661 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include "NodeInfo.h" #include "AdjInfoManager.h" // Manager class to handle info on all nodeIds used by components (including floating components) class NodeInfoManager { public: NodeInfoManager() {} ~NodeInfoManager() { DeAllocate(); } void DeAllocate() { for (auto& pNodeInfo : m_list) delete pNodeInfo; m_list.clear(); } size_t GetSize() const { return m_list.size(); } NodeInfo* GetAt(size_t i) { return m_list[i]; } void AddComp(const Component& comp) // Call this after creating a comp, or calling comp.SetNodeId() { if ( !comp.GetIsTrueComp() ) return; for (size_t n = 0, N = comp.GetNumPins(); n < N; n++) // Loop pins on the component { const int& nodeId = comp.GetNodeId(n); // Find the relevant list object for the nodeId, or create a new one if it doesn't exist NodeInfo* pFound(nullptr); for (auto& pNodeInfo : m_list) if ( pNodeInfo->GetNodeId() == nodeId ) { pFound = pNodeInfo; break; } if ( !pFound ) { pFound = new NodeInfo(nodeId); m_list.push_back(pFound); } pFound->AddComp(comp); } } void RemoveComp(const Component& comp) // Call this before destroying a comp, or calling comp.SetNodeId() { if ( !comp.GetIsTrueComp() ) return; for (NodeInfo* pNodeInfo : m_list) if ( pNodeInfo ) pNodeInfo->RemoveComp(comp); } int GetNewNodeId(const AdjInfoManager& m_adjInfoManager) // Returns lowest nodeId not used by a component or the board { // "this" has info on nodeIds use by components. // m_adjInfoManager has info on nodeIds on the board. const size_t iSize = GetSize(); if ( iSize > 0 ) SortByLowestNodeId(); // Sort "this" nodeIds by increasing value const int iMaxCompNodeId = ( iSize == 0 ) ? 0 : m_list[iSize-1]->GetNodeId(); if ( iSize > 0 ) // We could skip this whole "if". It's just an optimisation { // First try to use a zombie nodeId in the list (i.e. one with no comps) if one exists for (size_t i = 0; i < iSize; i++) { const int nodeId = m_list[i]->GetNodeId(); if ( nodeId != BAD_NODEID && !m_adjInfoManager.GetNodeIdExists(nodeId) && m_list[i]->GetNumComps() == 0 ) return nodeId; } // Then check for gaps between nodeIds in the list for (size_t i = 0; i < iSize-1; i++) { const int iTestNodeId = m_list[i]->GetNodeId() + 1; if ( !m_adjInfoManager.GetNodeIdExists(iTestNodeId) && iTestNodeId < m_list[i+1]->GetNodeId() ) return iTestNodeId; // Use gap between nodeIds } } // Use a new nodeId that is not used by either the board or the components for (int nodeId = iMaxCompNodeId + 1; nodeId < INT_MAX; nodeId++) if ( nodeId != BAD_NODEID && !m_adjInfoManager.GetNodeIdExists(nodeId) ) return nodeId; assert(0); // We've run out of nodeIds. Unlikely to happen. return BAD_NODEID; } void CalcBoundingRectangles(CompManager& compMgr, bool bIgnoreFloating) { for (auto& pNodeInfo : m_list) pNodeInfo->CalcBoundingRectangle(compMgr, bIgnoreFloating); } // Sort functions void SortByLowestDifficulty(CompManager& compMgr) { CalcBoundingRectangles(compMgr, true); // true ==> Ignore floating components std::stable_sort(m_list.begin(), m_list.end(), HasLowerDifficulty()); } private: void SortByLowestNodeId() { std::stable_sort(m_list.begin(), m_list.end(), HasLowerNodeId()); } struct HasLowerDifficulty { bool operator()(const NodeInfo* pA, const NodeInfo* pB) const { // Put complete things on the end of the list if ( pA->GetComplete() && !pB->GetComplete() ) return false; if ( pB->GetComplete() && !pA->GetComplete() ) return true; if ( pA->GetArea() != pB->GetArea() ) return ( pA->GetArea() < pB->GetArea() ); if ( pA->GetLength() != pB->GetLength() ) return ( pA->GetLength() < pB->GetLength() ); return pA->GetNumComps() < pB->GetNumComps(); } }; struct HasLowerNodeId { bool operator()(const NodeInfo* pA, const NodeInfo* pB) const { return pA->GetNodeId() < pB->GetNodeId(); } }; private: std::vector m_list; // Store pointers to avoid object copies on sort }; VeroRoute/licenses/license_GPLv3.txt000644 001750 001750 00000105762 13515171162 017714 0ustar00alexalex000000 000000 яЛП GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 3 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, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . VeroRoute/Src/Board_routing.cpp000644 001750 001750 00000074711 14427657727 017024 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ //#define ROUTE_ALGORITHM_TIMER #include "Board.h" // MH_LRTB = Manhatten "distance" for horizontally/vertically adjacent grid points. // MH_DIAG = Manhatten "distance" for diagonally adjacent grid points. // MH_WIRE = Manhatten "distance" for wires, regardless of their length. // MH_LPIN = Manhatten "distance" for changing layers at a pin (of a component or wire) // MH_LVIA = Manhatten "distance" for changing layers at a via (i.e. place with no pin) // Routing algorithm assumes: MH_LVIA >= MH_DIAG > MH_LRTB > MH_WIRE >= MH_LPIN // Increasing MH_LVIA will try harder to avoid making vias but makes the algorithm much slower. // For maximum speed put MH_LVIA = 3. #define MH_LPIN 1 #define MH_WIRE 1 #define MH_LRTB 2 #define MH_DIAG 3 #define MH_LVIA 6 // Routing methods void Board::WipeAutoSetPoints(int nodeId, bool bHavePlacedWires) { WIRELIST wireList; // Helper for chains of wires const bool bWipeAll = ( nodeId == BAD_NODEID ); for (int i = 0, iSize = GetSize(); i < iSize; i++) { Element* const p = GetAt(i); if ( !bWipeAll && p->GetNodeId() != nodeId ) continue; // Skip points with wrong nodeId const bool bAllLyrs = p->GetHasPinTH(); bool bWipe = p->ReadFlagBits(AUTOSET) && !p->ReadFlagBits(USERSET); if ( bHavePlacedWires && p->GetHasWire() ) { p->GetWireList(wireList); // Get list containing p and its wired points ... for (const auto& o : wireList) // ... and disable wipe if any of them are USERSET { const Element* const pW = o.first; if ( pW == p ) continue; // Skip p bWipe &= ( !pW->ReadFlagBits(USERSET) ); if ( !bWipe ) break; } for (const auto& o : wireList) { Element* const pW = const_cast (o.first); if ( bWipe ) SetNodeId(pW, BAD_NODEID, bAllLyrs); WipeFlagBits(pW, AUTOSET, bAllLyrs); MarkFlagBits(pW, USERSET, bAllLyrs); } } else { if ( bWipe ) SetNodeId(p, BAD_NODEID, bAllLyrs); WipeFlagBits(p, AUTOSET, bAllLyrs); MarkFlagBits(p, USERSET, bAllLyrs); } } } void Board::BuildTargetPins(int nodeId) { // Populate m_targetPins with all (non-wire) component pins with the specified NodeId. // These are the things on the board that the routing algorithm will try and connect together. assert( nodeId != BAD_NODEID ); m_targetPins.clear(); // Can limit target pins (and loop) to layer-0 if we don't have SOIC parts const int iSize = ( m_compMgr.GetNumSOIC() > 0 && GetLyrs() == 2 ) ? GetSize() : ( GetSize() / GetLyrs() ); for (int i = 0; i < iSize; i++) { Element* const p = GetAt(i); if ( p->GetHasPin() && p->GetNodeId() == nodeId && !(m_bHavePlacedWires && p->GetHasWire()) ) { if ( p->GetHasPinTH() && !p->GetIsBotLyr() ) continue; // Only put TH pins on bottom layer or we'll double count them m_targetPins.push_back(p); } } } void Board::Route(bool bMinimal) { #ifdef ROUTE_ALGORITHM_TIMER const auto start = std::chrono::steady_clock::now(); #endif SetHavePlacedWires(); // Set up m_bHavePlacedWires at very start of routing m_bRouteMinimal = bMinimal; // When routing is enabled, this method will build tracks and update the cost in each NodeInfo. // When routing is disabled, this method will update each NodeInfo cost without building new tracks. if ( GetRoutingEnabled() ) WipeAutoSetPoints(BAD_NODEID, m_bHavePlacedWires); m_nodeInfoMgr.SortByLowestDifficulty(m_compMgr); const bool bRipUpEnabled = GetRoutingMethod() == 1; const size_t numNodes = m_nodeInfoMgr.GetSize(); for (size_t i = 0; i < numNodes; i++) m_nodeInfoMgr.GetAt(i)->SetCost(UINT_MAX); // i.e. Mark all nodesIds as unrouted int iPasses(0); bool bImproved(true), bAllowRipUp( bRipUpEnabled && GetRoutingEnabled() ); while ( bImproved ) { bImproved = false; // Gets set true if we manage to lower any route costs on this pass // Allowing multiple passes fixes some simplistic cases but kills speed. So only do one pass. // The code for multiple passes has been left in place for future tests. iPasses++; if ( iPasses > 1 ) break; for (size_t i = 0; i < numNodes; i++) // Loop all nodeIds used by components { NodeInfo* const pI = m_nodeInfoMgr.GetAt(i); if ( pI->GetCost() == 0 ) continue; // Skip if fully routed const int& nodeIdI = pI->GetNodeId(); // Flood with MH values, starting from the m_targetPins const unsigned int costI = ( nodeIdI != BAD_NODEID ) ? Flood(nodeIdI) : UINT_MAX; if ( costI < pI->GetCost() ) { pI->SetCost( costI ); bImproved = true; } if ( bAllowRipUp && nodeIdI != BAD_NODEID && pI->GetCost() > 0 && i > 0 ) { TrackElementGrid Ibest, Iripped; CopyTo(Ibest); WipeAutoSetPoints(nodeIdI, m_bHavePlacedWires); // Rip-up I CopyTo(Iripped); size_t j(i-1); // Loop j through previously routed nodeIds while( pI->GetCost() > 0 ) { NodeInfo* const pJ = m_nodeInfoMgr.GetAt(j); const int& nodeIdJ = pJ->GetNodeId(); if ( pJ->GetCost() == 0 ) // Only consider J if it is fully routed { WipeAutoSetPoints(nodeIdJ, m_bHavePlacedWires); // Rip-up J const unsigned int costI = Flood(nodeIdI); // Route I ... if ( costI < pI->GetCost() ) // ... and if I improved { const unsigned int costJ = Flood(nodeIdJ); // Route J ... if ( costJ == 0 ) // ... and if J is still fully routed { bImproved = true; pI->SetCost( costI ); // Update cost I if ( costI > 0 ) // If we've not solved I ... CopyTo(Ibest); // ... log the improved route (it's the best so far) } } if ( pI->GetCost() > 0 ) CopyFrom(Iripped); // Revert to ripped-up I } if ( j == 0 ) break; else j--; } if ( pI->GetCost() > 0 ) CopyFrom(Ibest); } } if ( !bAllowRipUp ) break; } RebuildAdjacencies(); #ifdef ROUTE_ALGORITHM_TIMER const auto elapsed = std::chrono::steady_clock::now() - start; const auto duration_ms = std::chrono::duration_cast(elapsed).count(); std::cout << "Time : " << duration_ms << std::endl; #endif } void Board::UpdateVias() // Sets the via flag to true on all candidate vias { m_bRouteMinimal = true; m_bHasVias = false; // Reset the flag indicating if the board has routed vias (as opposed to "wires-as-tracks" vias) if ( GetViasEnabled() ) { // If the ends of a candidate via can be connected through a pin on the board then it is not a via. const bool bRoutingEnabled = GetRoutingEnabled(); // Log routing state SetRoutingEnabled(false); // Don't build tracks while performing test SetViasEnabled(false); // Disable routing through vias to perform test // Store existing MH values and route IDs (used for showing connected areas) because Flood() will wipe them std::vector iMH; iMH.resize( GetSize() ); std::vector iRID; iRID.resize( GetSize() ); for (int i = 0, iSize = GetSize(); i < iSize; i++) { Element* const p = GetAt(i); iMH[i] = p->GetMH(); iRID[i] = p->GetRouteId(); } SetHavePlacedWires(); // Set up m_bHavePlacedWires before calling Flood() in loop below for (int i = 0, iSize = ( GetLyrs() == 1 ) ? GetSize() : ( GetSize() / 2 ); i < iSize; i++) // Loop layer 0 only { Element* const p = GetAt(i); Element* const q = p->GetNbr(NBR_X); bool bIsVia(false); if ( q && !p->GetHasPinTH() && p->GetNodeId() == q->GetNodeId() && p->GetNodeId() != BAD_NODEID ) // If candidate via ... { m_targetPins.clear(); m_targetPins.push_back(p); m_targetPins.push_back(q); bIsVia = Flood() > 0; m_bHasVias |= bIsVia; // Update m_bHasVias } p->SetIsVia(bIsVia); } // Restore MH values and route IDs for (int i = 0, iSize = GetSize(); i < iSize; i++) { Element* const p = GetAt(i); p->SetMH( iMH[i] ); p->SetRouteId( iRID[i] ); } SetViasEnabled(true); // Restore vias state SetRoutingEnabled(bRoutingEnabled); // Restore routing state } else { // No test needed. Just wipe the via flag on the base elements for (int i = 0, iSize = ( GetLyrs() == 1 ) ? GetSize() : ( GetSize() / 2 ); i < iSize; i++) // Loop layer 0 only GetAt(i)->SetIsVia(false); } CalcMIN_SEPARATION(); } unsigned int Board::Flood(int iFloodNodeId) { BuildTargetPins(iFloodNodeId); // Populate m_targetPins return Flood(); } unsigned int Board::Flood(bool bSingleRoute) { // Flood the board with MH values, starting from the m_targetPins. // The return value is a cost that shows how unconnected the pins are. // Zero cost means the pins are all inter-connected. const size_t N = m_targetPins.size(); assert( !bSingleRoute || ( N == 1 ) ); if ( !bSingleRoute && N < 2 ) return 0; // Return cost of zero // Allocate the connection matrix to indicate which pairs of targetPins are connected m_connectionMatrix.Allocate( N ); // All target pins that support "flying wires" are connected to each other for (size_t j = 0; j < N; j++) if ( GetAllowFlyWire( m_targetPins[j] ) ) for (size_t k = j+1; k < N; k++) if ( GetAllowFlyWire( m_targetPins[k] ) ) m_connectionMatrix.Connect(j, k); // Make j-k connection and enforce transitivity if ( m_bRouteMinimal ) // For minimal routing, first do a preliminary flood to see which pins are connected Flood_Helper(false); // false ==> don't build new tracks if ( GetRoutingEnabled() ) Flood_Helper(true); // true ==> build new tracks // Give connected target pins the same route ID (so we can draw a limited set of air-wires). // We don't care about route IDs at other elements, so leave them as they are. for (size_t j = 0; j < N; j++) for (size_t k = j+1; k < N; k++) if ( m_connectionMatrix.GetAreConnected(j, k) ) m_targetPins[k]->SetRouteId( m_targetPins[j]->GetRouteId() ); m_connectionMatrix.DeAllocate(); return m_connectionMatrix.GetCost(); } void Board::Flood_Helper(const bool bBuildTracks) { WIRELIST wireList; // Helper for chains of wires for (int i = 0, iSize = GetSize(); i < iSize; i++) // Loop all grid points GetAt(i)->ResetMH(); // Wipe RouteId. Set "infinite" MH distance. Zero max MH parameter. m_tmpVec.resize(static_cast(GetSize()), nullptr); m_tmpVecSize = 0; // Clear the set of visited points const size_t N = m_targetPins.size(); m_growingRoutes.resize(N); // Allocate flags to track route growth from pins unsigned int iMH(0), iMaxMH(0), iMHlastGrowthCheck(0); // Add each target pin to the set of visited points, with a unique routeId, and MH value of zero unsigned int iRouteID(BAD_ROUTEID); for (auto p : m_targetPins) { iRouteID++; assert( iRouteID < BAD_ROUTEID ); // Should be safely < UINT_MAX in practice UpdateMH(p, iRouteID, iMH, iMaxMH); // Add p to set of visited points } const bool bMultiLayer = GetLyrs() > 1; const bool bViasEnabled = bMultiLayer && GetViasEnabled(); const int& iFloodNodeId = m_targetPins[0]->GetNodeId(); const bool bDiagsOK = ( GetDiagsMode() != DIAGSMODE::OFF ); const unsigned int iMaxDeltaMH = ( bViasEnabled ) ? MH_LVIA : bDiagsOK ? MH_DIAG : MH_LRTB; // The max MH increment in single-layer mode depends on if diagonals are allowed // If any of the target pins are wires, we have to handle those first for (size_t n = 0; n < N && m_bHavePlacedWires; n++) { Element* const p = m_targetPins[n]; if ( !p->GetHasWire() ) continue; const int iRID = p->GetRouteId(); p->GetWireList(wireList); // Get list of p and its wired points for (const auto& o : wireList) { Element* const pW = const_cast (o.first); if ( pW == p ) continue; // Skip p assert( p->GetNodeId() == pW->GetNodeId() ); // Sanity check if ( pW->GetMH() != BAD_MH ) continue; // Don't overwrite visited points (even if MH is improved) const unsigned int iOtherMH = iMH + MH_WIRE * o.second; // Each wire increases MH by MH_WIRE UpdateMH(pW, iRID, iOtherMH, iMaxMH); // Add pW to set of visited points } } std::fill(m_growingRoutes.begin(), m_growingRoutes.end(), false); // Clear flags tracking route growth from pins size_t jjStart(0); if ( !bMultiLayer ) iMH = MH_LRTB - 1; // Set iMH so it's incremented to MH_LRTB on loop entry bool bDone(false); while( !bDone ) { iMH++; // Increase MH (think of this as distance from start points). // Now see what visited points have an MH value that is "one step away" from this target value. // For visited wires, both wires-ends are in the set of visited points. // Therefore we only need to consider the 8 neighbours for each visited point. if ( iMH == BAD_MH ) break; // Quit if iMH reaches "infinity" if ( iMH > iMaxMH + iMaxDeltaMH ) break; // Can't reach out further from the set of visited points const size_t jjSize = m_tmpVecSize; // m_tmpVecSize gets modified in loop so take a copy for (size_t jj = jjStart; jj < jjSize && !bDone; jj++) // Loop through visited points { Element* const pJ = m_tmpVec[jj]; if ( pJ->GetMaxMH() + iMaxDeltaMH < iMH ) // If pJ (and all previous points) are too far from the flood boundary { jjStart = jj + 1; // ... then skip them from now on (since iMH only ever increases) continue; } const int iTypeMin(bMultiLayer ? 0 : 1), iTypeMax(bViasEnabled ? 2 : 1); for (int iType = iTypeMin; iType <= iTypeMax && !bDone; iType++) { switch( iType ) { case 0: // Type 0 ==> Change layer at a pin if ( pJ->GetMH() + MH_LPIN == iMH && pJ->GetHasPinTH() ) Flood_Grow(iFloodNodeId, pJ, NBR_X, bBuildTracks, iMH, iMaxMH, bDone); break; case 1: // Type 1 ==> Move within layer for (int iDiag = 0, iDiagMax = ( bDiagsOK ) ? 2 : 1; iDiag < iDiagMax && !bDone; iDiag++) // First pass ==> Non-diagonal nbrs. Second pass diagonal nbrs { const unsigned int iDeltaMH = ( iDiag ) ? MH_DIAG : MH_LRTB; if ( pJ->GetMH() + iDeltaMH != iMH ) continue; // pJ has wrong MH for connection for (int iNbr = iDiag; iNbr < 8 && !bDone; iNbr += 2) // Even/Odd iNbr ==> Non-diagonal/Diagonal Flood_Grow(iFloodNodeId, pJ, iNbr, bBuildTracks, iMH, iMaxMH, bDone); } break; case 2: // Type 2 ==> Change layer at a via if ( pJ->GetMH() + MH_LVIA == iMH && !pJ->GetHasPinTH() ) Flood_Grow(iFloodNodeId, pJ, NBR_X, bBuildTracks, iMH, iMaxMH, bDone); break; } } } // Periodically (every sufficiently large MH increase) examine which routes have grown. // If all growing routes are connected to each other then we're done. if ( N > 1 && !bDone && iMH >= iMHlastGrowthCheck + iMaxDeltaMH + (m_bHavePlacedWires ? MH_WIRE : 0) ) { bDone = true; for (size_t i = 0; i < N && bDone; i++) if ( m_growingRoutes[i] ) for (size_t j = i+1; j < N && bDone; j++) if ( m_growingRoutes[j] ) bDone = m_connectionMatrix.GetAreConnected(i,j); if ( !bDone ) { iMHlastGrowthCheck = iMH; std::fill(m_growingRoutes.begin(), m_growingRoutes.end(), false); // Clear flags tracking route growth from pins } } } } void Board::Flood_Grow(int iFloodNodeId, Element* const pJ, int iNbr, bool bBuildTracks, unsigned int& iMH, unsigned int& iMaxMH, bool& bDone) { WIRELIST wireList; // Helper for chains of wires Element* const pK = pJ->GetNbr(iNbr); assert( pK ); if ( pK == nullptr ) return; const bool bOK = pJ->GetNodeId() == iFloodNodeId; // true ==> pJ already painted with correct NodeId const unsigned int& j = pJ->GetRouteId(); const unsigned int& k = pK->GetRouteId(); const bool bDirOK = ( bOK && pJ->GetUsed(iNbr) ) || // i.e. if already painted with correct nodeId ( bBuildTracks && pJ->HaveNoBlankPins(iNbr) && !pJ->IsBlocked(iNbr, iFloodNodeId) && !(m_bHavePlacedWires && pJ->IsUselessWire(iNbr, iFloodNodeId)) ); if ( !bDirOK ) return; if ( pK->GetMH() == BAD_MH ) // Grow route with ID j (from pJ to pK) { const int& nodeId = pK->GetNodeId(); if ( nodeId == iFloodNodeId || nodeId == BAD_NODEID ) { UpdateMH(pK, j, iMH, iMaxMH); // Add pK to set of visited points const bool bWire = m_bHavePlacedWires && pK->GetIsBotLyr() && pK->GetHasWire(); // Constrain wire-routing to bottom layer if ( bWire ) { pK->GetWireList(wireList); // Get list of pK and its wired points for (const auto& o : wireList) // Ideally want these in order of increasing MH { Element* const pW = const_cast (o.first); if ( pW == pK ) continue; // Skip pK assert( pK->GetNodeId() == pW->GetNodeId() ); // Sanity check if ( pW->GetMH() != BAD_MH ) continue; // Don't overwrite visited points (even if MH is improved) const unsigned int iOtherMH = iMH + MH_WIRE * o.second; // Each wire increases MH by MH_WIRE UpdateMH(pW, j, iOtherMH, iMaxMH); // Add pW to set of visited points } } } return; } if ( m_connectionMatrix.GetAreConnected(j,k) ) return; // Routes with IDs j and k have met and don't have a connection yet ... if ( bBuildTracks ) // If building tracks ... { Backtrace(pJ, iFloodNodeId); // ... trace pJ back to its source, painting iFloodNodeId along the way Element* const pKprev = Backtrace(pK, iFloodNodeId); // ... trace pK back to its source, painting iFloodNodeId along the way // pKprev is the first backtraced element from pK. // If diagonal connections are allowed, and if pJ and pKprev are diagonal neighbours, // then remove pK from the backtrace. This will give a direct diagonal connection between pJ and pKprev. const bool bDiagsOK = ( GetDiagsMode() != DIAGSMODE::OFF ); if ( bDiagsOK && pKprev && pKprev->IsDiagNbr(pJ) ) BacktraceErase(pK); } m_connectionMatrix.Connect(j, k); // Make j-k connection and enforce transitivity if ( m_targetPins.size() > 1 ) bDone = m_connectionMatrix.GetCost() == 0; // Zero cost ==> done } Element* Board::Backtrace(Element* const pEnd, int nodeId) { // Backtrace route from pEnd to point with MH = 0 Element* pOut = nullptr; // We will return the first traced element from pEnd (if there is one) Element* p = pEnd; if ( p->GetMH() == BAD_MH ) return pOut; const bool bMultiLayer = GetLyrs() > 1; const bool bViasEnabled = bMultiLayer && GetViasEnabled(); const bool bDiagsOK = ( GetDiagsMode() != DIAGSMODE::OFF ); int iLastDirection(-1); // To avoid ping-pong between layers unsigned int MH = p->GetMH(); while ( true ) // Backtrace { assert( !p->GetIsHole() && !(p->GetSoicProtected() && nodeId != BAD_NODEID) ); Element* const pW0 = m_bHavePlacedWires ? p->GetW(0) : nullptr; Element* const pW1 = m_bHavePlacedWires ? p->GetW(1) : nullptr; const bool bWire = (pW0 || pW1) && p->GetIsBotLyr(); // Constrain wire-routing to bottom layer const bool bHasPinTH = bWire || p->GetHasPinTH(); // Checks all layers const bool bLyrHasPin = p->GetLyrHasPin(); // true ==> have a pin on this layer, so returns false for bottom layer under an SOIC pin (with no TH) const bool bAllLyrs = bHasPinTH; if ( !bLyrHasPin || bWire ) // For non-pins and wires BacktracePaint(p, nodeId, bAllLyrs, bWire); // Paint element p if ( !pOut && p != pEnd ) pOut = p; if ( MH == 0 ) return pOut; // We're done backtracing once MH == 0 bool bOK(false); // Will be set true after a successful backtrace (with modified p and MH) // Now decide where to back trace to. // Check wires first... if ( m_bHavePlacedWires ) { bOK = ( pW0 && pW0->GetMH() == MH - MH_WIRE ); if ( bOK ) { p = pW0; MH -= MH_WIRE; continue; } bOK = ( pW1 && pW1->GetMH() == MH - MH_WIRE ); if ( bOK ) { p = pW1; MH -= MH_WIRE; continue; } } for (int iLoop = 0; iLoop < 2 && !bOK; iLoop++) // First pass to give preference to nbrs that are not wire ends { const int iTypeMin(bMultiLayer ? 0 : 1), iTypeMax(bViasEnabled ? 2 : 1); for (int iType = iTypeMin; iType <= iTypeMax && !bOK; iType++) { switch( iType ) { case 0: // Type 0 ==> Change layer at a pin if multi-layer routing if ( bMultiLayer && bHasPinTH && iLastDirection != NBR_X ) { bOK = BacktraceHelper(p, MH, nodeId, MH_LPIN, NBR_X, iLoop); if ( bOK ) iLastDirection = NBR_X; } break; case 1: // Type 1 ==> Move within layer for (int iDiag = 0, iDiagMax = ( bDiagsOK ) ? 2 : 1; iDiag < iDiagMax && !bOK; iDiag++) // Loop for diagonal/non-diagonal directions { const unsigned int iDeltaMH = ( iDiag ) ? MH_DIAG : MH_LRTB; // First pass ==> Non-diagonal nbrs. Second pass diagonal nbrs for (int iNbr = iDiag; iNbr < 8 && !bOK; iNbr += 2) // Even/Odd iNbr ==> Non-diagonal/Diagonal { bOK = BacktraceHelper(p, MH, nodeId, iDeltaMH, iNbr, iLoop); if ( bOK ) iLastDirection = iNbr; } } break; case 2: // Type 2 ==> Change layer at a via if ( !bHasPinTH && iLastDirection != NBR_X ) { bOK = BacktraceHelper(p, MH, nodeId, MH_LVIA, NBR_X, iLoop); if ( bOK ) iLastDirection = NBR_X; } break; } } } if ( !bOK ) break; } assert(0); // Oh dear. Something went badly wrong !!! return pOut; } void Board::BacktracePaint(Element* const p, int nodeId, bool bAllLyrs, bool bWire) { const bool bPaintNodeId = ( p->GetNodeId() == BAD_NODEID ); // Set NodeId if not set yet. if ( !bPaintNodeId && !p->ReadFlagBits(USERSET) ) return; assert( bPaintNodeId || p->GetNodeId() == nodeId ); // If USERSET then nodeId must be OK if ( bPaintNodeId ) { SetNodeId(p, nodeId, bAllLyrs); WipeFlagBits(p, USERSET, bAllLyrs); } MarkFlagBits(p, AUTOSET, bAllLyrs); if ( bWire ) { WIRELIST wireList; // Helper for chains of wires p->GetWireList(wireList); // Get list of p and its wired points for (const auto& o : wireList) { Element* const pW = const_cast (o.first); if ( pW == p ) continue; // Skip p if ( bPaintNodeId ) { SetNodeId(pW, nodeId, bAllLyrs); WipeFlagBits(pW, USERSET, bAllLyrs); } MarkFlagBits(pW, AUTOSET, bAllLyrs); } } } void Board::BacktraceErase(Element* const p) { assert( !p->GetIsHole() && !p->GetSoicProtected() ); assert( p->GetNodeId() != BAD_NODEID ); Element* const pW0 = m_bHavePlacedWires ? p->GetW(0) : nullptr; Element* const pW1 = m_bHavePlacedWires ? p->GetW(1) : nullptr; const bool bWire = (pW0 || pW1) && p->GetIsBotLyr(); // Constrain wire-routing to bottom layer const bool bAllLyrs = bWire || p->GetHasPinTH(); const bool bWipeNodeId = !p->ReadFlagBits(USERSET); if ( bWipeNodeId ) { SetNodeId(p, BAD_NODEID, bAllLyrs); WipeFlagBits(p, USERSET, bAllLyrs); } WipeFlagBits(p, AUTOSET, bAllLyrs); if ( bWire ) { WIRELIST wireList; // Helper for chains of wires p->GetWireList(wireList); // Get list of p and its wired points for (const auto& o : wireList) { Element* const pW = const_cast (o.first); if ( pW == p ) continue; // Skip p if ( bWipeNodeId ) { SetNodeId(pW, BAD_NODEID, bAllLyrs); WipeFlagBits(pW, USERSET, bAllLyrs); } WipeFlagBits(pW, AUTOSET, bAllLyrs); } } } bool Board::BacktraceHelper(Element*& p, unsigned int& MH, int nodeId, unsigned int iDeltaMH, int iNbr, int iLoop) { Element* const pNbr = p->GetNbr(iNbr); if ( pNbr->GetRouteId() != p->GetRouteId() ) return false; // Skip if nbr has wrong routeId const bool bWire = m_bHavePlacedWires && pNbr->GetIsBotLyr() && pNbr->GetHasWire(); // Constrain wire-routing to bottom layer if ( iLoop == 0 && bWire ) return false; // Skip if nbr is a wire if ( iLoop == 1 && !bWire ) return false; // Skip if nbr is a non-wire if ( p->IsBlocked(iNbr, nodeId) ) return false; // Skip if blocked if ( pNbr->GetMH() != MH - iDeltaMH ) return false; // Skip if wrong MH change p = pNbr; MH -= iDeltaMH; return true; // We backtraced OK, and have modified p and MH } void Board::Manhatten(Element* p, bool bSingleRoute) { const int iTraceNodeId = p->GetNodeId(); // The NodeID to trace if ( iTraceNodeId == BAD_NODEID ) return; // Don't trace invalid NodeID const bool bRouteMinimal = m_bRouteMinimal; // Log m_bRouteMinimal state const bool bRoutingEnabled = GetRoutingEnabled(); // Log routing state SetHavePlacedWires(); // Set up m_bHavePlacedWires so we can skip calls to GetHasWire() here, and in Flood() m_bRouteMinimal = true; SetRoutingEnabled(false); // Don't build tracks m_targetPins.clear(); Element* pFirst = ( p->GetHasPinTH() && !p->GetIsBotLyr() ) ? p->GetNbr(NBR_X) : p; // Use bottom layer for TH pins if ( pFirst ) m_targetPins.push_back(pFirst); // If we haven't specified bSingleRoute, then build additional routes from all true component pins (not wires) for (int i = 0, iSize = ( GetLyrs() == 1 ) ? GetSize() : ( GetSize() / 2 ); i < iSize && !bSingleRoute; i++) // Loop base layer only { Element* const q = GetAt(i); // q is on layer 0 const bool bNonWirePin = q && q->GetHasPin() && !(m_bHavePlacedWires && q->GetHasWire()); // Skip wires if ( !bNonWirePin ) continue; Element* const r = q->GetHasPinTH() ? q : q->GetNbr(NBR_X); assert(r); // r is on layer 0 for TH pins, and layer 1 for SOIC pads if ( r && r->GetNodeId() == iTraceNodeId && r != pFirst ) // Skip first m_targetPins.push_back(r); } Flood(bSingleRoute); SetRoutingEnabled(bRoutingEnabled); // Restore routing state m_bRouteMinimal = bRouteMinimal; // Restore m_bRouteMinimal state // Update m_iConnPin and m_iConnRID. for (int i = 0, iSize = GetSize(); i < iSize && m_iConnPin == -1; i++) { Element* const q = GetAt(i); if ( q->GetMH() != BAD_MH && q->GetHasPin() && !(m_bHavePlacedWires && q->GetHasWire()) ) { m_iConnPin = i; m_iConnRID = q->GetRouteId(); } } } Element* Board::GetConnPin() { return ( m_iConnPin >= 0 && m_iConnPin < GetSize() ) ? GetAt(m_iConnPin) : nullptr; } unsigned int Board::GetConnRID() const { return ( m_iConnPin >= 0 && m_iConnPin < GetSize() ) ? m_iConnRID : BAD_ROUTEID; } void Board::CheckAllComplete() { assert( !GetRoutingEnabled() ); // If routing is enabled, use the "RoutedOK" flags instead of the "Complete" flags. // Calling Route() when routing is not enabled sets the cost info without building new tracks. // So we can use that to set the "Complete" flags Route(true); for (size_t n = 0, nSize = m_nodeInfoMgr.GetSize(); n < nSize; n++) { NodeInfo* const pNodeInfo = m_nodeInfoMgr.GetAt(n); pNodeInfo->SetComplete( pNodeInfo->GetCost() == 0 ); } m_nodeInfoMgr.SortByLowestDifficulty(m_compMgr); } void Board::PasteTracks(bool bTidy) { assert( GetRoutingEnabled() != bTidy ); if ( bTidy ) { SetRoutingEnabled(true); Route(false); // false ==> non minimal routing } size_t iPinIndex; int tmpCompId; // If we are doing a paste (not a tidy) and have a placed trax component, only paste within it then destroy the trax component Component& trax = m_compMgr.GetTrax(); const bool bRestrict = !bTidy && ( trax.GetSize() > 0 && trax.GetIsPlaced() ); const int lyrs = bRestrict ? trax.GetLyr() + 1 : GetLyrs(); const int rows = bRestrict ? trax.GetCompRows() : GetRows(); const int cols = bRestrict ? trax.GetCompCols() : GetCols(); for (int k = bRestrict ? trax.GetLyr() : 0; k < lyrs; k++) for (int j = 0, jRow = bRestrict ? trax.GetRow() : 0; j < rows; j++, jRow++) for (int i = 0, iCol = bRestrict ? trax.GetCol() : 0; i < cols; i++, iCol++) { if ( bRestrict && !trax.GetCompElement(j,i)->ReadFlagBits(RECTSET) ) continue; // Skip points outside grey area Element* const p = Get(k, jRow, iCol); const bool bHasPin = p->GetLyrHasPin(); // Tidy clears all non-pins and wires that are USER_SET ... if ( bTidy && ( !bHasPin || p->GetHasWire() ) && p->ReadFlagBits(USERSET) && !p->ReadFlagBits(AUTOSET|VEROSET) ) { assert( p->GetHasWire() == p->GetHasPinTH() ); // Either we have a wire (and therefore a TH), or we have no TH part SetNodeId(p, BAD_NODEID, p->GetHasPinTH()); // Last argument is "bAllLyrs" so use GetHasPinTH() for (int iSlot = 0; iSlot < 2; iSlot++) { Element* const pW = p->GetW(iSlot); if ( pW ) SetNodeId(pW, BAD_NODEID, pW->GetHasPinTH()); // Last argument is "bAllLyrs" so use GetHasPinTH() } } // Make the point USERSET WipeFlagBits(p, AUTOSET|VEROSET, bHasPin); MarkFlagBits(p, USERSET, bHasPin); // For wires, the "Paste" operation either paints the board at the wire-ends or wipes it. // Fix-up the nodeId info on any wire components ... const int& nodeId = p->GetNodeId(); for (int iSlot = 0; iSlot < 2; iSlot++) { Element* const pW = p->GetW(iSlot); if ( pW == nullptr ) continue; p->GetSlotInfo(iSlot, iPinIndex, tmpCompId); Component& comp = m_compMgr.GetComponentById( tmpCompId ); assert( comp.GetType() != COMP::INVALID ); for (size_t i = 0, iSize = comp.GetNumPins(); i < iSize; i++) { comp.SetNodeId(i, nodeId); for (int lyr = 0; lyr < 2; lyr++) comp.SetOrigId(lyr, i, nodeId); } } } if ( bRestrict ) { m_compMgr.ClearTrax(); m_rectMgr.Clear(); } if ( !bRestrict ) SetRoutingEnabled(false); } void Board::WipeTracks() { FloatAllComps(); // Float all components // If we have a placed trax component, only wipe the board within it then destroy the trax component Component& trax = m_compMgr.GetTrax(); const bool bRestrict = ( trax.GetSize() > 0 && trax.GetIsPlaced() ); const int lyrs = bRestrict ? trax.GetLyr() + 1 : GetLyrs(); const int rows = bRestrict ? trax.GetCompRows() : GetRows(); const int cols = bRestrict ? trax.GetCompCols() : GetCols(); for (int k = bRestrict ? trax.GetLyr() : 0; k < lyrs; k++) for (int j = 0, jRow = bRestrict ? trax.GetRow() : 0; j < rows; j++, jRow++) for (int i = 0, iCol = bRestrict ? trax.GetCol() : 0; i < cols; i++, iCol++) { if ( bRestrict && !trax.GetCompElement(j,i)->ReadFlagBits(RECTSET) ) continue; // Skip points outside grey area Element* const p = Get(k, jRow, iCol); assert( !p->GetHasPin() && !p->GetIsHole() && !p->GetHasComp() ); // Sanity check. Components are floated, so board should have no pins, holes, or components p->FixCorruption(); // As all components are floated, use this as an opportunity to fix any board corruption that may have occurred SetNodeId(p, BAD_NODEID, !bRestrict); WipeFlagBits(p, bRestrict ? (AUTOSET|VEROSET|RECTSET) : (AUTOSET|VEROSET), !bRestrict); MarkFlagBits(p, USERSET, !bRestrict); } if ( bRestrict ) { m_compMgr.ClearTrax(); m_rectMgr.Clear(); } if ( !bRestrict ) SetRoutingEnabled(false); PlaceFloaters(); // Unfloat components } VeroRoute/libraries/gEDA/veroroute_transistor/Darlington_NPN_TIP102.sym000644 001750 001750 00000002552 13515171161 026304 0ustar00alexalex000000 000000 v 20130925 2 T 0 900 5 10 0 0 0 0 1 numslots=0 P 0 900 300 900 1 0 0 { T 100 1000 5 8 1 1 0 0 1 pinnumber=1 T 100 1000 5 8 0 0 0 0 1 pinseq=1 T 100 1000 5 8 0 0 0 0 1 pinlabel=1 T 100 1000 5 8 0 0 0 0 1 pintype=pas } P 1000 1700 1000 1400 1 0 0 { T 1100 1400 5 8 1 1 0 0 1 pinnumber=2 T 1100 1400 5 8 0 0 0 0 1 pinseq=2 T 1100 1400 5 8 0 0 0 0 1 pinlabel=2 T 1100 1400 5 8 0 0 0 0 1 pintype=pas } P 1000 0 1000 300 1 0 0 { T 1100 200 5 8 1 1 0 0 1 pinnumber=3 T 1100 200 5 8 0 0 0 0 1 pinseq=3 T 1100 200 5 8 0 0 0 0 1 pinlabel=3 T 1100 200 5 8 0 0 0 0 1 pintype=pas } L 500 1100 500 700 3 0 0 0 -1 -1 L 500 1000 700 1100 3 0 0 0 -1 -1 L 500 800 700 700 3 0 0 0 -1 -1 L 500 900 300 900 3 0 0 0 -1 -1 L 800 900 800 500 3 0 0 0 -1 -1 L 800 800 1000 900 3 0 0 0 -1 -1 L 800 600 1000 500 3 0 0 0 -1 -1 L 1000 900 1000 1200 3 0 0 0 -1 -1 L 1000 1200 700 1200 3 0 0 0 -1 -1 L 700 1100 700 1200 3 0 0 0 -1 -1 L 1000 500 1000 300 3 0 0 0 -1 -1 L 700 700 800 700 3 0 0 0 -1 -1 L 1000 1200 1000 1400 3 0 0 0 -1 -1 V 800 900 500 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 903,509 L 1001,500 L 931,573 L 925,540 z H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 603,709 L 701,700 L 631,773 L 625,740 z T 1400 900 5 10 1 1 0 0 1 device=TIP102 T 1400 670 8 10 1 1 0 0 1 refdes=Q? T 1400 400 8 10 0 0 0 0 1 footprint=TO220 T 1400 400 8 10 0 0 0 0 1 description=NPN Darlington Transistor VeroRoute/Src/SimplexFont.h000644 001750 001750 00000004160 14377670762 016130 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include "Common.h" struct Simplex { public: static int GetLetterIndex(char c) { const int index = ( c - ' ' ); return ( index >= 0 && index < 95 ) ? index : -1; // -1 ==> unsupported character } static int GetLetterData(int i, int j) { return ( i < 95 && j < 112 ) ? sm_data[static_cast(i)][static_cast(j)] : -1; } static void CalcXlimits(int i, std::pair& o) { if ( i == 0 ) { o.first = 0; o.second = 5; return; } // ' ' character o.first = INT_MAX; o.second = INT_MIN; const int jEnd = 2 + 2 * GetLetterData(i, 0); for (int j = 2; j < jEnd; j += 2) // Loop x,y pairs { const int ix = GetLetterData(i, j); // Read x const int iy = GetLetterData(i, j+1); // Read y if ( ix == -1 && iy == -1 ) continue; o.first = std::min(o.first, ix); o.second = std::max(o.second, ix); } } static const std::pair& GetXlimits(int i) { if ( sm_xLimits.empty() ) // If cache is empty ... { sm_xLimits.resize(95); // ... build it for (int ii = 0; ii < 95; ii++) CalcXlimits(ii, sm_xLimits[static_cast(ii)]); } return sm_xLimits[static_cast(i)]; // Read cache } private: static std::vector< std::vector > sm_data; // Data for ASCII characters 32 to 126 inclusive static std::vector< std::pair > sm_xLimits; // A cache of the min/max X values for each letter }; VeroRoute/libraries/gEDA/veroroute_passive/Capacitor_Electrolytic_500mil.sym000644 001750 001750 00000001420 13515171161 027501 0ustar00alexalex000000 000000 v 20130925 2 T 200 700 5 10 0 0 0 0 1 numslots=0 P 200 700 400 700 1 0 0 { T 350 750 5 8 1 1 0 6 1 pinnumber=1 T 350 750 5 8 0 0 0 6 1 pinseq=1 T 350 750 5 8 0 0 0 6 1 pinlabel=1 T 350 750 5 8 0 0 0 6 1 pintype=pas } P 1100 700 900 700 1 0 0 { T 950 750 5 8 1 1 0 0 1 pinnumber=2 T 950 750 5 8 0 0 0 0 1 pinseq=2 T 950 750 5 8 0 0 0 0 1 pinlabel=2 T 950 750 5 8 0 0 0 0 1 pintype=pas } L 600 900 600 500 3 0 0 0 -1 -1 L 900 700 700 700 3 0 0 0 -1 -1 L 600 700 400 700 3 0 0 0 -1 -1 A 1400 700 700 165 30 3 0 0 0 -1 -1 L 489 900 489 800 3 0 0 0 -1 -1 L 540 849 440 849 3 0 0 0 -1 -1 T 500 300 5 10 1 1 0 0 1 device=5u6 T 500 1000 8 10 1 1 0 0 1 refdes=C? T 500 700 8 10 0 0 0 0 1 footprint=CAP_ELECTRO_500 T 500 700 8 10 0 0 0 0 1 description=Electrolytic Capacitor (500 mil diameter) VeroRoute/libraries/gEDA/veroroute_transistor/PNP_BC307.sym000644 001750 001750 00000001562 13515171161 023764 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=1 T 400 850 5 6 0 0 0 0 1 pinseq=1 T 400 850 5 6 0 0 0 0 1 pinlabel=1 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=3 T 400 50 5 6 0 0 0 0 1 pinseq=3 T 400 50 5 6 0 0 0 0 1 pinlabel=3 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 297,341 L 199,350 L 269,277 L 275,310 z T 600 700 5 10 1 1 0 0 1 device=BC307 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=PNP Transistor VeroRoute/libraries/gEDA/veroroute_transistor/NPN_TIP31.sym000644 001750 001750 00000001563 13515171161 024045 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=1 T 100 550 5 6 0 0 0 0 1 pinseq=1 T 100 550 5 6 0 0 0 0 1 pinlabel=1 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=2 T 400 850 5 6 0 0 0 0 1 pinseq=2 T 400 850 5 6 0 0 0 0 1 pinlabel=2 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=3 T 400 50 5 6 0 0 0 0 1 pinseq=3 T 400 50 5 6 0 0 0 0 1 pinlabel=3 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 403,209 L 501,200 L 431,273 L 425,240 z T 600 700 5 10 1 1 0 0 1 device=TIP31 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO220 T 600 400 8 10 0 0 0 0 1 description=NPN Transistor VeroRoute/libraries/gEDA/veroroute_transistor/NPN_BC184.sym000644 001750 001750 00000001562 13515171161 023765 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=1 T 400 850 5 6 0 0 0 0 1 pinseq=1 T 400 850 5 6 0 0 0 0 1 pinlabel=1 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=3 T 400 50 5 6 0 0 0 0 1 pinseq=3 T 400 50 5 6 0 0 0 0 1 pinlabel=3 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 403,209 L 501,200 L 431,273 L 425,240 z T 600 700 5 10 1 1 0 0 1 device=BC184 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=NPN Transistor VeroRoute/tutorials/tutorial_2.vrt000644 001750 001750 00000147312 14433261262 017616 0ustar00alexalex000000 000000 9 іTUTORIAL 2 - DOCKED DIALOGS The major dialogs in VeroRoute appear in fixed (docked) locations on the left and right. When one of these dialogs is opened and docks in its area, it will close and replace any dialog that was previously docked in that area. You can open and close docked dialogs using the Windows menu item. The most commonly used dialogs can also be opened and closed with toolbar buttons. Some dialogs (e.g. Wire Options, Bill Of Materials) do not dock and must be closed manually. 2 dialogs dock on the left: * Info Dialog This is the dialog you are currently reading. If you are not in tutorial mode, you can use the dialog to write information about your layout. * Pin Labels Editor This cannot be displayed in tutorial mode as it would hide the Info dialog. 4 dialogs dock on the right: * Control Dialog This is the main dialog in Circuit Layout Mode. * Component Definition Dialog. This is the main dialog in Component Editor Mode. * Parts Library Dialog Doubling clicking on the parts in the dialog adds them to the layout. * Rendering Options Dialog This is where you set the dimensions of PCB traces. To show the Parts Library Dialog, select "Windows -> Parts Library" or press the toolbar button with a picture of an IC. Try that now. Then press the button a second time to close the dialog and restore the main dialog for the mode of operation you are in. The Rendering Options Dialog is only available in Circuit Layout Mode. To show the dialog, select "Windows -> Rendering Options" or press the mil  toolbar button. Try that now. Then press the button a second time to go back to displaying the Control Dialog.џџџџџџџџџџџP$." 2< џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@)џџџџџ@2џџџџџ@3џџџџџ@4џџџџџџpџџџџџџџџџџСџџџџџџџџџџ pџџџџџџџџџџ Сџџџџџџџџџ@Eџџџџџџ @џџџџџџџџџџpџџџџџџџџџџСџџџџџџџџџ@Eџџџџџ@5џџџџџ@6џџџџџ@7џџџџџџpџџџџџџџџџС8џџџџџ!@9џџџџџ@:џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџџџџџGџџџџџџ |џџџџџџџџџџ ЧџџџџџџџџџџDџџџџџџџџџџ Dџџџџџџџџџџ|џџџџџџџџџџЧџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџ\Gџџџџџџ‡џџџџџџџџџ!+џџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDAџџџџџџ @џџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџ @џџџџџџџџџџ @џџџџџџџџџџ |џџџџџџџџџџ ЧџџџџџџџџџDAџџџџџџ Dџџџџџџџџџџ|џџџџџџџџџџЧџџџџџџџџџDFџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџLџџџџџџџџџpFџџџџџџСџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџџџџ DџџџџџџDџџџџџџџџџDџџџџџџ Dџџџџџџџџџ D$џџџџџџ |џџџџџџџџџ Ч$џџџџџD џџџџџ D&џџџџџџ|џџџџџџџџџЧ&џџџџџDџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџ|џџџџџЧџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ фџџџџџџџџџџџџџџџџџџџџџџџџ Dџџџџџ D%џџџџџџ |џџџџџџџџџ ч%џџџџџџџџџџџџџџџ D'џџџџџџ|џџџџџџџџџч'џџџџџџџџџџџџџџџџDџџџџџџџџџ"џџџџџџDџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ#џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ xџџџџџџџџџџ ѕџџџџџџџџџ ѓџџџџџ Сџџџџџ Dџџџџџ Dџџџџџ |џџџџџ їџџџџџџ Уџџџџџџџџџ Dџџџџџ| џџџџџїџџџџџџУџџџџџџџџџџDџџџџџџџџџџ@џџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџ@џџџџџџџџџџpџџџџџџџџџџСџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ |џџџџџџ пџџџџџџџџџџ Ÿџџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ џџџџџџџџџџ ?џџџџџџџџџ G џџџџџџ џџџџџџџџџџџџџџџџџџџџ?џџџџџџџџџGџџџџџџDџџџџџџџџџD"џџџџџџDџџџџџџџџџџDџџџџџџџџџdџџџџџ<џџџџџG#џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ <џџџџџџџџџџ OџџџџџџџџџџpџџџџџџџџџСџџџџџџpџџџџџџџџџёџџџџџџёџџџџџџџџџСџџџџџџ FџџџџџџџџџpџџџџџџёџџџџџџџџџСџџџџџџFџџџџџџџџџџDџџџџџџџџџHџџџџџџDџџџџџџџџџџDџџџџџџџџџtHџџџџџџУџџџџџџџџџџFџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџџџџџџ fџџџџџџџџџ<џџџџџџGџџџџџџџџџ<џџџџџџ_џџџџџџџџџПџџџџџџGџџџџџџџџџџ Dџџџџџџџџџџ\џџџџџџџџџП џџџџџџGџџџџџџџџџDIџџџџџџDџџџџџџџџџ@IџџџџџџDџџџџџџџџџџDџџџџџџџџџџ<џџџџџџџџџџGџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџd*џџџџџџ 4џџџџџџџџџ  C,џџџџџ F,џџџџџ @,џџџџџџNџџџџџџџџџ @-џџџџџ F-џџџџџ  D-џџџџџџLџџџџџџџџџ @.џџџџџ F.џџџџџ D.џџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџ @/џџџџџ F/џџџџџ D/џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџtџџџџџУџџџџџџ џџџџџџџџџФџџџџџDџџџџџџDџџџџџџџџџD џџџџџDџџџџџџ DџџџџџџџџџD џџџџџDџџџџџD џџџџџџџџџџџФџџџџџџџџџ џџџџџФџџџџџџdџџџџџџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ|џџџџџџџџџџЧџџџџџџџџџxџџџџџџХџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџ DџџџџџџDџџџџџџџџџџDџџџџџџџџџџDџџџџџџџџџџxџџџџџџџџџХ!џџџџџџxџџџџџџџџџџХџџџџџџџџџџtџџџџџџџџџџѓџџџџџџџџџџСџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ\џџџџџџџџџџ‡џџџџџџџџџ џџџџџџџџџџџџџџџџќџџџџџџџџџџџџџџџџџџџџџЧџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@џџџџџpџџџџџСџџџџџpџџџџџёџџџџџџёџџџџџџџџџё џџџџџСџџџџџpџџџџџС џџџџџpџџџџџС џџџџџLџџџџџp!џџџџџџёџџџџџџџџџљџџџџџџ§џџџџџџџџџџџџџџџЧџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџBџџџџџџџџџџџџџџџџџџџџџџџџџBџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџCџџџџџџџџџџџџџџџџџџџџџџџџџCџџџџџDџџџџџџџџџџџџџџџDџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ(џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџBd9 Pad12Vol2PadPadPADџџџфNF(!1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R212k7RResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d(Pad1GndPadPadPADWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпd*Pad3InPadPadPAD џџџ№WF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R61kRResistorRESISTORWF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d8 Pad11Vol1PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџ%D2 1N4148D Diode DIODEWF( 1 2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џfD?у333332?у333332Пй™™™™™š?й™™™™™š@V€џfD?фЬЬЬЬЬЬ?фЬЬЬЬЬЬПй™™™™™š?й™™™™™š@V€џfD?ѕ™™™™™™?ѕ™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џfDџџ,R139kRResistorRESISTOR SF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   L,Q1 2N5088QTO92TO92 EF(12 3Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џџ,R8100kRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ, R1210kRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џ&D3 1N4148D Diode DIODE EF(1 2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џfD?у333332?у333332Пй™™™™™š?й™™™™™š@V€џfD?фЬЬЬЬЬЬ?фЬЬЬЬЬЬПй™™™™™š?й™™™™™š@V€џfD?ѕ™™™™™™?ѕ™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џfDџџ,R512kRResistorRESISTORNF(1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d)Pad2+9VPadPadPADџџџьWF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R221MRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ, R14470kRResistorRESISTOR SF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d2Pad5Sustain1PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R9470kRResistorRESISTOR NF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§   L-Q2 2N5088QTO92TO92 WF(12 3Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џџШC Wire3 Wire3WireWire WF(12Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџџєC8500pCCeramicCAP_CERAMICNF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ P   L/Q4 2N5088QTO92TO92 WF(123Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џџ, R11390RRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєC5500pCCeramicCAP_CERAMIC NF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,R16390RRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєC10.1uCCeramicCAP_CERAMICSF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,R19100kRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџ, R13100kRResistorRESISTOR SF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џ$D1 1N4148D Diode DIODEEF( 1 2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џfD?у333332?у333332Пй™™™™™š?й™™™™™š@V€џfD?фЬЬЬЬЬЬ?фЬЬЬЬЬЬПй™™™™™š?й™™™™™š@V€џfD?ѕ™™™™™™?ѕ™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џfDd5Pad8 Tone1PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R1720kRResistorRESISTOR SF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџџџШF Wire6 Wire6WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџє!C1110nCCeramicCAP_CERAMICSF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,R18470kRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џє"C120.1uCCeramicCAP_CERAMICNF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ P џџџџџџџџџџШG Wire7 Wire7WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџd: Pad13Vol3PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R2100kRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џџШH Wire8 Wire8WireWire WF(12Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџџє#C130.1uCCeramicCAP_CERAMICNF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PџШI Wire9 Wire9WireWire WF(12П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџџџ,R3390RRResistorRESISTOR NF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џ'D4 1N4148D Diode DIODE WF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џfD?у333332?у333332Пй™™™™™š?й™™™™™š@V€џfD?фЬЬЬЬЬЬ?фЬЬЬЬЬЬПй™™™™™š?й™™™™™š@V€џfD?ѕ™™™™™™?ѕ™™™™™™Пй™™™™™š?й™™™™™š@V€џfDПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џfDџџ,R2010kRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џє C103n9CCeramicCAP_CERAMIC SF(12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PџџџШE Wire5 Wire5WireWire WF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџєC2500pCCeramicCAP_CERAMICNF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pd7 Pad10 Tone3PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпd6Pad9 Tone2PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R4470kRResistorRESISTORNF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєC30.1uCCeramicCAP_CERAMICWF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pџџ,R2322kRResistorRESISTOR SF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d+Pad4OutPadPadPAD$WF(!1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџџ,R710kRResistorRESISTORNF( 12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєC647nCCeramicCAP_CERAMICNF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ P џџџџџџџШA Wire1 Wire1WireWireWF(12Р@ПЙ™™™™™š?Й™™™™™š@V€пџџР@ПЙ™™™™™š?Й™™™™™š@V€пџџџџШB Wire2 Wire2WireWireWF(12Пј?јПЙ™™™™™š?Й™™™™™š@V€пџџПј?јПЙ™™™™™š?Й™™™™™š@V€пџџџєC70.1uCCeramicCAP_CERAMIC NF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ P   L.Q3 2N5088QTO92TO92 WF(123Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   Піffffff?іffffffПфЬЬЬЬЬЭ?ђffffffР4@i   џџ, R1012kRResistorRESISTOR NF(1 2ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§џєC947nCCeramicCAP_CERAMIC NF( 12Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PџШD Wire4 Wire4WireWireWF(12П№?№ПЙ™™™™™š?Й™™™™™š@V€пџџП№?№ПЙ™™™™™š?Й™™™™™š@V€пџџџџ,R1512kRResistorRESISTORNF(12ПђсGЎzс?ђсGЎzсПдzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@V€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@V€‚Я§ПђсGЎzс?ђсGЎzсПдzсGЎ{ПдzсGЎ{@V€‚Я§ПђсGЎzс?ђсGЎzс?дzсGЎ{?дzсGЎ{@V€‚Я§П§ИQы…П№Qы…ИRПй™™™™™š?й™™™™™™@J€РJ€‚Я§?№Qы…ИR?§ИQы…Пй™™™™™š?й™™™™™™@m @_Р‚Я§d3Pad6Sustain2PadPadPADSF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпџєC40.1uCCeramicCAP_CERAMICWF(1 2Піffffff?іffffffПй™™™™™š?й™™™™™š@V€џ PПіffffff?іffffffПй™™™™™š?й™™™™™š@V€џ Pd4Pad7Sustain3PadPadPADџџџфNF(1ПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпПмЬЬЬЬЬЭ?мЬЬЬЬЬЭПмЬЬЬЬЬЭ?мЬЬЬЬЬЭ@V€џџпB@џџџўINVALID TracksWF(џџџ€џџџ€џџџ€џџџ€џџџџџџџџF#џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ џ Р@Р@@V€џVeroRoute/libraries/gEDA/veroroute_transistor/JFET_Nchannel_2SK30.sym000644 001750 001750 00000001550 13515171161 025706 0ustar00alexalex000000 000000 v 20130925 2 T 100 500 5 10 0 0 0 0 1 numslots=0 P 100 500 400 500 1 0 0 { T 100 350 5 6 1 1 0 0 1 pinnumber=2 T 100 350 5 6 0 0 0 0 1 pinseq=2 T 100 350 5 6 0 0 0 0 1 pinlabel=2 T 100 350 5 6 0 0 0 0 1 pintype=pas } P 600 1000 600 800 1 0 0 { T 500 850 5 6 1 1 0 0 1 pinnumber=3 T 500 850 5 6 0 0 0 0 1 pinseq=3 T 500 850 5 6 0 0 0 0 1 pinlabel=3 T 500 850 5 6 0 0 0 0 1 pintype=pas } P 600 200 600 0 1 0 1 { T 500 50 5 6 1 1 0 0 1 pinnumber=1 T 500 50 5 6 0 0 0 0 1 pinseq=1 T 500 250 5 6 1 1 0 0 1 pinlabel=S T 500 50 5 6 0 0 0 0 1 pintype=pas } L 400 800 600 800 3 0 0 0 -1 -1 L 400 200 600 200 3 0 0 0 -1 -1 L 400 900 400 100 3 0 0 0 -1 -1 L 300 600 400 500 3 0 0 0 -1 -1 L 400 500 300 400 3 0 0 0 -1 -1 T 700 700 5 10 1 1 0 0 1 device=2SK30 T 700 400 8 10 1 1 0 0 1 refdes=Q? T 595 95 8 10 0 0 0 0 1 footprint=TO92 T 595 95 8 10 0 0 0 0 1 description=N-Channel JFET VeroRoute/libraries/gEDA/veroroute_passive/Capacitor_Film_200.sym000644 001750 001750 00000001270 13515171161 025224 0ustar00alexalex000000 000000 v 20130925 2 T 200 700 5 10 0 0 0 0 1 numslots=0 P 200 700 400 700 1 0 0 { T 350 750 5 8 1 1 0 6 1 pinnumber=1 T 350 750 5 8 0 0 0 6 1 pinseq=1 T 350 750 5 8 0 0 0 6 1 pinlabel=1 T 350 750 5 8 0 0 0 6 1 pintype=pas } P 1100 700 900 700 1 0 0 { T 950 750 5 8 1 1 0 0 1 pinnumber=2 T 950 750 5 8 0 0 0 0 1 pinseq=2 T 950 750 5 8 0 0 0 0 1 pinlabel=2 T 950 750 5 8 0 0 0 0 1 pintype=pas } L 600 900 600 500 3 0 0 0 -1 -1 L 900 700 700 700 3 0 0 0 -1 -1 L 600 700 400 700 3 0 0 0 -1 -1 L 700 900 700 500 3 0 0 0 -1 -1 T 500 300 5 10 1 1 0 0 1 device=82n T 500 1000 8 10 1 1 0 0 1 refdes=C? T 0 100 8 10 0 0 0 0 1 footprint=CAP_FILM2 T 0 100 8 10 0 0 0 0 1 description=Film Capacitor (200 mil length) VeroRoute/tutorials/000755 001750 001750 00000000000 14561471461 014773 5ustar00alexalex000000 000000 VeroRoute/Src/Rect.h000644 001750 001750 00000007075 14211732107 014540 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include "Persist.h" class Rect : public Persist, public Merge { public: Rect() {} Rect(int rowMin, int rowMax, int colMin, int colMax) : m_rowMin(rowMin), m_rowMax(rowMax), m_colMin(colMin), m_colMax(colMax) {} virtual ~Rect() {} Rect(const Rect& o) { *this = o; } Rect& operator=(const Rect& o) { m_rowMin = o.m_rowMin; m_rowMax = o.m_rowMax; m_colMin = o.m_colMin; m_colMax = o.m_colMax; return *this; } bool operator==(const Rect& o) const { return m_rowMin == o.m_rowMin && m_rowMax == o.m_rowMax && m_colMin == o.m_colMin && m_colMax == o.m_colMax; } bool operator!=(const Rect& o) const { return !(*this == o); } bool operator<(const Rect& o) const { return GetArea() > o.GetArea(); } // Bigger area is prefered Rect& operator|=(const Rect& o) { if ( !o.GetIsValid() ) return *this; m_colMin = std::min(m_colMin, o.m_colMin); m_colMax = std::max(m_colMax, o.m_colMax); m_rowMin = std::min(m_rowMin, o.m_rowMin); m_rowMax = std::max(m_rowMax, o.m_rowMax); return *this; } Rect operator|(const Rect& o) { Rect out(*this); out |= o; return out; } void SetInvalid() { m_rowMin = m_colMin = INT_MAX; m_rowMax = m_colMax = INT_MIN; } bool GetIsValid() const { return m_rowMin <= m_rowMax && m_colMin <= m_colMax ; } int GetRows() const { return GetIsValid() ? 1 + m_rowMax - m_rowMin : 0; } int GetCols() const { return GetIsValid() ? 1 + m_colMax - m_colMin : 0; } int GetArea() const { return GetRows() * GetCols(); } bool ContainsPoint(int row, int col) const { return GetIsValid() ? row >= m_rowMin && row <= m_rowMax && col >= m_colMin && col <= m_colMax : false; } bool Overlaps(const Rect& o) const { if ( m_rowMin > o.m_rowMax ) return false; if ( m_rowMax < o.m_rowMin ) return false; if ( m_colMin > o.m_colMax ) return false; if ( m_colMax < o.m_colMin ) return false; return true; } void Move(int iDown, int iRight) { if ( !GetIsValid() ) return; m_rowMin += iDown; m_rowMax += iDown; m_colMin += iRight; m_colMax += iRight; } // Merge interface functions virtual void UpdateMergeOffsets(MergeOffsets& o) override { o.deltaRow = std::max(o.deltaRow, m_rowMax + 1); //o.deltaCol = std::max(o.deltaCol, m_colMax + 1); } virtual void ApplyMergeOffsets(const MergeOffsets& o) override { m_rowMin += o.deltaRow; m_rowMax += o.deltaRow; m_colMin += o.deltaCol; m_colMax += o.deltaCol; } // Persist interface functions virtual void Load(DataStream& inStream) override { inStream.Load(m_rowMin); inStream.Load(m_rowMax); inStream.Load(m_colMin); inStream.Load(m_colMax); } virtual void Save(DataStream& outStream) override { outStream.Save(m_rowMin); outStream.Save(m_rowMax); outStream.Save(m_colMin); outStream.Save(m_colMax); } int m_rowMin = INT_MAX, m_rowMax = INT_MIN, m_colMin = INT_MAX, m_colMax = INT_MIN; }; VeroRoute/Src/images/undo.png000644 001750 001750 00000000664 13661712157 016422 0ustar00alexalex000000 000000 ‰PNG  IHDR szzєbKGDџџџ НЇ“ pHYsФФ•+tIMEу (#иZlAIDATXУн–MŠТ@…_ НЫi\h@цž`мЙ№т \ИKNр „€ШЬB˜ѕ\Уu\HkŒ§SiЊ3бHозЏ*]Mhi>9СЅ§їв"ŽБбєsQ›ћХц‡$ЧмЭЮ€ЂЬФP]Œ›Ъзукї.7!В­оgЬ•I)ЂЄюпИ&хQвЦ>хыqТиU–6„:rв%№œЦc Ў@ mˆ‡&ь Є AОШеœЁˆ ^”™#ђ%bышљф„еr…ЂЛБХgј§;!Š2u™†œЉhоч@XKbфњєж{pњчЕЈЊъvuеvЗ?й Э3­ѕ0{ ІўV€Pм1хHž@ьъ‡љ„šlАM(  Е~ZЉэ™ФS}ЦДБ)єŠšПdѓхвџTЇvУaъIENDЎB`‚VeroRoute/Src/compdialog.h000644 001750 001750 00000003041 14217136367 015762 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include class MainWindow; class Ui_CompDialog; class CompDialog : public QWidget { Q_OBJECT public: explicit CompDialog(QWidget* parent = nullptr); ~CompDialog(); void SetMainWindow(MainWindow* p); void Update(); void EnableControls(); bool GetUpdatingControls() const { return m_bUpdatingControls; } protected: bool eventFilter(QObject* object, QEvent* event); void wheelEvent(QWheelEvent* event); void mousePressEvent(QMouseEvent* event); void mouseDoubleClickEvent(QMouseEvent* event); void mouseMoveEvent(QMouseEvent* event); void mouseReleaseEvent(QMouseEvent* event); void keyPressEvent(QKeyEvent* event); void keyReleaseEvent(QKeyEvent* event); private: Ui_CompDialog* ui; MainWindow* m_pMainWindow; bool m_bUpdatingControls = false; }; VeroRoute/Src/images/verov.png000644 001750 001750 00000000404 13661712157 016606 0ustar00alexalex000000 000000 ‰PNG  IHDR szzєbKGD…ЌJ1J pHYsФФ•+tIMEуzп›Й‘IDATXУc 7;џŸLАтЄ#C„љВЭ`b`0И0џ€:Х2ƒ…&;бс&йу3ƒ‰X“Є˜1Ив!_ ЄšтBёLL: еŒС— qљ€”\@Š,јЮ? Nrі#е &Jуœв41ZŒ:`дЃ ’бЩhƒdДA2к m И)НfЃAд"IENDЎB`‚VeroRoute/Src/padoffsetdialog.cpp000644 001750 001750 00000004773 14215061472 017337 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #include "padoffsetdialog.h" #include "ui_padoffsetdialog.h" #include "mainwindow.h" PadOffsetDialog::PadOffsetDialog(MainWindow* parent) : QDialog(parent) , ui(new Ui_PadOffsetDialog) , m_pMainWindow(parent) { ui->setupUi(this); QFont font = ui->textL->font(); font.setFamily(QString("Arial Unicode MS")); font.setPointSize(12); ui->textL->setFont(font); ui->textR->setFont(font); ui->textT->setFont(font); ui->textB->setFont(font); // Unicode triangles ... ui->textL->setText(QChar(0x25c0)); ui->textR->setText(QChar(0x25b6)); ui->textT->setText(QChar(0x25b2)); ui->textB->setText(QChar(0x25bc)); QObject::connect(ui->textC, SIGNAL(clicked()), m_pMainWindow, SLOT(PadCentre())); QObject::connect(ui->textL, SIGNAL(clicked()), m_pMainWindow, SLOT(PadMoveL())); QObject::connect(ui->textR, SIGNAL(clicked()), m_pMainWindow, SLOT(PadMoveR())); QObject::connect(ui->textT, SIGNAL(clicked()), m_pMainWindow, SLOT(PadMoveT())); QObject::connect(ui->textB, SIGNAL(clicked()), m_pMainWindow, SLOT(PadMoveB())); QObject::connect(this, SIGNAL(rejected()), this, SLOT(OnCloseX())); // Close using X button } PadOffsetDialog::~PadOffsetDialog() { delete ui; } void PadOffsetDialog::OnCloseX() { m_pMainWindow->HidePadOffsetDialog(true); // true ==> force } void PadOffsetDialog::keyPressEvent(QKeyEvent* event) { #ifndef VEROROUTE_ANDROID m_pMainWindow->specialKeyPressEvent(event); #endif QDialog::keyPressEvent(event); event->accept(); } void PadOffsetDialog::keyReleaseEvent(QKeyEvent* event) { #ifdef VEROROUTE_ANDROID if ( event->key() == Qt::Key_Back ) { QTimer::singleShot(0, this, SLOT(OnCloseX())); return event->accept(); } #else m_pMainWindow->commonKeyReleaseEvent(event); #endif QDialog::keyReleaseEvent(event); event->accept(); } VeroRoute/Src/SimplexFont.cpp000644 001750 001750 00000022746 14402315210 016442 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #include "SimplexFont.h" // Simplex vector font. Covers ASCII characters 32 to 126 inclusive // See http://paulbourke.net/dataformats/hershey/ // First value is number of "points" and second is nominal width std::vector< std::vector > Simplex::sm_data = { std::vector {0,16}, std::vector {8,10,5,21,5,7,-1,-1,5,2,4,1,5,0,6,1,5,2}, std::vector {5,16,4,21,4,14,-1,-1,12,21,12,14}, std::vector {11,21,11,25,4,-7,-1,-1,17,25,10,-7,-1,-1,4,12,18,12,-1,-1,3,6,17,6}, std::vector {26,20,8,25,8,-4,-1,-1,12,25,12,-4,-1,-1,17,18,15,20,12,21,8,21,5,20,3,18,3,16,4,14,5,13,7,12,13,10,15,9,16,8,17,6,17,3,15,1,12,0,8,0,5,1,3,3}, std::vector {31,24,21,21,3,0,-1,-1,8,21,10,19,10,17,9,15,7,14,5,14,3,16,3,18,4,20,6,21,8,21,10,20,13,19,16,19,19,20,21,21,-1,-1,17,7,15,6,14,4,14,2,16,0,18,0,20,1,21,3,21,5,19,7,17,7}, std::vector {34,26,23,12,23,13,22,14,21,14,20,13,19,11,17,6,15,3,13,1,11,0,7,0,5,1,4,2,3,4,3,6,4,8,5,9,12,13,13,14,14,16,14,18,13,20,11,21,9,20,8,18,8,16,9,13,11,10,16,3,18,1,20,0,22,0,23,1,23,2}, std::vector {7,10,5,19,4,20,5,21,6,20,6,18,5,16,4,15}, std::vector {10,14,11,25,9,23,7,20,5,16,4,11,4,7,5,2,7,-2,9,-5,11,-7}, std::vector {10,14,3,25,5,23,7,20,9,16,10,11,10,7,9,2,7,-2,5,-5,3,-7}, std::vector {8,16,8,21,8,9,-1,-1,3,18,13,12,-1,-1,13,18,3,12}, std::vector {5,26,13,18,13,0,-1,-1,4,9,22,9}, std::vector {8,10,6,1,5,0,4,1,5,2,6,1,6,-1,5,-3,4,-4}, std::vector {2,26,4,9,22,9}, std::vector {5,10,5,2,4,1,5,0,6,1,5,2}, std::vector {2,22,20,25,2,-7}, std::vector {17,20,9,21,6,20,4,17,3,12,3,9,4,4,6,1,9,0,11,0,14,1,16,4,17,9,17,12,16,17,14,20,11,21,9,21}, std::vector {4,20,6,17,8,18,11,21,11,0}, std::vector {14,20,4,16,4,17,5,19,6,20,8,21,12,21,14,20,15,19,16,17,16,15,15,13,13,10,3,0,17,0}, std::vector {15,20,5,21,16,21,10,13,13,13,15,12,16,11,17,8,17,6,16,3,14,1,11,0,8,0,5,1,4,2,3,4}, std::vector {6,20,13,21,3,7,18,7,-1,-1,13,21,13,0}, std::vector {17,20,15,21,5,21,4,12,5,13,8,14,11,14,14,13,16,11,17,8,17,6,16,3,14,1,11,0,8,0,5,1,4,2,3,4}, std::vector {23,20,16,18,15,20,12,21,10,21,7,20,5,17,4,12,4,7,5,3,7,1,10,0,11,0,14,1,16,3,17,6,17,7,16,10,14,12,11,13,10,13,7,12,5,10,4,7}, std::vector {5,20,17,21,7,0,-1,-1,3,21,17,21}, std::vector {29,20,8,21,5,20,4,18,4,16,5,14,7,13,11,12,14,11,16,9,17,7,17,4,16,2,15,1,12,0,8,0,5,1,4,2,3,4,3,7,4,9,6,11,9,12,13,13,15,14,16,16,16,18,15,20,12,21,8,21}, std::vector {23,20,16,14,15,11,13,9,10,8,9,8,6,9,4,11,3,14,3,15,4,18,6,20,9,21,10,21,13,20,15,18,16,14,16,9,15,4,13,1,10,0,8,0,5,1,4,3}, std::vector {11,10,5,14,4,13,5,12,6,13,5,14,-1,-1,5,2,4,1,5,0,6,1,5,2}, std::vector {14,10,5,14,4,13,5,12,6,13,5,14,-1,-1,6,1,5,0,4,1,5,2,6,1,6,-1,5,-3,4,-4}, std::vector {3,24,20,18,4,9,20,0}, std::vector {5,26,4,12,22,12,-1,-1,4,6,22,6}, std::vector {3,24,4,18,20,9,4,0}, std::vector {20,18,3,16,3,17,4,19,5,20,7,21,11,21,13,20,14,19,15,17,15,15,14,13,13,12,9,10,9,7,-1,-1,9,2,8,1,9,0,10,1,9,2}, std::vector {55,27,18,13,17,15,15,16,12,16,10,15,9,14,8,11,8,8,9,6,11,5,14,5,16,6,17,8,-1,-1,12,16,10,14,9,11,9,8,10,6,11,5,-1,-1,18,16,17,8,17,6,19,5,21,5,23,7,24,10,24,12,23,15,22,17,20,19,18,20,15,21,12,21,9,20,7,19,5,17,4,15,3,12,3,9,4,6,5,4,7,2,9,1,12,0,15,0,18,1,20,2,21,3,-1,-1,19,16,18,8,18,6,19,5}, std::vector {8,18,9,21,1,0,-1,-1,9,21,17,0,-1,-1,4,7,14,7}, std::vector {23,21,4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,15,17,13,16,12,13,11,-1,-1,4,11,13,11,16,10,17,9,18,7,18,4,17,2,16,1,13,0,4,0}, std::vector {18,21,18,16,17,18,15,20,13,21,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5}, std::vector {15,21,4,21,4,0,-1,-1,4,21,11,21,14,20,16,18,17,16,18,13,18,8,17,5,16,3,14,1,11,0,4,0}, std::vector {11,19,4,21,4,0,-1,-1,4,21,17,21,-1,-1,4,11,12,11,-1,-1,4,0,17,0}, std::vector {8,18,4,21,4,0,-1,-1,4,21,17,21,-1,-1,4,11,12,11}, std::vector {22,21,18,16,17,18,15,20,13,21,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,18,8,-1,-1,13,8,18,8}, std::vector {8,22,4,21,4,0,-1,-1,18,21,18,0,-1,-1,4,11,18,11}, std::vector {2,8,4,21,4,0}, std::vector {10,16,12,21,12,5,11,2,10,1,8,0,6,0,4,1,3,2,2,5,2,7}, std::vector {8,21,4,21,4,0,-1,-1,18,21,4,7,-1,-1,9,12,18,0}, std::vector {5,17,4,21,4,0,-1,-1,4,0,16,0}, std::vector {11,24,4,21,4,0,-1,-1,4,21,12,0,-1,-1,20,21,12,0,-1,-1,20,21,20,0}, std::vector {8,22,4,21,4,0,-1,-1,4,21,18,0,-1,-1,18,21,18,0}, std::vector {21,22,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,19,8,19,13,18,16,17,18,15,20,13,21,9,21}, std::vector {13,21,4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,14,17,12,16,11,13,10,4,10}, std::vector {24,22,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,19,8,19,13,18,16,17,18,15,20,13,21,9,21,-1,-1,12,4,18,-2}, std::vector {16,21,4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,15,17,13,16,12,13,11,4,11,-1,-1,11,11,18,0}, std::vector {20,20,17,18,15,20,12,21,8,21,5,20,3,18,3,16,4,14,5,13,7,12,13,10,15,9,16,8,17,6,17,3,15,1,12,0,8,0,5,1,3,3}, std::vector {5,16,8,21,8,0,-1,-1,1,21,15,21}, std::vector {10,22,4,21,4,6,5,3,7,1,10,0,12,0,15,1,17,3,18,6,18,21}, std::vector {5,18,1,21,9,0,-1,-1,17,21,9,0}, std::vector {11,24,2,21,7,0,-1,-1,12,21,7,0,-1,-1,12,21,17,0,-1,-1,22,21,17,0}, std::vector {5,20,3,21,17,0,-1,-1,17,21,3,0}, std::vector {6,18,1,21,9,11,9,0,-1,-1,17,21,9,11}, std::vector {8,20,17,21,3,0,-1,-1,3,21,17,21,-1,-1,3,0,17,0}, std::vector {11,14,4,25,4,-7,-1,-1,5,25,5,-7,-1,-1,4,25,11,25,-1,-1,4,-7,11,-7}, std::vector {2,14,0,21,14,-3}, std::vector {11,14,9,25,9,-7,-1,-1,10,25,10,-7,-1,-1,3,25,10,25,-1,-1,3,-7,10,-7}, std::vector {10,16,6,15,8,18,10,15,-1,-1,3,12,8,17,13,12,-1,-1,8,17,8,0}, std::vector {2,16,0,-2,16,-2}, std::vector {7,10,6,21,5,20,4,18,4,16,5,15,6,16,5,17}, std::vector {17,19,15,14,15,0,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3}, std::vector {17,19,4,21,4,0,-1,-1,4,11,6,13,8,14,11,14,13,13,15,11,16,8,16,6,15,3,13,1,11,0,8,0,6,1,4,3}, std::vector {14,18,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3}, std::vector {17,19,15,21,15,0,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3}, std::vector {17,18,3,8,15,8,15,10,14,12,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3}, std::vector {8,12,10,21,8,21,6,20,5,17,5,0,-1,-1,2,14,9,14}, std::vector {22,19,15,14,15,-2,14,-5,13,-6,11,-7,8,-7,6,-6,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3}, std::vector {10,19,4,21,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0}, std::vector {8,8,3,21,4,20,5,21,4,22,3,21,-1,-1,4,14,4,0}, std::vector {11,10,5,21,6,20,7,21,6,22,5,21,-1,-1,6,14,6,-3,5,-6,3,-7,1,-7}, std::vector {8,17,4,21,4,0,-1,-1,14,14,4,4,-1,-1,8,8,15,0}, std::vector {2,8,4,21,4,0}, std::vector {18,30,4,14,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0,-1,-1,15,10,18,13,20,14,23,14,25,13,26,10,26,0}, std::vector {10,19,4,14,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0}, std::vector {17,19,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3,16,6,16,8,15,11,13,13,11,14,8,14}, std::vector {17,19,4,14,4,-7,-1,-1,4,11,6,13,8,14,11,14,13,13,15,11,16,8,16,6,15,3,13,1,11,0,8,0,6,1,4,3}, std::vector {17,19,15,14,15,-7,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3}, std::vector {8,13,4,14,4,0,-1,-1,4,8,5,11,7,13,9,14,12,14}, std::vector {17,17,14,11,13,13,10,14,7,14,4,13,3,11,4,9,6,8,11,7,13,6,14,4,14,3,13,1,10,0,7,0,4,1,3,3}, std::vector {8,12,5,21,5,4,6,1,8,0,10,0,-1,-1,2,14,9,14}, std::vector {10,19,4,14,4,4,5,1,7,0,10,0,12,1,15,4,-1,-1,15,14,15,0}, std::vector {5,16,2,14,8,0,-1,-1,14,14,8,0}, std::vector {11,22,3,14,7,0,-1,-1,11,14,7,0,-1,-1,11,14,15,0,-1,-1,19,14,15,0}, std::vector {5,17,3,14,14,0,-1,-1,14,14,3,0}, std::vector {9,16,2,14,8,0,-1,-1,14,14,8,0,6,-4,4,-6,2,-7,1,-7}, std::vector {8,17,14,14,3,0,-1,-1,3,14,14,14,-1,-1,3,0,14,0}, std::vector {39,14,9,25,7,24,6,23,5,21,5,19,6,17,7,16,8,14,8,12,6,10,-1,-1,7,24,6,22,6,20,7,18,8,17,9,15,9,13,8,11,4,9,8,7,9,5,9,3,8,1,7,0,6,-2,6,-4,7,-6,-1,-1,6,8,8,6,8,4,7,2,6,1,5,-1,5,-3,6,-5,7,-6,9,-7}, std::vector {2,8,4,25,4,-7}, std::vector {39,14,5,25,7,24,8,23,9,21,9,19,8,17,7,16,6,14,6,12,8,10,-1,-1,7,24,8,22,8,20,7,18,6,17,5,15,5,13,6,11,10,9,6,7,5,5,5,3,6,1,7,0,8,-2,8,-4,7,-6,-1,-1,8,8,6,6,6,4,7,2,8,1,9,-1,9,-3,8,-5,7,-6,5,-7}, std::vector {23,24,3,6,3,8,4,11,6,12,8,12,10,11,14,8,16,7,18,7,20,8,21,10,-1,-1,3,8,4,10,6,11,8,11,10,10,14,7,16,6,18,6,20,7,21,10,21,12} }; std::vector< std::pair > Simplex::sm_xLimits; VeroRoute/libraries/gEDA/veroroute_transistor/MOSFET_Nchannel_2N7000.sym000644 001750 001750 00000002007 13515171161 026175 0ustar00alexalex000000 000000 v 20130925 2 T 0 200 5 10 0 0 0 0 1 numslots=0 P 0 200 200 200 1 0 0 { T 0 300 5 10 1 1 0 0 1 pinnumber=2 T 0 300 5 10 0 0 0 0 1 pinseq=2 T 0 300 5 10 0 0 0 0 1 pinlabel=2 T 0 300 5 10 0 0 0 0 1 pintype=pas } P 500 600 500 800 1 0 1 { T 300 700 5 10 1 1 0 0 1 pinnumber=3 T 300 700 5 10 0 0 0 0 1 pinseq=3 T 300 700 5 10 0 0 0 0 1 pinlabel=3 T 300 700 5 10 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 300 0 5 10 1 1 0 0 1 pinnumber=1 T 300 0 5 10 0 0 0 0 1 pinseq=1 T 300 0 5 10 0 0 0 0 1 pinlabel=1 T 300 0 5 10 0 0 0 0 1 pintype=pas } L 250 600 500 600 3 0 0 0 -1 -1 L 250 200 500 200 3 0 0 0 -1 -1 L 250 400 350 450 3 0 0 0 -1 -1 L 250 400 350 350 3 0 0 0 -1 -1 L 250 675 250 525 3 0 0 0 -1 -1 L 250 475 250 325 3 0 0 0 -1 -1 L 250 275 250 125 3 0 0 0 -1 -1 L 200 600 200 200 3 0 0 0 -1 -1 L 250 400 400 400 3 0 0 0 -1 -1 L 400 400 400 200 3 0 0 0 -1 -1 T 600 200 5 10 1 1 0 0 1 device=2N7000 T 600 500 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=N-Channel MOSFET VeroRoute/libraries/gEDA/veroroute_transistor/NPN_BC337.sym000644 001750 001750 00000001563 13515171161 023766 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=1 T 400 850 5 6 0 0 0 0 1 pinseq=1 T 400 850 5 6 0 0 0 0 1 pinlabel=1 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=3 T 400 50 5 6 0 0 0 0 1` pinseq=3 T 400 50 5 6 0 0 0 0 1 pinlabel=3 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 403,209 L 501,200 L 431,273 L 425,240 z T 600 700 5 10 1 1 0 0 1 device=BC337 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=NPN Transistor VeroRoute/libraries/gEDA/veroroute_transistor/PNP_BC558.sym000644 001750 001750 00000001562 13515171161 023774 0ustar00alexalex000000 000000 v 20130925 2 T 0 500 5 10 0 0 0 0 1 numslots=0 P 0 500 200 500 1 0 0 { T 100 550 5 6 1 1 0 0 1 pinnumber=2 T 100 550 5 6 0 0 0 0 1 pinseq=2 T 100 550 5 6 0 0 0 0 1 pinlabel=2 T 100 550 5 6 0 0 0 0 1 pintype=pas } P 500 1000 500 800 1 0 0 { T 400 850 5 6 1 1 0 0 1 pinnumber=1 T 400 850 5 6 0 0 0 0 1 pinseq=1 T 400 850 5 6 0 0 0 0 1 pinlabel=1 T 400 850 5 6 0 0 0 0 1 pintype=pas } P 500 200 500 0 1 0 1 { T 400 50 5 6 1 1 0 0 1 pinnumber=3 T 400 50 5 6 0 0 0 0 1 pinseq=3 T 400 50 5 6 0 0 0 0 1 pinlabel=3 T 400 50 5 6 0 0 0 0 1 pintype=pas } L 200 650 500 800 3 0 0 0 -1 -1 L 200 350 500 200 3 0 0 0 -1 -1 L 200 800 200 200 3 0 0 0 -1 -1 H 3 0 0 0 -1 -1 1 -1 -1 -1 -1 -1 5 M 297,341 L 199,350 L 269,277 L 275,310 z T 600 700 5 10 1 1 0 0 1 device=BC558 T 600 400 8 10 1 1 0 0 1 refdes=Q? T 600 400 8 10 0 0 0 0 1 footprint=TO92 T 600 400 8 10 0 0 0 0 1 description=PNP Transistor VeroRoute/Src/TemplateManager.h000644 001750 001750 00000045304 14427317767 016732 0ustar00alexalex000000 000000 /* VeroRoute - Qt based Veroboard/Perfboard/PCB layout & routing application. Copyright (C) 2017 Alex Lawrow ( dralx@users.sourceforge.net ) 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 3 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, see . */ #pragma once #include "Template.h" // Manager class to handle component templates Q_DECL_CONSTEXPR static const int ALIASES_FILE_VERSION_1 = 1; Q_DECL_CONSTEXPR static const int ALIASES_FILE_VERSION_CURRENT = ALIASES_FILE_VERSION_1; struct StringPair { StringPair(const std::string& importStr) : m_importStr(importStr) {} StringPair(const std::string& importStr, const std::string& notesStr) : m_importStr(importStr), m_notesStr(notesStr) {} bool operator<(const StringPair& o) const { if ( m_importStr != o.m_importStr ) return m_importStr < o.m_importStr; return m_notesStr < o.m_notesStr; // Should not happen in practice } bool operator==(const StringPair& o) const { return m_importStr == o.m_importStr && m_notesStr == o.m_notesStr; } std::string m_importStr; std::string m_notesStr; }; class TemplateManager { public: TemplateManager() {} ~TemplateManager() { SaveAliasFile(); } const std::string& GetPathStr() const { return m_pathStr; } void SetPathStr(const std::string& str) { m_pathStr = str; LoadAliasFile(); } size_t GetSize(bool bGeneric) const { return bGeneric ? m_listGeneric.size() : m_listUser.size(); } const Component& GetNth(bool bGeneric, size_t N) const { assert( N < GetSize(bGeneric) ); auto iter = bGeneric ? m_listGeneric.begin() : m_listUser.begin(); for (size_t i = 0; i < N; i++) iter++; return *iter; } // Aliases for part types (footprints) const std::map& GetMapAliasToImportStr() const { return m_mapAliasToImportStr; } const std::string& GetImportStrFromAlias(const std::string& aliasStr) const { static std::string emptyStr(""); auto iter = m_mapAliasToImportStr.find(aliasStr); return ( iter != m_mapAliasToImportStr.end() ) ? iter->second : emptyStr; } void RemoveAlias(const std::string& aliasStr) { const auto iter = m_mapAliasToImportStr.find(aliasStr); if ( iter != m_mapAliasToImportStr.end() ) m_mapAliasToImportStr.erase(iter); } void RemoveAllAliases() { m_mapAliasToImportStr.clear(); } void AddAlias(const std::string& aliasStr, const std::string& importStr) { m_mapAliasToImportStr[aliasStr] = importStr; } void ClearInvalidAliases() { for (auto& o : m_mapAliasToImportStr) if ( !CheckPartOK(o.second) ) o.second = ""; } // Persistance of aliases between sessions QString GetAliasFilename() const { char buffer[256] = {'\0'}; sprintf(buffer, "%s/aliases/all.dat", GetPathStr().c_str()); // Maybe use separate files for Tango and Orcad in future return QString(buffer); } void LoadAliasFile() { m_mapAliasToImportStr.clear(); DataStream inStream(DataStream::READ); if ( inStream.Open( GetAliasFilename() ) ) { int iAliasFileVersion(0); inStream.Load(iAliasFileVersion); unsigned int iSize(0); inStream.Load(iSize); for(unsigned int i = 0; i < iSize; i++) { std::string A, B; inStream.Load(A); inStream.Load(B); m_mapAliasToImportStr[A] = B; } inStream.Close(); } } void SaveAliasFile() { DataStream outStream(DataStream::WRITE); if ( outStream.Open( GetAliasFilename() ) ) { outStream.Save(ALIASES_FILE_VERSION_CURRENT); outStream.Save(static_cast( m_mapAliasToImportStr.size() )); for (const auto& o : m_mapAliasToImportStr) { outStream.Save(o.first); outStream.Save(o.second); } outStream.Close(); } } void AddDefaults() { std::string nameStr(""), valueStr(""); for (const auto& eType : CompTypes::GetListCompTypes()) { if ( eType == COMP::TRACKS ) continue; // Not a real component if ( eType == COMP::VERO_NUMBER ) continue; // Not a real component if ( eType == COMP::VERO_LETTER ) continue; // Not a real component if ( eType == COMP::CUSTOM ) continue; // Don't show custom components in the left pane const int numPins = CompTypes::GetDefaultNumPins(eType); std::vector nodeList; nodeList.resize(static_cast(numPins), BAD_NODEID); Component comp(nameStr, valueStr, eType, nodeList); comp.SetId(BAD_COMPID); // This indicates a component template Add(true, comp); // true ==> generic } } bool Add(bool bGeneric, const Component& comp, std::string* pErrorStr = nullptr) { bool bAlreadyExists(false), bUsedImportStr(false); return Add(bGeneric, comp, bAlreadyExists, bUsedImportStr, pErrorStr); } bool Add(bool bGeneric, const Component& comp, bool& bAlreadyExists, bool& bUsedImportStr, std::string* pErrorStr = nullptr) { Template entry; if ( !entry.MakeTemplate(comp) ) { if ( pErrorStr ) *pErrorStr = "Internal Error: MakeTemplate() failed"; return false; } auto& lst = bGeneric ? m_listGeneric : m_listUser; if ( !bGeneric ) // A new entry in the "User-Defined" list need extra checks ... { for (const auto& o : lst) { const bool bSameTypeStr = entry.GetFullTypeStr() == o.GetFullTypeStr(); const bool bSameValueStr = entry.GetValueStr() == o.GetValueStr(); const bool bSameImportStr = entry.GetType() == COMP::CUSTOM && !entry.GetImportStr().empty() && entry.GetImportStr() == o.GetImportStr(); // ... it must have a unique (TypeStr,ValueStr) combination if ( bSameTypeStr && bSameValueStr ) { if ( bAlreadyExists ) continue; bAlreadyExists = true; if ( pErrorStr ) *pErrorStr = "The library part (Type = '" + o.GetFullTypeStr() + "') " + "(Value = '" + o.GetValueStr() + "') already exists"; return false; } else if ( bSameImportStr ) // ... if its a COMP::CUSTOM part, then it must have a unique import string { if ( bSameTypeStr ) // Type string and import string are same but value string differs { if ( bUsedImportStr ) continue; bUsedImportStr = true; } if ( pErrorStr ) *pErrorStr = "The library part (Type = '" + o.GetFullTypeStr() + "') " + "(Value = '" + o.GetValueStr() + "') " + "already has the Import string '" + o.GetImportStr() + "'"; return false; } } } // We've got a valid entry, so insert it at the relevant place in the list // If we are allowed to replace an entry, delete the old entry for (auto iter = lst.begin(); iter != lst.end() && (bAlreadyExists || bUsedImportStr); ++iter) { const bool bSameTypeStr = entry.GetFullTypeStr() == iter->GetFullTypeStr(); if ( !bSameTypeStr ) continue; const bool bSameValueStr = entry.GetValueStr() == iter->GetValueStr(); const bool bSameImportStr = entry.GetType() == COMP::CUSTOM && !entry.GetImportStr().empty() && entry.GetImportStr() == iter->GetImportStr(); if ( (bAlreadyExists && bSameValueStr) || (bUsedImportStr && bSameImportStr) ) { lst.erase(iter); break; } } auto iter = lst.begin(); bool bOK = iter == lst.end() || entry.IsLessThan(*iter, bGeneric); if ( bOK ) lst.insert(iter, entry); while( iter != lst.end() && !bOK ) { Template& prev = *iter; ++iter; bOK = prev.IsLessThan(entry, bGeneric) && ( iter == lst.end() || entry.IsLessThan(*iter, bGeneric) ); if ( bOK ) lst.insert(iter, entry); } if ( !bOK ) { if ( pErrorStr ) *pErrorStr = "Could not add part to library"; } return bOK; } bool CheckAllowOverWrite(const Component& comp) const // For CompDefiner::Build() { Template entry; if ( !entry.MakeTemplate(comp) ) return false; for (const auto& o : m_listUser) // Must have same (Type, Value, Import) strings { if ( entry.GetFullTypeStr() == o.GetFullTypeStr() && entry.GetValueStr() == o.GetValueStr() && entry.GetImportStr() == o.GetImportStr() ) return true; } return false; } bool Remove(const Component& comp) { Template entry; if ( !entry.MakeTemplate(comp) ) return false; const auto iter = std::find(m_listUser.begin(), m_listUser.end(), entry); const bool bOK = ( iter != m_listUser.end() ); if ( bOK ) m_listUser.erase(iter); // Erase entry if it exists return bOK; } bool GetFromImportStr(const std::string& importStr, Component& out) const { if ( importStr.empty() ) return false; for (const auto& o : m_listUser) if ( o.GetType() == COMP::CUSTOM && o.GetImportStr() == importStr ) { out = o; return true; } return false; } // Helper for alias dialog void CalcValidImportStrings(std::list& outList) { outList.clear(); outList.push_back( StringPair("PADS") ); // Special case. PADS is an allowed import string (like a SIP but broken into separate objects) outList.push_back( StringPair("DIODE_IPC") ); // Special case. DIODE using IPC standard pin numbering like KiCaD (opposite to VeroRoute) outList.push_back( StringPair("LED_IPC") ); // Special case. LED using IPC standard pin numbering like KiCaD (opposite to VeroRoute) for (const auto& o : m_listGeneric) if ( !o.GetImportStr().empty() ) outList.push_back( StringPair( GetImportStrCut(o.GetImportStr()) ) ); for (const auto& o : m_listUser) if ( o.GetType() == COMP::CUSTOM && !o.GetImportStr().empty() ) outList.push_back( StringPair(o.GetImportStr()) ); // Append 'x' for import strings with a suffix. Also see how suffices are handled in CheckPartOK() below for (auto& o : outList) { const bool bPADS = ( o.m_importStr == "PADS" ); const bool bDIODE_IPC = ( o.m_importStr == "DIODE_IPC" ); const bool bLED_IPC = ( o.m_importStr == "LED_IPC" ); const COMP eType = bPADS ? COMP::SIP // Treat PADS like SIP (regarding number of pins) : bDIODE_IPC ? COMP::DIODE : bLED_IPC ? COMP::LED : CompTypes::GetTypeFromImportStr( GetImportStrCut(o.m_importStr) ); o.m_notesStr = CompTypes::GetAliasNotes(eType); if (eType == COMP::DIODE || eType == COMP::LED) { if ( bDIODE_IPC || bLED_IPC ) o.m_notesStr += "Pin 2 is Anode. "; else o.m_notesStr += "Pin 1 is Anode. "; } const int minPins = CompTypes::GetMinNumPins(eType); const int maxPins = CompTypes::GetMaxNumPins(eType); const int modPins = CompTypes::GetModuloNumPins(eType); switch(eType) { case COMP::SIP: case COMP::DIP: case COMP::SWITCH_ST_DIP: case COMP::SWITCH_ST: case COMP::SWITCH_DT: case COMP::STRIP_100: case COMP::BLOCK_100: case COMP::BLOCK_200: o.m_importStr += "x"; o.m_notesStr += "x=[" + std::to_string(minPins) + "," + std::to_string(maxPins) + "] is number of pins." + ( modPins != 1 ? (" x must divide by " + std::to_string(modPins) + ".") : "" ) + ( bPADS ? " Each pin becomes a 'Pad' object." : "" ); break; case COMP::RESISTOR: case COMP::INDUCTOR: case COMP::DIODE: o.m_importStr += "x"; o.m_notesStr += "x=[" + std::to_string(CompTypes::GetMinLength(eType)-1) + "," + std::to_string(CompTypes::GetMaxLength(eType)-1) + "] is length in units of 100 mil. Omit x for 300 mil default."; break; case COMP::CAP_CERAMIC: case COMP::CAP_FILM: case COMP::CAP_FILM_WIDE: o.m_importStr += "x"; o.m_notesStr += "x=[" + std::to_string(CompTypes::GetMinLength(eType)-1) + "," + std::to_string(CompTypes::GetMaxLength(eType)-1) + "] is length in units of 100 mil. Omit x for 200 mil default."; break; default: break; } } outList.sort(); outList.unique(); // Make sure each import string is not listed as an alias for (auto& o : outList) RemoveAlias(o.m_importStr); } // Following is a helper for the import code bool CheckPartOK(const std::string& importStr) const { return CheckPartOK(CompStrings("", "", importStr)); } bool CheckPartOK(const CompStrings& compStrings, std::list* pOffBoard = nullptr, std::string* pErrorStr = nullptr, Component* pComp = nullptr) const { const std::string& nameStr = compStrings.m_nameStr; const std::string& valueStr = compStrings.m_valueStr; const std::string& importStr = compStrings.m_importStr; std::string dummyStr; std::string& errorStr = ( pErrorStr ) ? *pErrorStr : dummyStr; Component dummyComp; Component& comp = ( pComp ) ? *pComp : dummyComp; // If footprint is variable length, then get the number of pins/length from importStr. int numPins(0), nLength(0); // Invalid by default bool bOffBoard(false); std::string importStrCut = GetImportStrCut(importStr, numPins, nLength, bOffBoard); // Cut down version of importStr. e.g. DIP40 ==> DIP const std::string strID = "Part: Name = " + nameStr + ", Value = " + valueStr + ", Type = " + importStr; bool bCustom(false); // true ==> We've found a custom template with matching import string bool bSwapPinOrder(false); if ( importStrCut == "DIODE_IPC" ) { bSwapPinOrder = true; importStrCut = "DIODE"; } if ( importStrCut == "LED_IPC" ) { bSwapPinOrder = true; importStrCut = "LED"; } const COMP eType = CompTypes::GetTypeFromImportStr(importStrCut); bool bOK = ( eType != COMP::CUSTOM && eType != COMP::TRACKS && eType != COMP::VERO_NUMBER && eType != COMP::VERO_LETTER && eType != COMP::INVALID ); if ( !bOK ) // Search template manager bOK = bCustom = GetFromImportStr(importStrCut, comp); if ( !bOK ) { errorStr = strID + "\nError: Unknown part type"; return bOK; } // Check pins per component is within limits if ( numPins == 0 ) numPins = ( bCustom ) ? static_cast( comp.GetNumPins() ) : CompTypes::GetDefaultNumPins(eType); bOK = ( numPins > 0 ); if ( !bOK ) { errorStr = strID + "\nError: Part has no pins"; return bOK; } if ( bCustom ) { assert( comp.GetType() == COMP::CUSTOM ); comp.SetNameStr(nameStr); comp.SetValueStr(valueStr); } else { const int minPins = CompTypes::GetMinNumPins(eType); const int maxPins = CompTypes::GetMaxNumPins(eType); const int modPins = CompTypes::GetModuloNumPins(eType); bOK = numPins >= minPins; if ( !bOK ) { errorStr = strID + "\nError: Pin value in import string is too small"; return bOK; } bOK = numPins <= maxPins; if ( !bOK ) { errorStr = strID + "\nError: Pin value in import string is too large"; return bOK; } bOK = ( 0 == numPins % modPins ); if ( !bOK ) { errorStr = strID + "\nError: Pin value in import string is not a multiple of " + std::to_string(modPins); return bOK; } // Check length is within limits (for "RESISTOR", "INDUCTOR", "DIODE", "CAP_CERAMIC", "CAP_FILM", "CAP_FILM_WIDE") if ( nLength != 0 ) // Length of 0 ==> use default { bOK = nLength > 0; if ( !bOK ) { errorStr = strID + "\nError: Part length value in import string is invalid"; return bOK; } bOK = nLength >= CompTypes::GetMinLength(eType); if ( !bOK ) { errorStr = strID + "\nError: Part length is smaller than VeroRoute supports"; return bOK; } bOK = nLength <= CompTypes::GetMaxLength(eType); if ( !bOK ) { errorStr = strID + "\nError: Part length is larger than VeroRoute supports"; return bOK; } } assert( eType != COMP::INVALID ); std::vector nodeList; nodeList.resize(static_cast(numPins), BAD_NODEID); comp = Component(nameStr, valueStr, eType, nodeList); if ( nLength > 0 ) { while ( comp.GetCols() < nLength ) comp.Stretch(true); // grow while ( comp.GetCols() > nLength ) comp.Stretch(false); // shrink } } if ( bSwapPinOrder ) comp.SwapEnds(); if ( bOK && bOffBoard && pOffBoard ) // If have a valid offboard part (i.e. PADS with a valid suffix) pOffBoard->push_back(nameStr); // ... add it to the list of off-board parts return bOK; } const std::string& GetImportStrCut(const std::string& importStr) const { int nDummyPins(0), nDummyLength(0); bool bDummyOffBoard(false); return GetImportStrCut(importStr, nDummyPins, nDummyLength, bDummyOffBoard); } const std::string& GetImportStrCut(const std::string& importStr, int& numPins, int& nLength, bool& bOffBoard) const { static std::string importStrCut; // Cut down version of importStr. e.g. DIP40 ==> DIP // List of package identifiers for footprints with variable numbers of pins/lengths. // "PADS" ==> Create separate on-board PAD objects for an off-board part. // "SWITCH_ST_DIP" must be tested before "SWITCH_ST". // "DIODE_IPC" must be tested before "DIODE". Q_DECL_CONSTEXPR size_t NUM_VARIABLE_PIN_PARTS = 16; const std::string strVar[NUM_VARIABLE_PIN_PARTS] = {"SIP", "DIP", "PADS", "SWITCH_ST_DIP", "SWITCH_ST", "SWITCH_DT", "STRIP_100MIL", "BLOCK_100MIL", "BLOCK_200MIL", "RESISTOR", "INDUCTOR", "DIODE_IPC", "DIODE", "CAP_CERAMIC", "CAP_FILM", "CAP_FILM_WIDE"}; importStrCut = importStr; std::string pinStr; // Number of pins numPins = nLength = 0; // Invalid by default bOffBoard = false; for (size_t i = 0; i < NUM_VARIABLE_PIN_PARTS; i++) { const std::string& strTmp = strVar[i]; // e.g. "SIP", "DIP, etc const auto L = strTmp.length(); if ( importStr.length() >= L && importStr.substr(0, L) == strTmp ) { pinStr = importStr.substr(L); // e.g. "DIP40" ==> "40" importStrCut = importStr.substr(0, L); // e.g. "DIP40" ==> "DIP" if ( importStrCut == "PADS" ) // If we have an off-board part ... { bOffBoard = true; importStrCut = "SIP"; // ... treat it as a SIP for the moment } if ( importStrCut == "RESISTOR" || importStrCut == "INDUCTOR" || importStrCut == "DIODE_IPC" || importStrCut == "DIODE" || importStrCut == "CAP_CERAMIC" || importStrCut == "CAP_FILM" || importStrCut == "CAP_FILM_WIDE" ) { if ( !pinStr.empty() ) // If we have a suffix for the number of pins ... { nLength = atoi( pinStr.c_str() ); if ( nLength > 0 ) // The length is in 100ths of a mil ... nLength += 1; // ... so must add 1 to get part length in grid squares else nLength = -1; // Use invalid length of -1. Don't use 0 as that implies "use default". } } else // SIP, DIP, SWITCH_ST_DIP, SWITCH_ST, SWITCH_DT, STRIP_100MIL, BLOCK_100MIL, BLOCK_200MIL { numPins = atoi( pinStr.c_str() ); if ( numPins == 0 ) // Missing or zero ... numPins = -1; // ... use -1 instead. Don't use 0 as that implies "use default". } break; } } return importStrCut; } private: std::string m_pathStr; // Path to the "templates" and "aliases" folders std::list