Thesis - AIDA - Universität des Saarlandes
Transcription
Thesis - AIDA - Universität des Saarlandes
2009 Konzeption und Implementierung eines generischen Produktkonfigurators Diplomarbeit Universität des Saarlandes – Fachrichtung Informatik Lehrstuhl für Künstliche Intelligenz Erstprüfer: Prof. Dr. Dr. h.c. mult. Wolfgang Wahlster Zweitprüfer: Prof. Dr. grad. Ing. Jörg Siekmann Betreut von: Dipl.-Inform. Michael Schmitz Volker Kudelko 30.11.2009 <Inhaltsverzeichnis 2 ERKLÄRUNG DER SELBSTSTÄNDIGKEIT Hiermit versichere ich, die vorliegende Arbeit selbstständig verfasst und keine anderen als die angegebenen Quellen und Hilfsmittel benutzt sowie die Zitate deutlich kenntlich gemacht zu haben. Diese Arbeit wurde bisher in gleicher oder ähnlicher Form keiner anderen Prüfungsbehörde vorgelegt und auch nicht veröffentlicht. Die vorliegende Arbeit entstand im Rahmen einer praktischen Studienphase bei der ORBIS AG in Saarbrücken. Saarbrücken, den 30. November 2009 ________________________________ Unterschrift 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators DANKSAGUNG Ich bedanke mich bei Prof. Dr. Dr. Wolfgang Wahlster und Herrn Michael Schmitz für das interessante Thema und die eingehende Betreuung während der Durchführung meiner Arbeit. Ebenso geht mein Dank an Herrn Prof. Dr. Jörg H. Siekmann, der die Zweitkorrektur übernahm. Desweiteren bedanke ich mich bei der ORBIS AG für die sehr gute Zusammenarbeit, insbesondere bei Herrn Michael Hach für seine große Hilfe im Bereich der Variantenkonfiguration und der Java Programmierung. Außerdem danke ich meinen Eltern für die Unterstützung während meiner gesamten Studienzeit. 30. November 2009 3 <Inhaltsverzeichnis 4 Inhaltsverzeichnis Inhaltsverzeichnis ......................................................................................................... 4 1. 2. Einleitung ............................................................................................................ 8 1.1. Definitionen ........................................................................................... 9 1.2. Zielsetzung ........................................................................................... 10 1.3. Motivation............................................................................................ 11 1.4. Aufgabenstellung ................................................................................. 13 1.5. Aufbau der Arbeit................................................................................. 14 Grundlagen ....................................................................................................... 16 2.1. 3. Grafische Konfiguratoren ...................................................................... 16 2.1.1. Anforderungen an Konfiguratoren ................................................. 16 2.1.2. Einsatzgebiete ............................................................................... 19 2.2. Technische Einteilung von Produktkonfiguratoren .................................. 20 2.3. Generische Konfiguratoren ................................................................... 21 2.4. Constraint-Programmierung .................................................................. 22 2.5. Benutzerschnittstellen allgemein ........................................................... 24 2.6. Bewertung ........................................................................................... 27 Verwandte Arbeiten ........................................................................................... 28 3.1. Vergleich .............................................................................................. 30 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators 4. Implementierung................................................................................................ 32 4.1. Konzeption........................................................................................... 32 4.2. Umsetzung ........................................................................................... 33 4.2.1. Wahl der Programmiersprache ....................................................... 33 4.2.2. Wahl der Entwicklungsumgebung .................................................. 35 4.3. Designpattern ....................................................................................... 36 4.3.1. Singleton ....................................................................................... 36 4.3.2. Builder .......................................................................................... 37 4.3.3. Model View Controller ................................................................... 38 4.4. Laufzeit und Effizienzoptimierung ......................................................... 40 4.4.1. Hash Tabelle .................................................................................. 40 4.4.2. Queues ......................................................................................... 41 4.4.3. Konsistenzprüfungen ..................................................................... 42 4.4.4. Variablen ....................................................................................... 43 4.4.5. Constraints - Requires Relationen ................................................... 44 4.4.6. Constraints – Junction Relationen................................................... 44 4.5. Datenverarbeitung ................................................................................ 45 4.5.1. Zeichenobjekte (DrawingObject)..................................................... 45 4.5.2. Tree .............................................................................................. 46 4.6. Klassendesign ....................................................................................... 49 4.6.1. Übersicht ....................................................................................... 49 4.6.2. Drawing Manager.......................................................................... 50 4.6.3. Drawing Panel ............................................................................... 50 4.6.4. Data Handler ................................................................................. 50 4.6.5. Logic Container ............................................................................. 51 4.6.6. UI Changer .................................................................................... 51 30. November 2009 5 <Inhaltsverzeichnis 5. 4.7. Ablauf einer Variablenänderung in der ORBIS Configuration Suite .......... 51 4.8. Hardwareanforderungen....................................................................... 52 Generischer Aufbau ........................................................................................... 53 5.1. Einsatzbereich ...................................................................................... 53 5.2. Aufbau ................................................................................................. 54 5.2.1. Regeleditor .................................................................................... 55 5.2.2. Objekteditor .................................................................................. 59 5.2.3. GUI Designer ................................................................................. 59 5.2.4. Struktureditor ................................................................................ 60 5.3. 6. 7. 6 Dateiformat zur Speicherung von Konfigurationen................................. 60 Zusammenfassung und Ausblick ......................................................................... 62 6.1. Zusammenfassung der Arbeit ................................................................ 62 6.2. Ausblick auf mögliche Erweiterungen .................................................... 63 Anhang ............................................................................................................. 64 7.1. Ausgewählte Quelltexte ........................................................................ 64 7.2. Screenshots .......................................................................................... 66 8. Abbildungsverzeichnis ........................................................................................ 69 9. Literaturverzeichnis............................................................................................. 71 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators „Nichts ist schwier iger als das Vereinfachen. Nichts ist einfacher als das Kompliz ieren. “ Georges Elgozy „Fortschritt ist die Fähigkeit des Menschen, einfache Dinge zu kompliz ieren.“ Thor Heyerdahl 30. November 2009 7 Einleitung 8 1. Einleitung Der Bedarf nach Individualisierung von Produkten erfordert von Unternehmen die Realisierung individueller, maßgeschneiderter Kundenwünsche. Die Auseinandersetzung mit dieser Aufgabe ist für viele Unternehmen überlebenswichtig, insbesondere, um Marktposition, Alleinstellungsmerkmale und nicht zuletzt ihr Preisniveau im internationalen Wettbewerb behaupten zu können. Die Beherrschung der Produktkomplexität und Variantenvielfalt sowohl während der Auftragsgewinnung, als auch in der Auftragserfassung sind dabei von entscheidender Bedeutung. Hierbei eine machbare Auswahl aus einer Vielzahl von Produktkombinationen zu treffen, kann aufgrund einer hohen Komponentenvielfalt unmöglich sein. Unternehmen sind bemüht dem Kunden eine maximale Komponentenvielfalt anzubieten um eine möglichst große Anzahl von Kundenwünschen zu bedienen, bei gleichzeitiger Minimierung der innerbetrieblichen Varianz. Der Einsatz eines Produktkonfigurators ist somit unausweichlich, um aus dieser Komponentenvielfalt das gewünschte Produkt zu erhalten. Wird ein solcher Konfigurator verwendet, spielen intuitive Bedienbarkeit und die Möglichkeit einer grafischen Vorschau des Produktes eine wichtige Rolle, vorallem wenn Endkunden als Anwender in Frage kommen. Ein Endkunde möchte möglichst schnell und ohne große Einarbeitung sein Produkt konfigurieren und im Anschluss bestellen können. Hier setzen grafische Konfiguratoren an. Sie ermöglichen dem Benutzer anhand grafischer Elemente ein Produkt per Drag and Drop zusammenzustellen. Hierbei sind Restriktionen zu beachteten, so dass als Ergebnis ein technisch korrektes Produkt - u.a. 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators mit richtigem Preis - entsteht. Zur Einhaltung dieser Restriktionen werden beispielsweise Elemente dynamisch ausgeblendet oder bestimmte Aktionen je nach Kontext unterbunden. Die vorliegende Arbeit beschreibt den Aufbau und die Konzeption eines grafischen Konfigurators und dessen Integration in eine bestehende Applikation. Die Erfahrungen, die während dieser Implementierung gewonnen wurden, dienen dabei als Grundlage für die Konzeption eines generischen, grafischen Konfigurators, dessen Aufbau im Anschluss beschrieben wird. 1.1. Definitionen In diesem Abschnitt werden die in dieser Arbeit häufig verwandten Begriffe erklärt um später darauf zurückgreifen zu können. • Unter einer manuellen Konfiguration (Merkmalbewertung) wird im Folgenden die nicht grafisch-gestützte Bewertung von Merkmalen verstanden, die z.B. einzeln eingegeben oder durch Frage-Antwort Dialoge erfasst werden. • Im Gegensatz dazu bietet die grafische Konfiguration eine Möglichkeit, durch Interaktionen (z.B. Drag & Drop) mit der grafischen Darstellung des Produktes dieses zu verändern. Durch diese Interaktionen werden automatisch Merkmalbewertungen ausgeführt; sie sind also Folgeereignisse der grafischen Konfiguration. Der Benutzer kann somit durch Interaktionen ein Produkt erstellen ohne explizit Merkmale manuell bewerten zu müssen. • Ein konfigurierbares Material (KMat) ist ein Material, welches die Möglichkeit bietet, Varianten zu bilden. Das konfigurierbare Material wirkt somit wie eine Schablone für ein Endprodukt. Eine Instanz dieser Schablone wird Variante genannt, wobei die Attribute (=Merkmale) der Instanz die Ausprägungen der Eigenschaften des konfigurierbaren Materials darstellen. Zu jedem konfigurierbaren Material wird eine Stückliste erstellt, die die maximale Anzahl an Elementen enthält, sowie ein zugehöriger Arbeitsplan angelegt, der die maximal nötigen Arbeitsschritte enthält (1). 30. November 2009 9 Einleitung 10 1.2. Zielsetzung Ziel dieser Arbeit ist die Erstellung eines grafischen Konfigurators für Industriesektionaltore und dessen Integration in die ORBIS Configuration Suite1. Diese ist über eine bidirektionale Schnittstelle an ein SAP2 System angebunden, so dass während einer Kundenauftragserfassung in SAP eine grafische Konfiguration möglich ist. Die Kurzbeschreibung des Konfigurationsprozesses lautet: Wird in einem SAP Kundenauftrag eine neue Auftragsposition angelegt, so wird die ORBIS Configuration Suite gestartet und das SAP System bleibt in einer Wartestellung. Der eigentliche Konfigurationsprozess wird somit in eine externe Applikation ausgelagert, um die Einschränkungen seitens SAP – wie beispielsweise das Einbinden eines grafischen Konfigurators – zu umgehen. Die Konfiguration des Produktes in der ORBIS Configuration Suite kann hierbei manuell oder grafisch erfolgen. Nach erfolgter Konfiguration wird die ORBIS Configuration Suite beendet und es erfolgt ein Rücksprung in das SAP System, wobei alle notwendigen Parameter des konfigurierten Objektes (im vorliegenden Fall ein Industriesektionaltor) in den Kundenauftrag übernommen werden. Die grafische Implementierung soll zum einen dazu dienen, dass Personen ohne spezifische Produktkenntnisse den Konfigurator bedienen können und zum anderen, um in jedem Arbeitsschritt eine Vorschau des Produktes zu erhalten. Des Weiteren werden zu jedem Implementierungsdetail Empfehlungen zum Aufbau eines generischen Konfigurators hinzugefügt. Diese Empfehlungen sind durch ein “G“ links neben dem zugehörigen Text markiert. 1 2 Softwareprodukt der Orbis AG, http://www.orbis.de http://www.sap.de 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators Abbildung 1) Screenshot des grafischen Konfigurators 1.3. Motivation Die SAP-Variantenkonfiguration3 bietet weder einen integrierten grafischen Konfigurator, noch ist es ohne erheblichen Aufwand möglich, durch Programmierung einen derartigen mit gleichem Komfort und gleichen Möglichkeiten wie eine externe Applikation zu erstellen. Aus diesem Grund wurde der Fokus auf externe Konfiguratoren mit Schnittstellen zu einem SAP System gerichtet. Aktuell gibt es zahlreiche Produktkonfiguratoren4 mit Schnittstellen zu verschiedensten Softwaresystemen wie z.B. SAP, infor5, abas6, AutoCAD7 und Excel. 3 http://help.sap.com/saphelp_470/helpdata/de/92/58d455417011d189ec0000e81ddfac/frameset .htm 4 Ein Werkzeug, das hilft ein Produkt so zu bestimmen, dass es vorgegebenen Anforderungen genügt. 5 http://www.infor.de/ - Anbieter von Unternehmenssoftware 6 http://www.abas.de/ - ERP -und eBusiness-Software Anbieter für den Mittelstand 7 http://www.autodesk.de - Applikation von zum Erstellen von 2D- und 3D-Zeichnungen mit einem PC 30. November 2009 11 Einleitung 12 Dr. Axel Brinkop stellt achtzehn Produktkonfiguratoren in seinem Bericht (2) gegenüber und vergleicht diese anhand ihres Funktionsumfangs. Keines der vorgestellten Softwaresysteme bietet eine vollständige Integration in einen SAP Prozess, sondern sie kommunizieren lediglich mittels remoteaufrufbarer Funktionsbausteine mit einem SAP System. Die Bedeutung dieser Unterschiede verdeutliche ich anhand eines Kundenauftrags: Mit einigen vorgestellten Produkten lässt sich nach erfolgter Konfiguration ein Kundenauftrag im SAP System erstellen. Dadurch werden ein neuer Materialstamm und eine neue Materialstückliste erzeugt und die Auftragsposition innerhalb des Kundenauftrags erhält das neu angelegte Material. Möchte man nachträglich Änderungen vornehmen, muss der Kundenauftrag im SAP System geöffnet und bearbeitet werden. Da für jede Konfiguration ein neues Material angelegt wird, steigt mit jedem neuen Kundenauftrag die Anzahl der gespeicherten Materialen, wodurch ein erhöhter Pflegeaufwand für das SAP System entsteht. Andere Produkte, die zwar das SAP Beziehungswissen verwenden um die oben vorgestellten Probleme zu vermeiden, setzen aber ein eigenes – zusätzliches Beziehungswissen ein. Falls keine Schnittstelle zur Abgleichung des Beziehungswissens zwischen beiden Systemen existiert, ergibt sich somit ein doppelter Pflegeaufwand bei Änderungen, da beide Systeme angepasst werden müssen. In diesem Fall ist es auch notwendig, dass bei Änderungen im SAP System diese im eingesetzten Konfigurator vorgenommen werden. Im Gegensatz dazu kann beim Einsatz der ORBIS CS der Benutzer einen Kundenauftrag im SAP selbst anlegen. Beim Hinzufügen eines konfigurierbaren Materials in eine Position des Kundenauftrags, erfolgt ein Absprung in die ORBIS CS, wobei das SAP System in einer Warteposition bleibt. Beim Rücksprung wird SAP von der ORBIS CS mit allen notwendigen Daten versorgt, so dass der in SAP gestartete Prozess der Kundenauftragserfassung fortgesetzt werden kann. Es wird hierbei auch kein neues Material angelegt, sondern das konfigurierbare Material bleibt in der Auftragsposition erhalten. Zudem kann die Orbis CS das SAP Beziehungswissen migrieren, verändern und diese Änderungen zurück in das SAP System übertragen. Die Pflege kann somit vollständig ausgelagert werden und zentral an einer Stelle erfolgen. 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators Aufgrund der fehlenden vollständigen Integration und der beschriebenen Nachteile der aktuell erhältlichen Produktkonfiguratoren, entschloss sich die ORBIS AG eine eigene Anwendung zu entwickeln, die genau diese Integration bietet. Diese vollständige Integration eines Konfigurators in eine Unternehmenssoftware (z.B. ein SAP System) ist laut D. Jannach et al. (3) von großer Relevanz, wobei bereits ein Trend zu erkennen ist, dass Unternehmen darauf zielen bei der Herstellung und Bereitstellung ihrer konfigurierbaren Produkte in Supply-Chain Netzwerken zusammenzuarbeiten. Auch betonen diese die Bedeutsamkeit von web-basierten Konfiguratoren, die besonders für den Einsatz in heterogenen IT-Landschaften geeignet sind. Die vorliegende Arbeit implementiert einen grafischen Konfigurator in die ORBIS CS, so dass eine grafische Produktkonfiguration vollständig in einen SAP Prozess integriert werden kann. 1.4. Aufgabenstellung Zur Implementierung des grafischen Konfigurators in die ORBIS CS ist es erforderlich eine Schnittstelle zu definieren und diese zu implementieren. Dies bedeutet Methoden zu definieren, wie Grafikänderungen des Benutzers an die ORBIS CS übermittelt und wie manuelle Änderungen in der ORBIS CS in die Grafik übernommen werden. Die Kommunikation muss hierbei effizient sein, damit nicht bei jeder Änderung Daten übertragen und nicht jedes Mal Konsistenzprüfungen angestoßen werden. Ebenso muss eine anpassbare Logik hinterlegbar sein. Nach dieser Logik soll sich das User Interface dynamisch anpassen (z.B. wenn in ein Torglied bereits Fenster gesetzt wurden, muss die Fenster-Auswahlliste ergrauen, so dass in dieses Torglied keine weiteren Fenster platziert werden können). Zudem sollten für den User jederzeit grafisch dessen Interaktionsmöglichkeiten ersichtlich sein. Das fertig konfigurierte Produkt muss auf Widerspruchsfreiheit prüfbar sein. Hierzu benötigt man sowohl Klassen zum Hinterlegen von Bedingungen und Beziehungen als auch eine Prüflogik, die alle Bedingungen auf Korrektheit analysieren kann und bei Inkonsistenzen sinnvolle Fehlermeldungen liefert. 30. November 2009 13 Einleitung 14 Daraus resultieren folgende Anforderungen: • Plattformunabhängigkeit um die Anwendung in möglich vielen Umgebungen einsetzen zu können • effiziente Kommunikation der Grafik mit der ORBIS CS, damit nicht bei jeder Änderung der Grafik Konsistenzprüfungen durchgeführt werden müssen • intuitiv zu bedienende Benutzerschnittstellen • effiziente Speicherung einer großen Anzahl von Merkmalen - bestehend aus Variablenname und Wert • effiziente Berechnung der Konsistenzprüfungen mit schlüssigen Fehlermeldungen • Implementierung von Klassen zum Hinterlegen von Konsistenzprüfungen • Implementierung von Klassen zum Hinterlegen von Logik, nach welcher sich die Benutzerschnittstelle anpasst 1.5. Aufbau der Arbeit Das folgende Kapitel „Grundlagen“ beschreibt grafische Konfiguratoren und leitet zu generischen Konfiguratoren über. Im Anschluss erläutere ich die Verwendung von Constraints im Kontext der Variantenkonfiguration und zeige die Bedeutung von intuitiven Benutzerschnittstellen. Im Kapitel verwandte Arbeiten, erkläre ich kurz deren Funktionsweise und grenze sie anhand ausgewählter Eigenschaften von der vorliegenden Arbeit ab. Das dritte Kapitel „Implementierung“ behandelt zunächst die Wahl einer geeigneten Programmiersprache und die Verwendung in diesem Kontext. Ebenso werden an dieser Stelle die verwandten Designpattern aufgeführt und deren Vorteile erläutert. Zudem werden die zur Laufzeitoptimierung eingesetzten Datenstrukturen behandelt. Zuletzt wird die genaue Implementierung des Projektes anhand des Klassendesigns beschrieben. Das vorletzte Kapitel „generischer Aufbau“ erläutert die Konzeption eines generischen grafischen Konfigurators bestehend aus vier Hauptkomponenten. Des 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators Weiteren beschreibe ich dessen Einsatzdomäne und gehe näher auf die zugrunde liegende Wissensbasis ein. Die Arbeit schließt mit einer Zusammenfassung ab. Darin schildere ich zum einen meine Empfehlungen zum Aufbau eines Produktkonfigurators hinsichtlich dessen Generik und zum anderen gebe ich einen Ausblick auf mögliche Erweiterungen. 30. November 2009 15 Grundlagen 16 2. Grundlagen In diesem Kapitel erläutere ich zunächst grafische Produktkonfiguratoren und weise auf deren Bedeutung im Vergleich zu nicht grafischen Konfiguratoren hin. Anhand eines Beispiels zeige ich deren Vorteile beim Einsatz im Endkundenbereich, deren Grenzen und verdeutliche die Vorteile der ORBIS Configuration Suite. Im Anschluss gehe ich näher auf das Thema der Constraint Programmierung ein und erkläre deren Ziele und Anwendungsgebiete, die in der vorliegenden Arbeit betrachtet werden. Um genauere Informationen zu intuitiven Benutzerschnittstellen zu erhalten, gehe ich auf die allgemeinen Anforderungen an eine solche Benutzerschnittstelle ein und erläutere deren charakteristische Hauptmerkmale und wie diese in der vorliegenden Arbeit realisiert wurden. 2.1. Grafische Konfiguratoren Grafische Produktkonfiguratoren sind Computerprogramme, mit denen die Produktspezifikationen kundenindividuell für Angebote oder Aufträge (Konsumgüter oder Investitionsgüter) erzeugt werden können, wobei eine grafische Darstellung des anzupassenden Produktes enthalten ist. Grafische Vorschauelemente, die beispielsweise per Drag & Drop eingefügt werden können, unterstützen den Benutzer beim Aufbau seines Produktes. 2.1.1. Anforderungen an Konfiguratoren Die hohe Relevanz intuitiver und ergonomischer Schnittstellen in der Softwareentwicklung spiegelt sich im Bereich der Produktkonfiguratoren wider. So 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators erläutern Dan Heiderscheit und Hans Jorgen Skovgaard in Ihrem Bericht (4), dass Produktkonfiguratoren eine ansprechende und einfach zu bedienende Benutzerschnittstelle benötigen, mit der ein komplexes Konfigurationsproblem vereinfacht werden kann. Die beste Benutzerschnittstelle, insbesondere bei komplexen Aufgabenstellungen, besteht aus der Visualisierung des Produktes. Lässt sich ein Produkt nicht rein grafisch konfigurieren, so ist eine Kombination aus grafischer und manueller Konfiguration die beste Wahl. Dies bedeutet, man hat eine Kombination aus grafischer Darstellung des Produktes und verschiedene Eingabemasken, zum Hinterlegen von Details, die nicht durch die grafische Konfiguration abgedeckt werden können. Ebenso ist es wichtig, dass Benutzer mit unterschiedlichem Wissensstand mit der Applikation effizient arbeiten können. Erfahrene Benutzer mit spezifischem Produktwissen bevorzugen eine detaillierte Sicht auf das Konfigurationsproblem, wobei oft eine Gesamtübersicht in Form einer grafischen Darstellung gewünscht ist. Hingegen bevorzugen weniger erfahrene Benutzer nur die grafische Sicht mit dem Ziel schnell das gewünschte Produkt zu erhalten. Eine grafische Darstellung der Konfiguration erleichtert die Auswahl der Konfigurationsmöglichkeiten und der Endanwender kann Restriktionen besser verstehen. Wurde in ein Torglied eine Fensterreihe gesetzt, so können keine weiteren Elemente eingesetzt werden. Hier erkennt der Anwender sowohl an der Grafik, dass das Einfügen von weiteren Elementen in dieses Torglied keinen Sinn ergibt, als auch an der ergrauten Combobox zur Auswahl von weiteren Fenstern. Ferner beschreiben Dan Heiderscheit und Hans Jorgen Skovgaard, dass bei Konfigurationsproblemen, bei denen der Zusammenbau und die Platzierung von Objekten im Vordergrund stehen, grafische Vorschauelemente die Interaktion sehr erleichtern können, insbesondere wenn diese Elemente per Drag & Drop platziert werden können. Ein Beispiel für diese Art von Konfiguratoren ist der Ikea Home Planner8. Hier geht es primär darum, Möbelstücke in einem vorgegebenen Raum nach eigenen Wünschen zu platzieren und das Ergebnis in einer Maßzeichnung oder 3D Ansicht zu betrachten. Dadurch kann der Kunde nicht nur im Warenhaus selbst, sondern zu Hause – abseits von regulären Öffnungszeiten – seine Möbelstücke am PC auswählen 8 http://www.ikea.de 30. November 2009 17 Grundlagen 18 und platzieren. Der Entwurf lässt sich ausdrucken, so dass er zum nächsten Einkauf mitgenommen werden kann. Dies stellt beispielsweise bei der Einrichtung einer Küche einen Zeitgewinn für das Warenhaus dar, da der Mitarbeiter nur den Ausdruck Au überprüft und eventuell Verbesserungsvorschläge dem Kunden unterbreitet. Außerdem liefert der Ikea Home Planner als Ergebnis eine Materialstückliste mit den Preisen des aktuellen Katalogs. In diesem Fall dient der Konfigurator lediglich als Auswahlhilfe ilfe und zur räumlichen Darstellung der Möbelstücke. Es lässt sich aber weder eine Bestellung direkt aus der Anwendung heraus generieren, noch wird ein Prozess zur Auftragsabwicklung gestartet. Auch gibt das System keine Details über die Verfügbarkeit der ausgewählten Produkte preis. Hier setzt die ORBIS CS mit ihrem integrierten grafischen Konfigurator an, der genau diese Prozessintegration bietet und nach erfolgter Konfiguration Konfiguration einen Auftrag initiiert. Die folgende Abbildung zeigt einen Screenshot des Ikea Home Planners. Planner Unten rechts sind Miniaturansichten von verschiedenen Kleiderschränken zu sehen, die per Drag & Drop in das Vorschaubild eingefügt werden können. Die Kleiderschränke iderschränke können hierbei angepasst werden. Abbildung 2) Ikea Home Planner 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators Eine weitere wichtige Eigenschaft eines grafischen Konfigurators besteht darin, dass die Regeln zur Platzierung von Objekten, Prüflogiken und Konsistenzbedingungen in einer eigenen Klasse oder sogar in einer eigenen Anwendung ausgelagert sind, um die Komplexität zu verringern und Wartungsaufwände zu verringern. (Trennung von Konfigurator und Modellierungsanwendung). 2.1.2. Einsatzgebiete Das Haupteinsatzgebiet eines Produktkonfigurator ist die kundenindividuelle Serienfertigung. Diese stellt für jeden Kunden genau das Produkt bereit, das er wünscht – und zwar zu einem Preis ähnlich dem eines Standardproduktes. Unter dem Begriff versteht man ferner, möglichst viele denkbare Kundenwünsche zu bedienen, ohne die innerbetriebliche Varianz ausufern zu lassen (5). Die Produktkonfiguration, also die Erzeugung eines Produktes aus mehreren Bauteilen oder Baugruppen nach den Wünschen des Kunden in einem klassischen Baukastensystem, fällt demnach unter kundenindividuelle Serienfertigung. Dieses Verfahren darf nicht mit der Variantenfertigung verwechselt werden, durch die ein Kunde aus vorhandenen ähnlichen Produkten eine fertiggestellte Variante auswählen kann (6). Der Einsatz eines Produktkonfigurators in der kundenindividuellen Serienfertigung setzt folgendes voraus: a) Anpassung der Produktstruktur nach Markt- und Produktionsgesichtspunkten (7). b) Eine angemessene Fertigungstiefe und die Konzentration auf Kernkompetenzen (8). Grundsätzlich lassen sich Produktkonfiguratoren in drei Anwendungsbereiche gliedern, die jeweils separate Anforderungen stellen: 1) Platzierung von Objekten: z.B. Küchenplaner 2) Klassische Konfiguration: z.B. vorliegende Arbeit 3) Konstruktion In dieser Arbeit geht es um die Klassische Konfiguration. Falls der Bereich in die 30. November 2009 19 Grundlagen 20 Platzierung von Objekten geändert werden soll, müssten beispielsweise Ankerpunkte und eine erweiterte Logik zum Platzieren der Objekte dem Modell hinzugefügt werden. Der Bereich der Konstruktion stellt besondere Anforderungen, so dass der hier vorgestellte Konfigurator dafür nicht geeignet ist. 2.2. Technische Einteilung von Produktkonfiguratoren Laut Dr.-Ing. Josef Wüpping (5) können Produktkonfiguratoren technisch in drei Klassen unterteilt werden. 1) Wissensbasierte Systeme: In einem Expertensystem wird die Künstliche Intelligenz für die produktspezifischen Abhängigkeiten angewendet. Als Problemlösungstechniken werden meistens IF-THEN-ELSE Regeln, Constraints (siehe 2.4), Entscheidungsbäume zur Eingrenzung der Lösungsräume und Zustandstabellen möglicher, nicht möglicher und abhängiger Kombinationen verwandt. 2) Regelbasierte Systeme: Programmalgorithmen prüfen produktspezifische Abhängigkeiten in einem Constraint Löser. Für einfache Anwendungen ist der Aufwand zur Erstellung eines Regelwerkes vertretbar. Bei komplexen Systemen macht dies jedoch nur begrenzt Sinn, da die Pflege und Erweiterung dieses Beziehungswissens sehr aufwändig ist. 3) Entscheidungstabellenbasierte Systeme: Produktabhängigkeiten werden über verknüpfte Entscheidungstabellen abgebildet. Diese Technik eignet sich für einfache Konfigurationen, lässt sich jedoch für sehr komplexe Produkte nur schwer handhaben und pflegen. Der hier vorgestellte Konfigurator gehört zu den regelbasierten Systemen. Sämtliche Produktlogik wurde nur in Constraints hinterlegt, da das zugrundeliegende Konfigurationsproblem eine mittlere Komplexität aufwies. G Um auf alle Konfigurationsprobleme eingehen zu können, empfiehlt sich daher die Verwendung eines wissensbasierten Systems, da dieses auch für komplexe Probleme geeignet ist. 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators 2.3. Generische Konfiguratoren Um nicht für jedes Konfigurationsproblem eine eigene Anwendung zu entwickeln, dienen generische Konfiguratoren. Ein Konfigurator ist demnach generisch, wenn er sich an die Bedürfnisse eines Unternehmens anpassen lässt. Diese Anpassungen erfolgen über einen Customizing Bereich der Anwendung. Idealerweise sollten diese Änderungen ohne Programmierkenntnisse vorgenommen werden können, damit prinzipiell jeder Mitarbeiter mit entsprechendem Produktwissen damit zurechtkommt. Diese Möglichkeit der Anpassung ist von sehr großer Bedeutung, da sonst Änderungen nur im Quelltext von Spezialisten mit Programmierkenntnissen vorgenommen werden können. Diese nachträglichen Änderungen sind als schwierig und aufwändig einzustufen, da die Konfigurationsbasis bei jeder Änderung wächst und somit deren Komplexität zunimmt. Falls kein Mitarbeiter mit entsprechenden Programmierkenntnissen vorhanden ist, kommen externe Dienstleister ins Spiel, die diese Änderungen vornehmen. Hier kann leicht eine Art von Abhängigkeit entstehen, da nur diese Dienstleister mit der technischen Umsetzung vertraut sind. Allerdings sind Unternehmen oft zurückhaltend, wenn es darum geht ihr Produktwissen externen Firmen preiszugegeben. Genau vor diesen Problemen stand die Firma VHV Anlagenbau GmbH, die sich daher für den Einsatz eines generischen Produktkonfigurators entschied (9). Ebenso entstanden durch den Einsatz eines Produktkonfigurators erhebliche Zeiteinsparungen: „Die Einführung des Produktkonfigurators brachte zusätzlich einen enormen Zeitgewinn bei der Konfiguration eines Gurtförderers. Ein versierter Konstrukteur, der bereits mehrfach solche Anlagen konfiguriert hat, benötigte bisher für die Erstellung einer kompletten Anlage im 3D-CAD-System mindestens zwei Stunden. Nach der Einführung der KoViP-Software reduzierte sich die Zeit für die Konfiguration der Anlage und die Erstellung der kompletten Anlage im 3D CADSystem bis auf weniger als fünf Minuten“ (9). Oft existieren Produzent-Produzent Beziehungen zwischen Unternehmen, so dass ein Unternehmen Produkte herstellt und das andere diese Produkte kauft, in irgendeiner Form verändert, erweitert und selbst verkauft. Hier ist es von Vorteil, wenn das kaufende Unternehmen die Konfigurationsbasis des ersten importieren und somit selbst 30. November 2009 21 Grundlagen 22 verarbeiten kann, damit nicht eine spezielle Schnittstelle entwickelt (programmiert) werden muss. Dies kann mit anpassbaren generischen Konfiguratoren erreicht werden, so dass auch bei Änderungen der Konfigurationsbasis des ersten Unternehmens das zweite zeitnah und - vor allem selbst – diese Änderungen in ihrem eigenen System umsetzen kann. Das G-SCOP Laboratory des Grenoble Institute of Technology untersuchte den grundsätzlichen Aufbau von generischen Produktkonfiguratoren (10) und betonte dabei die Vorteile des Einsatzes einer Objekt-orientierten Programmiersprache (wie z.B. Java, C++ oder C#), da diese Sprachen über das Konzept der Vererbung verfügen. Dies ist bei der Erstellung von Objektstrukturen (Objekthierarchien) sehr hilfreich, da mittels Vererbung sich Eigenschaften und Methoden in „Kind-Klassen“ wiederverwenden lassen, ohne sie neu implementieren zu müssen. 2.4. Constraint-Programmierung Um Konsistenzbedingungen oder Logik zu hinterlegen werden in der vorliegenden Arbeit Constraints verwendet. Im Folgenden gehe ich näher auf diese ein und erkläre deren Bedeutung im verwendeten Kontext. Constraints9 eignen sich zur Darstellung von unvollständiger Information zur Beschreibung der Eigenschaften und Beziehungen von teilweise unbekannten Objekten. Als sehr allgemeiner und abstrakter Begriff haben Constraints die verschiedensten Ausprägungen und Arten. Als Constraint kann man beispielsweise eine mathematische Gleichung oder ein logisches Prädikat verstehen, zum Beispiel 5 oder „x ist ungerade“. Die beiden erwähnten Constraints enthalten zwar Informationen über die Werte der Variablen x und y, allerdings in schlecht verwertbarer Form. Ziel der Constraint-Programmierung ist es, eine Menge derartiger Informationen auf Widerspruchsfreiheit zu prüfen und gegebenenfalls zu vereinfachen. So kann beispielsweise aus den Informationen 2 und 1 2 y 1 die Lösung 7 und 5 gefolgert werden. Hat man ein Modell, bestehend aus mehreren Constraints, mit dem Ziel eine gültige 9 Engl. Für (Rand-, Neben-, Wert) Bedingungen, Einschränkungen 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators Lösung zu erhalten, so steht man vor dem Constraint Satisfaction Problem (CSP). Ziel ist es, einen Zustand (d. h. Belegungen von Variablen) zu finden, der alle aufgestellten Bedingungen (Constraints) erfüllt. Ein solches Problem besteht aus einer Menge von Variablen, ihren Wertebereichen und den Bedingungen, die Verknüpfungen zwischen den Variablen herstellen und dadurch festlegen, welche Kombinationen von Werten der Variablen zulässig sind. Ein CSP kann mittels einer inkrementellen Formulierung folgendermaßen als Standardsuchproblem angesehen werden: • Startzustand: Leere Zuweisung {}, in der keiner Variablen ein Wert zugeordnet ist. • Nachfolgerfunktion: Ein Wert kann einer beliebigen und nicht belegten Variablen zugewiesen werden ohne im Konflikt mit einer vorher belegten Variablen zu stehen. • Ziel: Die Aktuelle Zuweisung ist vollständig, d.h. jeder Variablen wurde ein Wert zugeordnet. • Pfadkosten: Konstante Kosten (z.B. 1) für jeden Schritt. Jede Lösung besteht aus einer Zuweisung aller Variablen mit Werten. Daher findet sich diese Lösung im Suchbaum bei Tiefe n, wenn n Variablen belegt werden müssen. Der Suchbaum dehnt sich nur bis zur Tiefe n aus, weshalb depthfirst10 Suchalgorithmen häufig eingesetzt werden. Sobald für die Variable x1 ein gültiger Wert gefunden wurde, wird dieser Wert beibehalten und ein gültiger Wert für die Variable x 2 ermittelt, ohne im Konflikt mit x1 zu stehen. Dies wird solange fortgeführt, bis zu jeder Variablen ein zulässiger Wert ermittelt wurde. Sobald eine gültige Variablenbelegung gefunden wurde, wird dieser Pfad fortgeführt, ohne weitere mögliche Belegungen zu testen. Wird ein ungültiger Wert gefunden, so wird solange nach einem Wert gesucht, bis ein gültiger gefunden wurde. 10 Tiefensuche 30. November 2009 23 Grundlagen 24 Die folgende Abbildung illustriert diese Vorgehensweise anhand eines Suchbaumes. Modell Start Variable x1 false Variable x2 Variable x3 true true true Abbildung 3) Depth-First Suchbaum Constraints finden zudem nicht nur in Programmiersprachen verstärkt Anwendung sondern auch in Datenbanken. Hier ermöglichen Constraints eine Zusammenfassung vieler Datenbankeinträge (u. U. unendlich viele) zu einem Eintrag. Dies ist vor allem bei der Speicherung von zeitlicher und räumlicher Information von Nutzen. In dieser Arbeit wird nur der Teilbereich der Constraint Programmierung behandelt, der sich mit dem Prüfen auf Widerspruchsfreiheit beschäftigt. Das heißt, es geht nicht darum eine optimale Lösung auf ein Problem bzw. ein Optimierungsproblem zu finden, sondern eine gegebene Lösung auf Zulässigkeit zu prüfen. Constraints geben hierbei Bedingungen der Variablenbelegungen an, wie z.B. Variable im Intervall [1,5] oder Variable < 8000. Bei der Überprüfung auf Widerspruchsfreiheit liegt die Laufzeit in O(n), wobei n die Anzahl der Constraints und Variablen ist. Im Gegensatz dazu beträgt die Laufzeit zur Berechnung eines CSP Problem O(n2). 2.5. Benutzerschnittstellen allgemein Intuitive und ergonomische Benutzerschnittstellen spielen in der Softwareentwicklung eine zentrale Rolle, da sie maßgeblich zur Benutzerakzeptanz und Effizienz beitragen. Demnach ist besonders wichtig, dass auch Produktkonfiguratoren über eine Benutzerschnittstelle mit diesen Eigenschaften verfügen. Aufgrund des hohen Stellenwertes des Benutzerschnittstellendesigns gibt es 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators zahlreiche Richtlinien11, welche konkrete Anforderungen an diese aufzeigen und Regelwerke zur Dialoggestaltung (11) beinhalten. Im Folgenden wird kurz auf die VDI-Richtlinie 5005 „Software-Ergonomie in der Büro-Kommunikation“ (12) eingegangen. Sie beschreibt im Wesentlichen drei wichtige Anforderungen an Software-Systeme: 1) Kompetenzförderlichkeit: Das Software-System soll konsistent und handlungsunterstützend gestaltet sein und so das Wissen des Benutzers über das Software-System steigern. 2) Handlungsflexibilität: Das System muss alternative Lösungswege und Aufgabenstellungen unterstützen. 3) Aufgabenangemessenheit: Das System muss erlauben, die Aufgabe gut und effizient zu erledigen. Ausgehend von diesen drei Grundanforderungen, ergeben sich zahlreiche weitere Anforderungen. Auf den grafischen Konfigurator und die ORBIS Configuration Suite bezogen, erläutere ich anhand ausgewählter Anforderungen, wie diese umgesetzt wurden. Der erste Punkt wird u.a. dadurch erreicht, dass • nur im Kontext anwendbare Aktionen ermöglich werden; sinnlose Funktionen werden blockiert (z.B. wenn eine Tür in das Tor platziert wurde, wird diese Auswahlliste grau darstellt und zu verhindern, dass eine weitere Tür hinzugefügt wird). • Sicherheitsabfragen bei Operationen mit schwerwiegenden Folgen: Beim Beenden der ORBIS Configuration Suite muss ein weiteres Dialogfenster bestätigt werden, in welchem ein Hinweis auf möglichen Datenverlust gegeben wird. Der zweiten Anforderung wird Rechnung getragen dadurch, dass • der Benutzer mit einer geänderten Aufgabenstellung (die Torhöhe ändert 11 VDI-Richtlinie 5005 „Software-Ergonomie in der Büro-Kommunikation, Motif (OSF/Motif Style Guide), MacOS X (Aqua Human Interface Guidelines) 30. November 2009 25 Grundlagen 26 sich und somit beginnt die Konfiguration erneut mit einem leeren Tor) seine Arbeit noch effizient mit demselben System erledigen kann, ohne das System bzw. den Prozess neuzustarten. • unterschiedliche Benutzer mit unterschiedlichem Erfahrungshintergrund ihre Aufgaben auf alternativen Wegen erledigen können. So kann zwischen einer grafischen und einer manuellen Konfiguration jederzeit hin und her gewechselt werden. Die letzte Anforderung der VDI Richtlinie an ein Software System wurde erfüllt, indem • der Benutzer die Zielsetzung seiner Aufgabe mit dem System erreichen kann, ohne zusätzlich andere Systeme oder Medien einsetzen zu müssen (z.B. Speicherung von Zwischenergebnissen auf Papier). • versucht wurde den Arbeitsaufwand zu reduzieren durch syntaktisch einfache Aufgaben (hinzufügen von Komponenten durch Drag & Drop) und Reduktion vieler Einzelschritte (eine Reihe von Torfenstern kann durch eine Aktion zum Tor hinzugefügt werden, ohne jedes Fenster einzeln einfügen zu müssen). Besonders anwenderfreundliche Benutzerschnittstellen und durchdachte Dialogtechniken wurden im Nielsen Norman Group Report ausgezeichnet (13). Eine der prämierten Dialogtechniken ist beispielsweise die weit verbreitete JavaScript Bibliothek Lightbox12. “Lightbox is a simple, unobtrusive script used to overlay images on the current page. It's a snap to setup and works on all modern browsers (14).” Diese Bibliothek wird u.a. verwendet um Bilder mittels modalen Dialogen anzuzeigen. Ein Link im Quellfenster öffnet durch Klicken ein weiteres Fenster, wobei das Quellfenster stark abgedunkelt wird, so dass der Fokus des Betrachters auf das neu geöffnete Fenster gerichtet wird. 12 http://www.lokeshdhakar.com/projects/lightbox2/ 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators 2.6. Bewertung Bei der Konzeption eines Konfigurators ist grundsätzlich die Einsatzdomäne zu beachten. Diese lässt sich - wie in 2.1.2 erwähnt - in die Bereiche Platzierung von Objekten, klassische Konfiguration und Konstruktion einteilen, welche jeweils unterschiedliche Anforderungen stellen. Für die vorliegende Arbeit spielt nur der Bereich der klassischen Konfiguration eine Rolle, so dass Anforderungen aus den beiden anderen Domänen – wie Ankerpunkte beim Platzieren von Objekten oder Konstruktionslogiken – entfallen. Weiterhin die Ausrichtung auf den 2D-Modus empfehlenswert um dem Benutzer die Interaktion zu erleichtern und die komplexen Berechnungen im 3D Modus zu umgehen. Zur Modellierung von Konsistenzprüfungen eignen sich Constraints, die entweder selbst entwickelt werden müssen oder durch Einbinden externer Bibliotheken verwendet werden können. Letzteres hat den Vorteil, dass diese meist einen großen Funktionsumfang aufweisen und Funktionalitäten wie Zusammenfassung oder Vereinfachung von Constraints bieten. Der Einsatz von Constraints kann auf einen Teilbereich – nämlich die Überprüfung auf Widerspruchsfreiheit – reduziert werden. Dies bedeutet, dass die Ausführung rechenintensiver Constraintlöser vermieden werden kann, da nur eine gegebene Lösung auf Gültigkeit überprüft und keine optimale Lösung gefunden werden muss. Bei der Gestaltung der Benutzerschnittstelle sollte die leichte Bedienung im Vordergrund stehen um auch eine hohe Endkundenakzeptanz zu erreichen. Daher ist es sinnvoll alle Oberflächen möglichst minimalistisch zu gestalten und beim Einsatz von Drag & Drop Elementen diese mit Vorschaubildern auszustatten. 30. November 2009 27 Verwandte Arbeiten 28 3. Verwandte Arbeiten In diesem Kapitel werden Arbeiten rund um das Thema grafischer bzw. generischer Produktkonfigurator vorgestellt und im Anschluss die Unterschiede zum vorgestellten Konzept verdeutlicht. Wie in 2.3 erwähnt, befasst sich das KoVip Projekt mit der Entwicklung eines generischen Konfigurators für die Firma VHV Anlagenbau GmbH (9), der über Schnittstellen zu CAD und ERP Systemen verfügt um einen gewissen Grad der Integration in eine bestehende Systemlandschaft zu bieten. Eines der Hauptziele war die Unabhängigkeit von externen Dienstleistern zu schaffen, so dass eigene Mitarbeiter den Konfigurator an die Bedürfnisse des Unternehmens anpassen können und die Vereinfachung der Wartung der zugrunde liegenden Wissensbasis. Die Folgende Abbildung zeigt zwei Screenshots dieser Applikation, wobei die linke die Produktstruktur und deren Aufbau und die rechte die CAD Applikation mit dem erstellten Produkt darstellt. Abbildung 4) Produktstruktur und parametrisiertes 3D-Modell 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators Unter dem Aspekt des Product Lifecycle Managements befasste sich das G-SCOP Laboratory des Grenoble Institute of Technology mit der generischen Produktkonfiguration (10) und erforschte in diesem Zusammenhang die Bedeutung von allgemeinen Business Objekten und deren sinnvoller Aufbau. Sie betonten die in 2.1.1 erwähnten Vorteile des Einsatzes einer Objekt-orientierten Programmiersprache. Wie in 2.1.2 beschrieben, entwickelte Ikea einen grafischen Konfigurator zur Platzierung von Möbelstücken, der nach erfolgter Konfiguration eine Materialstückliste alle verwandten Elemente mit zugehörigem Preis liefert. Die Firma Autodesk hat mit dem Projekt Dragonfly13 einen kostenlosen Wohnungsplaner vorgestellt, der als Webapplikation in einem Browser mit installiertem Adobe Flash lauffähig ist und mittels Adobe Flex14 realisiert wurde. Dadurch trägt Autodesk der wachsenden Bedeutung von Internet-fähigen Konfiguratoren Rechnung und ebnet den Einsatz in heterogenen Systemlandschaften. Mit zahlreichen Einrichtungsgegenständen und Architekturelementen kann damit die eigene Wohnung am Rechner geplant werden. Die Bedienung der Software ist möglichst einfach gehalten, so dass keine lange Einarbeitungszeit nötig ist. Die Konfiguration kann bei Dragonfly im zwei- und dreidimensionalen Raum erfolgen. Zu Beginn wird der Grundriss gezeichnet. Wenn dieser grob steht, werden die Räume durch Innenwände, Fenster und Mauervorsprünge ergänzt und individualisiert, bis die Wohnung abgebildet ist. Dazu steht eine große Auswahl an Bodenbelägen, Einrichtungsgegenständen, Wandverkleidungen und Dekorationen zur Verfügung, die als Miniaturansicht dargestellt werden und mittels Drag & Drop eingefügt werden können. Zwischen der zwei- und dreidimensionalen Ansicht kann jederzeit umgeschaltet werden. Dadurch können die Elemente präzise im Raum platziert werden. Die meisten Einrichtungsgegenstände lassen nicht aber nur im 2D Modus platzieren um dem Benutzer die oft schwierige Handhabung im dreidimensionalen Raum zu erleichtern. Prinzipiell lässt sich auch der gesamte Konfigurationsprozess im 2D-Modus durchführen, so dass der 3D-Modus nur als Ergebnisansicht bzw. Vorschau dient. 13 14 http://dragonfly.autodesk.com http://www.adobe.com/de/products/flex/ 30. November 2009 29 Verwandte Arbeiten 30 Die nachstehende Abbildung zeigt einen Screenshot vom Projekt Dragonfly im 3DModus während einer Wohnungskonfiguration. Rechts sind Miniaturansichten von Objekten zu sehen, die per Drag & Drop platziert werden können. Abbildung 5) Autodesk Projekt Dragonfly 3.1. Vergleich Der Bereich der Variantenkonfiguration liegt in einem eher kommerziellem Umfeld, so dass es zwar eine Vielzahl von Produkten (1.3) am Markt gibt, jedoch ohne eine detaillierte Beschreibung des Aufbaus oder Preisgabe des Quelltextes. Bei der Recherche fanden sich sowohl Arbeiten über grafische als auch über generische Produktkonfiguratoren, jedoch lies sich kein Dokument mit tiefergehenden Informationen über die Verbindung der beiden Domänen – nämlich ein generischer und grafischer Produktkonfigurator – finden. Entweder hatten die vorgestellten Lösungen einen generischen Aufbau oder sie besaßen eine Möglichkeit zur interaktiven-grafischen Konfiguration. Im Folgenden werden diese Unterschiede nochmals verdeutlich: Das KoViP Projekte entwickelte zwar einen generischen Produktkonfigurator, aber hier fehlt es an der Möglichkeit der interaktiven Konfiguration. Die Merkmale des 30. November 2009 31 Konzeption und Implementierung eines generischen Produktkonfigurators Produktes können nur manuell eingegeben werden und erst im Anschluss ist es möglich, das fertige Produkt mittels eines CAD Programms zu visualisieren. Ebenso fehlen Plattformunabhängigkeit und Internetfähigkeit. Diese letzten beiden Mankos existieren beim Projekt Dragonfly nicht. Es benötigt lediglich die Installation von Adobe Flash, was für Windows, Linux, MacOS M und Solaris verfügbar ist, und einen inen Internetbrowser. Internetbrowser Zudem gelang es durch den Einsatz der Adobe Flex Technologie eine optisch ansprechende Oberfläche zu gestalten. Der Ikea Home Planner lanner bietet im Vergleich zu den übrigen lediglich die Möglichkeit der interaktiven Konfiguration und der Ausgabe einer Materialstückliste. Die folgende Abbildung stellt einige Eigenschaften der verwandten Arbeiten und des eigenen Konzeptes gegenüber. KoViP Ikea HP Dragonfly Konzept interaktive Konfiguration figuration Miniaturansicht d. Elemente Schnittstellen zu ext. Systemen generischer Aufbau Import von ext. Bez.-wissen wissen internetfähig plattformunabhängig 15 Ergebnis als Materialstückliste Abbildung 6)) Vergleich der verwandten Arbeiten mit dem entwickelten Konzept Wie aus der Abbildung 6 zu erkennen ist, erfüllt keine der verwandten Arbeiten alle aufgeführten Eigenschaften. Aus diesem Grund wird in der vorliegenden Arbeit in Kapitel 5 ein Konzept vorgestellt, mit dem Ziel alle oben genannten Punkte zu erfüllen. 15 Sofern Adobe Flash für die verwendete Plattform verfügbar ist – aktuell: Windows, Linux, MacOS und Solaris 30. November 2009 Implementierung 32 4. Implementierung Die Umsetzung des Projektes stellte besondere Anforderungen an die Programmiersprache. Diese sollte plattformunabhängig eingesetzt werden können und über Bibliotheken zur grafischen Darstellung von Objekten verfügen. Ebenso werden die verwandten Designpattern im Einzelnen erklärt und näher auf deren Einsatzgebiete im Bereich der Produktkonfiguratoren mit deren Vorteilen eingegangen. Des Weiteren werden die eingesetzten Datenstrukturen hinsichtlich ihrer Funktionalität und Effizienz erläutert. Eine Besonderheit ist hierbei die Klasse Tree. Diese ist eine spezielle Baumstruktur zum Ablegen von Objekten, die im Anschluss ausführlich erklärt wird. Zuletzt wird anhand des Quellcodes ausgesuchter Methoden die Funktionsweise des Konfigurators gezeigt. 4.1. Konzeption Zur Darstellung der grafischen Elemente wurde die sehr umfangreiche Java 2D Bibliothek verwendet. Sie bietet alle notwendigen Methoden zum Zeichnen der geometrischen Figuren bis hin zur Kantenglättung von Schriften und Objekten. Außerdem verringert sich der Aufwand beim Implementieren einer PDF ExportFunktionalität, da mittels der frei erhältlichen iText16 Bibliothek PDF Dateien direkt aus Java 2D Methoden heraus erzeugt werden können. 16 http://www.lowagie.com/iText/ 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators 4.2. Umsetzung 4.2.1. Wahl der Programmiersprache Bei der Wahl der Programmiersprache war es wichtig, dass die resultierende Software plattformunabhängig einsetzbar ist. Sie sollte nicht nur unter Windows Betriebssystemen (wie Windows 2000, XP, Vista), sondern beispielsweise auch auf Linux Systemen lauffähig sein. Ein Grund für diese Anforderung ist die wachsende Bedeutung von nicht-Windows Systemen im professionellen Einsatzbereich. Dies belegt eine im Februar 2009 durchgeführte IDC Studie (15), wonach 53 Prozent der Befragten - u.a. als Reaktion auf die Wirtschaftskrise - den Einsatz von Linux auf Servern ausweiten wollen. Bereits jetzt haben 39 Prozent der befragten Unternehmen Unix im Einsatz und 55 Prozent arbeiten mit mindestens einem Linux Server. "Schwierige wirtschaftliche Rahmenbedingungen unterstützen aufstrebende Technologien und die Einführung kosteneffizienter Lösungen. Im Gegenzug bestrafe die Rezession nicht konkurrenzfähige Angebote“. Al Gillen, Studienautor und Software-Analyst bei IDC. Wegfallende Lizenzkosten, eine bessere Herstellerunabhängigkeit und eine erhöhte Flexibilität aufgrund der Quelltextoffenheit, sind dabei die Hauptgründe für den Einsatz von Linux. Nicht nur im Server- sondern auch im Desktopbereich nimmt die Bedeutung von Linux zu. Als Beispiel dafür ist die Stadt München zu nennen. So wurde im Rahmen des LiMux Projektes (16) die Stadtverwaltung von Windows NT auf Linux umgestellt. Insgesamt waren dabei ca. 14.000 PC Systeme und etwa 400 Notebooks betroffen. Folgende Ziele wurden mit dieser Migration verfolgt (17): • größere Unabhängigkeit von Softwareherstellern, Beratern, Plattformen und externen Zeitvorgaben • Erhöhung der Chancengleichheit zum Markteintritt für den Mittelstand, dadurch mehr Wettbewerb im Softwaremarkt • mittelfristig erhöhte Kostenkontrolle (angestrebte Reduzierung) Die Client Studie der Landeshauptstadt München, welche den Nutzen und die 30. November 2009 33 Implementierung 34 Kosten der Migration analysierte, kam zu folgendem Ergebnis: „Liegen die Präferenzen des Stadtrates der LHM eher auf der monetär wirtschaftlichen Seite, dann ist die Ausstattungsalterative Windows XP / Office XP für die Landeshauptstadt München vorteilhafter. Orientiert sich der Stadtrat eher in Richtung auf qualitativ-strategische Aspekte der Entscheidung, dann ist die Variante Linux / Open Office / VM Ware die optimale Lösung.“ (18) Desweiteren sind neben Linux, auch häufig OS/40017 Systeme von IBM als Serverbetriebssysteme im Einsatz, auf denen die Software lauffähig sein soll. Um die wachsende Bedeutung von Web-basierten Konfiguratoren zu beachten, sollte das Programm auch internetfähig sein. Aufgrund dieser Anforderungen kamen Java und die Microsoft .net Familie in die engere Auswahl, wobei letztlich die Entscheidung für Java gefallen ist. Einer der Gründe hierfür war, dass die angestrebte Plattformunabhängigkeit unter .net grundsätzlich möglich ist, aber die beiden am weitesten entwickelten Projekte Mono18 und dotGNU19 mit ihren Implementierungen noch nicht auf dem Entwicklungsstand des heutigen .net sind. Desweiteren bietet Java Connector „JCo“ zur Kommunikation der Anwendung mit einem SAP System mehr Vorteile gegenüber dem .net Connector. “The SAP Java Connector (SAP JCo) is a toolkit that allows a Java application to communicate with any SAP System. It combines an easy to use API with unprecedented flexibility and performance. The package supports both, Java to SAP System as well as SAP System to Java calls. The SAP JCo is the best choice for building SAP-enabled Java applications because of the following features: • High performance JNI-based RFC middleware. 17 http://www.ibm.com/iseries http://www.novell.com/linux/ximian.html 19 http://www.gnu.org/software/dotgnu 18 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators • Supports R/3 3.1I and higher (and other SAP Components that have BAPIs or RFMs). • Supports inbound (Java client calls BAPI or RFM) and outbound (ABAP calls Java server) calls. • Supports synchronous, transactional (important for IDocs), and queued RFC. • Supports client pooling (good for web servers) • Multi-platform • Complete and correct code-page handling (incl. multi-byte languages) • Easy to install and deploy” • (19) Zudem ist es durch die Java Applet Technologie ohne großen Aufwand möglich, die Anwendung in eine Internetseite zu integrieren, so dass eine Konfiguration auch im Internet erfolgen kann. Dies ist besonders für Endkunden interessant, die sich somit selbst und jederzeit über das Internet ihr gewünschtes Produkt konfigurieren können und als Ergebnis ein Vorschaubild und den Endpreis erhalten. Zur Integration der Grafik hätte man auch JavaFX20 einsetzen können. Diese von Sun entwickelte Produktfamilie zielt auf die Erstellung von grafisch ansprechenden und interaktiven Applikationen mit dem Anspruch, die zukünftige Präsentationsschicht für plattformübergreifende Java-Anwendungen zu werden. Jedoch hat JavaFX erst im Dezember 2008 das Betastadium verlassen und durch die Übernahme von Sun durch Oracle ist die weitere Entwicklung von JavaFX ungewiss (20). 4.2.2. Wahl der Entwicklungsumgebung Als Entwicklungsumgebung wurde das quelloffene Programmierwerkzeug Eclipse21 eingesetzt, da es eine Vielzahl von sehr hilfreichen Erweiterungen - sowohl quelloffen als auch von kommerziellen Anbietern - gibt. Des Weiteren bietet Eclipse eine AutoKorrektur sowie zahlreiche weitere nützliche Funktionen wie z.B. 20 21 http://www.javafx.com/ http://www.eclipse.org/ 30. November 2009 35 Implementierung 36 • Auslagern von Strings zur Unterstützung von Mehrsprachigkeit • konfigurierbares Formatieren • umfangreiche Debugging Möglichkeiten • zahlreiche Refactoring22 Möglichkeiten • viele verfügbare open source Erweiterungen 4.3. Designpattern Um bestimmte Probleme bei der Implementierung geschickt zu lösen, wurden geeignete Designpattern gesucht. Sie sind bewährte Lösungsvorschläge für wiederkehrende Entwurfsprobleme in der Softwarearchitektur und Softwareentwicklung. Sie stellen damit eine wiederverwendbare Vorlage zur Problemlösung dar, die in einem bestimmten Zusammenhang einsetzbar ist. Im Folgenden werden die Funktionsweise und der Verwendungsgrund der genutzten Designpattern erläutert. 4.3.1. Singleton Ein bekanntes Problem in der Programmiersprache Java besteht aus dem Fehlen von globalen Variablen, wie man sie beispielsweise von C++ kennt. Abhilfe schafft hier das Singleton Designpattern. Es ist ein in der Softwareentwicklung eingesetztes Entwurfsmuster und gehört zur Kategorie der Erzeugungsmuster. Es besteht aus einer eigenen Klasse mit privatem Konstruktor und einer öffentlichen, statischen Methode (getInstance()), welche die Instanz der Klasse zurückliefert. Singleton -instance : Singleton -Singleton() +getInstance() : Singleton Abbildung 7) Singleton Konstruktor Quelltext der Methode getInstance(): 22 Refactoring bezeichnet in der Software-Entwicklung die manuelle oder automatisierte Strukturverbesserung von Programm-Quelltexten unter Beibehaltung des Programm-Verhaltens. 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators public static Singleton getInstance() { if (instance == null) instance = new Singleton(); return instance; } Abbildung 8) UML Diagramm der Klasse Singleton Durch diesen Aufbau ist es möglich auf die Instanz der Klasse Singleton global zuzugreifen (Singleton.getInstance()). Der private Konstruktor verhindert außerdem, dass Instanzen direkt erzeugt werden können; nur mittels der Methode getInstance() kann eine einzelne Instanz erzeugt werden. 4.3.2. Builder Sind zum Erzeugen eines Objektes bestimmte Parameter notwendig und andere nur optional, so lässt sich dies mittels unterschiedlichen Konstruktoren realisieren, die sich alle anhand ihrer Signatur unterscheiden. Diese hat jedoch als Nachteil, dass die Lesbarkeit abnimmt und viele Konstruktoren geschrieben werden müssen. Eine Alternative hierzu bietet das Builder Pattern aus dem Bereich der Softwareentwicklung. Es gehört zur Kategorie der Erzeugungsmuster (Creational Patterns). Es trennt die Konstruktion komplexer Objekte von deren Repräsentationen, wodurch dieselben Konstruktionsprozesse wiederverwendet werden können. Im Wesentlichen besteht das Builder Pattern aus einer Objektklasse, einer inneren statischen Builder Klasse, welche für jeden optionalen Parameter eine eigene Methode enthält, und aus einer build Methode zum Erzeugen des Objektes. Um ein Objekt zu erzeugen wird der Konstruktor der inneren Builder Klasse nur mit den erforderlichen Parametern aufgerufen, wodurch der Konstruktor schlank und somit lesbar bleibt. Um weitere optionale Parameter anzugeben, werden die in der inneren Klasse definierten Methoden an den Konstruktor angehängt. Der folgende Quelltext illustriert dies: new Constraint.Builder( new StringVariable("SI_STUERT","J"), new StringVariable("SI_STAUSF",["SH, SL"])) .requires().build()); Abbildung 9) Beispiel eines Constraints 30. November 2009 37 Implementierung 38 Die Methode requires() ist hierbei in optionaler Parameter, der zwischen dem Konstruktor(StringVariable) und der build() Methode steht und angibt, dass wenn die Variable „SI_STUERT“ den Wert „J“ hat, muss die Variable „SI_STAUSF“ den Wert „SH“ oder „SL“ haben. 4.3.3. Model View Controller Zur Trennung von Darstellung und Logik, setzt die Orbis CS setzt das Model View Controller Pattern ein. Es lassen sich dadurch mehrere unterschiedliche Sichten (Views) für ein Konfigurationsproblem erstellen. Dies ist sinnvoll, da beispielsweise Endkunden und unternehmensinterne Mitarbeiter andere Sichten mit unterschiedlichem Detaillierungsgrad oder auch anderen Userinterfaceelementen bevorzugen. Das Model-View-Controller-Konzept beinhaltet die genaue Aufgabenverteilung innerhalb einer Anwendung. So versteht man unter dem Model die Datenquelle, die Daten unabhängig vom Erscheinungsbild liefert (z.B. aus einer Datenbank oder externen Quelle). Die View zeigt diese Daten in passender Form an (z.B. grafische Vorschau des Produktes), wobei die Art und Weise wie diese View die Daten anzeigt nicht vom Model beeinflusst wird. Der Controller steuert die Interaktion mit dem Benutzer (das Verhalten der Komponente). Wird beispielsweise in der angezeigten Merkmaltabelle ein Wert geändert, so teilt der Controller dies dem Model mit, welches wiederum die View darüber informiert, dass eine Änderung erfolgte und eine Aktualisierung der Grafik notwendig ist. Der Vorteil dieser Aufgabenverteilung ist zum einen die Möglichkeit der Aufteilung in logische, unabhängige Klassen, wie auch die Möglichkeit, jede der drei Komponenten jederzeit auszutauschen. Hierdurch ist bei der Java Bibliothek Swing der Austausch des Look-and-Feels23 zur Laufzeit möglich. Die nachstehende Abbildung soll diesen Zusammenhang verdeutlichen: 23 Eine Liste verfügbarer Look-and-Feels findet sich unter http://www.javootoo.com 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators Abbildung 10) Model View Controller Pattern (31) G Alle vorgestellten Designpattern eignen sich zur Erstellung eines generischen Produktkonfigurators, da sie allgemeine und in diesem Bereich immer auftretende Probleme wie • das Fehlen von globalen Variablen in Java, • die schlechte Lesbarkeit von Konstruktoren mit vielen Parametern und • die Notwendigkeit von verschiedenen Darstellungsmöglichkeiten zu ein und demselben Modell aufgrund unterschiedlichem Hintergrundwissen (Endkunde und Vertriebsmitarbeiter) elegant lösen. Besonders die letzte Anforderung spielt im Zusammenhang der Produktkonfiguration eine entscheidende Rolle, da verstärkt der Endkunde die Konfiguration eines Produktes selbst übernehmen soll. Dieser Endkunde verfügt in den meisten Fällen über wenig oder kein Produktwissen, so dass er eine vereinfachte und stärker System-geführte Konfiguration – also eine andere Sicht auf das Problem wie beispielsweise ein Vertriebsmitarbeiter – bevorzugt. 30. November 2009 39 Implementierung 40 4.4. Laufzeit und Effizienzoptimierung 4.4.1. Hash Tabelle Zur Verwaltung und Speicherung der Merkmale, wurde eine Datenstruktur gesucht, die folgende Operationen besonders effizient implementiert: • Abspeicherung und von Merkmalen (Wertepaar bestehend aus Name und Wert) in die Datenstruktur • Prüfung ob ein Merkmal bereits in der Datenstruktur vorhanden ist • Unterbindung von Mehrfachspeicherungen ohne explizite Prüfungen zu erstellen Die effiziente Implementierung obiger Methoden ist besonders wichtig, da die Datenstruktur – selbst bei weniger komplexen Konfigurationen – sehr schnell über tausend Einträge aufweisen kann. Eine weitere Anforderung besteht darin, dass jedes Merkmal nur einmal in der Datenstruktur vorkommen kann, d.h. beim erneuten Speichern eines Merkmals, soll der vorherige Wert überschrieben werden. Aufgrund dieser Überlegungen wurde zum Speichern der Merkmale eine Linked Hashmap gewählt, da sie für die beschriebenen Aktionen lediglich konstante Laufzeiten benötigt und somit die Größe (d.h. die Anzahl der gespeicherten Elemente) keine Rolle spielt. Die Klasse Linked HashMap ist eine Unterklasse von HashMap, die alle ihre Eigenschaften erbt und zusätzlich eine Reihenfolge bietet in der ein Iterator Elemente zurückliefert. Im Gegensatz zu LinkedHashSet bietet LinkedHashMap eine Wahl der Reihenfolge, in welcher der Iterator die Hash Tabelle durchlaufen soll. Elemente können in der Reihenfolge ausgegeben werden, in der sie hinzufügt wurden oder in der sie bearbeitet wurden. Die Folgende Tabelle zeigt sieben Map Implementierungen von Java und verdeutlicht die Laufzeitunterschiede anhand dreier Methoden. Die Variable h bezeichnet hierbei die Kapazität der Tabelle. • get(key): Liefert den Wert dem der angegebene Schlüssel zugeordnet ist. 30. November 2009 41 Konzeption und Implementierung eines generischen Produktkonfigurators • containsKey(name): Liefert true zurück, falls dem angegebenen Schlüssel ein Wert zugeordnet ist. • next(): Liefert das folgende Element innerhalb der Hash Tabelle zurück. get() containsKey() next() HashMap O(1) O(1) O(h/n) LinkedHashMap O(1) O(1) O(1) IdentityHashMap O(1) O(1) O(h/n) EnumMap O(1) O(1) O(1) O(log n) O(log n) O(log n) O(1) O(1) O(h/n) O(log n) O(log n) O(1) TreeMap ConcurrentHashMap ConcurrentSkipListMap Abbildung 11) Vergleich von Map Implementierungen anhand ihrer Laufzeiten 4.4.2. Queues Bei Änderungen in der Grafik, die mehrere Merkmale betreffen, sollte nicht jedes Merkmal einzeln übertragen und auf Konsistenz geprüft werden, sondern alle Änderungen sollten in einem Durchgang an die ORBIS CS gesendet und erst dann verarbeitet werden. Um dies zu realisieren eignet sich die Datenstruktur Queue. Diese kann eine beliebige Anzahl von Objekten aufnehmen und diese in der Reihenfolge ihres Einfügens wieder zurückliefern. Dazu werden folgende Operationen zur Verfügung gestellt: • enqueue: zum Hinzufügen eines Objekt und • dequeue: zum Zurückholen und Entfernen eines Objektes Dabei wird nach dem First In – First Out-Prinzip gearbeitet, das heißt, es wird von dequeue immer das Objekt aus der Warteschlange zurückgegeben, welches als erstes mit enqueue eingefügt wurde. Diese – recht simplen – Operationen sind in der Queue Datenstruktur besonders effizient implementiert, so dass, falls die oben genannten Methoden ausreichen, die Verwendung dieser Datenstruktur empfehlenswert ist. Die 30. November 2009 Implementierung 42 beiden oben genannten Methoden haben konstante Laufzeit, so dass die Länge der Queue keine Rolle spielt. Werden umgekehrt Änderungen in der ORBIS CS getätigt, so ist die Vorgehensweise analog zu oben. Der Konfigurator stellt ebenfalls eine Queue zum Sammeln von Merkmalen zur Verfügung, die in einem Schritt verarbeitet werden können. Dadurch wird nicht bei jeder Markmaländerung geprüft, ob sich Änderungen in der Grafik ergeben. 4.4.3. Konsistenzprüfungen Zum Hinterlegen von Bedingungen und zur Überprüfung des Modells auf Widerspruchsfreiheit, wurde ein eigenes Package bestehend aus den Klassen DependenceModel, Constraint, Variable, IntVariable und StringVariable erstellt. Der Fokus bei der Erstellung dieser Klassen lag dabei auf der Lesbarkeit des Quellcodes und der effizienten Implementierung der Prüfroutinen. Ersteres ist von Bedeutung, da in einem regelbasierten System die Komplexität der Wissensbasis mit jeder Änderung oder Erweiterung schnell wächst (9) und somit eine gute Lesbarkeit des Quelltextes wichtig ist. Um dies zu erreichen wurde u.a. das in 4.3.2 vorgestellte Design Pattern verwandt, welches Klassenkonstruktoren schlank hält und trotzdem weitere Parameter ermöglicht, ohne dass die Lesbarkeit darunter leidet. Um die Prüfroutinen nicht unnötig oft aufzurufen werden diese nur bei tatsächlichen Änderungen aktiv, was einen Performancegewinn darstellt. Ebenso wurde es durch den Einsatz einer Queue ermöglicht, eine Reihe von Änderungen vorzunehmen wobei erst nach deren vollständiger Abarbeitung die Konsistenzprüfungen starten. Die Klasse DependenceModel ist hierbei der Ausgangspunkt, welcher Variablen und Constraints (Beziehungen zwischen zwei oder mehreren Variablen) zugeordnet werden können. Außerdem enthält sie eine Methode zur Überprüfung des gesamten Modells auf Widerspruchsfreiheit. Zur Verwaltung von Variablen dient die abstrakte Klasse Variable, welche die Klassen IntVariable und StringVariable als untergeordnete Klassen mit jeweils eigenen Prüfmethoden besitzt. Sie dienen dazu konkrete Variablenbelegungen zu speichern. Bei Inkonsistenzen färbt sich eine Statusleuchte rot und ein Button zum Anzeigen der Fehlerdetails erscheint. Durch Drücken auf diesen Button erscheint ein Popup Fenster mit Fehlermeldungen, die zuvor in einen StringBuffer 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators geschrieben wurden. Ein StringBuffer ist ein Container,, in dem eine Zeichenkette abgelegt wird, die über bestimmte Methoden modifiziert werden kann. Der wesentliche Unterschied zur Klasse String besteht darin, dass der de StringBuffer veränderbar ist, d.h. während ährend die Manipulations-Methoden Methoden der de String Klasse immer neue String-Objekte Objekte erzeugen, erzeu arbeiten die Methoden auf ein und demselben Objekt,, woraus sich ein Performancevorteil im Vergleich zu String ergibt. Die folgende Abbildung verdeutlicht den Aufbau des Constraint Packages: Abbildung 12) UML Klassendiagramm des Packages Constraint 4.4.4. Variablen Variablen können mittels der Klasse IntVariable (Speicherung von ganzzahligen Werten) und StringVariable (Speicherung von Zeichenketten) in das Model eingebunden werden. Bei IntVariable kann festgelegt werden, ob eine Variable • gesetzt sein muss. • einen bestimmten Wert haben muss. • in einem Intervall liegen muss. 30. November 2009 43 Implementierung • 44 in einem Intervall mit bestimmten Schrittweiten liegen muss. Die Klasse StringVariable ist ähnlich aufgebaut. Hier kann bestimmt werden ob, eine Variable • gesetzt ein muss. • einen bestimmten Wert haben muss. • einen bestimmten Wert aus einer Liste haben muss. Bei Verletzung einer Bedingung wird eine entsprechende Text Meldung generiert. 4.4.5. Constraints - Requires Relationen Um Anzugeben, dass eine Variable erforderlich ist, wenn eine andere nicht leer oder einen bestimmten Wert hat, wird die requires Relation verwandt. Im Folgenden Beispiel muss die Variable „SI_VGLANORD“ einen Wert erhalten, sobald der Variable „SI_VGLTYP_OTG“ ein Wert zugewiesen wird. Man beachte den Aufruf der build() Methode, die das Objekt erzeugt nachdem alle Parameter angegeben wurden. new Constraint.Builder( new StringVariable("SI_VGLTYP_OTG"), new StringVariable("SI_VGLANORD")) .requires().build()); Abbildung 13) Quelltext Beispiel einer require Relation 4.4.6. Constraints – Junction Relationen Um logische Relationen zwischen Variablen zu definieren dient die junction Relation. Hier können die logischen Verknüpfungen AND, XOR und NAND hinterlegt werden. Das folgende Beispiel illustriert die Verwendung einer NAND Relation: Wenn die Variable „SI_VGLTYP_UTG“ den Wert „A“, „D“ oder „E“ hat, darf die Variable „SI_TGTYP_UTG“ nicht den Wert „AL“ haben. Umgekehrt gilt dies genauso. new Constraint.Builder( new StringVariable("SI_VGLTYP_UTG", new String[] {"A","D","E"}), new StringVariable("SI_TGTYP_UTG", "AL")) .junction(Junction.NAND).build()); Abbildung 14) Quelltext Beispiel einer Junction.NAND Relation Der Verwendung von AND und XOR Relationen ist analog zu obigen Beispiel. 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators Junction.NAND ist hierbei durch Junction.XOR bzw. Junction.AND zu ersetzen. G Die hier vorgestellten Datenstrukturen empfehlen sich alle zur Erstellung eines generischen Produktkonfigurators, da immer • Variablen verwaltet werden müssen und • die Möglichkeit bestehen muss, dass diese in Paketen (Queues) verarbeitet werden können Es hängt nur davon ab, welche Programmiersprache verwendet wird, da es hier unterschiedliche Map Implementierung gibt, die sich im Detail in ihrer Laufzeit unterscheiden können. Bei reinen regelbasierten Systemen kann es sinnvoll sein, externe Bibliotheken zur Erstellung von Konsistenzprüfungen zu verwenden, da in diesem Bereich der Fokus auf ihnen liegt und eine große Funktionalität wünschenswert ist. In den beiden anderen Bereichen (wissensbasierte und Entscheidungstabellen-basierte Systeme) werden Constraints nicht eingesetzt oder sie haben keine zentrale Bedeutung. Hier kann es durchaus sinnvoll sein, die benötigten Klassen mit den notwendigen Funktionalitäten selbst zu erstellen. Generell sollte aber der Einsatz eines regelbasierten Systems kritisch betrachtet werden, da hier die Pflege und die Verwaltung der Constraints mit der Zeit immer komplexer und somit auch aufwendiger wird. Nur bei weniger komplexen Konfigurationsproblemen ist deren Einsatz empfehlenswert. 4.5. Datenverarbeitung 4.5.1. Zeichenobjekte (DrawingObject) Um Objekte darzustellen wurde für jedes eine eigene Klasse entwickelt, die alle der abstrakten Klasse DrawingObject untergeordnet sind. Die folgende Grafik beschreibt den Aufbau der Zeichenobjekte. 30. November 2009 45 Implementierung 46 DrawingObject MainGate Elmement MainGate Sandwich Window Door AluFrame Window Abbildung 15) 15 Die abstrakte Klasse DrawingObject mit ihren Unterklassen Die in der Hierarchie oberste abstrakte Klasse ist DrawingObject.. Sie enthält dabei alle Methoden und Felder, die in allen untergeordneten Klassen benötigt werden, werden wie z.B.: X/Y Koordinate und Höhe/Breite Höhe/ des Objektes. Alle untergeordneten Klassen erben diese Methoden und Attribute, so dass diese nicht wieder implementiert werden müssen. 4.5.2. Tree Zur hierarchischen und strukturierten Speicherung aller grafischen Objekte wurde eine eigene Baumstruktur erstellt. Ein Baumobjekt besteht hierbei aus einem eine Zeichenobjekt (DrawingObject DrawingObject) und enthält dabei Referenzen auf den d übergeordneten Baum (parent: Tree) und auf eine Liste mit untergeordneten Bäumen (children: children: ArrayList<Tree>). Betrachten wir als Beispiel ein Tor, Tor welches aus drei Torgliedern besteht und eine Tür besitzt. Außerdem sind in den Torgliedern mit Nummer zwei und drei Fenster eingebaut. Die Baumdarstellung dieses Tores lautet: MainGate MainGate Element 1 MainGate Element 2 MainGate Element 3 Sandwich Window Sandwich Window Door Abbildung 16)) beispielhafte Baumdarstellung eines Tores 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators Der Baumknoten besteht aus dem Haupttor, welcher die Grunddaten (X/Y Position und Höhe/Breite) beherbergt. Alle übrigen Elemente sind untergeordnete Objekte, da sie sich innerhalb des Tores befinden. Auf der nächsten Stufe befinden sich die einzelnen Torgliedelemente und die Tür. Auf der dritten Stufe sind die Fenster und Alurahmen zu finden, da sie immer in ein bestehendes Torgliedelement eingesetzt werden. Durch diese Anordnung wird das Tor mit jeder weiteren Stufe in immer kleinere Bereiche unterteilt. Beim Einfügen neuer Objekte spielt immer nur das übergeordnete Objekt eine Rolle anhand dessen die Positionierung berechnet wird. Beim Einfügen eines Zeichenobjektes kann das übergeordnete Objekte für die Position ausschlaggebend sein aber auch das Objekt selbst. Letzteres ist beispielsweise bei der Tür der Fall, diese wird immer in die erste Hierarchieebene eingefügt. In diesem Fall muss der Konstruktor dementsprechend angepasst werden, damit beim Erzeugen und Einfügen des Objektes der korrekte Platz im Baum eingenommen wird. G Diese Art der Verwaltung eignet sich auch für einen generischen Konfigurator. Die Standardmethoden, die für jeden Konfigurator empfehlenswert sind, bestehen hierbei aus: • get/setChildren() • get/setParent() • getNumberOfChildren() • addChild(Tree) • removeChild(Tree), removeChildAt(int) • get/setData() • isMarked(): überprüft ob ein Baumobjekt markiert / ausgewählt ist. • pre/post/inOrder(): Überführung des Baumes in eine Liste mit allen Blattknoten in einer bestimmten Reihenfolge. • hasChildWithTypeOf(String) Besondere Bedeutung haben hier bei die Baum-Traversierungsmethoden preOrder() und postOrder(). Diese Methoden liefern eine geordnete Liste aller Zeichenobjekte, wobei das Durchlaufen bei preOrder() nach der depth-first und bei 30. November 2009 47 Implementierung 48 24 postOrder() nach der breadth-first breadth Methode abläuft. Die folgenden Grafiken verdeutlichen die Unterschiede zwischen beiden Methoden und zeigen die Darstellungen des Tores aus 4.5.2. MgElem 1 MgElem 2 MgElem 3 Door S.Window S.Window Abbildung 18) Pre-Order Darstellung MgElem I S.Window MgElem 2 S.Window MgElem 3 Door Abbildung 17) Post-Order Darstellung Anhand der preOrder() Reihenfolge, werden die die Objekte gezeichnet. Die postOrder() Reihenfolge bestimmt welches Objekt markiert markiert wird, falls Objekte übereinanderliegen und eine ein Objektanwahl stattfindet. Es werden somit unterliegende Objekte als erstes selektiert. (z.B. ein Alu Fenster liegt in einem Torgliedelement, beim Selektieren soll aber nur das Alu Fenster gewählt werden können). Die gewünschte Hierarchie wird dadurch eingehalten, eingehalten indem dem Objekte nur hinzugefügt werden können, wenn das gewünschte übergeordnete Objekt markiert ist. Das neue Objekt wird in diesem Fall als Unterbaum eingefügt. Lediglich die Tür, welche nur dem Tor selbst ungeordnet ist, wird immer in die zweite Hierarchiestufe eingefügt. Vor or dem Einfügen muss daher nicht das Tor markiert werden. 24 Breitensuche 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators 4.6. Klassendesign 4.6.1. Übersicht Abbildung 19)) Klassendiagramm des grafischen Konfigurators 30. November 2009 49 Implementierung 50 4.6.2. Drawing Manager Diese Klasse dient als Schnittstelle zur ORBIS CS. Sie enthält alle notwendigen Methoden, damit die ORBIS CS Werteänderung an die Grafikkomponente senden kann, worauf Änderungen in der Grafik erfolgen können. Die Methoden selbst, sind in der Klasse Data Handler ausgelagert und werden lediglich von Drawing Manager aufgerufen. Umgekehrt erhält sie von der ORBIS CS eine Instanz dessen InstanceManagers, damit Änderungen des Benutzers in der Grafik an die ORBIS CS übertragen werden können. Außerdem instanziiert sie ein Drawing Panel und erstellt eine Instanz des Data Handlers, welcher bei Wertänderungen durch Die ORBIS CS die Grafik anpasst, bereit. Die Art und Weise dieser Änderungen wird durch die Klasse LogicContainer spezifiziert. 4.6.3. Drawing Panel Ein zentrales Element des grafischen Konfigurators stellt die Klasse „DrawingPanel“ dar. Sie implementiert Mouse- und Mouse Motion Listener zur Steuerung von Benutzer Interaktionen (z.B. Hinzufügen einer Tür) und gibt diese Änderungen weiter an die Klasse Data Handler. Umgekehrt werden auch Änderungen von der ORBIS CS an Data Handler übergeben und dort weiterverarbeitet. Des Weiteren instanziiert sie alle UI Elemente sowie den Zeichenbereich (DrawingArea). 4.6.4. Data Handler Diese Klasse steuert zentral die Änderungen der Grafik, wenn Änderungen von der ORBIS CS ausgehen und wenn Änderungen über die Benutzerschnittstelle erfolgen. Für Ersteres stellt Data Handler Methoden wie beispielsweise setValue und deleteValue zur Verfügung. Um nicht bei jeder Änderung überprüfen zu müssen, ob eine Aktualisierung der Grafik notwendig ist, stellt sie außerdem die Methoden setValueToInputQueue und processInputQueue zur Verfügung. Erstere dient dazu, Werte in eine Warteschlange (Queue) zu setzen, die mit der Methode processInputQueue verarbeitet werden können. Durch die Verwendung einer Queue können somit mehrere Variablen gesetzt werden, ohne bei jeder Wertsetzung zu prüfen, ob sich Änderungen in der Grafik ergeben. Dieser Einsatz der Queue bietet somit einem Performancevorteil. 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators 4.6.5. Logic Container Mit der Klasse Logic Container ist es möglich, einem Objekt mehrere Variablen zuzuordnen und zu bestimmen, welche dieser Variablen gesetzt sein müssen, damit das jeweilige Objekt gezeichnet werden kann. Neben den Variablen lassen sich noch Funktionen zuordnen, die bei Ausführung „true“ zurückliefern müssen, damit das betreffende Objekt gezeichnet wird. Sie beinhaltet somit alle notwendigen Variablenbelegungen und Nebenbedingungen eines Objektes. G Diese Klasse ist bereits generisch implementiert, so dass sie für alle Arten von Objekten eingesetzt werden kann. 4.6.6. UI Changer Die Klasse UI Handler dient zur Steuerung der Userinterface-Elemente (z.B. Auswahllisten) und ermöglicht das Verändern des Erscheinungsbildes (ergrauen und ausblenden). Durch die Zuordnung eines Zeichenobjektes (DrawingObject) zu einem oder mehreren UI Elementen können Methoden hinterlegt werden, die bei der Auswahl eines Objektes ausgeführt werden und die Darstellung ändern. G Diese generische Art der Userinterface-Steuerung eignet sich prinzipiell für alle Arten von Konfiguratoren. 4.7. Ablauf einer Variablenänderung in der ORBIS Configuration Suite Wird eine Variable in der Orbis CS geändert oder gesetzt, so wird die setValue() Methode des grafischen Konfigurators aufgerufen. Diese Methode ist Bestandteil der Klasse DrawingManager und sie reicht die getätigte Änderung weiter an die Klasse DataHandler. Diese überprüft, ob sich durch die Wertsetzung eine Änderung in der Grafik ergeben hat, aktualisiert diese dementsprechend und legt die Variable in der Hash Tabelle, die alle Variablen verwaltet, ab. Außerdem wird bei einer Änderung, diese auch an die Klasse UIChanger weitergeleitet, die für die Aktualisierung der Benutzerschnittstelle verantwortlich ist. Je nachdem welche Art von Änderung stattgefunden hat, werden UI Elemente ausgeblendet, ergraut oder beinhalten andere Werte. 30. November 2009 51 Implementierung 52 Die Folgende Abbildung illustriert diesen Ablauf in vereinfachter Form: Abbildung 20) Sequenzdiagramm einer Variablenänderung Nachdem dieser Prozess abgeschlossen ist, startet die Konsistenzprüfung, die das Ergebnis visuell anzeigt. 4.8. Hardwareanforderungen Insgesamt betrachtet stellt das Programm keine hohen Anforderungen an einen Rechner. Ein Pentium 425 oder ein AMD Athlon XP26 Prozessor genügt, um ein flüssiges Arbeiten zu ermöglichen. Der Einsatz eines Zwei – oder Vierkernprozessors bringt keine Vorteile, da die Anwendung nicht auf den Mehrkern-Betrieb optimiert wurde. Ebenso genügt eine onboard Grafikkarte, da weder Schattierungen noch Lichtreflektionen verwendet werden. An rechenintensiven Operationen wird nur Antialiasing27 bei der Kantenglättung von Text eingesetzt. Da dies nur ein kleiner Teil der Grafik ist, fallen diese Berechnungen nicht ins Gewicht. Beim Einsatz von Windows XP sind 512 MB oder mehr und bei Windows Vista bzw. Windows 7 1024 MB Arbeitsspeicher oder mehr empfohlen. 25 http://www.intel.com/products/processor/pentium4/index.htm http://www.amd.com/athlonxp 27 Bezeichnet eine Technik zur Verminderung von unerwünschten Effekten, die durch ein begrenzt aufgelöstes Pixelraster verursacht werden. Ein sehr häufig auftretender Effekt ist der Treppeneffekt, der bei der Erzeugung einer Computergrafik entstehen kann. 26 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators 5. Generischer Aufbau Dieser Abschnitt behandelt den Aufbau eines generischen grafischen Konfigurators anhand ausgewählter Literatur und wird durch persönliche Empfehlungen und Erfahrungen, die während der Konzeption und Implementierung des in dieser Arbeit beschriebenen grafischen Konfigurators gewonnen wurden, ergänzt. 5.1. Einsatzbereich Grundsätzlich stellt sich die Frage ob die grafische Konfiguration im 2D oder 3D Modus erfolgen soll. Beide Modi haben jeweils ihre Vor- und Nachteile, wobei der 2D Modus im Allgemeinen die bessere Wahl ist. Dies liegt daran, dass Benutzer mit einer 2D Ansicht leichter zurechtkommen, da hier kein räumliches Denken notwendig ist, welches laut Thurstone (21) eines von sieben Primärfaktoren der intellektuellen Kapazität darstellt. Um Benutzer ohne diese Fähigkeit nicht auszuschließen, ist eine Interaktion im 2D Modus die beste Wahl. Außerdem sind hier Überdeckungen einzelner Objekte leichter zu erkennen als im 3D Modus. Durch den Einsatz des 2D Modus ergibt sich sowohl eine Reduzierung der Komplexität in der Bedienung als auch in der Entwicklung, da beispielsweise komplexe Kollisionsprüfungen (Ineinanderstellen von Objekten) entfallen. Um einen Vorteil der 3D Ansicht – nämlich die Nähe zur Realität – nutzen zu können, sollte das fertig konfigurierte Produkt in einer 3D-Ansicht visualisiert werden können. Dies kann beispielsweise durch eine Anbindung an ein CAD Programm erfolgen oder durch den Export des Produktes als PDF 3D28 Datei. Letzteres bietet den Vorteil, 28 http://www.acrobat3d.de/ 30. November 2009 53 Generischer Aufbau 54 dass auch Endkunden ihr Produkt von allen Seiten betrachten können, da der benötigte Adobe Acrobat Reader kostenlos verfügbar ist29. Der Einsatz zielt auf die Produktionsgüterindustrie für Objekte wie beispielsweise Fenster, Türen und Tore, die aus einfachen geometrischen Figuren wie Quadrat, Rechteck, Dreieck, Kreis oder Ellipse bestehen, wobei es erlaubt ist, Objekte übereinander zu positionieren. 5.2. Aufbau Für den Aufbau der Applikation empfiehlt sich die Einteilung in folgende vier Komponenten: • GUI Designer zur Anpassung und Erstellung der Benutzerschnittstelle und zum Hinterlegen von „UI-Effekten“ wie ein/ausblenden und ergrauen von UIElementen • Objekteditor zur Erstellung der grafischen Darstellung der einzelnen Objekte bzw. Bauteile • Regeleditor um Beziehungen zwischen den Objekten / Bauteilen herzustellen und entsprechende Konsistenzbedingungen zu hinterlegen • Struktureditor um den grundsätzlichen Aufbau eines Produktes zu beschreiben mit all seinen möglichen Ausprägungen ohne weitere Logik zu beinhalten Abramovici et Al. verfolgten in ihrem KoViP Projekt (9) die gleiche Strategie und nahmen ebenfalls eine Unterteilung in diese vier Elemente vor. Sie empfahlen weiterhin alle Daten in einer Konfigurationsdatenbank zu speichern, damit alle Komponenten zugreifen können. Dies ist nötig, da einige Objekte von mehreren Komponenten bearbeitet werden. Zur Anbindung von externen Systemen wie einer CAD Anwendung entwickelten sie eine weitere Komponente, die eng mit dem Objekt- und dem Struktureditor verbunden ist. 29 http://get.adobe.com/de/reader 30. November 2009 55 Konzeption und Implementierung eines generischen Produktkonfigurators Die nachstehende Grafik veranschaulicht die Zusammenhänge zwischen den vier Komponenten und zeigt Beziehungen zu weiteren Objekten auf: 1 * GUI Editor Struktureditor * 1 * * * Einzelteil Konfigurierbares Material Gui Element * * * * * 1 * * * Zeichenobjekt Objekteditor * * Variable 1 * 1 1 * * Constraint Regeleditor * * Abbildung 21) Übersicht generischer grafischer Konfigurator Im Folgenden gehe ich näher auf die einzelnen Komponenten ein und erläutere ihren Aufbau und deren Funktionsweise. 5.2.1. Regeleditor Der Regeleditor dient zum Hinterlegen der Produktlogik und Konsistenzprüfungen und somit zum Erstellen des gesamten Beziehungswissens. Die Produktlogik kann z.B. mit Entscheidungsbäumen realisiert werden(22), wobei zwischen UND- bzw. ODERBäumen zu unterscheiden ist (23). Letztere bestehen aus Knoten, die jeweils eine ODERVerknüpfung der folgenden d.h. ungeordneten Knoten beinhalten. Es kann also nur ein Knoten gewählt werden. Ein Ast eines ODER-Entscheidungsbaumes könnte hierbei bedeuten: • wenn „Tür“ gewählt wird, dann ist keine weitere Tür wählbar, oder • wenn „Breite größer als 6000 mm“ gewählt wird, dann sind nur noch Torhöhen kleiner als 6000 mm wählbar. Die Definition von UND-Bäumen ist analog zu ODER-Bäumen, wobei Knoten in gleicher Hierarchiestufe bedeuten, dass alle Knotenmerkmale erforderlich sind. Es müssen also alle Knoten gewählt werden. 30. November 2009 Generischer Aufbau 56 Zusammenfassend lässt sich sagen, dass UND/ODER-Bäume bei der Konfiguration von besonderem Interesse sind (24). Sie eignen sich zur Repräsentation von Konfigurierungsproblemen. In UND-Knoten kann festgehalten werden, welche Arten von Bausteinen zur Realisierung eines Produktes notwendig sind, und in ODER-Knoten, welche Alternativen für die Bausteine zur Verfügung stehen. Die folgende Abbildung veranschaulicht den Einsatz von UND/ODER Knoten in einer Baumdarstellung. In erster Stufe befinden sich zwei UND-Knoten, die beide erforderlich für das Produkt sind. Die dritte Stufe besteht hingegen aus ODER-Knoten, aus denen jeweils eine Auswahl getroffen werden muss. Tor UND ODER Torgliedelement AluRahmen Sandwichfenster Oberflächendesign Stucco Micrograin Abbildung 22) UND/ODER Baum Prinzipiell stellt sich die Frage nach einem wissensbasierten, regelbasierten oder Entscheidungstabellenbasierten System wie sie in 2.2 beschrieben wurden. Um den Einsatzbereich eines Konfigurators zu maximieren, empfiehlt sich daher für einen generischen Konfigurator ein wissensbasiertes System, da hier verschiedene Techniken zur Regelhinterlegung verwendet werden und ein wissensbasiertes System auch bei komplexen Anforderungen geeignet ist. Im Gegensatz dazu bestehen • entscheidungstabellenbasierte Systeme nur aus verknüpften Tabellen, mit denen nur einfache Regeln hinterlegt werden können. • regelbasierte Systeme nur aus Constraints, deren Pflege und Erweiterung bei komplexen Anforderungen sehr aufwändig ist. Die zweite Hauptkomponente des Regeleditors besteht aus Konsistenzprüfungen, die sich mittels Constraints realisieren lassen wie sie in 2.4 beschrieben wurden. Des Weiteren sollte eine Benutzeroberfläche erstellt werden, mit der ohne 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators Programmieraufwand Constraints hinterlegt werden können. Zur technischen Umsetzung eignen sich funktionale Programmiersprachen, die Merkmale wie Pattern Matching30 und Funktionen höherer Ordnung31 bieten. Das KoViP Projekt verwandte zur Umsetzung hierzu die logische Programmiersprache Prolog. Ein Prolog-Programm besteht aus einer Datenbasis, deren Einträge als Fakten und Regeln bezeichnet werden. Der Benutzer kann Anfragen an diese Datenbasis stellen, woraufhin der PrologInterpreter die Fakten und Regeln benutzt, um systematisch eine Antwort zu finden. Näheres zu Prolog incl. Tutorial ist in (25) zu finden. Eine weitere wichtige Eigenschaft des Regeleditors besteht darin, das formulierte Beziehungswissen als XML-Datei zu im- und zu exportieren. Dadurch können technisch versierte Benutzer auch Änderungen direkt in der XML-Datei vornehmen und diese im Anschluss importieren. Dies ist z.B. sinnvoll um Bedingungen zu hinterlegen, dich nicht über die Standard-Benutzerschnittstelle eingegeben werden können. Auch kann die Imund Exportfunktion dahingehend eingesetzt werden, um Beziehungswissen zu verteilen (24) oder - wie in 2.3 erwähnt - die Produktlogik eines Dritten einzubinden. Um Letzteres zu realisieren, muss eine geeignete Oberfläche erstellt werden, mit welcher der zu importierende Inhalt der XML-Datei auf das unternehmensinterne Produktwissen abgebildet wird. Aufbau der Wissensbasis Beim Aufbau der Wissensbasis ist es laut R. Rumage (26) empfehlenswert, zunächst das Produkt genau zu definieren um im Anschluss die Hauptkomponenten zu bestimmen. Die erste Phase besteht somit aus einer physikalischen und funktionellen Analyse und der detaillierten Beschreibung des Produktes. In der zweiten Phase wird das Endprodukt in Hauptkomponenten unterteilt und diese jeweils separat – auch oft von verschiedenen Personen – möglichst vollständig beschrieben. Essentielle Bestandteile der ersten Phasen sind die Produktlogik und die Konsistenzbedingungen (Constraints). Sie bilden den Kern der Wissensbasis, welche sich in eine dreigliedrige Hierarchie, bestehend aus Basiswissen, Benutzerwissen und Produktwissen, einteilen lässt (9). 30 31 Musterabgleich Funktionen, die als Ergebnis wieder eine Funktion zurückliefern. 30. November 2009 57 Generischer Aufbau 58 Auf der untersten Stufe dieser Wissenspyramide befindet sich das Basiswissen. Dieses kann beispielsweise die Arithmetik zum Umrechnen zwischen Einheiten oder länderspezifische Normen wie die verwendete elektrische Spannung liefern. liefern Auf der nächsten Stufe liegt das Produktwissen, welches alle notwendigen Regeln und Konsistenzprüfungen zur Erstellung des jeweiligen Produktes enthält wie z.B. „wenn Torbreite zwischen 3500mm und 4500mm, dann sind die gültigen gültige Türpositionen = 2,3,4“. Die dritte und oberste Stufe besteht aus dem Projektwissen. Es beinhaltet das Projekt-spezifische spezifische Wissen, welches welche nur in diesem Projekt relevant ist. Dies können Sonderfälle oder zusätzliche Konfigurationsmöglichkeiten sein, wie z.B. z.B. das Hinzufügen eines weiteren Oberflächendesigns. Auch kann es verwandt werden um das Wissen einer nur zeitweise verfügbaren verfügbare Sonderedition eines Produktes zu hinterlegen. Wird ein neues Projekt angelegt, wird somit immer auf das gleiche BasisBasis und Produktwissen Prod zurückgegriffen. Projektwissen Produktwissen Basiswissen Abbildung 23) Wissenspyramide Das Produktwissen beinhaltet oft Regeln in der Art, dass „wenn Komponente A ausgewählt wird, muss auch Komponente B ausgewählt werden“. Diese zusätzlich erforderliche Auswahl sollte automatisch durch den Produktkonfigurator übernommen werden, um dadurch die Benutzerinteraktivität zu verbessern. verbessern Nach ach Goetz Botterweck et Al. (27) ist es wichtig,, eine solche automatische a Auswahl bzw. Abwahl dem Benutzer sowohl grafisch (durch entsprechende Symbole und eine farbliche Hervorhebung der betreffenden Komponenten) Komponenten) als auch textuell mitzuteilen, damit dieser den Grund der automatischen Aktion erkennt und somit das Produkt besser versteht. 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators 5.2.2. Objekteditor Der Objekteditor dient als Modellierer für alle benötigten grafische Primitive. Hier wird das Erscheinungsbild der Objekte festgelegt. Im Anschluss an die Modellierung wird jedem Zeichenobjekt ein Einzelteil, welches im Struktureditor erstellt wurde, zugeordnet um eine logische Verbindung zwischen grafischer Darstellung in internem Produktwissen herzustellen. Zur grafischen Modellierung empfiehlt sich der Einsatz eines vektorbasierten Editors, der aus den Benutzereingaben Quellcode (in vorliegender Implementierung Java2D Code) erzeugt. Optional können die Objekte mit Texturen versehen werden. Da dies jedoch eine höhere Rechenzeit benötigt, sollte der Einsatz nur bei ausreichender Rechenleistung in Erwägung gezogen werden. Der Vorteil des Einsatzes von Texturen, wäre eine detailliertere Darstellung des Produktes, was dem Endkunden entgegenkommt. Des Weiteren ist sinnvoll, eine Importmöglichkeit für CAD-Zeichnungen zu schaffen, da diese Zeichnungen in Unternehmen weit verbreitet sind und somit eine erneute Modellierung im Objekteditor hinfällig ist. Die Verwendung einer objektorientierten Programmiersprache eignet sich an dieser Stelle aufgrund auftretender Vererbungshierarchien (10), welche in einer derartigen Sprache leicht umzusetzen sind und sich der Programmieraufwand für untergeordnete Klassen verringert. 5.2.3. GUI Designer Alle benötigten Benutzerschnittstellen werden mit Hilfe des GUI Designers erstellt. Er soll eine Auswahl aus allen gängigen UI Elementen wie Buttons, Tabellen, Textbereichen, Auswahlboxen und Listenfelder bieten, die frei angeordnet werden können. Um eine möglichst große Flexibilität und damit auch eine hohe Generik zu erreichen, sollten alle UI-Elemente, die die verwendete Programmiersprache bietet, zur Auswahl stehen. Nachdem die Auswahl und Platzierung abgeschlossen ist, erfolgt die Zuordnung von UI Elementen zu grafischen Objekten, die zuvor mittels des Objekteditors erstellt wurden. Dies ist notwendig um bei Interaktionen mit den Zeichenobjekten, die Benutzeroberfläche dynamisch anzupassen. 30. November 2009 59 Generischer Aufbau 60 5.2.4. Struktureditor Der Struktureditor dient sowohl zum Anlegen aller Einzelteile eines konfigurierbaren Materials als auch zur Beschreibung all seiner möglichen Ausprägungen ohne eine bestimmte Produktlogik zu enthalten. enthalten Nur der strukturierte und hierarchische Aufbau des Produktes ist hier von Bedeutung. Bedeutung Dies kann elegant mittels verknüpfter Materialtabellen abellen erreicht werden, wie es in wissensbasierten Systemen eingesetzt wird (5). Industrietor Torgliedelement •Torgliedelement •Tür •Sandwichfenster Typ A •Sandwichfenster Typ D •Sandwichfenster Typ E •Alurahmen Sandwichfenster Typ D •Breite: Breite: 400 - 450 mm •Höhe: Höhe: 250mm Abbildung 24) Verknüpfte Materialtabellen Falls Stammdaten in anderen Systemen (z.B. SAP) gepflegt werden, so sollen die Materialien mittels einer Schnittstelle ausgewählt a werden können, ohne sie im Struktureditor neu anlegen zu müssen. müssen Diese Zeitersparnis durch Importieren vorhandener Materialien spiegelt den hohen Stellenwert und einen Vorteil einer vollintegrierten Lösung wider. 5.3. Dateiformat zur Speicherung von Konfigurationen Neben der Speicherung des fertig konfigurierten Produktes als PDF Dokument sollte auch der Export als Grafikdatei möglich sein. Hier eignen sich am besten vektorbasierte Dateiformate um beispielsweise in einer vergrößerten Detailansicht eine Pixelbildung zu vermeiden. Zudem ist es von Nutzen noch weitere Informationen zu dem Objekt in diese Bilddatei zu integrieren. Diese D beiden Anforderungen erfüllt das quelloffene SVG Format32. Es dient der Speicherung S von zweidimensionalen Vektorgrafiken mittels einer XML Datei,, die um weitere Attribute – wie Merkmalname und –wert wert – ergänzt werden kann. Selbst bei einfachen Grafiken kann eine ei SVG-Datei Datei schnell mehrere hundert Zeilen 32 http://www.svg.org 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators aufweisen. Um daher die Dateigröße nicht ausufern zu lassen, bietet sich eine standardmäßige Komprimierung33 an. Die Kompressionsrate bei Textdateien ist im Allgemeinen recht hoch, so dass die Dateigröße bei einer Kompression wesentlich abnimmt. Als Komprimierungsmethode bietet sich das zip-Format an. Es bietet zwar im Vergleich zu anderen Formaten wie rar oder 7zip eine schlechtere Komprimierungsrate aber die größte Kompatibilität und es ist kostenfrei. Alle notwendigen Bibliotheken sind für alle gängigen Programmiersprachen verfügbar, so dass deren Implementierung kein Problem darstellt. Bei SVG ist es außerdem möglich eigene Document Type Definitions34 anzulegen und zu integrieren. Diese bestehen aus einem Satz von Regeln, um Dokumente eines bestimmten Typs zu definieren. Eine Dokumenttypdefinition besteht dabei aus Elementtypen, Attributen von Elementen, Entitäten und Notationen. Dies bedeutet, dass in einer DTD die Reihenfolge, die Verschachtelung der Elemente und die Art des Inhalts von Attributen festgelegt werden. Die Erstellung einer solchen DTD bietet sich im vorliegenden Fall an, um Merkmale mit ihren Werten oder sogar Beziehungswissen zu hinterlegen. Zur Umsetzung hierzu kann beispielsweise das Batik Toolkit35 eingesetzt werden. Dabei handelt sich es um eine frei verfügbare Java Bibliothek, die u.a. aus Java 2D Funktionsaufrufen SVG Dokumente erzeugen kann. , 33 http://www.uni-koeln.de/rrzk/software/archkomp/ http://www.w3.org/TR/SVG11/svgdtd.html 35 http://xmlgraphics.apache.org/batik/ 34 30. November 2009 61 Zusammenfassung und Ausblick 62 6. Zusammenfassung und Ausblick 6.1. Zusammenfassung der Arbeit Die Entwicklung eines zu hundert Prozent generischen grafischen Konfigurators halte ich für weniger sinnvoll, da dies meines Erachtens mit einem erheblichen Aufwand verbunden ist. Schon bei einer geringen Reduzierung der Generik sinkt der Entwicklungsaufwand deutlich. Um dennoch eine größtmögliche Flexibilität zu erreichen, sollten in jeder, der in 5.2 beschriebenen Hauptkomponenten, eine Möglichkeit bestehen, eigenen Quellcode zu hinterlegen. Eine weitere Möglichkeit eine hohe Flexibilität zu erreichen, besteht aus dem Gebrauch von Im- und Export von Konfigurationsdateien wie es in 5.2.1 erläutert wurde. Auf diese Weise kann eine exportierte Datei manuell verändert und diese im Anschluss importiert werden. Dies ermöglicht beispielsweise das Hinterlegen von Funktionen, die nicht über die Standardbenutzeroberfläche umgesetzt werden können aber sehr wohl vom Konfigurationssystem verarbeitet werden können. Im Gegensatz dazu halte ich es wichtig für Unternehmen, dass beim Einsatz eines nicht grafischen Konfigurators dieser eine hundert prozentige Generik anstrebt um die bereits erwähnten Nachteile wie • Abhängigkeit von externen Dienstleitern • Steigerung der Komplexität mit jeder Änderung des Beziehungswissens im Quelltext • Preisgabe des Produktwissens an Dritte zu umgehen. 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators Aufgrund der fehlenden Literatur zu generischen grafischen Konfiguratoren wurden die beiden verbreiterten Bereiche generischer bzw. grafischer Konfigurator zunächst separat betrachtet um dadurch im Anschluss ein Konzept zur Verbindung der beiden Welten zu entwickeln. 6.2. Ausblick auf mögliche Erweiterungen Die ORBIS CS verfügt über eine Benutzeroberflächenmodellierung mit der UIElemente eingefügt und platziert werden können. Somit hätte die eigens erstellte GUI mit dieser modelliert und eingebunden werden können. Constraints wurden in dieser Implementierung mittels Java Klassen realisiert. Anstatt diese selbst zu implementieren, hätte auch die frei erhältliche Java Bibliothek JaCoP36 eingesetzt werden können. Sie bietet neben der Überprüfung eines Modells auf Widerspruchsfreiheit auch die Möglichkeit ein klassisches Suchproblem zu lösen. Liegt die Präferenz auf dem Einsatz keiner Fremdbibliothek, so eignet sich zum Aufbau einer Logik die Programmiersprache Prolog, welche mittels der JPL37 Bibliothek in ein Java Projekt eingebunden werden kann. Soll die Anwendung als Browser Applikation mit Fokus auf einer grafischansprechenden Benutzeroberfläche eingesetzt werden, könnte die Umsetzung mittels des Adobe Flex38 Frameworks erfolgen. Es dient zum Erstellen von Rich Internet Applications39 und besteht aus unterschiedlichen Komponenten wie dem Software Development Kit, dem Flex Builder, dem LiveCycle Data Service und Flex Charting. Adobe zielt darauf ab, mit Flex eine Plattform zu etablieren, die auch Softwareentwickler und nicht nur Designer – wie es wie Adobe Flash der Fall war - anspricht. Bibliotheken wie Degrafa40 für den 2D bzw. Away3d41 für den 3D Bereich bieten eine brauchbare Grundlage zum Erstellen von grafischen Elementen. 36 http://jacop.osolpro.com/ http://www.swi-prolog.org/packages/jpl/java_api/index.html 38 http://www.adobe.com/de/products/flex/ 39 Rich Internet Applications (RIAs) bieten eine funktionsreiche und ansprechende Benutzerschnittstelle mit dem Ziel zu Kundenzufriedenheit und Produktivität zu erhöhen, wobei die gesamte Anwendung in einem Web-Browser lauffähig ist. 40 http://www.degrafa.org/ 41 http://away3d.com/ 37 30. November 2009 63 Anhang 64 7. Anhang 7.1. Ausgewählte Quelltexte Die Überprüfung, ob zu einem Zeichenobjekt alle notwendigen Werte zugeordnet wurden, übernimmt die Methode performVariables(). Wenn erforderliche Werte nicht gesetzt wurden, wird das jeweilige Objekt nicht dargestellt. Eine Besonderheit ist hier das Haupttor selbst – erst wenn alle benötigten Werte dafür gesetzt wurden, können alle übrigen Objekte gezeichnet werden. private void performVariables() { _instance.getDrawingArea().cleer(); if (_objList.get(0).allRequirementsAreSet(this)) { updateDrawing(_objList.get(0).getObjNames().get(0)); for (int i = 1; i < _objList.size(); i++) { LogicContainer lc = this._objList.get(i); if(lc.allRequirementsAreSet(this)) updateDrawing(_objList.get(i).getObjNames().get(0)); } } } Die Methode hasChildWithTypeOf überprüft ob der aktuelle (Teil-)Baum Unterbäume mit Objekten des Typs type hat. Sie ist auch für generische Anwendungen verwendbar, da der gewünschte Typ nur als String übergeben werden muss. public boolean hasChildWithTypeOf(String type) { if (this.hasChildren()) { for (Tree tree : this.getChildren()) { if (tree.getData().getClass().getName().endsWith(type)) return true; } } return false; } 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators Um ein Torgliedelement einzufügen wird der Konstruktor der Klasse MainGateElement aufgerufen, der das gerade erstellte Objekt an die entsprechende Position im Baum eingefügt. Jedes Zeichenobjekt muss somit einen Konstruktor mit entsprechenden Anweisungen zur Platzierung des Objektes im Baum enthalten. public MainGateElement(float xPos, float yPos, float elem_height, String elemType) { addObjectChangeListener(this); setParent(Singleton.getInstance().getTree()); setXPos(xPos); setYPos(yPos); setXSize(getParent().getData().getXSize()); setYSize(elem_height); setElemType(elemType); setSurfaceType(getParent().getData().getSurfaceType()); getParent().addChild(new Tree(getParent(), this)); } Zur Verwaltung von Variablen empfiehlt sich zunächst eine abstrakte Klasse zu erstellen, die als Oberklasse zu allen Variablentypen fungiert und als Feld lediglich den Variablennamen beinhaltet, der mit der Methode setVariable() gesetzt werden kann. Sinnvoll ist es auch eine Methode zum Ermitteln des Typs zu implementieren, da beispielsweise bei arithmetischen Operationen der Variablentyp bekannt sein muss. public abstract class VariableContainer { private String variable; public public public public void setVariable(String var) {this.variable = var;} String getVariable() {return variable;} abstract Object getValue(); abstract Class<?> getType(); } 30. November 2009 65 Anhang 66 7.2. Screenshots Die untenstehende Abbildung zeigt die ORBIS CS mit integriertem grafischen Konfigurator während der Konfiguration eines Industriesektionaltores. Links oben sind die Grunddaten des Tores zu finden, welche erst mit Werten versorgt werden müssen, damit die grafische Konfiguration erfolgen kann. Unterhalb dessen befindet sich die Baumdarstellung alle verwandten Komponenten mit den jeweiligen Preisen. Rechts des Tores sind die Userinterfaceelemente zur Objektauswahl mit ihren Vorschaugrafiken angeordnet. Um ein Element in das Tor einzufügen, muss bei Fenstern zunächst das Zieltorglied gewählt werden. In Anschluss muss in der jeweiligen Combo Box das passende Fenster selektiert werden, woraufhin eine Vorschaugrafik des Fenster anzeigt wird. Durch Drag & Drop der Vorschaugrafik wird das Fenster in das zuvor selektierte Torgliedelement gesetzt. Abbildung 25) Grafische Konfiguration eines Tores Das Einfügen einer Tür verläuft analog zum Einfügen eines Fensters mit dem Unterschied, dass kein Torgliedelement zuvor selektiert werden muss. Nach dem Einfügen nimmt die Tür nur gültige Positionen, die abhängig von der Torbreite sein, ein. Das Verschieben der Tür ist ebenfalls möglich. 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators Während der Konfiguration laufen nach jeder Merkmaländerung, des Tores Konsistenzprüfungen ab. Das Ergebnis dieser wird durch einen farbigen (rot/grün) Status Button visualisiert um dem Benutzer jederzeit über die Gültigkeit seiner Aktionen zu informieren. Die Konfiguration kann hierbei nicht nur grafisch, sondern auch manuell erfolgen, indem Merkmale einzeln bewertet werden. Dazu sind alle Merkmale des Tores aufgeführt, deren Änderung sich unmittelbar auf die Grafik auswirkt. Abbildung 26) Manuelle Konfiguration Wird nun durch die manuelle Konfiguration ein ungültiger Wert für ein Merkmal (z.B. eine Türbreite von 400mm) eingegeben, Abbildung 27) Manuelle Fehlkonfiguration 30. November 2009 67 Anhang 68 so färbt sich die Statusleuchte rot und ein Button mit Fehlerdetails erscheint. Abbildung 28) Visualisierung der Fehlkonfiguration Beim Klicken auf den Button „Fehlerdetails“ öffnet sich ein Fenster mit den genauen Informationen über den Fehler. Abbildung 29) Fehlerdetails einer Konfiguration 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators 8. Abbildungsverzeichnis Abbildung 1) Screenshot des grafischen Konfigurators ............................................... 11 Abbildung 2) Ikea Home Planner ............................................................................... 18 Abbildung 3) Depth-First Suchbaum .......................................................................... 24 Abbildung 4) Produktstruktur und parametrisiertes 3D-Modell ................................... 28 Abbildung 5) Autodesk Projekt Dragonfly .................................................................. 30 Abbildung 6) Vergleich der verwandten Arbeiten mit dem entwickelten Konzept ........ 31 Abbildung 7) Singleton Konstruktor........................................................................... 36 Abbildung 9) Beispiel eines Constraints...................................................................... 37 Abbildung 8) UML Diagramm der Klasse Singleton..................................................... 37 Abbildung 10) Model View Controller Pattern (31) ..................................................... 39 Abbildung 11) Vergleich von Map Implementierungen anhand ihrer Laufzeiten .......... 41 Abbildung 12) UML Klassendiagramm des Packages Constraint.................................. 43 Abbildung 13) Quelltext Beispiel einer require Relation ............................................... 44 Abbildung 14) Quelltext Beispiel einer Junction.NAND Relation .................................. 44 Abbildung 15) Die abstrakte Klasse DrawingObject mit ihren Unterklassen ................. 46 Abbildung 16) beispielhafte Baumdarstellung eines Tores........................................... 46 Abbildung 17) Post-Order Darstellung ....................................................................... 48 Abbildung 18) Pre-Order Darstellung ......................................................................... 48 30. November 2009 69 Abbildungsverzeichnis 70 Abbildung 19) Klassendiagramm des grafischen Konfigurators ................................... 49 Abbildung 20) Sequenzdiagramm einer Variablenänderung ....................................... 52 Abbildung 21) Übersicht generischer grafischer Konfigurator ..................................... 55 Abbildung 22) UND/ODER Baum ............................................................................... 56 Abbildung 23) Wissenspyramide................................................................................ 58 Abbildung 24) Verknüpfte Materialtabellen ............................................................... 60 Abbildung 25) Grafische Konfiguration eines Tores .................................................... 66 Abbildung 26) Manuelle Konfiguration ...................................................................... 67 Abbildung 27) Manuelle Fehlkonfiguration ................................................................ 67 Abbildung 28) Visualisierung der Fehlkonfiguration.................................................... 68 Abbildung 29) Fehlerdetails einer Konfiguration ......................................................... 68 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators 9. Literaturverzeichnis 1. Meier, Andreas V. und Cojocaru, Natalia. Konfigurierbare Materialien. Technische Universität München : s.n., 2004. 2. Brinkop, Dr. Axel. Marktführer Produktkonfiguration. Oberschlettenbach : s.n., 2009. 3. Research Issues in Knowledge-Based Configuration. Jannach, Dietmar, et al. Hershey - New York : Information Science Reference, 2007. Mass Customization Information Systems in Business. S. 221-236. 4. Visualization of Configurations: Simplifying Configuration User Interfaces. Dan Heiderscheidt, Hans Jorgen Skovgaard. 1999. AAAI Technical Report WS-99-05. S. 114-118. 5. Wüpping, Dr.2Ing. Josef. Konfigurationstechnik für die individuelle Serienfertigung. IT Management. 2000, April. 6. Piller, F. Kundenindividuelle Massenproduktion. München/Wien : Hanser Verlag, 1998. 7. Wüpping, Dr.2Ing. Josef. Logistikgerechte Produktstrukturen bei marktorientierter Variantenvielfalt. io Management. 1998, 1/2. 8. Maßberg, W. Beherrschung der Komplexität in der Produktion. wt Werkstattechnik. S. 349-354 : Springer-VDI-Verlag, 1997. 30. November 2009 71 <Literaturverzeichnis 72 9. Abramovici, Michael, et al. KoViP - Konfigurationssoftware und Dienstleistungen für virtuelle Produkte. CAD-CAM-Report. 2006, 09. 10. The mechanisms of construction of generic product configuration with the help of business object and delay differentiation. Izadpanah, S2H, Gzara, L und Tollenaere, M. 3, Cranfield : Royaume-Uni, 2009, Bde. CIRP-Design. 11. Microsoft Corporation. The Windows Interface Guidelines for Software Design: An Application Design Guide. s.l. : Microsoft Press, 1995. 12. VDI2Gesellschaft Entwicklung Konstruktion Vertrieb. Bürokommunikation; Software-Ergonomie in der Bürokommunikation. 1990. 13. Nielsen Norman Group Report. Application Design Showcase: 10 Best App UIs. s.l. : eSellerate, 2008. 14. Dhakar, Lokesh. Lightbox 2. [Online] September 2009. http://www.huddletogether.com/projects/lightbox2/. 15. IDC Central Europe GmbH. Der IT Markt in Deutschland, 2008-2013 – Update 1. Quartal 2009. Frankfurt : IDC Central Europe GmbH, 2009. 16. Landeshauptstadt München. LiMux Projekt. [Online] 2009. http://www.muenchen.de/limux. 17. Schießl, Florian. LiMux und WollMux: Zwei Jahre freie Software in München. München : s.n., 2008. 18. UNILOG Integrata. Client Studie der Landeshauptstadt München, Kurzfassung des Abschlussberichtes. München : s.n., 2003. 19. SAP AG, Integration and Certification Centers. Integration Guide - Technologies. s.l. : SAP Press, 2003. 20. Java World. Does JavaFX have a future at Oracle? [Online] 4. April 2009. http://www.javaworld.com/community/node/2859. 30. November 2009 Konzeption und Implementierung eines generischen Produktkonfigurators 21. Thurstone, L.L. Fundamental Equations - Multiple-Factor Analysis. Chicago : The University of Chicago Press, 1947. 22. Heiob, W. Einsatz dialogorientierter Entscheidungstabellentechnik in der Angebotsund Auftragsbearbeitung in Unternehmen mit auftragsgebundener Produktion. Karlsruhe : Dissertation, TU Karlsruhe, 1982. 23. Die Konfigurations- & Verträglichkeitsmatrix als Beitrag zum Management von Konfigurationswissen in KMU. Puls, Christoph. Karlsruhe : Dissertation an der ETH Zürich, 2002. 24. National Instruments. Generic Configuration Editor (xCE) Reference Example. Example Program. 2009. 25. Fuchs, Norbert E. Prolog Tutorial. Zürich : Institut für Informatik - Universität Zürich, 2003. 26. Rumage, Richard L. Generic Configuration Management - Explained. 2005. 27. Interactive Techniques to Support the Configuration of Complex Feature Models. Goetz, Botterweck, Schneeweiss, Denny und Pleuss, Andreas. Ireland : Lero, University of Limerick, 2009. 28. Günter, Andreas, Kreuz, Ingo und Kühn, Christian. Kommerzielle SoftwareWerkzeuge für die Konfigurierung von technischen Systemen. [Hrsg.] arenDTaP Verlag. Künstliche Intelligenz,. 1999, 3, S. 61-65. 29. Abramovici, Michael, Ghoffrani, Mehdi und Neubach, Manuel. Produktkonfiguratoren für die mittelständische Industrie. CAD-CAM Report. 2005, 4. 30. Abramovici, Michael, et al. A Generic Knowledge Base Pruduct Configuration Software And Servies For Virtual Products. Bochum : Ruhr-Universität Bochum, 2006. 31. Sun Microsystems, Inc. Java BluePrints - Model-View-Controller. [Online] 2002. http://java.sun.com/blueprints/patterns/MVC-detailed.html. 30. November 2009 73