Grafisk programmering av primitiver - Mälardalens högskola
Grafisk programmering av primitiver - Mälardalens högskola
Grafisk programmering av primitiver - Mälardalens högskola
Transform your PDFs into Flipbooks and boost your revenue!
Leverage SEO-optimized Flipbooks, powerful backlinks, and multimedia content to professionally showcase your products and significantly increase your reach.
<strong>Grafisk</strong> <strong>programmering</strong> <strong>av</strong> <strong>primitiver</strong><br />
genom att använda C# och WPF.<br />
Examensarbete i Datorteknik<br />
Utfört vid Asea Brown Boveri<br />
Utfört <strong>av</strong>:<br />
Patricia Öhlund, MDH<br />
ABB, Asea Brown Boveri<br />
Programmering <strong>av</strong> <strong>primitiver</strong> till 800xA produkten<br />
Handledare: Björn Lindberg<br />
MDH, <strong>Mälardalens</strong> Högskola<br />
Examensarbete i Datateknik 15hp.<br />
Handledare och Examiantor: Thomas Larsson
<strong>Grafisk</strong> <strong>programmering</strong> <strong>av</strong> <strong>primitiver</strong> genom att använda C# och<br />
WPF.<br />
Sammanfattning:<br />
Uppgiften för detta examensarbete är att använda konstruktionen från den nya<br />
grafiska motorn i 800xA systemet från ABB, genom att implementera byggstenar för<br />
att få igång bildvisningar. Dessa byggstenar kallas grafiska <strong>primitiver</strong>.<br />
<strong>Grafisk</strong>a <strong>primitiver</strong> används i många program, bl.a. Office Excel.<br />
Det system som arbetet kommer att utföras i är 800xA systemet, vilket är utvecklat <strong>av</strong><br />
ABB.<br />
I detta system byggs produkter till kunder för försäljning, de beställer och ABB<br />
tillverkar, men för att kunna bygga programmen som kunderna efterfrågar så måste<br />
det finnas grafiska <strong>primitiver</strong> att använda.<br />
ABB har fått en ny grafikmotor och de implementerar nu <strong>primitiver</strong> med C# istället för<br />
Visual Basic som var det gamla systemets konstruktion.<br />
Exempel på några <strong>primitiver</strong> är olika diagram: stapel och cirkel diagram, dessa<br />
diagram kan kopplas samman med kommandon så att värden matas in automatiskt<br />
och <strong>primitiver</strong>na kommer till rörelser med hjälp <strong>av</strong> dessa värden.<br />
För varje nytt värde som blir inmatat ska diagrammet uppdateras automatiskt och rita<br />
ut de nya diagrammen med de nya värdena.<br />
Eftersom man kommer att använda sig <strong>av</strong> både C# och WPF så ska vi också gå<br />
igenom vad dessa två språk är och hur de fungerar.<br />
Graphical programming of primitives by using C# and WPF<br />
Abstract:<br />
The assigment of this thesis work is to use the construction from the new graphical<br />
engine in 800xA base, by implementing building blocks to utilize the visualization.<br />
These building blocks are named graphic primitives.<br />
Graphical primitives are being used in a lot of products, an example is Office Excel.<br />
The system where most of the work will be held is called 800xA and it is developed<br />
by ABB. In this system, programs will be built for customers to ABB, but to be able to<br />
create the program that the customers are asking for, the programmer needs to h<strong>av</strong>e<br />
graphics primitives to use.<br />
ABB recently received a new graphical engine and they now implement primitives<br />
with C# instead of Visual Basic which was the old systems construction.<br />
Examples on some primitives are different kinds of diagrams: staple and circle<br />
diagram, these diagrams can be connected with each other by using commands, so<br />
that the value will be fed in automatically.<br />
For each new value entered, the diagram needs to update the values and draw the<br />
new diagram.<br />
The language that will be used is C# and WPF and because of this we will also go<br />
deeper into the two languages and explain how they work.<br />
ii
iii
Förord<br />
Denna rapport skapades i samarbete med examensarbete på 15hp vid <strong>Mälardalens</strong><br />
Högskola (MDH), examensarbetet blev utfört vid Asea Brown Boveri (ABB).<br />
Jag skulle vilja tacka min handledare vid ABB Björn Lindberg som hjälpte mig igenom<br />
den praktiska delen <strong>av</strong> examensarbetet.<br />
Jag skulle också vilja tacka min handledare och examinator vid MDH Thomas<br />
Larsson som hjälpte mig med att skriva denna rapport.<br />
iv
Innehållsförteckning<br />
1 Inledning ............................................................................................................................ 1<br />
1.1 Hur <strong>primitiver</strong> hjälper användare ....................................................................................... 1<br />
1.2 Mål .......................................................................................................................................... 1<br />
2 Bakgrund ............................................................................................................................ 2<br />
2.1 ABB ......................................................................................................................................... 2<br />
2.2 C# ............................................................................................................................................ 3<br />
2.2.1 Historia .............................................................................................................................................. 3<br />
2.3 WPF ........................................................................................................................................ 4<br />
2.3.1 Visuals ............................................................................................................................................... 4<br />
2.3.2 Verktyg .............................................................................................................................................. 5<br />
2.3.2.1 DrawingVisual klassen: ............................................................................................................ 5<br />
2.3.2.2 Viewport3DVisual klassen: ...................................................................................................... 5<br />
2.3.2.3 ContainerVisual klassen: .......................................................................................................... 5<br />
2.3.2.4 Drawing Content i Visual objekt. ............................................................................................. 6<br />
2.3.2.5 DrawingContext klassen ........................................................................................................... 6<br />
2.3.2.6 StreamGeometryContext class: ................................................................................................ 6<br />
2.4 Program plattformar ............................................................................................................ 7<br />
2.4.1 Visual Studio 2005 ............................................................................................................................ 7<br />
2.4.2 Team Foundation Server ................................................................................................................... 7<br />
2.4.3 800xA ................................................................................................................................................ 7<br />
3 Primitiver .......................................................................................................................... 10<br />
3.1 Primitiv tabell ...................................................................................................................... 10<br />
3.2 Primitiv behov ...................................................................................................................... 12<br />
3.2.1 Procentuell visning .......................................................................................................................... 12<br />
3.2.2 Långa textsträngar ........................................................................................................................... 13<br />
4 Applikationerna ................................................................................................................ 15<br />
4.1 Pajdiagram primitiv ............................................................................................................ 15<br />
4.1.1 Egenskaper ...................................................................................................................................... 15<br />
4.1.2 Funktion .......................................................................................................................................... 16<br />
4.1.3 Problem som uppstod under arbetets gång ...................................................................................... 17<br />
4.2 Textrullning primitiv .......................................................................................................... 18<br />
4.2.1 Egenskaper ...................................................................................................................................... 18<br />
4.2.2 Funktion .......................................................................................................................................... 19<br />
4.2.3 Problem som uppstod ...................................................................................................................... 20<br />
4.3 Capability diagram primitiv ............................................................................................... 20<br />
4.3.1 Egenskaper ...................................................................................................................................... 20<br />
4.3.2 Tillverkning ..................................................................................................................................... 22<br />
4.3.3 Exempel Bilder ................................................................................................................................ 23<br />
4.3.4 Problem som uppstod ...................................................................................................................... 23<br />
5 Ändringar och planerade ändringar <strong>av</strong> gjorda <strong>primitiver</strong> ............................................. 24<br />
5.1 FlexiblePipe: ......................................................................................................................... 24<br />
5.2 Paj Diagram: ........................................................................................................................ 25<br />
5.3 Scrolling text: ....................................................................................................................... 26<br />
6 Rapport skrivning till Företaget ...................................................................................... 27<br />
7 Slutsatser .......................................................................................................................... 28<br />
vi
Figurförteckning<br />
Figur 2-1: 800xA system koppling. ........................................................................................... 8<br />
Figur 2-2: 800xA systemet ....................................................................................................... 9<br />
Figur 3-1: Blandande behållare. ............................................................................................. 12<br />
Figur 4-1: Paj diagram ............................................................................................................ 16<br />
Figur 4-2: ScrollingText. ......................................................................................................... 20<br />
Figur 5-1: Flexible Pipe: före ändringen ................................................................................. 24<br />
Figur 5-2: FlexiblePipe: Efter ändringen ................................................................................. 24<br />
Figur 5-3: Flexible Pipe: ihopsatt ............................................................................................ 25<br />
Figur 5-4: Pajdiagrammet före ändringen ............................................................................... 25<br />
Figur 5-5: Pajdiagrammet med en mindre skuggning ............................................................ 25<br />
Figur 5-6: Pajdiagrammet, full skuggning (badboll). ............................................................... 25<br />
Figur 5-7: Pajdiagrammet efter ändringen <strong>av</strong> skuggningen ................................................... 26<br />
vii
1 Inledning<br />
Den här rapporten kommer att handla om ett grafiskt examensarbete som finns<br />
tillgängligt för alla som har produktlicensen till 800xA som ABB har tillverkat.<br />
Primitiver till produkten är något som är nödvändigt och dessa <strong>primitiver</strong> får inte<br />
konsumera för mycket resurser.<br />
<strong>Grafisk</strong> <strong>programmering</strong> kan göras i både 2D, 2.5D och 3D.<br />
2D kan uppfattas som ”platt och tråkig” men den är väldigt nyttig och tar oftast minst<br />
resurser när den blir programmerad. 2D används bäst till att visa text och värden [1].<br />
2.5D är en blandning <strong>av</strong> 2D och 3D, även kallad pseudo-3D, det används först och<br />
främst för spel och blev en revolution 1976 när det första pseudo-3D spelet skapades<br />
<strong>av</strong> Atari.<br />
3D kan ses från alla håll, allting ändras med kamer<strong>av</strong>inkelns ändring.<br />
3D används bäst i första persons perspektiv, eller om man ska presentera någon<br />
form <strong>av</strong> vetenskap, exempelvis en kropps olika delar, hjärtat, hjärnan.<br />
Något man måste tänka på är dock att 3D innehåller mycket mer information och<br />
kommer att ta mer resurser för att exekvera.<br />
Eftersom företagets kunder har maskiner som redan pressas till max så vill man att<br />
programvaran tar så lite resurser som möjligt. På grund <strong>av</strong> detta ska man tillverka<br />
<strong>primitiver</strong> så enkelt som möjligt, men det innebär inte att man helt ska utesluta 3D.<br />
Alla <strong>primitiver</strong> som tillverkas för 800xA systemet här i ABB är bildade ur C# och WPF<br />
med hjälp <strong>av</strong> plattformen Visual Studio och alla tillverkade <strong>primitiver</strong> finns tillgängliga<br />
till alla anställda inom ABB genom Team Foundation servrar.<br />
1.1 Hur <strong>primitiver</strong> hjälper användare<br />
Primitiver behövs för att hjälpa en programmerare att tillverka själva produkten som<br />
en kund har beställt. Desto mer <strong>primitiver</strong> det finns desto snabbare kan en<br />
programmerare arbeta för att få upp den information som kunden vill ha. I vissa fall<br />
kommer en programmerare att specifikt beställa delar till den beställda produkten<br />
från en annan <strong>av</strong>delning inom ABB, så programmeraren själv kan koncentrera sig på<br />
sitt arbete.<br />
1.2 Mål<br />
ABB behöver fler <strong>primitiver</strong> till sitt 800xA system. De behöver bland annat en primitiv<br />
som kan visa användaren procentuellt vilka <strong>av</strong> de inkommande värdena som är de<br />
högsta, en primitiv som kan visa långa textsträngar och en primitiv som var beställd<br />
<strong>av</strong> en kund.<br />
Diskussioner uppstod om hur dessa <strong>primitiver</strong> skulle byggas upp och fungera.<br />
Med den procentuella visningen undrade man om en tabell i enkel form, stolpdiagram<br />
eller ett pajdiagram skulle vara det bästa sättet att visualisera procenten<br />
För den långa textsträngen blev det frågor angående sättet att visa texten så att den<br />
endast ska synas inom ett mindre område.<br />
Det primära målet var att lära sig mer om C# och WPF <strong>programmering</strong> med Visuals,<br />
att lära sig och förstå hur det fungerar, dessutom att förstå hur visualisering <strong>av</strong><br />
<strong>primitiver</strong> uppfattas <strong>av</strong> människor och tillverka dessa på bästa möjliga sätt [13].<br />
1
2 Bakgrund<br />
Bakgrund och historia om de verktyg och plattformar som användes för att få<br />
examensarbetet färdigställt.<br />
2.1 ABB<br />
ABB står för Asea Brown Boveri [2], och har bildats från två olika företag Asea och<br />
Brown Boveri. Aseas historia sträcker sig till 1883 och Brown Boveris börjar vid 1891.<br />
Huvudkontoret hamnade efter sammanslagningen i Zürich, Schweiz och företaget<br />
ägdes till hälften <strong>av</strong> Asea och hälften <strong>av</strong> Brown Boveri. Den nya storkoncernen, som<br />
började verksamheten den 5’e januari 1988, fick hela 100 miljarder kronor i<br />
omsättning och 160 000 anställda över hela världen.<br />
Sen dess har ABB växt, nu finns ABB i över 100 länder över hela världen, endast i<br />
Sverige finns ABB i över 20 orter.<br />
ABB är indelade i fem områden:<br />
• Power Products<br />
• Power Systems<br />
• Automation Products<br />
• Process Automation<br />
• Robotics<br />
De tillverkar kraftnät med transformatorer, ställverk, övervakningssystem,<br />
processtyrning och industrirobotar.<br />
I över hundra år har ABB (och dåvarande Asea) genom långsiktig forskning och<br />
utveckling tagit fram teknik, produkter och tjänster som underlättar för alla i<br />
samhället.<br />
2
2.2 C#<br />
C# (uttalas C Sharp) [4] språket sägs kombinera de bästa egenskaperna från både<br />
C++, C och J<strong>av</strong>a. Det utvecklades <strong>av</strong> Microsoft till deras .NET plattform och det är<br />
specifikt tillverkat för Microsofts egna operativsystem.<br />
C# versionen 3.0 blev utsläppt november 2007, som en del <strong>av</strong> .NET Framework 3.5<br />
Att kunna koppla ihop WPF med C# blev möjligt i .NET 3.0. [5]<br />
Här kommer lite kod exempel hur C# kodning kan se ut:<br />
public class HelloWorld<br />
{<br />
public static void Main(string[] args)<br />
{<br />
Console.WriteLine("Hello, World!");<br />
Console.WriteLine("You entered the following {0} command line arguments:",<br />
args.Length );<br />
for (int i=0; i < args.Length; i++)<br />
{<br />
Console.WriteLine("{0}", args[i]);<br />
}<br />
}<br />
}<br />
2.2.1 Historia<br />
I januari 1999 bildade Anders Hejlsberg en grupp för att bygga ett nytt<br />
<strong>programmering</strong>sspråk, som vid tillfället blev kallat för ”Cool”. När .NET blev publicerat<br />
för allmänheten i juli 2000 så blev programspråkets namn ändrat till just C#.<br />
Anders Hejilsberg har även arbetat med utveckling <strong>av</strong>:<br />
• Visual J++<br />
• Borland Delphi<br />
• Turbo Pascal<br />
Han har sagt i intervjuer att de flesta stora <strong>programmering</strong>sspråken (C++, j<strong>av</strong>a,<br />
Delphi och smalltalk) utgjorde grundprincipen <strong>av</strong> CLR (Common Language Runtime),<br />
vilket i sin tur utgjorde designen <strong>av</strong> C# <strong>programmering</strong>sspråket. Många påstår att C#<br />
har sina rötter från andra <strong>programmering</strong>sspråk.<br />
3
2.3 WPF<br />
WPF, Windows Presentation Foundation, ingår i .NET 3.0 och den kommer<br />
förinstallerad i Windows Vista Operativsystemet. Den finns också för Windows XP<br />
SP2 och Windows Server 2003 för nedladdning. [6, 7, 8]<br />
Den är direkt kopplad till XAML (Extensible Application Markup Language, uttalas<br />
Zammel), XAML fungerar på ett liknande sätt som CSS till HTML <strong>programmering</strong>.<br />
WPF består <strong>av</strong> en sammanhängande <strong>programmering</strong>smodell som håller isär<br />
användargränssnitt och affärslogik.<br />
Ett WPF program kan köras både fristående eller i en webbläsare. WPF integrerar<br />
UI, 2D och 3D ritningar, dokument, <strong>av</strong>ancerad typografi, vektorgrafik, rastergrafik,<br />
animation, datakommunikation, ljud och video.<br />
WPF är tänkt att bli nästa generations grafik API för Windows applikationer på<br />
skrivbordet. Följande är några <strong>av</strong> Microsofts egna produkter eller tredje part<br />
applikationer som är skrivna i WPF:<br />
• Microsoft Expression Design<br />
• Microsoft Expression Blend<br />
• Yahoo! Messenger<br />
Ett antal nyhetstidningar genom skrivbordet:<br />
• New York Times reader<br />
• Forbes.com reader<br />
• Seattle Post-Intelligencer reader<br />
• Daily Mail eReader<br />
• Denounce RSS reader och Podcast Lyssnare<br />
• Jyllands Posten JP2<br />
2.3.1 Visuals<br />
I Visuals finns den abstrakta klassen UIElement, som är basklassen till<br />
FrameworkElement. UIElement har en lågnivåstruktur för att rita någonting på<br />
skärmen.<br />
Visual objektet är ett WPF objekt, vars primära uppgift är att ge renderingshjälp och<br />
UI kontroller, så som knappar och text boxar, Visual klassen hjälper till med följande<br />
delar:<br />
• Output visning: Rendering <strong>av</strong> kvarstående och seriell ritning <strong>av</strong> innehållet i<br />
en Visual.<br />
• Transformationer: Genomför transformationer i en Visual.<br />
• Klippning: Ger tillgång till klippning <strong>av</strong> en Visual<br />
• Hit Test: Bestämmer om en geometri finns inom en gräns för en Visual<br />
• Bounding box beräkningar: Bestämmer den bundna rektangeln <strong>av</strong> en<br />
Visual.<br />
DrawingComplex tillåter dig att populera en Visual med visuellt innehåll. När du<br />
använder dig <strong>av</strong> en DrawingContext ritnings objekt, kommer du att lagra en serie <strong>av</strong><br />
renderingsdata som blir använt <strong>av</strong> ett grafiksystem, man ritar alltså inte på skärmen i<br />
real tid.<br />
4
Vi tänker oss ett äldre spel i formatet ”Mario Brothers”, där sidrullning förekommer. I<br />
situationer som detta, om spelet är implementerat med WPF, kan det finnas upp till<br />
tusen ritningar samtidigt på skärmen. Det är på grund <strong>av</strong> detta problem som det finns<br />
en speciell Visualklass, en subklass som lättar upp renderingen <strong>av</strong> rörelserna. Den<br />
kallas för DrawingVisuals och istället för DrawingComplex blir DrawingVisuals<br />
snabbare med större applikationer.<br />
2.3.2 Verktyg<br />
Visual är använt som en publikabstraktklass som måste uppstå från dess<br />
underklasser. Följande illustration visar hierarkin <strong>av</strong> en Visual objekt som är<br />
exponerad i WPF: [9]<br />
2.3.2.1 DrawingVisual klassen:<br />
[8] DrawingVisual är en lättviktig ritningsklass som används för att rendera former,<br />
bilder, eller text. Denna klass anses lättviktig på grund <strong>av</strong> att den inte ger någon<br />
layout eller någon form <strong>av</strong> händelseaktivering, vilket förbättrar dess prestanda. Av<br />
denna anledning blir bakgrundsritningar och clipartbilder perfekta<br />
användningsområden för DrawingVisuals.<br />
Några egenskaper DrawingVisual har:<br />
• Drawing: Får in en ritning <strong>av</strong> ett DrawingVisual objekt<br />
• Opacity: sätter genomskinlighetsgraden på ContainerVisual, 0 = genomskinlig.<br />
• VisualClip: får eller sätter en klippregion <strong>av</strong> Visual som ett Geometrivärde.<br />
• VisualTransform: får eller sätter ett Transformationsvärde för en Visual<br />
2.3.2.2 Viewport3DVisual klassen:<br />
viewport3DVisual ger en bro mellan 2D Visual och Visual3D objekt. Visual3D<br />
klassen är basklassen för all form <strong>av</strong> 3D visualisering. Viewport3DVisual måste få<br />
in ett kamer<strong>av</strong>ärde och ett Viewportvärde. Kameran tillåter dig att se området i<br />
2D.<br />
2.3.2.3 ContainerVisual klassen:<br />
ContainerVisual används som en container för att samla ihop Visual objekt.<br />
DrawVisual klassen kommer från ContainerVisual klassen och tillåter den att<br />
samla ihop en grupp <strong>av</strong> Visual objekt.<br />
5
2.3.2.4 Drawing Content i Visual objekt.<br />
Ett Visual objekt lagrar dess renderingsdata som en vektor, med en grafisk<br />
instruktionslista. Varje del <strong>av</strong> instruktionens lista representerar en viss grafisk<br />
datagrupp och associerade resurser i ett numrerat format.<br />
2.3.2.5 DrawingContext klassen<br />
En DrawingContext klass [10] används på liknande sätt som DrawingVisual,<br />
för varje figur man skapar kommer renderingsinformationen att lagras för<br />
utritning.<br />
Några medlemmar som finns i DrawingContext klassen är:<br />
• DrawDrawing: Ritar ut det specifikt lagrade ritningsobjektet.<br />
• DrawGeometry: Ritar ut den specifika Geometrylagringen genom att använda en<br />
Pensel eller penna.<br />
• DrawGlyphRun: Ritar ut en specifikt lagrad text.<br />
• DrawImage: Ritar ut en bild inom en region som är specificerad <strong>av</strong> en Rect<br />
(rektangel)<br />
• DrawLine: Ritar ut en rak linje mellan två punkter med en penna.<br />
• DrawRectangle: Ritar ut en rektangel.<br />
• DrawRoundedRectangle: Ritar ut en rundad rectangle i hörnen.<br />
• DrawText: Ritar ut en formatterad text på en specifik plats.<br />
• DrawVideo: Ritar ut en video inom en spefik region.<br />
• Pop: Poppar den sista masken, klippet, effekten eller transformationen som har<br />
blivit pushad till drawingContext.<br />
• PushClip: Pushar den sista specifika klipp regionen in i drawingContext<br />
• pushEffect, PushGuidelineSet, PushOpacity, PushOpacityMask och<br />
PushTransform används på alla sätt och kan alla bli poppade <strong>av</strong> Pop.<br />
2.3.2.6 StreamGeometryContext class:<br />
En StreamGeometry är ett enklare alternativ till PathGeometry för att tillverka<br />
geometriska figurer. Man ska använda en streamGeometry när man behöver<br />
beskriva en complexgeometri men inte vill att den ska kunna ta hand om en speciell<br />
databindning, animationer eller ändringar. På grund <strong>av</strong> dess effektivitet, är<br />
streamGeometry klassen ett bra val för att beskriva figurer.<br />
Några medlemmar från StreamGeometryContext:<br />
• ArcTo: Ritar ut en ark till en specifik punkt.<br />
• BeginFigure: Specifiserar startpunkten för en ny figur.<br />
• LineTo: Ritar ut en rak linje till en specifik punkt.<br />
• PolyBezierTo: Ritar ut en eller fler kopplade Beizerkurvor.<br />
• PolyLineTo: Ritar ut en eller fler kopplade raka linjer<br />
6
2.4 Program plattformar<br />
Följande program användes för att framställa 800xA <strong>primitiver</strong>na.<br />
2.4.1 Visual Studio 2005<br />
Visual Studio är tillverkad <strong>av</strong> Microsoft [11], det är den huvudsakliga IDE’n (Integrated<br />
Development Environment) från Microsoft. Den kan användas till att tillverka konsol och<br />
GUI (Graphical User Inerface) applikationer, tillsammans med Windows-forms<br />
applikationer, webbsidor, webbapplikationer och webbservice.<br />
Visual Studio har bland annat en egen debugger, man kan designa sina egna GUI<br />
applikationer, webbdesignare, klassdesignare och databasschemadesigner.<br />
Visual Studio förstår följande <strong>programmering</strong>s språk:<br />
• C/C++ via Visual C++<br />
• VB.NET via Visual Basic.NET<br />
• C# via Visual C#<br />
• F#<br />
• Python<br />
• Ruby<br />
• XML/XSLT<br />
• HTML/XHTML<br />
• J<strong>av</strong>aScript<br />
• CSS<br />
För tillfället finns Visual Studio 2008 och 2005 Professional Editions, tillsammans<br />
med språkversionerna (Visual Basic, C++, C#, J#) <strong>av</strong> Visual Studio 2005 för gratis<br />
nedladdning via Microsofts DreamSpark program för studenter.<br />
2.4.2 Team Foundation Server<br />
En snabb genomgång <strong>av</strong> vad Team Foundation Server (även förkortat TFS)[12] är<br />
och hur den fungerar.<br />
TFS är tillverkad <strong>av</strong> Microsoft, för att samla data, lagra, rapportera och hitta projekt.<br />
Den är till för att tillverka flertalet projekt och det finns flera versioner <strong>av</strong> den, bland<br />
annat som en ensamstående mjukvara eller med en serverplattform för Visual Studio<br />
Team System (VSTS). TFS hanterar med andra ord projekt som klienter sparar<br />
undan, dessa projekt blir tillgängliga för de som har tillgång till nätverket.<br />
2.4.3 800xA<br />
800xA systemet är en produkt som ABB säljer till kunder där varje kund får köpa en<br />
eller flera licenser beroende på hur stort deras företag är.<br />
Systemet fungerar på följande sätt inom ABB:<br />
Ett 800xA systeminstallation består <strong>av</strong> datorer och utrustning som kommunicerar<br />
med varandra över olika typer <strong>av</strong> kommunikation och nätverk, som illustreras bra i<br />
följande figur.<br />
7
Figur 2-1: 800xA system koppling.<br />
Klientens nätverk används för att kommunicera mellan servrar och arbetsstationer.<br />
Servrarna kör en mjukvara som ger systemet tillgång till funktionaliteter.<br />
Arbetsstationerna kör en mjukvara som ger olika former <strong>av</strong> användarinteraktioner.<br />
För mindre system, servrar och arbetsstationer, kan mjukvaran komma att bli<br />
installerade och körda på en och samma maskin.<br />
Kontrollnätverket är ett lokalt nätverk (LAN) som har en hög prestanda och pålitlig<br />
kommunikation med förutbestämda responstider i realtid. Den används till att koppla<br />
upp kontrollerna mot serverarna. Kontrollerna är som noder som kör en kontrollerad<br />
mjukvara.<br />
Fältbussar används för att koppla samman utrustning, så som I/O moduler, smarta<br />
sensorer och aktiveringsdelar. När den kopplar ihop alla dessa I/O moduler till<br />
systemet kommer det att gå via några kontroller så som indikeras i Figur 2-1, eller<br />
kopplas direkt till en server.<br />
Klientens/Serverns nätverk kan bli kopplad till en ”Plant Network” så som ett kontor<br />
eller ett samlat nätverk, via någon form <strong>av</strong> nätverkets utrustning.<br />
Ett tusental I/O-enheter sitter och mäter värden från de sensorer och delar den har<br />
tillgång till, dessa värden kommer att passera upp till kontrollerna.<br />
Kontrollerna kommer att styra I/O-enheterna efter begäran, exempelvis om elden<br />
börjar slockna så gasar programmet på lite till för att hålla igång den.<br />
Dessa kontroller går sedan till operatörer, där skärmar visar alla värden som bildas<br />
och en person vid en operatorskärm kan själv styra kontrollerna för sänkning eller<br />
ökning <strong>av</strong> värdena i I/O-enheterna.<br />
Huvudpersonerna har även de tillgångar till all statistik, som exempel:<br />
8
Hur mycket tillverkades?<br />
Hur har det fungerat?<br />
Hur har det sett ut?<br />
Om det finns flera byggnader i eller utanför landet kan alltihop kopplas ihop med ett<br />
större nätverk och information kan enkelt skickas mellan de olika parterna.<br />
Det område som tillverkar <strong>primitiver</strong> är även det område som gör programmen till<br />
operatörerna, så att operatörerna ser alla nödvändiga värden som bildas i I/O som<br />
kontrollerna plockar upp.<br />
Det är dessa <strong>primitiver</strong> som kommer att visa hur saker och ting fungerar och de kan<br />
kopplas ihop med varningssignaler och alarm om något värde börjar glida åt fel håll<br />
och de åtgärder den har blivit programmerad att göra inte hjälper.<br />
Simulatorprogrammet kommer att testas noggrant innan det anländer till kunden.<br />
Många <strong>av</strong> dessa program är stora och mycket komplicerade och allt måste fungera<br />
bra i simulatorn innan de skickas till kunden, det är det som testarna arbetar med.<br />
Figur 2-2: 800xA systemet<br />
9
3 Primitiver<br />
En grafikprimitiv kan vara en stor variation <strong>av</strong> grafiska delar. En liten text är en<br />
primitiv för sig. Rektangel, cirkel, trianglar är också de <strong>primitiver</strong>.<br />
Primitiver kan vara väldigt komplicerade och det är dessa som tar tid att tillverka.<br />
Med komplicerade <strong>primitiver</strong> menas sådana <strong>primitiver</strong> som har många funktioner och<br />
metoder. Det är också dessa som behöver en stor dokumentation om hur de fungerar<br />
för att andra ska kunna förstå vad som behöver göras för att använda den på rätt<br />
sätt.<br />
3.1 Primitiv tabell<br />
De <strong>primitiver</strong> som används just nu i 800xA systemet kommer nedanför, denna lista<br />
kommer att öka allt eftersom de tillverkar fler och eftersom 800xA uppdateras<br />
dagligen så kommer det absolut att ändras, lista: 2008-04-19:<br />
Arc Ritar ut en del <strong>av</strong> en cirkel, kan<br />
ändra <strong>av</strong>ståndet mellan start och<br />
stop.<br />
Bar Visar värderna som placeras,<br />
horisontellt.<br />
CapabilityDiagram (min) Capability diagram, kommer att<br />
finnas inne i systemet senare.<br />
Chord Ritar ut en del <strong>av</strong> en cirkel som är<br />
ifylld eller transparent.<br />
Cone Ritar ut en kon<br />
Curve Klicka och den ritar ut kurvor, som<br />
kan ha olika böjningar<br />
Ellipse Ritar ut en ellips<br />
ErrorIndicator Man kan välja vilken grad <strong>av</strong> fel det<br />
har blivit – om något.<br />
FilledPath Ritar en fylld stig<br />
FlexiblePipe (ändrade i) Flexibelt rör, den följer med där man<br />
klickar, ritar automatiskt ut hörnen.<br />
10
GroupBox Grupperar arbetena.<br />
HScale En skala horisontellt.<br />
Image Kan placera en bild inuti, denna är<br />
tom.<br />
Pie Ritar ut en paj form, kan bestämma<br />
start och stopp<br />
PieChart Ritar ut ett paj diagram<br />
Pipe Ritar ut en del <strong>av</strong> ett rör.<br />
Polygon Ritar ut en polygon där man klickar<br />
PolyLine Ritar ut raka linjer där man klickar<br />
RadarChart Ritar ut ett radardiagram, följer ett<br />
antal värden när de ändras i detta<br />
diagram<br />
RangeBar Ritar ut en bar, farlig nivå, ok nivå,<br />
välj färger.<br />
ScrollingText ( min) Ritar ut en rullande text, välj håll och<br />
typ <strong>av</strong> rullning.<br />
Text Ritar ut en text.<br />
Trend Ritar ut en trend, många olika<br />
värden som kan följa trenden.<br />
Denna är tom.<br />
Triangle / Rektangel Ritar ut en triangel eller en rektangel<br />
11
VScale<br />
12<br />
Ritar ut en vertikal skala, man kan<br />
ändra dess värden och antal pinnar<br />
som man har mellan skalorna bland<br />
annat.<br />
XYGraph/ XYPlot Ritar ut en XY graf eller XY<br />
punktgraf. Dessa är tomma<br />
XYZGraph Ritar ut en 3D graf.<br />
Följande bild är ett exempel på hur man kan placera ut olika delar tillsammans och<br />
skapa en produkt:<br />
Figur 3-1: Blandande behållare.<br />
3.2 Primitiv behov<br />
ABB behöver fler <strong>primitiver</strong> till sitt 800xA system, de behöver bland annat en primitiv<br />
som kan visa användaren procentuellt vilka <strong>av</strong> de inkommande värden som var de<br />
högsta, en primitiv som kan visa långa textsträngar på ett mindre område och en<br />
primitiv som skulle användas till ett olja och gasföretag som är kund hos ABB, för<br />
utveckling <strong>av</strong> kundens produkt.<br />
3.2.1 Procentuell visning<br />
För procentuell visning kan en enkel tabell fungera alldeles utmärkt för syftet. Om<br />
man dessutom tar och kalkylerar ut det högsta procentuella värdet kan man få<br />
tabellen att måla ut det högsta värdet i en definierad färg. På detta sätt kan man lätt<br />
med hjälp <strong>av</strong> en färg följa det högsta värdet, något som ABB var ute efter. Däremot
ville inte ABB se endast det högsta värdet tydligt, utan alla värden skulle kunna ses<br />
enkelt.<br />
Resultatet blir antagligen en väldigt multifärgad tabell eller en utan färg och då blir<br />
det genast svårare att uppfatta de rätta procentvärdena, dessutom är det inte visuellt<br />
bra att rita upp en tabell som kommer att få många och olika värden inmatade.<br />
Ett pajdiagram bygger på just procentvärden, den ritar ut värdena beroende på hur<br />
stor procent <strong>av</strong> cirkeln de använder. Men hur är det med ett stolpdiagram, kan man<br />
använda sig <strong>av</strong> ett stolpdiagram för att visa procentuella värden?<br />
Ett stolpdiagram fungerar på liknande sätt som ett pajdiagram. Vilket <strong>av</strong> dem som<br />
lämpar sig bäst att användas beror helt på vilken information man vill visa. Ett<br />
stolpdiagram är mycket bättre på att visa skillnader och jämföra olika värden,<br />
exempelvis hur många bilar som har sålts detta år jämfört med de senaste 10 åren.<br />
Något man ska tänka på är att inte använda sig <strong>av</strong> pseudo-3D diagram, eftersom det<br />
blir mycket svårare att läsa <strong>av</strong> innehållet, ett 2D diagram är mycket mer lättläst. Om<br />
en kund efterfrågar ett specifikt detaljerat diagram med pseudo-3D och kommentarer,<br />
visa dem då varför det inte fungerar bra. Förklara vad som blir effektivast, ge kunden<br />
valmöjligheter, tillverka båda delarna, en med pseudo-3D och en 2D, be kunden att<br />
ge värdet i pseudo-3D, ta sen fram din 2D och ge ett exaktare värde. [14]<br />
I detta fall ville ABB visa procentvärdena på ett effektivt sätt. Då återstår<br />
pajdiagrammet som på ett effektivt sätt kan visa de procentuella värden som uppstår.<br />
Något som gör det hela ännu lättare att visualisera är om man färgar varje värde med<br />
olika färger och låter procentsiffrorna ligga innanför själva cirkeln eller ”flyga” smått<br />
ovanför. Att ha värdena staplade på sidan om pajen skulle ta bort fokus på själva<br />
diagrammet.<br />
Det val vi gjorde var ha procentvärdena utanför cirkeln men tillräckligt nära för att inte<br />
tappa fokus från själva pajdiagrammet. Nya värden kommer att matas in snabbare än<br />
varje sekund och då måste man kunna hålla ögonen på informationen på ett smidigt<br />
sätt.<br />
Om vi hade valt att ha procenttexten inuti varje pajdel i pajdiagrammet skulle det ha<br />
blivit problematiskt om ett värde hade varit litet i jämförelse med de andra värdena.<br />
Var skulle texten hamna? All information ska kunna vara tillgänglig när som helst så<br />
det är inte möjligt att ta bort ett värde bara på grund <strong>av</strong> att det är litet.<br />
En annan idé var att sortera pajdiagrammet i storlek, så att det största värdet alltid är<br />
på en speciell placering, men genom forskning kom vi fram till att om man vill sortera<br />
värdena efter storlek ska man satsa på en punktgraf istället.<br />
3.2.2 Långa textsträngar<br />
De stora diskussionerna inom detta område handlade om hur vi skulle visualisera en<br />
lång text inom ett mindre område. Vilket <strong>av</strong> dessa alternativ skulle vara bäst att ha?<br />
13
Ett litet textområde där texten delade sig i flertalet bitar för att passa textområdets<br />
storlek, där textområdet skulle visa första delen <strong>av</strong> själva texten 10-30 sekunder<br />
innan den fortsatte till nästa del och så vidare hela vägen till slutet <strong>av</strong> textsträngen.<br />
Eller skulle det vara bättre att använda en rullande text som rullar igenom textområdet<br />
som man kan kontrollera.<br />
Låt oss ta en titt på texten som delade sig, vi kallar den för klipp-och-klistra texten för<br />
tillfället. En klipp-och-klistra text skulle troligen bli svår att konstruera pga. det faktum<br />
att man inte kommer att veta var någonstans man ska klippa <strong>av</strong> själva texten, om<br />
texten inte innehåller något tecken som kan visa primitiven att vid detta tecken ska<br />
det klippas.<br />
En rullande text blir lättare i detta <strong>av</strong>seende men då måste man animera texten.<br />
Något som skulle vara bra till en rullande text skulle vara att kunna kontrollera<br />
rullningen på ett effektivt sätt, så som val <strong>av</strong> hur rullningen ska gå till, var ska den<br />
börja och var ska den sluta, dess hastighet och dess utseende.<br />
14
4 Applikationerna<br />
Dessa är de färdigställda <strong>primitiver</strong>na som blev tillverkade under examensarbetet i<br />
ABB.<br />
4.1 Pajdiagram primitiv<br />
Ett Pajdiagram är en stängd figur, skapad genom ett antal pajdelar som blir skapade<br />
genom två raka linjer och en del <strong>av</strong> en cirkel mellan dem.<br />
4.1.1 Egenskaper<br />
Följande är en tabell med alla egenskaper som ett pajdiagram har:<br />
NAME TYPE DEFAULT DESCRIPTION<br />
Font LogicalFont<br />
15<br />
“Font( “Ariel”, 14,<br />
Regular,<br />
DemiBold)”<br />
Visible BOOLEAN True<br />
Height FLOAT 300<br />
Width FLOAT 300<br />
Teckensnitt för att<br />
använda i all text i paj<br />
diagrammet.<br />
Bestämmer om den är<br />
synlig i programmet<br />
eller ej.<br />
Höjden på själva<br />
primitiven<br />
Bredden på själva<br />
primitiven<br />
Name STRING “PieChart1” Namnet på primitiven<br />
Pen Pen “N<strong>av</strong>y, 1”<br />
EngineeringUnit STRING “”<br />
ShadeLength INTEGER 0<br />
PresentationMode<br />
Shade<br />
ShowText<br />
ShowLines<br />
Transform<br />
ENUM<br />
UnitType<br />
ENUM<br />
ShowShade<br />
ENUM<br />
ShowText<br />
ENUM<br />
ShowLines<br />
TRANSFORM<br />
Type<br />
XPos, YPos FLOAT<br />
En penna för att rita ut<br />
pajen och linjerna.<br />
EngineeringUnit är till<br />
för att spåra värdena<br />
Möjliggör ändringar <strong>av</strong><br />
storleken på<br />
shadningen<br />
Percentage Sätter presentationen.<br />
Show3D<br />
ShowText<br />
NoLines<br />
Center of the<br />
display area<br />
Aktiverar shadning,<br />
eller slår <strong>av</strong> den<br />
Aktiverar text, eller slår<br />
<strong>av</strong> den<br />
Aktiverar linjerna, eller<br />
slår <strong>av</strong> dem<br />
Möjliggör animationer<br />
så som skalning,<br />
flyttning och rotationer.<br />
Positionen <strong>av</strong><br />
primitivens area,<br />
placering uppe i<br />
vänstra hörnet.
Rotation<br />
ROTATION<br />
Type<br />
PieSpokeXColor BRUSH<br />
16<br />
0<br />
“Red” (the first<br />
10 colors is<br />
default defined)<br />
PieSpokeXCurrentValue DOUBLE 10<br />
PieSpokeXNumberOfDecimals INTEGER 1<br />
Rotations vinkel,<br />
center <strong>av</strong> den<br />
definierade arean är<br />
axis <strong>av</strong> rotationen.<br />
En pensel för att färga<br />
varje pajdel.<br />
Värdet på den<br />
specifika pajdelen.<br />
Antal decimaler på<br />
värdena.<br />
4.1.2 Funktion<br />
Börja med att först välja hur många värden som kommer att bli inmatade i själva<br />
diagrammet. Ge sedan värdena varsitt värde, automatiskt kommer pajen ändra form<br />
för att passa de nya värdena.<br />
Man kan aktivera ”utritning <strong>av</strong> linjer” till siffrorna och siffrorna kan visas som både<br />
procent och det nuvarande inmatade värdet. Man kan också ta bort texten och vara<br />
helt utan siffror.<br />
EngineeringUnit möjliggör en ändring <strong>av</strong> värdena, så att man kan förlänga siffrorna<br />
med valfri sträng: cm, m, km, cl, liter, och så vidare. Detta visas i det nedre vänstra<br />
pajdiagrammet i Figur 4-1.<br />
Om skuggningen <strong>av</strong>aktiveras blir den 2D, annars så ritas en skuggning ut längst ut<br />
på cirkelns kant som ger den en falsk 3D-aktig figur.<br />
Exempel Bilder:<br />
Figur 4-1: Paj diagram<br />
PieChart:<br />
Utritade med:<br />
• Linjer.<br />
• Olika färger.<br />
• Olika värden.<br />
• Visning <strong>av</strong> procent.<br />
• Visning <strong>av</strong> värden.<br />
• Med skuggning.<br />
• Utan skuggning.<br />
• Engineering Unit
4.1.3 Problem som uppstod under arbetets gång<br />
Några problem som uppstod var bland annat på vilket sätt man skulle måla ut pajen. I<br />
den första omgången gjordes en enkel cirkel med linjer som rörde sig efter<br />
inkommande värden. Det upptäcktes dock snabbt att valet att ha olika färger för varje<br />
pajdel inte skulle fungera med denna utritning och att det skulle bli lättare att<br />
visualisera varje pajdel i diagrammet om varje del fick olika färger.<br />
Istället ändrades det till att rita ut två raka linjer och lägga en ark mellan dessa två<br />
linjer.<br />
Koden:<br />
streamContext.BeginFigure(p0, true, true);<br />
streamContext.LineTo(p1, true, true);<br />
streamContext.ArcTo(p2, arcSize, 0, rotateAngle > 180,<br />
SweepDirection.Clockwise, true, true);<br />
streamContext.LineTo(p0, true, true);<br />
Man måste börja med att tala om var startpunkten är och detta gör man med<br />
”BeginFigure”.<br />
”BeginFigure”: denna metod vill få in punkten där figuren ska börja ritas (p0).<br />
Nu är det dags att börja rita, vi ropar på funktionen ”LineTo” från<br />
StreamGeometryComplex klassen.<br />
”LineTo” vill ha punkten dit linjen ska gå, den har början från ”BeginFigure” redan<br />
och nu fortsätter den till punkt 1 (p1)<br />
Arken, ”ArcTo” fungerar på följande sätt:<br />
”ArcTo” ritar ut en del <strong>av</strong> en cirkel. Men det finns många sätt att rita ut en böjd kurva<br />
mellan två linjer och därför begär den många inparametrar innan den vet exakt hur<br />
kurvan kommer se ut.<br />
”ArcTo” vill veta till vilken punkt den ska rital. Den har ju startpunkten från punkt 1, så<br />
då ger vi den punkt 2 (p2).<br />
Nu vill ”ArcTo” veta hur stor radie på cirkeln det ska vara, detta är ”arcSize” i koden.<br />
”ArcTo” vill veta om det finns någon rotationsvinkel, vilket det i detta fall inte finns. Vi<br />
matar in 0. ”ArcTo” vill också veta om den ska rita ut den stora kurvan mellan de två<br />
punkterna eller den lilla kurvan, i detta fall beror det på hur stor själva pajen är. Det är<br />
därför vi jämför med 180 grader, om den går längre än 180 kommer den att<br />
returneras ”True”, vilket innebär att den ritar den stora kurvan, annars ritas den<br />
mindre kurvan mellan punkterna.<br />
Den femte parametern gäller åt vilket den ska rita kurvan, ”clockwise” eller<br />
”counterClockwise”.<br />
Dessa är de viktiga parametrarna som man måste ordna innan det blir dags för själva<br />
utritningen <strong>av</strong> ”ArcTo”. När väl denna har blivit utritad får man inte glömma att peka<br />
tillbaka till startpunkten med ”LineTo” igen (p0)<br />
Nu tar vi en titt på en enda pajdel så att man lättare förstår vad som händer.<br />
LineTo<br />
P1<br />
P0<br />
LineTo<br />
ArcTo<br />
P2<br />
1: BeginFigure skapar startpunkten p0<br />
2: LineTo ritar ut en linje till nästa punkt p1<br />
3: ArcTo ritar ut arken till den sista punkten p2<br />
4: LineTo ritar ut den sista sträckan tillbaka till<br />
startpunkten.<br />
17
När den har blivit utritad på detta sätt kommer pajdelen att rotera hela sin vinkel, dit<br />
den andra linjen finns och sen ritas nästa del ut. På så sätt bildas pajen och det med<br />
hjälp <strong>av</strong> ”push-transform” som ordnar rotationen för den färdiga delen.<br />
4.2 Textrullning primitiv<br />
Rullande textprimitiven används för att visa en rullande text i ett grafikfönster. Den<br />
kan rulla in från grafikfönstret och ut med olika egenskaper.<br />
4.2.1 Egenskaper<br />
Följande är en tabell med alla egenskaper som rullande text har:<br />
NAME TYPE DEFAULT DESCRIPTION<br />
Name STRING “ScrollingText1” Namnet på primitiven<br />
Visible BOOLEAN True<br />
18<br />
Bestämmer om den är<br />
synlig i programmet eller ej.<br />
Height FLOAT 96 Höjden på själva primitiven<br />
Width FLOAT 96<br />
XPos, YPos FLOAT<br />
Transform<br />
TRANSFORM<br />
Type<br />
Center of the display<br />
area<br />
Line Pen Pen(RGB(0,255,0),1)<br />
FillColor BRUSH RGB(64,64,64)<br />
Rotation ROTATION Type 0<br />
Frame3DEffect<br />
ENUM<br />
Frame3DEffect<br />
RAISED<br />
FrameColor COLOR RGB (200,200,200)<br />
FrameColor2 COLOR RGB (127,127,127)<br />
Bredden på själva<br />
primitiven<br />
Positionen <strong>av</strong> primitivens<br />
area, placering uppe i<br />
vänstra hörnet.<br />
Möjliggör animationer så<br />
som skalning, flyttning och<br />
rotationer.<br />
Penna som ritar ut linjerna<br />
runt primitiven<br />
Bakgrunds färg till<br />
primitiven<br />
Rotations vinkel, center <strong>av</strong><br />
den definierade arean är<br />
axis <strong>av</strong> rotationen.<br />
Kontrollerar ramens<br />
placering i djup.<br />
Färg för att använda till den<br />
högra sedan <strong>av</strong> primitiven.<br />
Färg för att använda på<br />
vänster sida <strong>av</strong> primitiven.<br />
FrameWidth INTEGER 3 Bredden på ramen.<br />
Font FONT Tahoma<br />
Text STRING “ScrollingText”<br />
TextColor COLOR RGB(0,255,0)<br />
Teckensnitt för att visa<br />
texten.<br />
Själva texten som ska<br />
visas i arean.<br />
Färg för att ändra textens<br />
färg som visas inne i<br />
primitiven.
ScrollSpeed INTEGER 2<br />
ScrollOption<br />
Direction<br />
FadingShade<br />
ENUM<br />
ScrollOption<br />
ENUM<br />
ScrollDirection<br />
ENUM<br />
FadingShade<br />
19<br />
StartToEnd<br />
Left<br />
Both<br />
Sätter hastigheten på<br />
rullningen.<br />
Den bestämmer på vilket<br />
sätt texten ska rulla.<br />
Bestämmer åt vilket håll<br />
texten ska rulla.<br />
Bestämmer hur<br />
skuggningen ska visas.<br />
4.2.2 Funktion<br />
Den rullande texten blir animerad med hjälp <strong>av</strong> en klocka som är inbyggd i 800xA<br />
systemet, med varje ”tick” flyttar sig bilden ett antal pixlar åt valt håll beroende på<br />
hastigheten.<br />
De extra funktionerna som finns är hur rullningen ska börja och sluta.<br />
• ”StartToEnd” innebär att rullningen startar från första bokst<strong>av</strong>en och rullar till<br />
andra sidan <strong>av</strong> textområdet, den rullar hela vägen till den sista bokst<strong>av</strong>en. När<br />
den sista bokst<strong>av</strong>en når slutkanten <strong>av</strong> textområdet så börjar texten om igen.<br />
• ”StartToStart” innebär att rullningen startar från första bokst<strong>av</strong>en och rullar till<br />
andra sidan <strong>av</strong> textområdet, men när den första bokst<strong>av</strong>en når textkanten <strong>av</strong><br />
textområdet börjar texten om omgående.<br />
• ”AtOnce” innebär att rullningen startar från första bokst<strong>av</strong>en och rullar till andra<br />
sidan <strong>av</strong> textområdet, men på vägen till textkanten <strong>av</strong> textområdet kommer en<br />
ny text att starta upp så fort den sista bokst<strong>av</strong>en har lämnat startkanten. På<br />
detta sätt får man en flytande rullande text med inga stopp i, som inte visar<br />
några tomma områden i textrullningen.<br />
FadingShade bestämmer var skuggningen ska ske, den gör så att texten försvinner<br />
på ett finare sätt längst ut vid slutet och/eller början <strong>av</strong> textområdet.<br />
”Both” menas att båda sidorna har skuggningen aktiverad.<br />
Eftersom 800xA systemet ska finnas tillgängligt i de länder som läser från vänster till<br />
höger också så måste man även kunna välja vilket håll rullningen ska åka mot.
Exempel Bild:<br />
Figur 4-2: ScrollingText.<br />
20<br />
Rullande Text:<br />
• Här ser man alla val, ink. olika<br />
färger.<br />
• Skuggning <strong>av</strong>/på.<br />
• olika inställningar på rullningen<br />
(Pilarna visar vilket håll texten rör sig).<br />
4.2.3 Problem som uppstod<br />
Ett större problem som uppstod, om man körde med längre meningar när man hade<br />
”StartToStart” som val, var att text två började skriva över den första texten som<br />
redan rullade. Det fanns alltså ingen kontroll som kontrollerade att det inte fanns<br />
någon text där redan.<br />
Detta problem fixades genom att ändra ”StartToStart” till att automatiskt ändras till<br />
”AtOnce” när textsträngen är så pass lång att den sträcker sig hela vägen mellan<br />
textområdet. På detta sätt började texten om när den sista biten hade lämnat<br />
startkanten.<br />
4.3 Capability diagram primitiv<br />
Capability Diagrammet är en början <strong>av</strong> ett diagramprogram åt en kund till ABB som<br />
håller på med mätningar <strong>av</strong> gas och olja. Diagrammets uppgift är att visa när en<br />
generator börjar närma sig ett farligt värde. När operatören ser detta måste denna<br />
person göra åtgärder för att hindra att generatorn överstiger den farliga gränsen.<br />
Diagrammet kommer att ha tillgång till en rad olika värden som blir resultatet <strong>av</strong> ett<br />
utritat kryss, det är detta kryss som inte får vara i närheten <strong>av</strong> den farliga zonen <strong>av</strong><br />
grafen (Figur 4-4, mörkblå färg). Om detta inträffar och de åtgärder som programmet<br />
blivit programmerad att vidta i nödlägen inte ändrar riktning, måste operatören genast<br />
ta till egna åtgärder för att förhindra generators nuvarande kurs. Det är på grund <strong>av</strong><br />
detta som man senare kommer att programmera in alarm som gör det lättare för<br />
operatören att upptäcka att ett problem är på gång att uppstå.<br />
4.3.1 Egenskaper<br />
Tabell <strong>av</strong> alla egenskaper för Capability Diagrammet<br />
NAME TYPE DEFAULT DESCRIPTION<br />
Name STRING "CapabilityDiagram1" Namnet för primitiven<br />
Visible BOOLEAN True<br />
Bestämmer om den är<br />
synlig i programmet eller ej.
Height FLOAT 96 Höjden på själva primitiven<br />
Width FLOAT 96<br />
XPos, YPos FLOAT<br />
Transform<br />
TRANSFORM<br />
Type<br />
Center of the display<br />
area<br />
Back Color COLOR “DarkGray”<br />
Ligh tColor COLOR RGB(172,183,253)<br />
Dark Color COLOR RGB(53,0,213)<br />
TransferZone<br />
Color<br />
COLOR RGB(255,128,128)<br />
Line Pen Pen(White, 1.)<br />
21<br />
Bredden på själva<br />
primitiven<br />
Positionen <strong>av</strong> primitivens<br />
area, placering uppe i<br />
vänstra hörnet.<br />
Möjliggör animationer så<br />
som skalning, flyttning och<br />
rotationer.<br />
Färg som används för att<br />
rita ut bakgrundsfärgen.<br />
Färg som används för att<br />
rita ut den ljusazonen<br />
(brazonen)<br />
Färg som används för att<br />
rita ut den mörka zonen (<br />
farligazonen).<br />
Färg som används för att<br />
rita ut själva<br />
Transferzonen.<br />
Penna som ritar ut linjen<br />
runt primitiven och som<br />
också ritar ut kryssen.<br />
Operator Limit FLOAT 0 En operator gräns<br />
PFLagMin DOUBLE 0.2 Lutningen på Lag Sidan<br />
PFLeadMin DOUBLE -0.2 Lutningen på Lead Sidan.<br />
PMAX FLOAT 50 Värdet på PMAX<br />
PMIN FLOAT 2 Värdet på PMIN<br />
PN FLOAT 41 Värdet på PN<br />
PQScaleMax FLOAT 65 Värdet på PQScaleMax<br />
Q0 FLOAT -40 Värdet på Q0<br />
Q1 FLOAT -25 Värdet på Q1<br />
Q2 FLOAT 50 Värdet på Q2<br />
QMAX FLOAT 60 Värdet på QMAX<br />
QMIN FLOAT -28 Värdet på QMIN<br />
QP0 FLOAT -35 Värdet på QP0<br />
QPN FLOAT -20 Värdet på QPN<br />
Scale Lines DashDotPen<br />
DashDotPen(White,<br />
0.5, Dash, Flat,<br />
Miter)<br />
Show Dots ENUM ShowDots ShowDots Sätter utritning <strong>av</strong> kryssen.
Show Lines ENUM ShowLines ShowLines Sätter utritning <strong>av</strong> linjerna.<br />
TransferZone<br />
Enable<br />
BOOLEAN False<br />
TransfZoneLimH FLOAT 10<br />
TransfZoneLimL FLOAT 15<br />
Rotation ROTATION Type 0<br />
22<br />
Sätter på/<strong>av</strong> visningen <strong>av</strong><br />
”Transferzone”<br />
Höga nivån på<br />
”Transferzone”<br />
Låga nivån på<br />
”Transferzone”.<br />
Rotationsvinkel, center <strong>av</strong><br />
den definierade arean är<br />
axis <strong>av</strong> rotationen.<br />
4.3.2 Tillverkning<br />
Capability Diagrammet är tillverkad med tre olika stora cirklar, tre olika trianglar och<br />
en rektangel. Tillsammans bildar de ett mönster som blir ritade i två olika färger i den<br />
farliga zonen och den ofarliga zonen (se Figur 4-4), det finns även en aktivering <strong>av</strong><br />
en markör med färgen rosa/orange som visar var krysset befinner sig horizontellt,<br />
denna del kommer att bli programmerad att röra sig efter själva krysset.<br />
Nedanför följer en figur <strong>av</strong> den första skissen <strong>av</strong> hur diagrammet skulle se ut, på<br />
grund <strong>av</strong> att detta är en produkt till en kund till ABB så har namnen på funktionerna<br />
och beskrivningarna tagits bort från alla metoder <strong>av</strong> hemlighetsstämplingssyfte.<br />
Figur 4-3: Capability Diagrammet<br />
Capability Diagram<br />
Diagram designen<br />
som skulle tillverkas.<br />
Det röda området är<br />
det område som är<br />
den ofarligazonen.<br />
Utanför den röda<br />
linjen är den<br />
farligazonen.
4.3.3 Exempel Bilder<br />
Figur 4-4: Capability Diagrammet exempelFigur<br />
23<br />
Capability Diagram:<br />
• Den farligazonen (mörkblå)<br />
• Den ofarligazonen (ljusblå)<br />
• Den rosa/orange delen är den<br />
del som kommer ritas ut<br />
beroende var krysset befinner<br />
sig.<br />
• Linjerna.<br />
• Kryssen.<br />
4.3.4 Problem som uppstod<br />
Det tillverkade diagrammet är endast en primitiv, det är inte den färdiga produkten.<br />
En programmerare kommer att sitta med detta och lägga till alla säkerhets funktioner<br />
samt krysset som ska följa värdena som blir inmatade till diagrammet. En form <strong>av</strong><br />
gradbeteckning ska också skapas vilket kommer att visa var värdena horisontellt och<br />
vertikalt ligger. Eftersom det redan finns en gradbeteckningsskalnings primitiv i<br />
800xA kommer dessa att användas för att bygga upp det färdiga diagrammet.
5 Ändringar och planerade ändringar <strong>av</strong> gjorda <strong>primitiver</strong><br />
Ändringar som kommer eller har skett under examensperioden.<br />
5.1 FlexiblePipe:<br />
FlexiblePipe är en primitiv vars funktion är att rita ut ett rör, som kan kopplas samman<br />
med varandra och med andra <strong>primitiver</strong>.<br />
Ett problem som skulle ändras var att när två rör skulle kopplas samman så fanns det<br />
inget bra sätt att utföra detta på.<br />
Så här såg det ut förut vid ihopkoppling:<br />
Figur 5-1: Flexible Pipe: före ändringen<br />
Flexible Pipe:<br />
Med denna bild ser man att<br />
ihopkopplingen inte ser så bra ut.<br />
Det händer att man inte ens drar rören<br />
ända fram till målet när man gör<br />
simulatorerna och då blir det ett stort<br />
mellanrum mellan de båda figurerna.<br />
Figur 6-2 visar den nya ändrade delen.<br />
Det ser konstigt ut när långa rör skulle kopplas samman. För att få rör att kopplas<br />
samman finare behövdes en extra metod, den var redan skapad men däremot inte<br />
implementerad. Metoden gick ut på att tillverka en triangel längst ut på röret, med<br />
denna triangel kunde man koppla ihop rör på ett effektivare sätt.<br />
Triangeln kunde man aktivera när man ville.<br />
Figur 5-2: FlexiblePipe: Efter ändringen<br />
FlexiblePipe:<br />
Här ser man hur den nya triangeln blivit<br />
aktiverad.<br />
24
Och i en sammansatt bild ser det ut på följande sätt:<br />
Figur 5-3: Flexible Pipe: ihopsatt<br />
25<br />
FlexiblePipe:<br />
Här ser man hur triangeln ser<br />
mycket bättre ihopkopplat.<br />
En 45 graders vinkling var<br />
inte möjlig att koppla ihop<br />
förut så att den såg bra ut.<br />
Dock fungerar den nya<br />
triangeln utan problem med<br />
detta.<br />
5.2 Paj Diagram:<br />
Pajdiagrammet blev ändrat från vad som såg ut som en badboll till en mer plattare<br />
skuggning.<br />
Så här såg diagrammet ut innan ändringen:<br />
Figur 5-4: Pajdiagrammet före ändringen<br />
Figur 5-5: Pajdiagrammet med en mindre<br />
skuggning<br />
Figur 5-6: Pajdiagrammet, full skuggning (badboll).
Skuggningen <strong>av</strong> pajdiagrammet gjordes på följande sätt:<br />
En transparent färg placerades i mitten som sakta övergår mot en svart färg med ett<br />
mindre genomskinlighetsvärde. Sedan placerades en ljuskälla, för att ge illustrationen<br />
<strong>av</strong> att den är rund. Det finns även en mindre mörkare ”linje” längst ner på höger sida<br />
<strong>av</strong> diagrammet som skapar lite extra känsla <strong>av</strong> rundhet (se Figur 5-6).<br />
När många värden blev inmatade i diagrammet såg det dock ut som en stor badboll<br />
och följande ändringar infördes för att rätta till badbollsproblemet.<br />
• Man tog bort ljuspunkten som fanns för att skapa illustrationen <strong>av</strong> att den var<br />
rund.<br />
• Man ändrade tillfället då den transparanta delen började gå över mot mörk<br />
färg, så att den aktiveras snabbare men under en mindre sträcka. Detta<br />
placerades vid den yttre omkretsen istället för att börja omgående från<br />
centrum <strong>av</strong> diagrammet.<br />
• Den svarta mörkläggningen längst till höger togs bort för att återigen minska<br />
synvillan <strong>av</strong> att den var rund.<br />
På detta sätt ser nu det nya diagrammet mycket mer plattare ut:<br />
Figur 5-7: Pajdiagrammet efter ändringen <strong>av</strong> skuggningen<br />
5.3 Scrolling text:<br />
Den rullande texten har inte blivit ändrad ännu, men det diskuterades att det skulle<br />
vara rolig att införa en metod för att stoppa rullningen <strong>av</strong> texten och att möjligtvis<br />
lägga till pilar (knappar) på vardera sida som kontrollerar åt vilket håll texten rullar<br />
utan att börja om från början. På så sätt kan man backa och läsa något igen om man<br />
råkade missa texten.<br />
En tredje sak som kan vara intressant att göra är att lägga till en vattenskuggning, så<br />
att den text och textområde som visas kommer att skuggas, som en reflektion på<br />
vatten/glas.<br />
Detta är bara förslag och inget har blivit sagt att det ska göras, dessutom kan detta<br />
göras utanför primitiven, med hjälp <strong>av</strong> primitivknapparna som redan finns tillgängliga.<br />
26
6 Rapport skrivning till Företaget<br />
Dokumentation var nödvändigt att göra för varje primitiv man tillverkade. Det skulle<br />
skrivas två rapporter för varje primitiv som blev tillverkad, en CTTD rapport och en<br />
DOF rapport.<br />
CTTD rapporten är den delen som testarna kommer att utföra, de går igenom varje<br />
steg som finns i rapporten och kryssar <strong>av</strong> att den fungerar som den ska. Rapporten<br />
har ofta många bilder och många ändringar och sist i rapporten finns ett<br />
kommentarsfält där testpersonerna kan skriva vad som uppträdde konstigt.<br />
Om ett fel upptäcks <strong>av</strong> ett inskickat testdokument så kommer rapporten skickas<br />
tillbaka med anteckningar och kommentarer om vad som gick fel.<br />
En rapport kan bli lång om primitiven är stor och det finns många metoder att gå<br />
igenom, det kan ta ett tag för testarna att försäkra sig om att primitiven fungerar<br />
perfekt innan den blir aktiverad för global användning till alla som har licensen till<br />
800xA systemet.<br />
DOF rapporten handlar mer om själva primitiven, hur den fungerar, vilka funktioner<br />
och egenskaper primitiven har och hur varje funktion fungerar.<br />
Rapporten har ett fåtal exempelbilder <strong>av</strong> hur primitiven kan se ut med olika funktioner<br />
aktiverade.<br />
27
7 Slutsatser<br />
Den visuella effekten som skapar de illusioner som vi människor behöver för att läsa<br />
diagram på ett positivt och enkelt sätt är det som är det viktigaste när man skapar<br />
<strong>primitiver</strong>. Man vill inte få en tabell med alltför många värden på grund <strong>av</strong> det blir<br />
svårläst och svårt för det mänskliga ögat att uppfatta vad som är vad på en kortare<br />
tid.<br />
En rullande textremsa har en förmåga att plocka upp uppmärksamheten från<br />
användaren, att titta lite närmare på vad det står, men för mycket information eller<br />
blinkningar på texten kan upplevas som besvärande. Därför måste man vara försiktig<br />
med vad som visas i det rullande fältet och dessutom förstå att irritationsfaktorer kan<br />
leda till misstag.<br />
Eftersom en rullande text oftast får uppmärksamhet är det bäst att de inte används<br />
vid vägar, eller inom platser där användaren måste ha full uppmärksamhet på andra<br />
områden. I dessa fall borde det andra systemet passa bättre, där man låter en del <strong>av</strong><br />
texten vara synlig några sekunder innan nästa del <strong>av</strong> texten dyker upp. Den måste<br />
däremot vara förståelig och inte skapa frågor, om man inte skulle hinna läsa båda<br />
delarna.<br />
Det faktum att färgen spelar en sådan står roll i visualiseringen gör att man måste<br />
tänka efter vad som är bra och dålig färgsättning. Ett pajdiagram utan färg blir genast<br />
mycket mer svårtolkat än ett med färg. Det blir då färgen som talar om vilket värde<br />
det är, samtidigt som texten hjälper till att fastställa det korrekta värdet.<br />
Att ha en funktion som kan ta bort texten fixar till problemet med rörighet, samma sak<br />
som gäller i en tabell eller graf, för mycket information gör det rörigt.<br />
Men nu är det användare själva som kan bestämma hur de vill att pajdiagrammet ska<br />
fungera för just dem och välja vilka delar de vill ha aktiverade.<br />
28
Referenser<br />
[1] * 2D: http://en.wikipedia.org/wiki/2D_computer_graphics ;<br />
* 2.5D: http://en.wikipedia.org/wiki/2.5D ;<br />
* 3D: http://en.wikipedia.org/wiki/3D<br />
2008-06-13<br />
[2] ABB hemsida: http://www.abb.se : 2008-06-13<br />
[4] Programming Microsoft Windows with C#, Charles Petzold : ISBN: 0-7356-1370-2<br />
2001-12-18<br />
[5] .NET Framework:<br />
http://en.wikipedia.org/wiki/.NET_Framework_3.0#.NET_Framework_3.0 :<br />
2008-05-27<br />
[6] Windows Presentation Foundation Unleashed,<br />
Adam Nathan, ISBN: 0-672-32891-7 : 2007<br />
[7] Applications = code + Markup, a guide to the Microsoft Windows Presentation<br />
Foundation, Charles Petzold ISBN 10: 0-7356-1957-3<br />
[8] Foundation of WPF, an introduction to Windows Presentation Foundation,<br />
Laurence Moroney – ISBN: 1-59059-782-6 : 2006-11<br />
[9] WPF Graphic rendering overview:<br />
http://msdn2.microsoft.com/en-us/library/ms748373.aspx : 2008-04-24<br />
[10]<br />
http://msdn2.microsoft.com/enus/library/system.windows.media.drawingvisual_members.aspx<br />
: 2008-05-27<br />
[11] Proffersional Visual Studio 2005 Team System.<br />
D<strong>av</strong>id, Tony, Gunvaldson, Bowen, Coad, Jefford, ISBN: 0-7645-8436-7<br />
[12] Team Foundation Server: http://en.wikipedia.org/wiki/Team_Foundation_Server :<br />
2008-04-24<br />
[13] Information Visualization:<br />
Robert Spence - ISBN: 0-201-59626-1 : 2000<br />
[14] Creating more effective graphs<br />
Robbins, Naomi B. – ISBN: 047127402X : 2004-12<br />
29