Institutionen f¨
or datavetenskap
Department of Computer and Information Science
Examensarbete
Visualisering av elektroniska
kopplingsscheman
avJohan Bohlin
LIU-IDA/LITH-EX-G–09/008–SE
2009-09-29
Link¨opings universitet SE-581 83 Link¨oping, Sweden
Link¨opings universitet 581 83 Link¨oping
Examensarbete
Visualisering av elektroniska
kopplingsscheman
avJohan Bohlin
LITH-IDA-EX-2009/EX-G–09/008–SE
2009-09-29
Handledare: Per Nilsson, AnSyn AB Examinator: Peter Fritzson
Sammanfattning
AnSyn AB ¨ar ett f¨oretag i Link¨oping som utvecklar programvara f¨or att optimera analog elektronik. I deras program Analog Dimensions finns en visualiseringsmodul som ritar upp de kopplingsscheman som elektronikkon-strukt¨oren arbetar med. Ansyn var inte n¨ojda med den l¨osningen de hade. Den gamla visualiseringsmodulen hade flera begr¨ansningar och i denna rap-port kan du f¨olja arbetet med att ta fram en ny visualiseringsmodul. Arbetet resulterade i en helt ny visualiseringsmodul som saknar de begr¨ansningar som den gamla visualiseringsmodulen hade. Visualiseringsmodulen ¨ar helt skriven i Java och anv¨ander sig av ett grafikbibliotek vid namn Netbeans Visual Library. Det ¨ar ett bibliotek med ¨oppen k¨allkod som bland annat kan anv¨andas f¨or visualisering av vektorgrafik. Rapporten inneh˚aller ¨aven en unders¨okning av programbibliotek f¨or Java som hanterar vektorgrafik. I unders¨okningen studerades totalt 15 olika bibliotek.
Inneh˚
all
1 Inledning 1 1.1 Bakgrund . . . 1 1.2 Syfte . . . 1 1.3 Avgr¨ansning . . . 1 1.4 Metod . . . 2 1.4.1 Milstolpar . . . 2 1.5 Kravspecifikation . . . 2 1.5.1 Obligatoriska krav . . . 2 1.5.2 Frivilliga krav . . . 3 2 Analys 5 2.1 N¨atlistan . . . 5 2.2 Koordinatsystemet . . . 7 2.3 Anv¨andarinteraktioner . . . 7 2.4 Externa programbibliotek . . . 72.5 Unders¨okta bibliotek . . . 8
2.5.1 Netbeans Visual Library . . . 8
2.5.2 JGraph . . . 9
2.5.3 JFDraw . . . 9
2.5.4 Batik SVG Toolkit . . . 9
2.6 Resultat av unders¨okningen . . . 9
3 Netbeans Visual Library 11 3.1 Widget . . . 11
3.2 Scene . . . 11
3.3 LayerWidget . . . 12
3.4 WidgetAction . . . 12
3.5 LookFeel . . . 13
4 Design och Implementation 15 4.1 Verktyg . . . 15
4.2 Koordinatsystemet i NVL . . . 15
4.3 Den nya visualiseringsmodulen . . . 16
4.4 schematicDisplay2 . . . 16
4.6 schematicWidget . . . 17 4.6.1 componentWidget . . . 17 4.7 Hantering av h¨andelser . . . 18 4.7.1 Selektionsverktyget . . . 19 4.7.2 Panoreringsverktyget . . . 19 4.7.3 Zoomverktyget . . . 20 4.8 LookFeel . . . 20 4.9 Manual . . . 20 5 Resultat 21 6 Diskussion 25 6.1 Framtida arbete . . . 25 Referenser 27 Bilagor:
A Lista ¨over alla klasser 29
Figurer
1 Exempel p˚a n¨atelement visualiserad av gamla visualiseringsmod-ulen . . . 6 2 Exempel p˚a tr¨ad med Widgets . . . 12 3 Klasshierarki av widgets . . . 18 4 Exempel p˚a meny som visas n¨ar anv¨andaren h¨ogerklickar p˚a
ett n¨atelement . . . 22 5 Exempel p˚a hur information kan visas bredvid ett n¨atelement 23 6 J¨amf¨orelse av f¨argscheman . . . 24
Kapitel 1
Inledning
Detta kapitel behandlar bakgrunden till arbetet, dess omfattning samt hur och varf¨or det genomf¨ordes. Kapitlet avslutas med kravspecifikationen.
1.1
Bakgrund
AnSyn AB utvecklar och marknadsf¨or ett program, Analog Dimensions, som anv¨ands av konstrukt¨orer av analog elektronik. Programmet automa-tiserar mycket av konstrukt¨orens annars manuella och tidskr¨avande jobb. I programmet kan de konstruktioner som konstrukt¨oren arbetar med visualis-eras. S.k. n¨atelement (komponenter, n¨at, pinnar och terminaler) p˚a ritnin-gen ritas upp p˚a sk¨armen, och anv¨andaren har m¨ojlighet zooma, panorera, markera komponenter med mera. AnSyn var inte n¨ojda med den befintli-ga l¨osningen som hade flera begr¨ansningar. De ville ha en ny och b¨attre visualiseringsmodul med b¨attre funktionalitet ¨an den gamla l¨osningen.
1.2
Syfte
Syftet med detta arbete var att utifr˚an en kravspecifikation ta fram en ny visualiseringsmodul som i slut¨andan skulle ers¨atta den gamla visualis-eringsmodulen.
1.3
Avgr¨
ansning
Ett antal avgr¨ansningar gjordes f¨or att begr¨ansa arbetets omfattning. Av alla de ¨onskem˚al som AnSyn hade p˚a den nya visualiseringsmodulen, valdes 14 av kraven ut. 12 av dessa blev obligatoriska krav, och tv˚a frivilliga krav som skulle genomf¨oras i m˚an av tid. En annan avgr¨ansning var att l¨osningen inte skulle inf¨oras i Analog Dimensions.
1.4
Metod
Det grafiska gr¨ansnittet i Analog Dimensions ¨ar skrivet i Java. Arbetet b¨orjade d¨arf¨or med att unders¨oka m¨ojligheterna att arbeta med vektorgrafik i Java. Java har inbyggda funktioner f¨or att rita upp enkla geometriska fig-urer, s˚asom linjer, cirklar med mera m.h.a. Graphics-klassen[1, s. 230]. Vi-sualiseringsmodulen kr¨aver dock mer ¨an att bara rita upp figurerna. Att implementera alla de funktioner som kravspecifikationen kr¨aver, ist¨allet f¨or att anv¨anda ett mjukvarubibliotek, skulle g¨ora utvecklingstiden l¨angre[2, s. 13]. D¨arf¨or gjordes en unders¨okning f¨or att hitta ett l¨ampligt Java-bibliotek som har mycket av den funktionalitet som ¨ar ¨onskad. I den gamla l¨osningen anv¨andes ett bibliotek som heter JGraph, men AnSyn var inte helt n¨ojda med det. JGraph anv¨andningsomr˚ade ¨ar fr¨amst f¨or grafteoretiska applikationer[4]. AnSyn trodde att det skulle finnas andra l¨ampligare bib-liotek f¨or denna uppgift.
Totalt unders¨oktes 15 olika Java-bibliotek, och i samr˚ad med AnSyn valdes det som ans˚ags l¨ampligast ut. Efter detta tog arbetet med att designa och implementera l¨osningnen vid.
1.4.1
Milstolpar
F¨or att se att utvecklingsarbetet fortl¨opte enligt planeringen sattes tre mil-stolpar upp:
1. Vecka 5: Kunna rita ut ett schema (Motsvarar krav 1)
2. Vecka 7: Kunna zooma och panorera i schemat (Motsvarar
ungef¨ar krav 2 och 3)
3. Vecka 10: Visualisering fungerar enligt kravspecifikation
1.5
Kravspecifikation
Kravspecifikationen bestod av totalt 14 krav.
1.5.1
Obligatoriska krav
1. Kopplingsschemats olika n¨atelement (komponenter, n¨at, terminaler och pinnar) skall visualiseras enligt indata
2. Anv¨andaren skall kunna zooma in, zooma ut, zoom to fit, zooma in p˚a markerat omr˚ade, zooma in p˚a vald komponent, n¨at, pin eller terminal, zooma till en viss area specifierad med koordinater
3. Anv¨andaren skall kunna panorera med musen samt piltangenterna 4. Markera komponenter, n¨at, terminaler, pinnar som ¨ar specifierade i en
5. Anv¨andaren skall kunna specificera vilka av objekten som ¨ar marker-bara
6. Anv¨andaren skall kunna extrahera koordinaterna f¨or den markerade arean samt nuvarande musposition
7. Olika menyer f¨or olika typer av objekt skall visas n¨ar anv¨andaren h¨ogerklickar p˚a objekten
8. Anv¨andaren skall kunna specificera om n˚agot/n˚agra objekt ej skall ritas upp
9. Anv¨andaren skall kunna f˚a en lista med de objekt som f¨or tillf¨allet ¨ar markerade
10. Texter skall vara vektoriserade, f¨or att undvika fula texter vid in-zoomning
11. Vald area skall kunna exporteras till en bild
12. Till objekten skall man kunna koppla information som visas bredvid komponenten
1.5.2
Frivilliga krav
1. Solder dots1skall visas
2. Anv¨andaren skall kunna ¨andra f¨argschema, mellan svart och vit bak-grund
Kapitel 2
Analys
I detta kapitel beskrivs hur kravspecifikationen analyserades, f¨or att kunna g˚a vidare med att l¨osa uppgiften.
2.1
N¨
atlistan
F¨orsta kravet p˚a kravspecifikationen var att alla n¨atelement skall visualis-eras enligt indata. Den indata som visualiseringsmodulen ska rita upp ¨ar en s.k. n¨atlista (eng. netlist). En n¨atlista best˚ar av flera olika n¨atelement av fyra olika typer: komponenter, n¨at, pinnar och terminaler. I Analog Di-mensions beskriver n¨atlistan f¨orutom hur de olika n¨atelementen ¨ar anslutna till varandra, ¨aven information som beh¨ovs f¨or att kunna rita upp dem ko-rrekt. Varje n¨atelement har tre olika delar av information som anv¨ands f¨or att visualisera den. F¨orsta delen ¨ar en x- och y-koordinat som beskriver vart elementet skall ritas ut. Andra delen ¨ar en speciellt kodad textstr¨ang som beskriver hur det ska ritas upp. Textstr¨angen best˚ar av ett antal olika geometriska former som tillsammans bildar en figur. Det finns totalt fem olika former som figuren kan best˚a av: rektangel, cirkelb˚age, ellipse, polygon samt polygont˚ag1. Figuren kan ocks˚a inneh˚alla vanlig text (etiketter) som
ska ritas upp. Exempel p˚a textstr¨ang som beskriver en figurs utseende:
label — [@partName] — R0 — 0.5 — -1.40625 — device — 231: label — [@instanceName] — R0 — 1.0 — -0.8125 — instance — 236: rect — 0.0 — -2.25 — 1.25 — -0.5625 — instance — 236:
label — AGND — R270 — 0.5 — -1.9625 — pin — 229: label — AVDD — R270 — 0.5 — -0.85 — pin — 229: label — Vn5 — R0 — 0.9625 — -1.1875 — pin — 229: label — Vn6 — R0 — 0.9625 — -1.3125 — pin — 229: label — Vn8 — R0 — 0.9625 — -1.4375 — pin — 229: label — Vn9 — R0 — 0.9625 — -1.5625 — pin — 229: rect — 0.0 — -2.0 — 1.0 — -0.8125 — device — 231: line — 0.5 — -2.25 — 0.5 — -2.0 — device — 231: line — 0.5 — -0.5625 — 0.5 — -0.8125 — device — 231:
line — 1.25 — -1.1875 — 1.0 — -1.1875 — device — 231: line — 1.25 — -1.3125 — 1.0 — -1.3125 — device — 231: line — 1.25 — -1.4375 — 1.0 — -1.4375 — device — 231: line — 1.25 — -1.5625 — 1.0 — -1.5625 — device — 231: rect — 0.475 — -2.275 — 0.525 — -2.225 — pin — 229: rect — 0.475 — -0.5875 — 0.525 — -0.5375 — pin — 229: rect — 1.225 — -1.2125 — 1.275 — -1.1625 — pin — 229: rect — 1.225 — -1.3375 — 1.275 — -1.2875 — pin — 229: rect — 1.225 — -1.4625 — 1.275 — -1.4125 — pin — 229: rect — 1.225 — -1.5875 — 1.275 — -1.5375 — pin — 229;
De olika formerna som tillsammans bildar n¨atelement ¨ar separerade med semikolon. En form best˚ar sedan av ett antal olika delar som ¨ar sepa-rerade med tre tecken: — . De olika delarna inneb¨ar olika saker beroende p˚a vilken form det ¨ar. En av formerna i figuren ovan ser ut s˚ah¨ar:
rect — 0.0 — -2.0 — 1.0 — -0.8125 — device — 231:
Den beskriver en rektangel, vars h¨orn har koordinaterna (0.0, -2.0) samt (1.0, -0.8125). Formen ligger i lagret device och den ska ha f¨arg nummer 231.
Hur hela n¨atelementet som beskrivs ovan ser ut n¨ar det visualiseras med den gamla visualiseringsmodulen ses i figur 1.
Figur 1: Exempel p˚a n¨atelement visualiserad av gamla visualiseringsmodulen Tredje delen som beskriver n¨atelementet ¨ar en textstr¨ang som best¨ammer om det skall roteras eller speglas p˚a n˚agot s¨att. Totalt finns ˚atta olika m¨ojliga s¨att f¨or n¨atelementen att rotera och/eller speglas:
• R0 - Rotation 0 grader
• R90 - Rotation 90 grader moturs • R180 - Rotation 180 grader
• MX - Spegling runt X-axeln • MY - Spegling runt Y-axeln
• MXR90 - Spegling runt X-axeln + Rotation 90 grader moturs • MYR90 - Spegling runt Y-axeln + Rotation 90 grader moturs
2.2
Koordinatsystemet
F¨or att visualisera indatan korrekt m˚aste man ¨aven k¨anna till vilket koordi-natsystem som anv¨ands. I indatan ¨ar alla positioner i kartesiska koordinater, d¨ar X-axeln v¨axer ˚at h¨oger fr˚an origo, och Y-axeln upp˚at. Koordinaterna ¨
ar flyttal med maximalt fyra decimalers noggrannhet. Koordinaten 1.275, -1.5375 befinner sig s˚aledes sydost om origo.
2.3
Anv¨
andarinteraktioner
M˚anga av kraven p˚a kravspecifikationen handlar om olika typer av anv¨andarinteraktioner. Anv¨andaren skulle t.ex. kunna markera objekt, zooma in p˚a markerat omr˚ade med mera. Dessa anv¨andarinteraktioner skulle kun-na ha l¨osts p˚a flera olika s¨att, dock hade Ansyn synpunkter p˚a hur de skulle fungera. De ville att anv¨andarinteraktionerna skulle likna de i ett annat program som anv¨ands tillsammans med Analog Dimensions. Detta f¨or att underl¨atta f¨or anv¨andarna av programmen.
2.4
Externa programbibliotek
Att l¨osa uppgiften utan externa programbibliotek skulle ha varit helt m¨ojligt. Java har inbyggda funktioner f¨or att rita upp de enkla figurer som skall ritas upp, m.h.a. Graphics-klassen[1, s. 230]. Det skulle dock har beh¨ovts mycket arbete f¨or att klara av hela kravspecifikationen. Ist¨allet har ett programbib-liotek anv¨ants som hade mycket av den funktionalitet som ¨onskades inbyggt. Att anv¨anda sig av externa programbibliotek har flera f¨ordelar:[2, s. 13]
• Kortare utvecklingstid • H¨ogre utvecklingskostnad
• Snabbt f˚a fram en fungerande prototyp
• Det externa programbiblioteket kan ibland ge extra funktionalitet som g¨or slutprodukten b¨attre
Det finns dock flera saker att ha i ˚atanke n¨ar externa programbibliotek tas in:[2, s. 14]
• Tillverkaren kan g˚a in konkurs
• Kvaliteten p˚a komponenten kan vara d˚alig • Risk att tappa kontroll ¨over funktionaliteten
2.5
Unders¨
okta bibliotek
Totals unders¨oktes 15 grafikbibliotek. Nedan presenteras endast de fyra bib-liotek som ans˚ags vara mest intressanta. De grafikbibliotek som unders¨oktes var:
• Netbeans Visual Library[3] • JGraph[4]
• JFDraw[5]
• Batik SVG Toolkit[6] • JGo[7]
• yFiles for Java[8]
• Tom Sawyer Visualization - Java Edition[9] • FreeHEP VectorGraphics[10]
• Graphical Editing Framework[11] • Piccolo2d[12]
• Mica Graphics Framework[13] • Diva[14]
• JHotDraw[15] • JDrawing[16] • JUNG[17]
2.5.1
Netbeans Visual Library
Netbeans Visual Library (i forts¨attningen ben¨amnt NVL) ¨ar ett bibliotek som ¨ar en del av Netbeans Platform som ¨ar ett helt ramverk f¨or att un-derl¨atta programutveckling p˚a Java-platformen[3] [18]. Biblioteket kan dock anv¨andas frist˚aende fr˚an Netbeans Platform. Biblioteket kan visualisera vek-torgrafik, men ¨aven graf-teoretiska problem. Det har st¨od f¨or zoomning, selektion av objekt, animeringar, lager med mera. Det finns mycket doku-mentation om biblioteket samt flera kodexempel som visar hur biblioteket kan anv¨andas. Det ¨ar ¨oppen k¨allkod.
2.5.2
JGraph
JGraph ¨ar det javabibliotek som anv¨andes i den gamla visualiseringsmod-ulen. Det ¨ar ett bibliotek som ¨ar gjort f¨or visualisering av grafer av olika slag, bland annat processdiagram, fl¨odesscheman, databasvisualisering och elek-troniska kretsar[4]. Biblioteket har m˚anga inbyggda funktioner, bland an-nat zoom-m¨ojligheter, selektion av objekt, gruppering av objekt, m¨ojlighet att skapa olika lager med mera. Det ¨ar ett v¨alanv¨ant bibliotek som ¨ar v¨aldokumenterat. JGraph ¨ar sl¨appt under LGPL-licensen, vilket inneb¨ar att det ¨ar gratis att anv¨anda och att k¨allkoden finns tillg¨angligt.
2.5.3
JFDraw
JFDraw ¨ar inte bara ett bibliotek man kan anv¨anda i sitt egna program, det ¨
ar ¨aven ett frist˚aende program f¨or ritning av vektorgrafik[5]. Biblioteket kan anv¨andas f¨or att visualisera mekanik, elektronik med mera. Det har inbyggt st¨od f¨or flera olika grafiska komponenter, tex rektanglar, parallellogram med mera. Alla komponenter kan grupperas, ligga i olika lager, roteras, speglas och skalas om. Biblioteket har ¨aven zoom-m¨ojligheter samt funktioner f¨or att exportera till flera olika bildformat. Priset, som varierar beroende p˚a antal utecklare samt om k¨allkod ¨onskar, ligger p˚a $299-$1329.
2.5.4
Batik SVG Toolkit
Batik ¨ar ett bibliotek f¨or att skapa och visa SVG-dokument2[6]. F¨or att visualisera den indata som finns, skulle en konvertering till SVG-formatet vara n¨odv¨andig. Biblioteket har flera inbyggda funktioner, t.ex. m¨ojlighet att zooma och panorera. Batik ¨ar sl¨appt under en ¨oppen k¨allkod-licens.
2.6
Resultat av unders¨
okningen
M˚anga av de biblioteket som unders¨oktes har inte de funktioner som efters¨oktes. Av de unders¨okta biblioteket var det endast en handfull som ans˚ags tillr¨ackligt kompetenta. Tillsammans med AnSyn togs beslutet att anv¨anda Netbeans Visual Library. Biblioteket ans˚ags vara det med st¨orst m¨ojligheter. Det fanns m˚anga exempel som visade hur det kunde anv¨andas och det fanns utf¨orlig dokumentation. Det var ¨aven licensierat som ¨oppen k¨allkod.
Kapitel 3
Netbeans Visual Library
I detta kapitel beskrivs Netbeans Visual Library (NVL) i stort och vilka huvudkomponenter som biblioteket best˚ar av. NVL ¨ar det omfattande vi-sualiseringbibliotek som best˚ar av ¨over 130 klasser[22]. I NVL ritas det upp ett antal objekt av datatypen Widget[23]. Dessa objekt ¨ar organiserade i en tr¨adstruktur och roten i detta tr¨ad ¨ar ett objekt av datatypen Scene, som ¨ar en underklass till basklassen Widget. Ett exempel p˚a ett tr¨ad med Widget-objekt som ska ritas upp visas i figur 2.
3.1
Widget
Widget¨ar en basklass f¨or allt som ska visualiseras[23]. En Widget har bland annat en x- och y-koordinat, samt en funktion som anropas n¨ar den skall ritas upp. Varje Widget sk¨oter allts˚a sin egen uppritning. Tillsammans med NVL kommer flera underklasser till Widget, t.ex. LabelWidget som anv¨ands f¨or att rita upp text och ImageWidget som anv¨ands f¨or att rita upp en bild. Det g˚ar ¨aven att g¨ora helt egna underklasser till Widget genom att ¨arva fr˚an klassen och implementera funktionen som anropas n¨ar den ska ritas upp.
3.2
Scene
Rot-widgeten i tr¨adstrukturen med alla Widget-objekt ¨ar av datatypen Scene, vilket ¨ar en specialisering av klassen Widget[23]. Den klassen har bland annat funktionalitet f¨or att ¨andra zoomning och s¨atta vilket verktyg som ¨ar aktivt, t.ex. zoom-verktyget eller panoreringsvektyget. Klassen Scene har funktionen getView() som returnerar den grafiska komponent som ri-tas upp i f¨onstret. ¨Aven Scene har en underklass, ObjectScene, vilket ¨ar en specialisering som underl¨attar om man vill g¨ora associationer mellan de widgets som ritas upp och andra objekt. Med ObjectScene finns det bland annat f¨ardiga funktioner f¨or att f˚a fram vilka objekt som ¨ar markerade.
Figur 2: Exempel p˚a tr¨ad med Widgets
3.3
LayerWidget
NVL har en speciell Widget som fungerar som ett lager, LayerWidget[23]. Standardinst¨allningen ¨ar att lagret ¨ar helt genomskinligt. Om ett lager d¨oljs s˚a kommer de Widget som ligger under i tr¨adstrukturen ¨aven att d¨oljas.
3.4
WidgetAction
En widget vet hur den ska ritas upp, och den vet vart den ska ritas upp, men den vet inte hur den ska agera[23]. En WidgetAction beskriver f¨or en widget hur den ska agera n¨ar anv¨andaren anv¨ander mus och tangentbord f¨or att interagera med den. En widget kan ha noll eller flera WidgetAction. NVL inneh˚aller ett antal WidgetAction, t.ex. m¨ojlighet att flytta en Widget. Det finns ¨aven m¨ojlighet att g¨ora helt egna genom att g¨ora en underklass till WidgetAction.
3.5
LookFeel
LookFeel ¨ar en abstrakt klass i NVL som kapslar in information om hur vissa saker skall ritas upp[23]. Bland annat s˚a beskriver ett LookFeel-objekt vilken ram en Widget ska ha n¨ar den ¨ar markerad. Det ¨ar Scene-objektet som har ett LookFeel-objekt.
Kapitel 4
Design och
Implementation
Utvecklingen av visualiseringsmodulen genomf¨ordes inte med n˚agon speciell utveckingsmetod. Arbetet delades upp i sm˚a iterationer d¨ar varje iteration, som bestod av ett eller flera av kraven, designades, implementerades och tes-tades. En s˚adan uppdelning av arbetet ¨ar vanlig inom agila utvecklingsmetoder[19, s. 291-295, 314-312]. Detta arbetss¨att skiljer sig fr˚an mer traditionell pro-gramvaruutveckling (t.ex. Vattenfallsmetoden) d¨ar man f¨orst designar hela systemet, sedan implementerar och sist testar systemet.
4.1
Verktyg
Det grafiska gr¨ansnittet i Analog Dimensions skrivet i Java, n¨armare best¨amt version 6. Som utvecklingsmilj¨o anv¨andes Netbeans IDE, vilket ¨ar en gratis utvecklingsmilj¨o som kommer fr˚an samma tillverkare som Java, Sun Microsystems[20][1, s. 5]. Netbeans IDE underl¨attar genom bland annat au-tomatisk kodkomplettering, auau-tomatisk generering av kod, debugm¨ojligheter och inbyggt st¨od f¨or versionshanteringssystem[20].
4.2
Koordinatsystemet i NVL
Koordinatsystemet som beskivs i kapitel 2.2 ¨ar inte samma koordinatsystem som NVL anv¨ander internt. I NVL v¨axer X-axeln ˚at h¨oger, men y-axeln v¨axer ned˚at i motsats till indatans koordinatsystem[23]. Koordinaterna i NVL specificeras i heltal, till skillnad fr˚an indatan d¨ar decimaltal med max-imalt fyra siffror till h¨oger om decimaltecknet anv¨ands. F¨or att konvertera koordinatsystemet fr˚an indatans koordinatsystem till det i NVL inverteras f¨orst y-koordinaten. Sedan multipliceras b˚ade y- och x-koordinaterna med
10000, vilket f˚ar alla decimalsiffror till h¨oger om decimaltecknet att ham-na p˚a v¨anster sida. P˚a detta s¨att f¨orloras ingen noggranhet. Om indatan s¨ager att en koordinat ¨ar (1.275, -1.5375) s˚a skulle den i NVL ha koordi-naten (12750, 15375). I NVL motsvarar en punkt i koordinatsystemet en pixel, vilket inneb¨ar att alla koordinater skulle bli v¨aldigt stora. L¨osningen p˚a detta problem ¨ar att skala om zoomnings-niv˚an. Det som f¨or anv¨andaren presenteras som 100%, ¨ar i sj¨alva verket mycket mindre, cirka 1%. Det som egentligen i NVL ¨ar 100% skulle s˚aledes f¨or anv¨andaren presenteras som cirka 10000%.
4.3
Den nya visualiseringsmodulen
Den nya visualiseringsmodulen best˚ar av ett drygt 30-tal klasser som tillsam-mans best˚ar av cirka 6000 rader kod. De viktigaste klasserna finns beskrivna i denna kapitel. En komplett lista ¨over alla klasser tillsammans med en kort beskrivning av vad klassen g¨or finns i Bilaga A.
4.4
schematicDisplay2
Trots att visualiseringsmodulen best˚ar av ¨over 30 klasser ¨ar det bara en klass som anropas utifr˚an, schematicDisplay2. Klassen fungerar som en fasad, vilket inneb¨ar att den fungerar som ett gr¨anssnitt mellan programmet och visualiseringsmodulen[21, s. 185-193]. Fasaden d¨oljer helt den underliggande strukturen och det faktum att ett helt bibliotek (NVL) anv¨ands. F¨or att anv¨anda nya visualiseringsmodulen beh¨over man allts˚a endast anv¨anda de publika funktioner som schematicDisplay2 erbjuder. Att gr¨anssnitt mellan Analog Dimensions och visualiseringsmodulen endast g˚ar via en klass g¨or att koppling mellan dem ¨ar enkel. Det skulle inte vara sv˚art att byta ut visualis-eringsmodulen tack vare denna enkla koppling. Att ha s˚adan enkel koppling mellan moduler anses vara bra praxis inom programmering[19, s. 79]. Nam-net p˚a den gamla visualiseringsmodulen var schematicDisplay, d¨arav har denna klass f˚att sitt namn schematicDisplay2.
schematicDisplay2 inneh˚aller ett objekt av datatypen ObjectScene som anv¨ands som rot i tr¨adet med Widget. Anledning att ObjectScene valdes ist¨allet f¨or Scene ¨ar att ObjectScene har funktionalitet f¨or att kop-pla ihop en Widget med ett objekt av vilken datatyp som helst. Det ¨ar schematicDisplay2 som tar emot indatan av datatypen netlist, vilket representerar en n¨atlista som inneh˚aller ett antal olika komponenter
(device), n¨at (net), pinnar (pin) och terminaler (terminal).
schematicDisplay2 skapar en Widget f¨or varje n¨atelement och registrerar ¨
aven associationen mellan Widget-objektet och motsvarande n¨ atelement-objektet.
4.5
Lager
Totalt finns det 11 olika lager som ligger direkt under roten i Widget-tr¨adet. • Bakgrundslager
• Interaktionslager - Alla interaktioner som anv¨andaren g¨or och som visas p˚a sk¨armen, t.ex. om en anv¨andare markerar flera komponenter genom att rita upp en rektangel, s˚a ritas rektangeln upp i detta lager • 4 olika lager f¨or de fyra olika n¨atelement-typerna
• 4 olika lager f¨or texter till de fyra olika n¨atelement-typerna • Ett lager d¨ar anteckningar visas
4.6
schematicWidget
Allt som ritas upp av visualiseringsmodulen ¨arver av klassen
schematicWidget, som i sin tur ¨arver av Widget. schematicWidget in-neh˚aller funktionalitet som beh¨ovs av alla de olika n¨atelement som kan ritas ut, t.ex. rotering och spegling av figuren. schematicWidget har tv˚a underklasser, textWidget och componentWidget. textWidget anv¨ands f¨or all text som ska skrivas ut. componentWidget ¨ar en abstrakt klass f¨or de olika n¨atelementen och har funktionalitet f¨or att avkoda den textstr¨ang som beskriver figuren. componentWidget har fyra underklasser f¨or de fyra olika typerna av n¨atelement: deviceWidget, netWidget, pinWidget och terminalWidget. Hierarkin ¨over alla Widget-klasser visas i figur 3.
4.6.1
componentWidget
componentWidget¨ar en abstrakt klass som ¨arver fr˚an schematicWidget och som inneh˚aller funktionalitet som alla de olika n¨atelementen beh¨over f¨or att kunna visualiseras. Klassen har funktioner f¨or att avkoda den textstr¨ang (mer om indatan i kapitel 2.1) som beskriver figuren. Avkodningen sker genom att textstr¨angen som beskriver ett antal olika former delas upp till ett antal nya str¨angar d¨ar varje str¨ang beskriver en form. Varje form avkodas sedan och ett objekt som beskriver formen skapas. Om textstr¨angen beskriv-er en ellipse skapas ett Ellipse-objekt, o.s.v. Det finns totalt fem olika klasser som beskriver olika former: Rect, Line, Ellipse, Arc och Polygon. Dessa fem ¨arver fr˚an en klass, Shape. De h¨ar klasserna har tv˚a uppgifter. Dels att beskriva sj¨alva formen, t.ex. bredd, h¨ojd, x-, och y-v¨arde f¨or en rektangel, och dels att rita ut formen.
Alla objekt som beskriver figurens alla former sparas sedan i en array. N¨ar ett objekt av typen componentWidget f˚ar i uppdrag att rita upp sig sj¨alv, itererar den igenom sin array med former, och ber varje form att rita ut sig sj¨alv.
Figur 3: Klasshierarki av widgets
4.7
Hantering av h¨
andelser
Visualiseringsmodulen klarar av ett antal olika h¨andelser som anv¨andaren kan generera genom att anv¨anda tangentbordet och musen p˚a olika s¨att. Vis-sa av h¨andelserna reagerar visualiseringsmodulen alltid p˚a, t.ex. om anv¨andaren trycker p˚a plus-tangenten p˚a tangentbordet sker en inzoomning. Andra h¨andelser reagerar visualiseringsmodulen p˚a n¨ar ett visst verktyg ¨ar aktivt. Totalt finns tre olika verktyg som anv¨andaren kan anv¨anda sig av.
• Selektionsverktyget • Panoreringsverktyget • Zoomningsverktyget
Det finns fyra olika WidgetAction som ¨ar globala, d.v.s. de reagerar p˚a anv¨andargenererade h¨andelser oavsett vilket av verktygen som ¨ar aktivt. Det ¨ar endast roten i Widget-tr¨adet, d.v.s. ObjectScene-objektet som har dessa WidgetAction.
mouseZoomAction
Om anv¨andaren h˚aller Ctrl-tangenten kan hon/han ¨andra zoomning med hjulet p˚a musen. Det ¨ar mouseZoomAction som hanterar denna h¨andelse.
wheelPanAction
Om anv¨andaren snurrar p˚a mushjulet utan att h˚alla nere Ctrl-tangenten s˚a panoreras bilden i sidled. F¨or att panorera i h¨ojdled h˚allet anv¨andaren Shift-tangenten nedtryckt. Allt detta hanteras av wheelPanAction. keyboardZoomAction
keyboardZoomAction reagerar om anv¨andaren trycker p˚a n˚agon av plus-eller minustangenterna och ¨andrar zoomningen.
updateCurrentMousePositionAction
updateCurrentMousePositionAction¨ar en WidgetAction som alltid ¨ar ak-tiv men som anv¨andaren inte m¨arker av alls. Den reagerar s˚a fort anv¨andaren flyttar mark¨oren och sparar muspositionen i en variabel. Denna variabel kan sedan presenteras f¨or anv¨andaren som d˚a ser vilken koordinat muspekaren befinner sig p˚a.
4.7.1
Selektionsverktyget
Detta ¨ar ett verktyg som anv¨andaren v¨aljer n¨ar han/hon vill markera ett eller flera n¨atelement. F¨or att visualiseringsmodulen ska reagera n¨ar anv¨andaren klickar finns tv˚a Widgetaction som aktiveras n¨ar verktyget markeras som aktivt.
selectAction
Alla Widget som ska vara selektionsbara f˚ar denna WidgetAction. Den-na WidgetAction k¨anner av om anv¨andaren klickar p˚a ett n¨atelement och ¨
andrar dess status till selekterad. Detta p˚averkar hur n¨atelementet ritas upp, beroende p˚a vilken typ av n¨atelement det ¨ar. Komponenter, pinnar och terminaler f˚ar en ram runt sig, medans n¨at ritas upp i en annan f¨arg. selectAction har ¨aven st¨od f¨or att markera flera Widget genom att anv¨andaren h˚aller nere Shift-tangenten.
rectangularSelectAction
Denna WidgetAction ¨ar kopplad till roten i Widget-tr¨adet, d.v.s. ObjectScene-objektet. Den m¨ojligg¨or f¨or anv¨andaren att markera flera Widget genom att klicka med musen, dra ut en rektangel, och sedan sl¨appa musknappen. Alla Widget-objekt inom rektangeln s¨atts som markerade.
4.7.2
Panoreringsverktyget
N¨ar detta verktyg ¨ar valt kan anv¨andaren panorera genom att klicka med
mousePanAction som sk¨oter denna h¨andelse. mousePanAction ¨ar kopplad till roten i Widget-tr¨adet.
4.7.3
Zoomverktyget
Anv¨andaren kan zooma n¨ar som helst, tack vare de globala WidgetAction som sk¨oter zoomning med hj¨alp av tangentbordet och musen. Men det finns ¨aven ett verktyg som kan anv¨andas f¨or att zooma. Den WidgetAction som tar hand om det heter rectangularSelectActionTwoClicks. Denna zoomning fungerar genom att anv¨andaren f¨orst klickar en g˚ang och sl¨apper sedan knappen, flyttar musmark¨oren och klickar sedan igen. Visualiser-ingsmodulen zoomar sedan in till den rektangel som anv¨andaren ritade upp. rectangularSelectActionTwoClicks¨ar kopplad till roten i Widget-tr¨adet.
4.8
LookFeel
Till klassen LookFeel har en abstrakt underklass schematicLookFeel ska-pats som beskriver ytterligare hur n¨atelement ska visualiseras. Den klassen beskriver ¨aven vilken f¨arg som en viss typ av Widget ska ha, beroende p˚a vilket tillst˚and den ¨ar i (t. ex. markerad). Tv˚a konkreta klasser som ¨arver fr˚an schematicLookFeel, darkLookFeel och lightLookFeel beskriver de tv˚a olika f¨argscheman som finns. Ett med vit bakgrund, och ett med svart bakgrund.
4.9
Manual
En enkel handledning finns tillg¨anglig som beskriver hur visualiseringsmod-ulen ska intregreras i Analog Dimension. Den ger en introduktion till hur den nya visualieringsmodulen fungerar och presenterar kortfattat de publika funktioner som finns tillg¨angliga f¨or programmeraren. I manualen finns ¨aven n˚agra kodexempel som visar hur de olika funktionerna anv¨ands. Manualen finns bifogad till denna rapport, se bilaga B.
Kapitel 5
Resultat
Nedan presenteras resultatet utifr˚an de totalt 14 kraven fr˚an kravspecifika-tionen.
Kopplingsschemats olika n¨atelement (komponenter, n¨at,
termi-naler och pinnar) skall visualiseras enligt indata
Fungerar enligt kravspecifikation. Alla typer av former, dvs. rektangel, cirkelb˚age, ellipse, polygon och polygont˚ag visualiseras korrekt. ¨Aven n¨atelementens etiketter visualiseras enligt indatan.
Anv¨andaren skall kunna zooma in, zooma ut, zoom to fit, zooma
in p˚a markerat omr˚ade, zooma in p˚a vald komponent, n¨at, pin
eller terminal, zooma till en viss area specifierad med koordinater Fungerar enligt kravspecifikationen. Anv¨andaren kan zooma in med musen och med tangentbordet. Anv¨andaren kan ocks˚a zooma in p˚a markerat omr˚ade. Visualiseringsmodulen har ¨aven funktioner f¨or att zooma in p˚a ett visst n¨atelement eller en viss koordinat.
Anv¨andaren skall kunna panorera med musen samt piltangenterna
Fungerar enligt kravspecifikationen.
Markera komponenter, n¨at, terminaler, pinnar som ¨ar specifierade i en lista
Fungerar enligt kravspecifikationen.
Anv¨andaren skall kunna specificera vilka av objekten som ¨ar
markerbara
Anv¨andaren skall kunna extrahera koordinaterna f¨or den mark-erade arean samt nuvarande musposition
Fungerar enligt kravspecifikationen. Visualiseringsmodulen har en funktion f¨or att ta reda p˚a vilket koordinat som mark¨oren befinner sig p˚a. Det g˚ar ocks˚a att f˚a en notifiering fr˚an modulen n¨ar koordinaten ¨andras (d.v.s n¨ar anv¨andaren flyttar mark¨oren).
Olika menyer f¨or olika typer av objekt skall visas n¨ar anv¨andaren h¨ogerklickar p˚a objekten
Fungerar enligt kravspecifikation. Se figur 4 f¨or exempel.
Figur 4: Exempel p˚a meny som visas n¨ar anv¨andaren h¨ogerklickar p˚a ett n¨atelement
Anv¨andaren skall kunna specificera om n˚agot/n˚agra objekt ej
skall ritas upp
Fungerar enligt kravspecifikation.
Anv¨andaren skall kunna f˚a en lista med de objekt som f¨or tillf¨allet ¨
ar markerade
Texter skall vara vektoriserade, f¨or att undvika fula texter vid inzoomning
Fungerar enligt kravspecifikation.
Vald area skall kunna exporteras till en bild
Det g˚ar inte att v¨alja en viss rektangel och sedan f˚a denna area exporterad till en bild, d¨aremot kan man exportera den synliga arean. Anv¨andaren m˚aste allts˚a f¨orst zooma in p˚a den area som hon/han vill ha exporterad, och sedan exportera f¨or att uppn˚a samma resultat som kravspecifikationen. Till objekten skall man kunna koppla information som visas bred-vid komponenten
Fungerar enligt kravspecifikation. Visualiseringsmodulen har funktioner f¨or
att visa b˚ade vanlig text, men ¨aven en JComponent bredvid ett
n¨atelement. Texten/JComponent kan placeras p˚a nio olika positioner rel-ativt till n¨atelementet: Nord, nord¨ost, ¨ost, sydost, s¨oder, sydv¨ast, v¨ast, nordv¨ast samt centrerat ¨over n¨atelementet. Ett exempel p˚a hur man kan visualisera extra information bredvid en komponent visas i figur 5.
Figur 5: Exempel p˚a hur information kan visas bredvid ett n¨atelement
Solder dots skall visas (frivilligt krav) Fungerar enligt kravspecifikation.
Anv¨andaren skall kunna ¨andra f¨argschema, mellan svart och vit bakgrund (frivilligt krav)
Fungerar enligt kravspecifikation. Hur det ljusa respektive de m¨orka f¨argschemat ser ur visas i figur 6.
Kapitel 6
Diskussion
Syftet med detta arbete var att ta fram en ny visualiseringsmodul enligt en kravspecifikation, och det ¨ar nu genomf¨ort. Den nya visualiseringsmodulen har fler funktioner ¨an den gamla, och saknar framf¨or allt de begr¨ansningar som fanns. En viktig framg˚angsfaktor i detta arbete var valet av grafik-bibliotek. NVL hade m˚anga inbyggda funktioner som underl¨attade utveck-lingen.
N˚agot som man skulle kunna g¨ora f¨or att ytterligare f¨orb¨attra ¨ar att arbeta p˚a att f˚a visualiseringsmodulen snabbare. Modulen ¨ar inte j¨attesnabb n¨ar riktigt stora scheman ritas ut. Det man kan g¨ora ¨ar att snabba upp sj¨alva uppritningen av figurerna. Vid varje omritning, t.ex. n¨ar en anv¨andare zoomar in, ritas en figur om genom att alla former som den best˚ar ritas upp en och en. F¨or att snabba upp skulle man kunna rita upp figuren p˚a en bild, och sedan rita om hela den bilden ist¨allet f¨or att rita upp flera former. De scheman som man arbetar med i Analog Dimensions ¨ar dock uteslutande s˚a pass sm˚a att visualiseringsmodulen fungerar utan n˚agra problem.
Koden skulle ocks˚a p˚a vissa st¨allen kunna f¨orb¨attras. Klassen schematicDisplay2 inneh˚aller n¨astan 2000 rader kod, vilket man kan tycka ¨
ar lite v¨al mycket. I klassen finns bland annat funktioner som tar n¨ atelement-objekt och skapar motsvarande Widget-atelement-objekt. Dessa funktioner skulle kun-na ligga i separata klasser d¨ar man anv¨ander n˚agot l¨ampligt designm¨onster som finns f¨or skapande av nya objekt.
6.1
Framtida arbete
Idag kan visualiseringsmodulen enbart visa kopplingsscheman gjorda i andra program, som importeras i Analog Dimensions. En ut¨okning som skulle vara m¨ojlig ¨ar att inf¨ora editeringsm¨ojligheter, d¨ar konstrukt¨oren direkt i Analog Dimensions kan designa de kretsar som hon/han arbetar med.
Referenser
[1] Skansholm, Jan (2002). Java direkt med Swing. Studentlitteratur. Tredje upplagan.
[2] Josefsson, Margareta & Oskarsson, ¨Osten (1999). Programvarukompo-nenter i praktiken - att k¨opa tid och prestera mer. Sveriges Verkstadsin-dustrier.
[3] Netbeans Visual Library. http://graph.netbeans.org/. 2009-08-11. [4] JGraph. http://www.jgraph.com. 2009-07-22.
[5] JFDraw. http://www.jfimagine.com. 2009-07-22.
[6] Batik SVG Toolkit. http://xmlgraphics.apache.org/batik/. 2009-07-22.
[7] JGo. http://www.nwoods.com/go/jgo.htm 2009-07-22.
[8] yFiles for Java. http://www.yworks.com/en/products/yfiles/
about.htm. 2009-07-22.
[9] Tom Sawyer Visualization, Java Edition. http://www.tomsawyer.com/ products/visualization/java/index.php. 2009-07-22.
[10] FreeHEP VectorGraphics. http://java.freehep.org/
vectorgraphics/. 2009-08-11.
[11] Eclipse Graphical Editing Framework. http://www.eclipse.org/ gef/. 2009-07-22.
[12] Piccolo2D. http://www.piccolo2d.org/. 2009-07-22.
[13] Mica Graphics Framework. http://www.swfm.com/mica/. 2009-08-11. [14] Diva. http://embedded.eecs.berkeley.edu/diva/demo/.
2009-08-11.
[15] JHotDraw. http://www.jhotdraw.org/. 2009-08-11.
[17] JUNG - Java Universal Network/Graph Framework. http://jung. sourceforge.net/. 2009-08-11.
[18] Netbeans Platform. http://platform.netbeans.org/. 2009-08-11. [19] Bell, Douglas (2005). Software Engineering for Students.
Addison-Wesley. Fourth edition.
[20] Netbeans IDE - Features. http://www.netbeans.org/. 2009-08-21. [21] Erich Gamma et al. (1995). Design Patterns - Elements of Resuable
Object-Oriented Software. Addison-Wesley.
[22] Netbeans Visual Library API. http://bits.nbextras.org/dev/
javadoc/org-netbeans-api-visual/. 2009-08-31.
[23] Netbeans Visual Library 2.0 Documentation. http://bits.netbeans. org/dev/javadoc/org-netbeans-api-visual/org/netbeans/api/ visual/widget/doc-files/documentation.html. 2009-08-31.
Bilaga A
Lista ¨
over alla klasser
Nedan f¨oljer en lista ¨over samtliga klasser samt en kort beskrivning av vad klassen g¨or.
Arc
Representerar en cirkelb˚age. ¨Arver av Shape. componentWidget
Abstrakt klass som ¨arver av schematicWidget. Representerar ett n¨atelement. Har fyra underklasser f¨or de fyra olika typerna av n¨atelement.
darkLookFeel
Definierar en LookFeel med svart bakgrund. ¨Arver fr˚an schematicLookFeel. deviceWidget
Representerar en komponent. ¨Arver fr˚an componentWidget. Ellipse
Representerar en ellips. ¨Arver fr˚an Shape. jComponentWidget
Widget som anv¨ands f¨or att rita ut vanliga JComponent-objekt. ¨Arver fr˚an schematicWidget.
keyboardZoomAction
Reagerar om anv¨andaren trycker p˚a plus- eller minustangenterna p˚a tangent-bordet och utf¨or ¨onskad zoomning. ¨Arver fr˚an WidgetAction (NVL-klass).
lightLookFeel
Definierar en LookFeel med vit bakgrund. ¨Arver fr˚an schematicLookFeel. Line
Representerar ett polygont˚ag. ¨Arver fr˚an Shape. marqueeDecorator
Skapar den widget som ritas ut n¨ar anv¨andaren ritar upp en rektangel f¨or att antingen zooma in p˚a rektangeln eller markera de objekt innanf¨or rek-tangeln. Implementerar RectangularSelectDecorator (NVL-interface). marqueeSelectProvider
Anropas n¨ar anv¨andaren har ritat upp en rektangel om selektionsverktyget ¨
ar valt. Klassen genomf¨or selektionen av de Widget som ligger i rektangeln. Implementerar RectangularSelectProvider (NVL-interface).
marqueeZoomProvider
Anropas n¨ar anv¨andaren har ritat upp en rektangel om zoomverktyget ¨ar valt. Klassen genomf¨or zoomning till den rektangel som anv¨andaren ritade upp. Implementerar RectangularSelectProvider (NVL-interface).
mousePanAction
Sk¨oter panorering som anv¨andaren panorerar med musen. ¨Arver av Wid-getAction (NVL-klass).
mousePositionAndZoomLevelUpdateListener
Ett interface som en klass kan implementera. Klassen kan sedan registrera sig som lyssnare hos schematicDisplay2 och kommer d˚a att f˚a notifieringar n¨ar muspositionen eller zoomniv˚an ¨andras. ¨Arver fr˚an EventListener (Java-klass).
mouseZoomAction
Sk¨oter zoomning n¨ar anv¨andaren zoomar genom att h˚alla Ctrl-tangenen nertryckt samtidigt som mushjulet snurras. ¨Arver av WidgetAction (NVL-klass).
netWidget
notesWidget
En widget f¨or anteckningar. ¨Arver av componentWidget. pinWidget
Representerar en pinne. ¨Arver av componentWidget. Polygon
Representerar en polygon. ¨Arver fr˚an Shape. Rect
Representerar en rektangel. ¨Arver fr˚an Shape. rectangularSelectAction
Anv¨ands n¨ar anv¨andaren vill markera flera Widget genom att rita upp en rektangel genom att klicka och dra ut rektangeln. ¨Arver fr˚an WidgetAction (NVL-klass).
rectangularSelectActionTwoClicks
Denna klass ¨ar lik klassen ovan, med skillnaden att rektangeln ritas upp genom att anv¨andaren markerar f¨orsta h¨ornet med ett klick och andra h¨ornet med ett andra klick. Anv¨ands av zoom-verktyget. ¨Arver fr˚an WidgetAction (NVL-klass).
schematicDemoWindow
Ett f¨onster som demonstrerar visualiseringsmodulens alla funktioner. schematicDisplay2
Klass som ¨ar gr¨anssnitt mot hela visualiseringsmodulen. schematicDisplay2Helper
Klass med funktioner som beh¨ovs av flera klasser, t.ex. funktioner f¨or att konvertera mellan indatans koordinatsystem och det koordinatsystem som NVL anv¨ander.
schematicException
Ett exception som kastas n¨ar n˚agot blir fel i visualiseringsmodulen. ¨Arver fr˚an Exception (Java-klass).
schematicLookFeel
Abstrakt klass som representerar en LookFeel som kan anv¨andas av visu-aliseringsmodulen. ¨Arver fr˚an LookFeel (NVL-klass).
schematicWidget
Abstrakt klass som anv¨ands f¨or alla Widget i visualiseringsmodulen. In-neh˚aller bl.a. funktioner f¨or att rotera. ¨Arver fr˚an Widget (NVL-klass). selectAction
Ser till att en Widget markeras n¨ar anv¨andaren klickar p˚a den. ¨Arver fr˚an WidgetAction (NVL-klass).
Shape
Abstrakt basklass f¨or olika former. Definierar vilka funktioner underklasser-na skall ha, exempelvis paint()-funktionen som anropas n¨ar en form ska ritas upp.
terminalWidget
Representerar en terminal. ¨Arver fr˚an componentWidget. textWidget
Anv¨ands f¨or all text som ska ritas upp, d.v.s. etiketter till n¨atelement. ¨Arver fr˚an schematicWidget.
updateCurrentMousePositionAction
Reagerar varje g˚ang anv¨andaren flyttar musmark¨oren. Den sparar undan muspositionen och ser till att alla lyssnare f˚ar en notifikation om att ny musposition finns att h¨amta. ¨Arver fr˚an WidgetAction (NVL-klass).
Bilaga B
Manual
Improved Schematic Display Johan Bohlin johan.bohlin@ansyn.com
Intro
F¨or att l¨agga till en display i ett f¨onster. Antag att det finns tv˚a JPanel. I f¨orsta ska schematic visas, och i andra visas ¨oversikts-vyn (Satellite view).
// s k a p a d i s p l a y e n s c h e m a t i c D i s p l a y 2 d i s p l a y = new s c h e m a t i c D i s p l a y 2 ( ) ; // l ¨a g g t i l l d i s p l a y e n i j p a n e l 1 . d i s p l a y . g e t V i e w ( ) r e t u r n e r a r en JComponent j P a n e l . add (new J S c r o l l P a n e ( d i s p l a y . g e t V i e w ( ) ) ) ; // l ¨a g g t i l l s a t e l i t t e v i e w i j p a n e l 2 j P a n e l 2 . add ( d i s p l a y . g e t S a t e l l i t e V i e w ( ) ) ; // a n g e r v i l k e n n e t l i s t som s k a l l r i t a s upp d i s p l a y . s e t N e t l i s t ( n e t l i s t ) ;
Verktygen
Displayen har fyra olika verktyg, ett av dem ¨ar alltid de aktuella. De fyra verktygen
1. Select tool: M¨ojlighet att markera en komponent i taget. M¨ojlighet att merkera flera komponenter genom att dra en rektangel runt dem. Detta verktyg ¨ar valt n¨ar displayen skapas.
2. Zoom tool: Zoomar in p˚a markerad rektangel 3. Pan tool: Panorerar
F¨or att ¨andra verktyg anv¨ands tre olika funktioner // S ¨a t t e r s e l e k t i o n s −v e r k t y g e t t i l l a k t i v t v e r k t y g d i s p l a y . s e t S e l e c t T o o l A s A c t i v e T o o l ( ) ; // S ¨a t t e r p a n o r e r i n g s −v e r k t y g e t t i l l a k t i v t v e r k t y g d i s p l a y . s e t P a n T o o l A s A c t i v e T o o l ( ) ; // S ¨a t t e r zoom−v e r k t y g e t t i l l a k t i v t v e r k t y g d i s p l a y . s e t Z o o m T o o l A s A c t i v e T o o l ( ) ;
Lager
Displayen best˚ar av ett antal lager, varav flera kan d¨oljas. F¨oljande lager kan d¨oljas:
• Lagret med etiketter f¨or komponenter • Lagret med etiketter f¨or n¨at
• Lagret med etiketter f¨or pinnar • Lagret med etiketter f¨or terminaler • Lagret med anteckningar
F¨or att d¨olja/visa dessa lager anv¨ands dessa funktioner:
// Visa / D ¨o l j l a g r e t med e t i k e t t e r f ¨o r komponenter
d i s p l a y . s e t D e v i c e L a b e l L a y e r V i s i b i l i t y ( boolean v i s i b l e ) ; // Visa / D ¨o l j l a g r e t med e t i k e t t e r f ¨o r n ¨a t d i s p l a y . s e t N e t L a b e l L a y e r V i s i b i l i t y ( boolean v i s i b l e ) ; // Visa / D ¨o l j l a g r e t med e t i k e t t e r f ¨o r p i n n a r d i s p l a y . s e t P i n L a b e l L a y e r V i s i b i l i t y ( boolean v i s i b l e ) ; // Visa / D ¨o l j l a g r e t med e t i k e t t e r f ¨o r t e r m i n a l e r d i s p l a y . s e t T e r m i n a l L a b e l L a y e r V i s i b i l i t y ( boolean v i s i b l e ) ; // Visa / D ¨o l j l a g r e t med a n t e c k n i n g a r d i s p l a y . s e t N o t e s L a y e r V i s i b i l i t y ( boolean v i s i b l e ) ;
// Visa / D ¨o l j a l l a l a g e r med e t i k e t t e r . Andra p a r a m e t e r n a n g e r om l a g r e t med a n t e c k n i n g a r ¨aven s k a l l d ¨o l j a s
d i s p l a y . s e t A l l L a b e l L a y e r s V i s i b i l i t y ( boolean v i s i b i l i t y , boolean i n c l u d e N o t e s L a y e r )
Panorering och zoom
Den nya displayen har flera olika s¨att att zooma och panorera. Man kan g¨ora det med musen, tangentbordet samt via funktionsanrop.
Panorering
Mushjulet kan anv¨andas f¨or att panorera i h¨ojdled. Om shift-tangenten ¨
ar nertryck sker panoreringen ist¨allet i sidled. ¨Aven piltangenterna kan anv¨andas f¨or att panorera.
Zoom
Mushjultet ¨andrar zoomniv˚an och Ctrl-tangenten samtidigt ¨ar nertryckt. Plus- och minus-tangenterna ¨andrar ¨aven zoomniv˚an. Det finns sedan ett antal funktioner som p˚a n˚agot s¨att ¨ar relaterade till zoomning:
// zooma i n ( z o o m l e v e l ∗= 1 . 1 ) d i s p l a y . zoomIn ( ) ;
// zooma u t ( z o o m L e v e l /= 1 . 1 ) d i s p l a y . zoomOut ( ) ;
//En ut− och i n z o o m n i n g t a r s˚a l e d e s u t v a r a n d r a ! //zoom t o f i t d i s p l a y . zoomToFit ( ) ; // zooma t i l l o b j e c t d e v i c e d = n e t l i s t . g e t D e v i c e ( ” b i a s N e t w o r k ” ) ; d i s p l a y . zoomToObject ( d ) ; // zooma t i l l s p e c i f i k a k o o r d i n a t e s i Cadence c o o r d i n a t s y s t e m ( N o t e r a : x och y ¨a r ¨o v r e v ¨a n s t r a h ¨o r n e t i r e k t a n g e l n som man s p e c i f i e r a r )
d i s p l a y . zoomToCadenceCoordinates (new R e c t a n g l e 2 D . Double ( x , y , w, h ) ) ;
// zooma t i l l c a d e n c e k o o r d i n a t e r med t v˚a p u n k t e r ( m o t s t˚a e n d e p u n k t e r i r e k t a n g e l )
d i s p l a y . zoomToCadenceCoordinates (new Point2D . Double ( x , y ) , new Point2D . Double ( x2 , y2 ) ) ;
// zooma t i l l k o o r d i n a t e r i d e t i n t e r n a k o o r d i n a t s y s t e m e t d i s p l a y . zoomToRectangle (new R e c t a n g l e ( x , y , w, h ) ) ;
// ¨Andrar v i l k e n maximal / minimal zoomniv˚a som ¨a r t i l l˚a t e n : d i s p l a y . setMaxZoomLevel ( 3 0 0 ) ; //max 300 \% zoom
d i s p l a y . setMinZoomLevel ( 1 0 0 ) ; //min 100 \% zoom // S ¨a t t e r nuvarande zoomniv˚a t i l l 100%
d i s p l a y . s e t C u r r e n t Z o o m A s 1 0 0 P e r c e n t ( ) . // S k r i v e r u t nuvarande zoomniv˚a
System . o u t . p r i n t l n ( ”Zoom : ” + d i s p l a y . g e t Z o o m L e v e l ( ) ) ;
F¨or att f˚a en notifikation om att zoom-niv˚an har ¨andrat kan man registrera en lyssnare hos displayen. L¨as mer under rubriken Musposition”.
Hantering av objekten som ritas ut
Standardinst¨allningen ¨ar all samtliga n¨atelement i n¨atlistan ritas ut, och att inget av dessa ¨ar selektionsbara. Funktioner f¨or att hantera objekten:
// S ¨a t t s e l e k t i o n s b a r h e t p˚a s a m l i n g o b j e k t d i s p l a y . s e t O b j e c t S e l e c t i o n A l l o w e d ( C o l l e c t i o n o b j e c t s , boolean s e l e c t i o n A l l o w e d ) ; // S ¨a t t e r om e t t o b j e k t s k a l l r i t a s upp e l l e r i n t e d i s p l a y . s e t O b j e c t V i s i b i l i t y ( C o l l e c t i o n o b j e c t s , boolean v i s i b l e ) ; // S ¨a t t e r t i l l o b j e k t som s k a l l v a r a markerade d i s p l a y . s e t S e l e c t e d O b j e c t s ( C o l l e c t i o n o b j e c t s ) ;
// s ¨a t t v i l k a o b j e k t som s k a h i g h l i g h t a s . Andra p a r a m e t e r n a v g ¨o r om t e r m i n a l e r p˚a en komponent s k a l l h i g h l i g h t a s s a m t i d i g t som komponenten . T r e d j e p a r a m e t e r n s ¨a g e r om nuvarande
h i g h l i g h a d e o b j e k t s k a f o r t s ¨a t t a v a r a h i g h l i g h t a d e . Med s i s t a p a r a m e t e r n kan man ange v i l k e n f ¨a r g o b j e k t e t s k a l l f˚a . d i s p l a y . s e t H i g h l i g h e d O b j e c t s ( C o l l e c t i o n o b j e c t s , boolean
h i g h l i g h t T e r m i n a l O n D e v i c e , boolean c l e a r C u r r e n t H i g h l i g h t s , C o l o r h i g h l i g h t C o l o r ) ;
// H¨amtar de o b j e k t som ¨a r markerade j u s t nu :
C o l l e c t i o n s e l e c t e d O b j e c t s = d i s p l a y . g e t S e l e c t e d O b j e c t s ( ) ; // H¨amtar de o b j e k t som ¨a r h i g h l i g h t a d e j u s t nu : C o l l e c t i o n h i g h l i g h t e d O b j e c t s = d i s p l a y . g e t H i g h l i g h e d O b j e c t s ( ) ; // H¨amtar a l l a o b j e k t som d i s p l a y e n h a n t e r a r C o l l e c t i o n a l l O b j e c t s = d i s p l a y . g e t A l l O b j e c t s ( ) ; //Hur man g ¨o r a l l a o b j e k t s e l e k t i o n s b a r a d i s p l a y . s e t O b j e c t S e l e c t i o n A l l o w e d ( d i s p l a y . g e t A l l O b j e c t s ( ) , true ) ;
Muspositon
Det g˚ar att f˚a fram vilken musposition som muspekaren befinner sig p˚a i displayen. Positionen ges i det koordinatsystem som Cadence anv¨ander sig av.
// H¨amtar m u s p o s i t i o n e n
Point2D . Double p o i n t 1 = d i s p l a y . g e t C u r r e n t M o u s e P o s i t i o n ( ) ; //om man a n v¨a n d e r zoom−v e k t y g e t e l l e r s e l e k t i o n s v e k t y g e t kan man
¨
aven f˚a fram v i l k e n h ¨o r n p o s i t i o n den u p p r i t a d e r e k t a n g e l n h a r . Andra h ¨o r n e t p˚a r e k t a n g e l n f˚a s fram v i a f u n k t i o n e n v i s a d ovan . Om man f˚a r t i l l b a k a n u l l , s˚a ¨a r i n t e n˚agon r e k t a n g e l u p p r i t a d .
Point2D . Double p o i n t 2 = d i s p l a y .
g e t C u r r e n t M a r q u e e S e l e c t i o n P o s i t i o n ( ) ;
Muspositionen ¨andrar ju sig n¨ar anv¨andaren flyttar mark¨oren. Man kan registrera en lyssnare hos displayen som f˚ar reda p˚a n¨ar muspositionen samt ¨aven zoomniv˚an har ¨andrats.
public J f r a m e testWindow implements
m o u s e P o s i t i o n A n d Z o o m L e v e l U p d a t e L i s t e n e r { private s c h e m a t i c D i s p l a y 2 d i s p l a y ; testWindow ( ) { // s k a p a d i s p l a y och s ¨a t t n ¨a t l i s t a d i s p l a y = new s c h e m a t i c D i s p l a y 2 ( ) ; d i s p l a y . s e t N e t l i s t ( g e t T h e N e t l i s t ( ) ) ; // R e g i s t r e r a t h i s som l y s s n a r e h o s d i s p l a y e n d i s p l a y . a d d L i s t e n e r ( t h i s ) ; } // d i s p l a y e n m e d d e l a r a t t d e t f i n n s ny m u s p o s i t i o n s −d a t a public void m o u s e P o s i t i o n U p d a t e d ( ) { d i s p l a y M o u s e P o s i t i o n ( d i s p l a y . g e t C u r r e n t M o u s e P o s i t i o n ( ) ) ; d i s p l a y Z o o m L e v e l ( d i s p l a y . g e t Z o o m L e v e l ( ) ) ; }
}
¨
Ovriga funktioner
Till ett objekt kan man koppla en popup-meny som visas n¨ar anv¨andaren h¨ogerklickar p˚a objektet:
JPopupMenu popupmenu = createAPopupMenu ( ) ; d e v i c e d = n e t l i s t . g e t d e v i c e ( ” b i a s N e t w o r k ” ) ; addPopupMenutoObject ( d , popupmenu ) ;
Den synliga delen av dispayen kan exporteras.
// E x p o r t e r a t i l l en B u f f e r e d I m a g e som s e d a n kan s p a r a s t i l l f i l B u f f e r e d I m a g e e x p o r t = d i s p l a y . e x p o r t V i s i b l e A r e a ( ) ;
Displayen har tv˚a olika f¨argscheman som man kan v¨axla mellan:
// S ¨a t t e r den l j u s a f ¨a r g s ¨a t t n i g e n t i l l a k t i v d i s p l a y . s e t L i g h t C o l o r S c h e m e ( )
// S ¨a t t e r den m¨orka f ¨a r g s ¨a t t n i g e n t i l l a k t i v d i s p l a y . s e t D a r k C o l o r S c h e m e ( ) ;
Bredvid uppritade objekt kan man rita upp information, antingen en vanlig textstr¨ang, eller en JComponent
// S k r i v e r u t ” I n f o r m a t i o n ” o v a n f ¨o r komponenten b i a s N e t w o r k i o r a n g e t e x t . d e v i c e d = n e t l i s t . g e t d e v i c e ( ” b i a s N e t w o r k ” ) ; S t r i n g i n f o = ” I n f o r m a t i o n ” ; C o l o r c = C o l o r .ORANGE; i n t p o s i t i o n = S w i n g C o n s t a n t s .NORTH; a d d A d d i t i o n a l I n f o r m a t i o n T o O b j e c t ( d , i n f o , c , p o s i t i o n ) ; // r i t a r u t en JComponent t i l l h ¨o g e r om en komponent d e v i c e d = n e t l i s t . g e t d e v i c e ( ” b i a s N e t w o r k ” ) ; JComponent component = c re a te J Co m po n e nt ( ) ; i n t p o s i t i o n = S w i n g C o n s t a n t s . EAST ; a d d A d d i t i o n a l I n f o r m a t i o n T o O b j e c t ( d , component , p o s i t i o n ) ;
P˚a svenska
Detta dokument h˚alls tillg¨angligt p˚a Internet - eller dess framtida ers¨attare - under en l¨angre tid fr˚an publiceringsdatum under f¨oruts¨attning att inga extra-ordin¨ara omst¨andigheter uppst˚ar.
Tillg˚ang till dokumentet inneb¨ar tillst˚and f¨or var och en att l¨asa, ladda ner, skriva ut enstaka kopior f¨or enskilt bruk och att anv¨anda det of¨or¨andrat f¨or ickekommersiell forskning och f¨or undervisning. ¨Overf¨oring av upphovsr¨atten vid en senare tidpunkt kan inte upph¨ava detta tillst˚and. All annan anv¨andning av dokumentet kr¨aver upphovsmannens medgivande. F¨or att garantera ¨aktheten, s¨akerheten och tillg¨angligheten finns det l¨osningar av teknisk och administrativ art.
Upphovsmannens ideella r¨att innefattar r¨att att bli n¨amnd som up-phovsman i den omfattning som god sed kr¨aver vid anv¨andning av doku-mentet p˚a ovan beskrivna s¨att samt skydd mot att dokumentet ¨andras eller presenteras i s˚adan form eller i s˚adant sammanhang som ¨ar kr¨ankande f¨or upphovsmannens litter¨ara eller konstn¨arliga anseende eller egenart.
F¨or ytterligare information om Link¨oping University Electronic Press se f¨orlagets hemsida http://www.ep.liu.se/
In English
The publishers will keep this document online on the Internet - or its possible replacement - for a considerable time from the date of publication barring exceptional circumstances.
The online availability of the document implies a permanent permis-sion for anyone to read, to download, to print out single copies for your own use and to use it unchanged for any non-commercial research and education-al purpose. Subsequent transfers of copyright cannot revoke this permission. All other uses of the document are conditional on the consent of the copy-right owner. The publisher has taken technical and administrative measures to assure authenticity, security and accessibility.
According to intellectual property law the author has the right to be mentioned when his/her work is accessed as described above and to be protected against infringement.
For additional information about the Link¨oping University Electron-ic Press and its procedures for publElectron-ication and for assurance of document integrity, please refer to its WWW home page: http://www.ep.liu.se/
c
Avdelning, Institution Division, Department Datum Date Spr˚ak Language Svenska/Swedish Engelska/English Rapporttyp Report category Licentiatavhandling Examensarbete C-uppsats D-uppsats ¨Ovrig rapport
URL f¨or elektronisk version
ISBN ISRN
Serietitel och serienummer Title of series, numbering
ISSN Titel Title F¨orfattare Author Sammanfattning Abstract
AnSyn AB ¨ar ett f¨oretag i Link¨oping som utvecklar programvara f¨or att op-timera analog elektronik. I deras program Analog Dimensions finns en visualis-eringsmodul som ritar upp de kopplingsscheman som elektronikkonstrukt¨oren arbetar med. Ansyn var inte n¨ojda med den l¨osningen de hade. Den gamla visualiseringsmodulen hade flera begr¨ansningar och i denna rapport kan du f¨olja arbetet med att ta fram en ny visualiseringsmodul. Arbetet resulterade i en helt ny visualiseringsmodul som saknar de begr¨ansningar som den gam-la visualiseringsmodulen hade. Visualiseringsmodulen ¨ar helt skriven i Java och anv¨ander sig av ett grafikbibliotek vid namn Netbeans Visual Library. Det ¨ar ett bibliotek med ¨oppen k¨allkod som bland annat kan anv¨andas f¨or visualisering av vektorgrafik. Rapporten inneh˚aller ¨aven en unders¨okning av programbibliotek f¨or Java som hanterar vektorgrafik. I unders¨okningen stud-erades totalt 15 olika bibliotek.
IDA,
Dept. of Computer and Information Science 581 83 Link¨oping
2009-09-29
LIU-IDA/LITH-EX-G-09/008-SE
-2009-09-29
Visualisering av elektroniska kopplingsscheman
Johan Bohlin
× ×