Miskolci Egyetem Gépészmérnöki és Informatikai Kar Elektrotechnikai-Elektronikai Intézeti Tanszék
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben
Szakdolgozat
Készítette: Név: Mohácsi Máté Neptunkód: M0MF35 Szak: Mérnök Informatikus Bsc Korszerű WEB technológiák szakirány
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben
Tartalomjegyzék 1. BEVEZETÉS.............................................................................................. 1 2. HASZNÁLT TECHNOLÓGIÁK ............................................................... 3 2.1.
PSPICE ............................................................................................................................................ 3
2.2.
PHP ................................................................................................................................................ 3
2.3.
SVG ................................................................................................................................................ 4
3. SCHEMATICS ALKATRÉSZ KÖNYVTÁRAK ....................................... 5 3.1.
SLB könyvtárak ............................................................................................................................... 7
3.2.
PLB könyvtárak............................................................................................................................... 7
4. ALKATRÉSZ KÖNYVTÁRAK FELDOLGOZÁSA ................................. 8 4.1.
Attribútumok feldolgozása ........................................................................................................... 10
4.2.
Grafikák (Elektronikai rajzjelek) feldolgozása ............................................................................... 12
4.3.
Lábak feldolgozása ....................................................................................................................... 17
4.4.
Referencia elemek........................................................................................................................ 21
5. TOKOZÁS FELDOLGOZÁSA ............................................................... 23 6. SCHEMATICS FÁJLOK FELTÖLTÉSE .............................................. 27 6.1.
Kliensről történő feltöltés ............................................................................................................ 27
6.2.
Szerverről történő feltöltés .......................................................................................................... 28
7. FELTÖLTÖTT FÁJL FELDOLGOZÁSA ............................................. 29 8. FÁJL ALKATRÉSZEINEK KIRAJZOLÁSA ........................................ 32 9. DINAMIKUS TARTALOM FELDOLGOZÁSA .................................... 38 10.
WEBES FELÜLET .............................................................................. 40 I
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben
11.
IRODALOMJEGYZÉK ........................................................................ 42
12.
ÖSSZEGZÉS ......................................................................................... 43
13.
SUMMARY ........................................................................................... 44
14.
MELLÉKLET ....................................................................................... 45
14.1.
1.Melléklet ................................................................................................................................... 45
14.2.
2. Melléklet .................................................................................................................................. 46
14.3.
CD melléklet ................................................................................................................................. 48
II
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben
1. Bevezetés A téma ötlete egy kapcsolási rajzot kirajzoló webes felület elkészítése. Oktatási segédlet, mely az előadáson, illetve gyakorlaton elvégzett feladat megtekintésére vagy kinyomtatására alkalmas megjelenítést biztosít. Kapcsolási rajz weben keresztüli kirajzolására a lehetséges opciók az alábbiak:
Kapcsolási rajzot kirajzoló program, weben keresztüli elérése
Egy program által fájlba mentett kapcsolási rajz feldolgozása és kirajzolása.
Az alkatrészek kirajzolása mellett lehetőséget kell nyújtania a programnak azok tulajdonságainak beállítására és kívánság szerinti megjelenítésére. Lényeges tulajdonságok közé tartozik például egy ellenállás alkatrésznek az elektromos ellenállás értéke vagy egy kondenzátor kapacitása. A legtöbb program ezek mellett az áramkör szimulációját is biztosítja, amire nekünk nincs szükségünk, így célszerűbb a fájlba mentett rajz feldolgozás és megjelenítése. Ebben az esetben a feldolgozás megértése egy Black-Box tesztelésre hasonlít majd, melyben a forráskód nem ismert csak az adott bemenetre várt kimenet. A fájlban szereplő adatokat át kell konvertálni webes megjelenítésre alkalmas kódra, úgy hogy a rajzban szereplő elemek megőrizzék eredeti formájukat. Olyan nyelvet kell választanunk, amit a lehető legtöbb böngésző támogat. A rajzot úgy kell megjeleníteni, hogy egyszerű legyen átlátni és a szükséges adatok jól láthatóak legyenek. Fontos hogy felhasználó barát legyen, és könnyen vissza lehessen állítani eredeti pozíciójába. Feldolgozásnál figyelembe lehet venni, hogy minden olyan sor, amely megjelenítés szempontjából lényegtelen, ne kerüljön feldolgozásra, mert feleslegesen lassítaná azt. Olyan nyelvet szükséges választani a feldolgozásra, amely szerveroldali és csak a végeredményt adja vissza, elrejtve a felhasználó elől a feldolgozás folyamatát. A további funkciók, mint méretezés és pozícionálás megoldható kliens oldalon is.
1
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben Egyszerű és felhasználó barát megjelenítés kell, melyben lenyíló menüpontokban találhatóak a rajz transzformációi, feltöltése szerver illetve kliens oldalról és nyomtatása. A szerver és kliens oldalról történő feltöltések feldolgozása ugyanazon kód alapján történjen. Az fájlban szereplő kapcsolási rajz elemek megjelenése ne térjen el a programban szereplő rajztól. Ezalatt értendő az alkatrészek lábához húzott vezetékek, illetve a csomópontok elágazában lévő kirajzolódása. Az alakzatok pontos megjelenése szintén követelmény, hiszen a tokban szereplő alkatrészek nem eshetnek a tok rajzán kívűl és a hozzá tartozó lábak, illetve attribútumok sem.
2
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben
2. Használt technológiák 2.1.
PSPICE
Kapcsolási rajz elkészítésére rendelkezésre álló OrCAD PSPICE 9.1 verzió számú program, amely ingyenesen elérhető. A PSPICE-ban kapcsolási rajz készítésére és szimulációjára a Schematics alkalmas. OrCAD PSpice egy szimulációs program, amely modellezi a viselkedését egy analóg és digitális eszközöket tartalmazó áramkörnek. Alap és Haladó szintű elemzéseket is képes végrehajtani: Egyenáramú, Váltakozó áramú és tranziens elemzések, amelyekkel meg lehet vizsgálni egy áramkör viselkedését különböző bemenetekre. [1] A modell könyvtárak szinte korlátlanul bővíthetőek, ezáltal újabb elemek tölthetőek le a felhasználó kívánsága szerint. A könyvtárakban szereplő alkatrészekből szinte bármilyen kapcsolási rajz elkészíthető. Minden alkatrész tulajdonsága a könyvtárakban szerepel ASCII kódban megírva, így egyszerű olvasni és feldolgozni. Működés alapvető lépése a Schematics könyvtárak és a feltöltött sch kiterjesztésű fájlok feldolgozása egy választott programnyelv által, és fájl feltöltése esetén a benne szereplő elemek kirajzolása.
2.2.
PHP
A PHP-t Rasmus Lerdorf agyalta ki valamikor 1994 őszén. Az első kiadatlan verziókat a saját honlapján használta, hogy figyelemmel kísérje, kik látogatják az oldalait. Az első mások által is használt változat 1995 elején látott napvilágot és "Personal Home Page Tools" néven volt ismert. A feldolgozó program újraírása után 1995 közepén a "PHP/FI 2. verzió" nevet kapta. Ötvözte a "Personal Home Page Tools" programját a "Form Interpreter"-el és mSQL támogatást adott hozzá. Így született a PHP/FI. A program bámulatos ütemben fejlődött, és az emberek elkezdték kódokkal segíteni a fejlesztést. [2] A feltöltött fájlok feldolgozására dinamikus weblap létrehozása szükséges, a PHP ráadásul szerveroldali szkriptnyelv, melynek köszönhetően nem kerül elküldésre a teljes feldolgozás. A kliens csupán a végeredményt kapja meg, így rejtve marad a feldolgozás.
3
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben
2.3.
SVG
Az SVG (Scalable Vector Graphics) magyar fordítása "méretezhető vektorgrafika". Ezt a leírónyelvet a World Wide Web Consortium (W3C) egyik munkacsoportja 1998-ban kezdte el kidolgozni. A cél egy olyan szabvány kifejlesztése volt, mely XML-t alkalmazva képes az ábrák leírására. Egy SVG dokumentum geometrikus alakzatokból álló ábrát, képet tartalmaz szöveges formában. Ezek a grafikák később megjeleníthetőek egy weboldalon vagy egy erre alkalmas program segítségével. A grafikában szereplő elemek általában görbék, síkidomok vagy szöveges objektumok, azonban meghagyták a lehetőséget arra is, hogy nem vektoros képet építsünk be a rajzba. Mivel szövegesen van leírva a kép tartalma, a keresőprogramok könnyebben tudnak információhoz jutni az ábrával kapcsolatban, mintha hagyományos, raszteres ábrázolást használnánk. A vektorgrafika másik nagy előnye a szabad átméretezhetőség a minőség romlása nélkül. Az SVG erre is rugalmas lehetőséget biztosít a felhasználó számára. [3] Számunkra jelentős SVG előnyök:
SVG
képek
létrehozhatóak
és
szerkeszthetőek
bármelyik
szövegszerkesztővel
XML formátumban definiálja a megjelenítést
Az SVG megjelenítés nem veszít a minőségéből még nagyítás vagy méretezés esetén sem.
Minden elem és minden attribútum az SVG fájlokban animálható [4]
4
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben
3. Schematics Alkatrész Könyvtárak A Schematics minden könyvtárában különböző szerepű elemek tárolása valósul meg. A könyvtárak szöveges fájlok és mindegyikük ugyanazon szabvány alapján van megírva. Ezt a szabványt használva a programban saját könyvtárakat is létre lehet hozni. A gyárilag megadott könyvtárak slb és plb, amíg a saját könyvtárak olb kiterjesztésűek. Az slb kiterjesztésű könyvtárak tartalmazzák az elemek attribútumait, kirajzoláshoz szükséges grafikákat és a lábakat, a plb könyvtárak pedig a lábak számozását. A könyvtár fejlécében „@index” kulcsszó után egy „tartalomjegyzék” következik, melynek minden sora a „symloc” kulcsszót követően három lényeges információt hordoz. Az alkatrész neve, hozzá tartozó törzsben szereplő definíció kezdetének eltolása és a definíció hossza található, mely minden könyvtárban megegyezik. symloc C 0 618
A példa alapján, C (Capacitor) az elem neve, magyarul Kondenzátor, 0 a törzs kezdetétől számított eltolás és 618 karakter (byte) a hozzá tartozó tulajdonságok hossza. Előfordul, hogy ugyanazt az alkatrészt több gyártó eltérő neveken forgalmazza, ilyenkor nincs szükség az alkatrész definíciójának megismétlésére, elegendő a neveket egymástól kettősponttal elválasztva felsorolni, és az utolsóként megadott név alatt szerepel az alkatrész teljes definíciója. Például: symloc GND_ANALOG:AGND 4703 52 symloc 7400:00 22563 141
5
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben Ezek alapján minden könyvtár feldolgozható ugyanazon kóddal. A mellékletben (1. melléklet) található példa a könyvtárak szerkezetére. A különböző szerepű alapkönyvtárak a következőek:
Analog: Analóg elemek, mint ellenállás, kondenzátor.
Eval: félvezetők, digitális eszközök, kapcsolók
Abm: speciális funkciók, mint a négyzetgyök, szorozók és függvények
Port: földelések, magas/alacsony digitális portok
Source: magában foglalja az áramforrásokat, mint az Egyenáramú (DC) forrás Vdc, Váltakozó áramú (AC) forrás Vac, Sin hullámú feszültség VSIN
Breakout: Tokok, MOS tranzisztorok, bipoláris tranzisztorok.
Special: Ampermérők, nézőpontok.
Analog_p: Hasonló az analog könyvtárhoz annyi különbséggel hogy az elemek végén 1-es és 2-es számjegyek a +, - jelek helyett a polaritás jelzésére. [5]
6
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben
3.1.
SLB könyvtárak
A törzsben szerepelő tulajdonságok három részre oszlanak: attribútumok, lábak, grafikák. A tulajdonságok kezdete a „*symbol” kulcsszóval, az elem nevével, leírásával és következő sorban típusának betűjelével található a könyvtárban. A tulajdonságaik @attributes, @pins, @graphics kulcsszavakkal kezdődnek.
3.2.
PLB könyvtárak
Léteznek olyan funkciójú elemek, amelyekből többet szokás egy tokban elhelyezni, főleg a digitális kapu áramkörök. Ebben az esetben minden alkatrész lába különböző számot kap, melyet az 5.1. ábra szemléltet. A package library, röviden plb, azaz tokozás könyvtár az slb-ben található valamennyi tokban szereplő elem lábainak sorszámát tartalmazza. A törzsben szereplő tulajdonságok a „*package” kulcsszóval és az elem nevével kezdődnek, majd következő sorokban a kapuk darabszámát és neveit a @types kulcsszó alatt, továbbá a kapuk lábszámát a különböző be/ki menetek esetén a @pinout után.
7
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben
4. Alkatrész Könyvtárak feldolgozása Minden könyvtár feldolgozásra kerül egy cikluson belül, amely futási feltétele a tömb mérete, ahol a könyvtárak elérése található. Az fgets metódus segítségével történik a sorok beolvasása, amely addig olvassa be a karaktereket, amíg a sor végére nem ér. do{ $location=ftell($currentlib); $buff=fgets($currentlib,4000); $symlocarray=explode(" ",$buff); if($symlocarray[0]=="symloc") { $partarray[]=$symlocarray; } }while(strpos("symloc",$symlocarray[0])=="symloc");
Egy hátultesztelős ciklus segítségével beolvassuk soronként a jelenlegi könyvtár fejlécét, majd az explode függvénnyel felbontjuk tömbre szóközönként, így megkapva a sorban lévő szavakat sorszámozva. Ha a tömb első string-je „symloc” amely jelen esetben a symbol location, azaz szimbólum helye (működése alapján pointer), akkor eltároljuk egy két dimenziós tömbben, mely soronként az elemeket, oszloponként a hozzá tartozó tulajdonságokat tárolja. Az ftell metódus segítségével elmentjük a jelenlegi pozíciót ahol járunk a könyvtárban egy változóba és felülírjuk minden ciklusban. A ciklus végeztével megkapjuk a törzs kezdetét, ahonnan kiszámítható a definícióban szereplő eltolás. $name=htmlspecialchars(strtoupper($partarray[$j][1])); if(array_search($name,$namecheck)==FALSE) { $start=$location+(int)$partarray[$j][2]; $length=(int)$partarray[$j][3];
Újabb ciklust indítunk, amely a könyvtár törzsét, azaz az előzőekben feldolgozott fejlécben szereplő alkatrészek definíciót dolgozza fel egyenként. Ezen ciklus futási feltétele a korábban elmentett szimbólum helyek tömbjének a mérete. A tömb minden sorának második elemét (alkatrész neve) a speciális HTML karakterek átalakításával elmentjük egy változóba. Az duplikáció elkerülése céljából feltétel vizsgálást indítunk, melyben megkeressük az előző sorban elmentett változó értékét egy ellenőrző tömbben az 8
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben array_search metódus segítségével. Ha hamis értéket ad, akkor az elem még nem került feldolgozásra. A jelenlegi pozícióhoz hozzá adjuk az elem kezdőértékének eltolását, amely a második elem a tömbben, majd változóban tároljuk. Szintén változóban tároljuk a hosszát, azaz a tömb harmadik elemét. Elágazás alapján külön feldolgozásra kerülnek a plb kiterjesztésű fájlok. array_push($namecheck,$name); if(strstr($name,":")==FALSE) { $parts[$name]=stream_get_contents($currentlib,$length,$start); } else { $refparts[$name]=stream_get_contents($currentlib,$length,$start); }
Az duplikáció ellenőrzés céljából hozzáadjuk a tömbhöz a jelenlegi elem nevét. Az elem nevei után álló kettőspont azt jelenti, hogy a kettőspont után álló elem egy referencia elem, melyet külön változóba mentünk. A stream_get_contents paraméterlistájába átadjuk a jelenlegi könyvtárat, a jelenlegi elem tulajdonságainak hosszát és a kezdetét. Eltároljuk egy asszociatív tömbben, mely indexei az elemek nevei lesznek. Foreach ciklusban kulcsérték pár alapján feldolgozzuk az előbb elmentett tömböt.
$attlines=explode("\n",substr($value,strpos($value,"@attributes"),strpos($value,"@pins")-strpos($value,"@attributes"))); $pinlines=explode("\n",substr($value,strpos($value,"@pins"),strpos($value,"@graphics")-strpos($value,'@pins'))); $graphstr=substr($value,strpos($value,"@graphics"));
Mindhárom sorban egymásba ágyazott metódusok által kapjuk meg tulajdonságokat tömbökre bontva sorok alapján. Az strpos az első string paraméterből a második paraméter első előfordulásának pozícióját a szövegből. A substr függvény által megkapjuk a paraméterben megadott karakterlánc egy részletét. Jelen esetben az strpos-al megadjuk az attribútumok kezdetét és végét jelző annotációk pozícióját. Második paraméter a kezdete, a harmadik paraméter pedig a pozíció különbsége, mely a hosszt fogja megadni.
9
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben
4.1.
Attribútumok feldolgozása
Az attribútum sorok az elemek tulajdonságainak nevét és értékét tartalmazza. Legtöbb attribútum minden elemnél változó, kivétel az elem megnevezése. Az attribútum értéke vagy állandó, vagy a felhasználó által megadható. A sor első karaktere mindig „a” és szóköz után mindig 0 áll, ezek jelölik az attribútum sorokat. A sor további értékeinek jelentését a 4.1.1. ábra szemlélteti. Az attribútum értékének és nevének kiírására szolgáló számok egyben az attribútum típusát jelölik. Minden szám bitenként különböző tulajdonságot jelöl, melyekből az utolsó jelöli számunkra, hogy szükséges-e a kiírása: 3 (0011), 9 (1001), 11 (1011), 13 (1101). a 1 s 3 0 0 0 hcn 100 LABEL=+5v a 0 sp 9 0 0 0 hln 100 REFDES=U? a 0 s 11 0 10 34 hln 100 PART=HPOLY a 0 u 13 0 16 38 hlb 100 TOLERANCE=
3 Label: címke.
9 Refdes (reference designator): darabjegyzék megnevezése.
11 Part: a jelenlegi elem neve.
13 Value, Tolerance, egyéb: minden elemnél különböző kirajzolásra kerülő attribútum, melyek értékei a felhasználó által változtathatóak.
4.1.1. ábra
10
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben for($k=0;$k<sizeof($attlines);$k++) { $attline=explode(" ",$attlines[$k]); if($attline[0]=="a" && isset($attline[3])) { if(in_array($attline[3],array("3","9","11","13"))) { $attribs[$key][]=$attlines[$k]; } } }
For ciklus futása alatt minden sorban felbontjuk az attribútumokat szóközönként. Az if feltételében az in_array visszatérési értéke igaz lesz, ha a tömb negyedik eleme 3,9,11,13. Ha a feltétel teljesül a sort két dimenziós asszociatív tömbbe írjuk.
11
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben
4.2.
Grafikák (Elektronikai rajzjelek) feldolgozása
A grafikák rész lényegében a kirajzolandó alakzatokat tartalmazzák. Ezek az alakzatok lehetnek kör, téglalap, vonal, görbe és Kezdő sora a @graphics kulcsszó és az alakzathoz tartozó szélesség, magasság, x és y tengelyen való eltolását tartalmazzák. Majd a további sorokban az alakzatokhoz tartozó paraméterek szerepelnek. $graphhead=substr($graphstr,0,strpos($graphstr,"\n")); $graphheader=explode(" ",$graphhead);
Mielőtt a grafikus részét is felbontanánk az attribútumokhoz hasonlóan, substr metódussal levágjuk az első sort. Külön dolgozzuk fel, hiszen ez minden további sorra érvényes lesz. @graphics 230 60 0 0
Az első szám az elem szélessége, a második a magassága. A negyedik az x koordinátája, az ötödik az y koordinátája. if($graphheader[0]=="@graphics") { $partghead[$key]["width"]=(int)$graphheader[1]; $partghead[$key]["height"]=(int)$graphheader[2]; $partghead[$key]["x"]=-(int)$graphheader[3]; $partghead[$key]["y"]=-(int)$graphheader[4]; }
A forráskód alapján asszociatív tömbökbe írjuk az előbb említett sorokat. Az x és y koordináták negatív értékét írjuk a változóba, hiszen az SVG más módon rajzolja ki a képet, mint a Schematics. Következő sorokban feldolgozzuk a grafikai rész további sorait. Egy switch case feltétel vizsgálat segítségével elágazást hozunk létre a sor első karakterétől függően. Switch case használatát csupán a program áttekinthetősége miatt választottunk, hiszen ugyan így meg lehetne oldani else, illetve elseif feltétel vizsgálattal is.
12
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben case "z": { $draw[$key].='
'; $draw[$key].='
font-family= "Verdana"
font-size="6pt"
font-
style="normal" font-weight="100" stroke="blue" stroke-width="0.1" opacity="0.9" >' .$graph[$m+7]; $draw[$key].=''; break; }
Első elágazásban „z” karakter esetén a sor egy karakterlánc tulajdonságait tartalmazza. Egy asszociatív tömbhöz hozzáfűzzük a szöveg SVG kódját. A
és kódok között egy csoport szerepel, melyre a g után megadott tulajdonságok lesznek érvényesek. Jelen esetben egy konkrét transzformációt alkalmazunk, amely az első sorban elmentett x és y koordinátával történő eltolás. Következő sorban a sorban lévő x és y értéke a sor harmadik és negyedik eleme, amely a szöveg x és y koordinátája. A stoke érték a betűk színét jelöli, stoke-width a vastagságát és az opacity az átlátszóságot 1 és 0 érték között, melynél 0 teljesen átlátszó. A tag-ek között elhelyezzük a hetedik tömbelemet, amely a kiírandó string. case "r": { $rectw=$graph[$m+2]+$graph[$m+4]; $recth=$graph[$m+3]+$graph[$m+5]; $graph[$m+4]=$graph[$m+4]-10; $draw[$key].='
'; $draw[$key].='
x="'.$graph[$m+2].'"
y="'.$graph[$m+3].'"
width="'.$graph[$m+4].'"
height="'.$graph[$m+5].'"
stroke="black" stroke-width="0.3" fill="none" >'; $draw[$key].=''; break;
Ha a feltétel „r” karakter esetén teljesül akkor az alakzat rectangle, vagyis téglalap. A könyvtárakban megadott paraméterek egyszerű feldolgozásnál nem a várt eredményt adják vissza. Ezért az első sorokban a hibák kiküszöbölésére elmentjük a koordinátáit hogy az oldalak széléhez lehessen igazítani a lábakat. A hozzá tartozó width és height tulajdonságok a szélességét és a magasságát jelölik.
13
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben case "c": { $draw[$key].='
'; $draw[$key].=''; $draw[$key].=' class="partdraw />'; break; }
Schematic forrásfájlban a „c” a kör jele, míg az SVG-ben a circle kulcsszóval rajzolhatunk kört és az x és y paraméter helyett most cx és cy paramétert kell megadni, amelyek a kör középpontjának koordinátáit jelentik. Szintén elengedhetetlen megadnunk a kör sugarát, melyet az „r” paraméterrel tudjuk megadni. A fill paramétert mindenképp none értéket kell adnunk az összes alakzatnál, hiszen ez az alakzat kitöltését jelenti, és ha más értékre állítjuk a benne található alakzatokat elfedi. case "v": { $draw[$key].='
'; $offset=2; $draw[$key].='<path d="M'.$graph[$m+2].' '.$graph[$m+3];
A leggyakrabban előforduló alakzat a „v” karakterrel jelölt vonal, illetve törött vonal. SVG-ben törött vonalat a path kulcsszóval rajzolhatunk, melyben az M (move to) paranccsal ugorhatunk az utána szereplő két koordinátával megadott pontba. while($graph[$m+$offset]!=";") { $draw[$key].=' L '.$graph[$m+$offset].' '.$graph[$m+$offset+1]; $offset=$offset+2; } $draw[$key].='" stroke="black" stroke-width="0.3" fill="none"/>';
Az előző törött vonal kirajzolása while ciklussal. Minden törött vonalat, illetve vonalat rajzoltató utasítás végén pontosvessző szerepel a könyvtárakban. Erre alapozva állítjuk be a ciklus futási feltételét. Az path-ban „L” (line to) parancs segítségével rajzolhatunk vonalat jelenlegi pozíciónkból a megadott pontba. Egészen addig fut a ciklus, amíg ki nem rajzoltunk minden vonalat, amely az elemhez tartozik.
14
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben $draw[$key].='
<path d="M '.$p1x.' '.$p1y.' Q '.$p2x.','.$p2y.' '.$p3x.','.$p3y.'" stroke="black" stroke-width="0.3" fill="none"/>'."\n"; break; }
Utolsó alakzat, amelyet tartalmaznak a könyvtárak a görbe, melyet az „a” (arc) betű szimbolizál. A Schematics-ban minden görbét három ponttal adunk meg. Az Schematics-ban ezen a három ponton keresztül rajzolódik ki a görbe 4.2.1 ábrán szemléltetve. A weblapon ez a sugár kiszámolása után az SVG-ben megadott elliptikus görbe kirajzolásának segítségével történik, melynek szintaktikája „a rx ry x-axis-rotation large-arc-flag sweep-flag x y”.
4.2.1. ábra A sugár meghatározása az alábbi matematikai képlet használatával lehetséges. 𝑟=
𝑎𝑏𝑐 𝑎 + 𝑏 + 𝑐 𝑏 + 𝑐 − 𝑎 𝑐 + 𝑎 − 𝑏 (𝑎 + 𝑏 − 𝑐)
Ez a képlet a háromszög köré rajzolható kört adja meg. Mivel három pont adott, így ki kell számolnunk A, B és C oldalakat. Következő képlet segítségével számolja ki a program. 𝑑=
𝑥2 − 𝑥1
2
+ (𝑦2 − 𝑦1 )2
$a=sqrt(pow($p2x-$p3x,2)+pow($p2y-$p3y,2)); $b=sqrt(pow($p1x-$p3x,2)+pow($p1y-$p3y,2)); $c=sqrt(pow($p2x-$p1x,2)+pow($p2y-$p1y,2)); $r=$a*$b*$c/sqrt(($a+$b+$c)*($b+$c-$a)*($a+$c-$b)*($a+$b-$c)); $draw[$key].='
<path d="M '.$p1x.' '.$p1y.' A '.$r.','.$r.' 0 0,0 '.$p3x.','.$p3y.'" stroke="black" stroke-width="0.3" fill="none"/>';
15
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben Az alábbi kóddal rajzolható ki a görbe. Az első négy sor az oldalak és a sugár kiszámítása a fenti képletek alapján. Utolsó két sorban a görbe kirajzolása SVG-vel és egy változóban való eltárolása. Az elliptikus görbe egy egyedi path parancs, esetünkben ellipszis helyett egy kör részletére volt szükségünk, ezért az rx és ry sugarak megegyeznek. A következő paraméterekkel adható meg sorrendben:
(x1, y1) a jelenlegi „út” relatív koordinátáit jelölik, melyeket az előző parancs koordinátáiból kap meg.
rx és ry a görbe sugarai (más néven a nagytengely és a kistengely).
φ a jelenlegi koordináta rendszer x tengelye és az ellipszis x tengelye által bezárt szög.
fA a nagy görbe jelzőbit, az érték 0, ha a görbe kisebb vagy egyenlő, mint 180° alatt látszó szakasza lett kiválasztva, vagy 1, ha a görbe nagyobb, mint 180° alatt látszó szakasza lett kiválasztva.
fS az ív jelzőbit, az értéke 0, ha a vonal a kisebb szög külsején ível keresztül, az értéke 1, ha a vonal a nagyobb szög külsején ível keresztül.
(x2, y2) az abszolút koordinátái a görbe végpontjainak. [6]
4.2.4. ábra fA és fS
16
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben
4.3.
Lábak feldolgozása
A @pins kulcsszó után találhatóak a lábak kirajzolásához szükséges információk és a hozzájuk tartozó attribútumok. A „p” karakterrel kezdődő sorok a lábakat jelölik, az „a” karakterrel kezdődőek pedig lábakhoz tartozó attribútumokat, melyek a megjelenítés szempontjából feleslegesek. A lábak feldolgozása kezdetben hasonló, mint az attribútumok és a grafikák feldolgozása. Soronként felbontjuk tömbökre a több karakterből álló jelölések okán. for($n=1;$n<sizeof($pinlines);$n++){ $pins[$n]=explode(' ',$pinlines[$n]); if($pins[$n][0]=='p' || $pins[$n][0]=='a'){ if(!($pins[$n][6]=="GND" || $pins[$n][6]=="PWR")) { $pinx=$pins[$n][8]; $piny=$pins[$n][9];
Egy ciklussal soronként felbontjuk tömbre a jelenlegi elemhez tartozó részt, majd elmentjük egy tömb változóban a jelenlegi sor számát megadva indexként, így létrehozva egy két dimenziós tömböt. Egy feltételvizsgálatban megnézi, hogy a tömbünk első eleme a „p” vagy „a” karakter, amely a lábat és a hozzá tartozó attribútumot jelöli. Mivel a GND és PWR nevű lábakat nem jelölik áttekinthetőség céljából a kapcsolási rajzokon, ezért az ilyen nevű lábakat nem dolgozzuk fel. A tömb 8. és 9. elemét elmentjük külön változóba, mivel ezek a lábakhoz tartozó x és y koordináták. if(!(($pins[$n][7]=='z')||($pins[$n][0]=='a'))){
A nyolcadik tömbelemben szereplő „z” karakter olyan lábat jelöl, mely információ megjelenítésére elhelyezett elemhez tartozik és megjelenítés céljából nincs értelme feldolgozni. A lábak attribútum sorait szintén nem kívánjuk feldolgozni.
17
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben switch ($pins[$n][10]){ case "h":$normalpin='h10'; $bubblepin='h5 a2.5,2.5 1,1 10 0.1';$circlepin='h10 m0 2.5 l2.5 -2.5 l-2.5 -2.5'; $tanchor="right"; break;
A tömb tízedik eleme a láb irányát mutatja. A forrásban 3 féle „N” „B” és „C” lábtípus van és mindegyik elforgatható 90°, 180° és 270°-al, mely lehetőségeket a 4.3.1. ábra szemlélteti. Minden irányba minden lábtípus külön SVG paraméterét beírjuk változóba és a következő switch minden case-ében kiválasztjuk a megfelelőt. Majd a szöveg jobbra, balra vagy középre igazítását elmentjük egy változóba, hogy később az SVG kódban ezt adjuk meg a kívánt paraméter értékének.
4.3.1. ábra $pins[$n][2]=$pins[$n][2]-10; if(isset($rectw)) { $pinx=$rectw; }
A téglalapok eltolt oldalaihoz most hozzá igazítjuk a lábakat, melyeket csak a négyszögek jobb szélére és az aljára szükséges elvégeznünk.
18
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben $pintext=$pins[$n][6]; if($pintext[0]=="\\") { $pintext=substr($pintext,1,strlen($pintext)-2); $decor='text-decoration = "overline"'; } else { $decor='';
A tömb 6. eleme a lábak neve melyet változóban tárolunk. Feltételvizsgálatban megnézi a karakter első elemét és ha „\” karakter akkor azt jelenti, hogy negált láb, amit neve felé húzott vonallal jelölünk. A Schematics a negált láb neve előtt és után lévő „\” jelekkel jelöli (pl. \Z\). Ez a jelölés SVG-ben text decoration paraméterben az overline kulcsszóval adható meg. A substr metódussal levágjuk a string első és utolsó karakterét ezzel eltávolítva a „\” jeleket. A feltételvizsgálat minden más esetben üresen hagyja a dekorációhoz rendelt változót. if($pins[$n][1]=="2") { $px[$n]=$partghead[$key]["x"]+$pins[$n][2]; $py[$n]=$partghead[$key]["y"]+$pins[$n][3]; $pscale=$pins[$n][5]/100; $pindraw.='
'.$pintext.'’;
Csak azokat a lábakat kívánjuk kirajzolni, amely második tömbeleme „2”, mert általában ezek a lábak szerepelnek a kapcsolási rajzokon, ettől eltérő számmal jelölt lábak a kirajzolás szempontjából lényegtelenek (pl. 16=GND). Az elem eltolását hozzáadja a láb elemen belüli eltolásához így megkapva azt a koordinátát ahova a lábat kell kirajzolni.
19
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben
Egy string változóhoz hozzáfűz minden kirajzolni kívánt SVG szöveget, majd ezt a string-et később eltárolja egy asszociatív tömbben, melynek indexe az elem neve. Ezáltal az elem nevével lehetséges hivatkozni az elem lábainak kirajzolásához. Paraméterben megadjuk az előbb beállított koordinátát eltolásnak, és a dekorációt, ezek mellett vörös színű kitöltés a könnyebb megkülönböztetés céljából. Új paraméterként text-anchor kerül elő, amely a szöveget az változóból megkapott pozícióba igazítja.
case "n": $pindraw.='<path transform="translate('.$partghead[$key]["x"].', '.$partghead[$key]["y"].')" d="M '.$pinx.' '.$piny.' '.$normalpin.'" stroke="blue" stroke-width="0.3" fill="none" />'; break; case "b": $pindraw.='<path transform="translate('.$partghead[$key]["x"].', '.$partghead[$key]["y"].')" d="M '.$pinx.' '.$piny.' '.$bubblepin.'" stroke="blue" stroke-width="0.3" fill="none" />'; break; case "c": $pindraw.='<path transform="translate('.$partghead[$key]["x"].', '.$partghead[$key]["y"].')" d="M '.$pinx.' '.$piny.' '.$circlepin.'" stroke="blue" stroke-width="0.3" fill="none" />'; break;
A 4.3.1. ábrán szemléltetett lábtípusok kirajzolásra kerülnek elágazás teljesülése alapján.
20
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben
4.4.
Referencia elemek
A referencia elemek szerepe Schematics-ban az elemek hivatkozása egy megegyező szimbólumú elemre. Az ilyen hivatkozás a könyvtárakban „Elem neve: Hivatkozott elem” szintaktikával van megoldva. foreach($refparts as $key=>$value) { $partref=substr($key,strpos($key,":")+1); $currentpart=substr($key,0,strpos($key,":"));
A referencia változóknak létrehozott tömbön végigmegy egy ciklussal kulcs-érték alapján. Majd következő két sorban külön választjuk az elem nevét és a hivatkozott elem nevét. Az strpos metódussal megállapítva kettőspontig tartó részt leválasztása substr-el adja az elem nevét, kettőspont után a hivatkozott elem nevét. if(isset($attribs[$partref])) { $attribs[$currentpart]=$attribs[$partref]; }
Referencia elem indexű attribútum tömb létezése esetén a jelenlegi elem attribútumai helyére beírjuk a hivatkozott elem attribútumait. else { if(!isset($refflag[$key]) || $refflag[$key]!=true) { array_push($refparts,$key); $refflag[$key]=true; }}
21
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben Hamis feltétel teljesülésénél az elemet hozzáadjuk a referencia tömbhöz array_push metódussal. Az array_push alkalmazásával a tömb végére kerül az elem, amely azért szükséges, mert a hivatkozott elem később szerepel a könyvtárban, mint a hivatkozó. Ezáltal az összes elem feldolgozása után újra megpróbáljuk a feldolgozást. Végtelen ciklus elkerülésére jelzőbitet hozunk létre minden későbbi feldolgozásra szánt elemhez, így csak akkor írjuk a tömb végére az elem nevét, ha a jelzőbit nem létezik vagy nem „igaz” értéket ad. Bármelyik feltétel nem teljesülése esetén az elemet már megpróbáltuk feldolgozni másodszorra is. Elfogadható lehetőség lenne jelzőbit helyett inkrementálni egy változót és adott számnál abbahagyni az elem feldolgozását, de a Schematicsban nincs többszörös hivatkozás (pl. 1:2 és 2:3), ezért elég egy jelzőbit.
22
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben
5. Tokozás feldolgozása Elektronikai áramkörök megépítésénél számít a tokokban lévő kapuk lábainak számozása. Erre a problémára a Schematics megoldása a tokozás könyvtár, melyben beállíthatjuk egy kapunak a lábszámozását. Az 5.1. ábrán szemléltetve a lábak számozásának oka.
5.1. ábra 7402 NOR kapuk lábszámozása A tokozás könyvtárban 5.1. ábrán szereplő NOR kapu lábak A, B, C és D kapukra vannak felbontva. *package 7402 @types 4 g 1 A,B,C,D
Minden kapuhoz hozzárendelve A, B bemenet és Y kimenet. Az A kapuban a két bemenet 2 és 3, amíg a kimenet 1. @pinout t DIP14 g1 p A 2,5,8,11 p B 3,6,9,12 p Y 1,4,10,13A
23
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben foreach($packages as $key=>$value) { $typelines=explode("\n",substr($value,strpos($value,"@types"),strpos($value,"@pinout")-strpos($value,'@types'))); $pinoutlines=explode("\n",substr($value,strpos($value,"@pinout")));
Kulcs-érték pár alapján végigmegyünk az asszociatív tömbön, amiben eltároltuk az elemekhez tartozó adatokat. Két részre bontjuk, az egyik a típusok sorai, másik a lábszámok sorai lesznek. for($q=0;$q<sizeof($typelines);$q++) { if(strstr($typelines[$q],"@types")) { $typehead=explode(" ",$typelines[$q]); $tnum=(int)$typehead[1];
Ciklussal minden sorban megvizsgáljuk, hogy szerepel-e „@types” kulcsszó, ha teljesül a feltétel, akkor felbontjuk a sort szóközönként tömbre és elmentjük az másodikat egy változóba. Ez a szám jelzi a kapuk számosságát. if(isset($typelines[$q][0]) && $tnum!=1) { if($typelines[$q][0]=="g") { $typegroups=explode(" ",$typelines[$q]); $group=explode(",",$typegroups[2]); }
Feltételvizsgálatban üres sorokat és 1 kapuval rendelkező elemeket kizárva „g” karakterrel kezdődőeket felbontva szóközönként tömbökre majd a 3. tömbelemet felbontjuk vesszőnként tömbre. Így az alábbi sorból g 1 A,B,C,D megkapjuk a kapuk neveit tömbbe írva.
24
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben for($r=0;$r<sizeof($pinoutlines);$r++) { if(isset($pinoutlines[$r][0]) && $tnum!=1) { if($pinoutlines[$r][0]=="p") { $pinogroups=explode(" ",$pinoutlines[$r]); $pgroup[]=explode(",",$pinogroups[2]); array_push($pinname,$pinogroups[1]);
A lábak számozását tartalmazó sorokat is feldolgozzuk, az üres és egy kaput tartalmazó sorokon kívül mindet. A „p” karakterrel kezdődő sorokat felbontjuk szóköz és vessző alapján. Ezekből több sor is lehet, pontosan annyi ahány lába van az elemnek. Ezért minden sort külön sorba írunk a tömbbe, így létrehozva egy kétdimenziós tömböt. A lábak nevét jelzi a tömb első eleme, későbbi feldolgozáshoz elengedhetetlen, ezért egy tömbben tároljuk. for($s=0;$s<$tnum;$s++) { $packkvp[$key][$s][0]=$group[$s]; for($v=0;$v<sizeof($pgroup);$v++) { $packkvp[$key][0][$v+1]=$pinname[$v]; $packkvp[$key][$s][$v+1]=$pgroup[$v][$s];
Ciklust indítunk melynek futási feltétele a kapuk száma. Minden kapunevet elmentünk sorrendben, egy asszociatív tömb első oszlopába, melynek indexe az elem neve. Újabb ciklust indítunk, ami addig fut, amíg a lábak számát tartalmazó tömb sorait fel nem dolgoztuk. Az első sort feltöltjük a lábak neveivel. Ezeket a sorokat hozzáadjuk természetesen a könyvtárban lévő sor és oszlop felcserélésével az előző asszociatív tömbhöz, a második oszloptól kezdődően, így létrehozva elemenként egy kétdimenziós mátrixot, melyet az 5.2. táblázat szemléltet.
25
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben
A
B
Y
A
2
3
1
B
5
6
4
C
8
9
10
D
11
12
13
5.2. táblázat
26
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben
6. Schematics fájlok feltöltése A Schematics fájlok feltöltésére két lehetőség adott a weblapon. Az első lehetőség a kliens gépről való feltöltés, melynek segítségével a felhasználók a saját elkészített fájljaikat tudják feltölteni és megtekinteni. A másik lehetőség a szerver egy mappájában tárolt fájlok feltöltése, tehát a hallgatók megtekinthetik, illetve kinyomtathatják a tanár által elkészített órai feladatokat.
6.1.
Kliensről történő feltöltés
Az alábbi kód kliens gépről való feltöltést szolgálja. A form elemének aktiválása esetén az action paraméterben megadott $_SERVER['PHP_SELF']; parancs lefutása a weblap újratöltését eredményezi. Az input accept paraméterében adható meg hogy milyen fájlokat fogadjon el, amely jelen esetben sch kiterjesztésű, így csak a Schematics fájljait lehet feltölteni. Fájl kiválasztása után meghívódik a paraméter nélküli submit függvény, amely az adatok elküldését eredményezi.
27
Elektronikai áramkör szimulátor schematics forrásfájlt vektoros webes (SVG) kódra konvertáló oktatási segédprogram kifejlesztése PHP-ben
6.2.
Szerverről történő feltöltés