# Monday, October 29, 2007

Nach einer kleinen Einleitung, möchte ich nun einen Überblick geben, wie unsere 3D Ersatzteilkatalog-Lösung interaktive PDFs mit 3D Objekten erzeugt. SPCat3D selbst besteht aus mehreren Komponenten, die wiederum mit externen Programmen zusammenarbeiten:

SPCat3D - Ablauf

Auf der linken, oberen Seite sehen wir unsere klassische Katalog-Software SPCat. Dieser Ersatzteilkatalog bietet uns sehr viele Möglichkeiten hierarchische Teilelisten zu importieren und zu bearbeiten. Wir verwenden diese erprobte Technologie als Stücklisten-Datenbasis weiter.

SPCat3D PDF Creator greift bei der PDF Produktion auf die SPCat Datenbank zu. Die Schnittstelle ist aber so ausgelegt, dass auch andere Datenquellen möglich sind. Unser eigener SPCat ist nur die nächstliegende und einfachste Anbindung. Andere Katalog-Systeme oder direkter Zugriff auf ERP Daten (SAP) sind auch denkbar.

Parallel müssen die 3D-CAD Daten aufbereitet werden. Wir verwenden dazu von Right Hemisphere die Deep Exploration CAD Edition. Mit diesem Tool können wir alle relevanten CAD Formate öffnen und bearbeiten. Unter anderem können wir damit die CAD Daten reduzieren und mit einer animierten Explosionsdarstellung versehen.

Der nächste Schritt ist die Zuordnung der Stückliste zu den CAD Grafiken und den einzelnen Objekten innerhalb einer Grafik. Dabei hilft es, dass Deep Exploration die Metadaten aus den meisten CAD Formaten übernehmen kann. Die genaue Vorgehensweise in dieser Stelle hängt sehr stark von den Ausgangsdaten ab.

Deep Exploration enthält ein PDF Publishing Module das es ermöglicht 3D Illustrationen in eine PDF Vorlage (Template) einzufügen. Von Right Hemisphere gibt es bereits einige fertige Templates die interaktive PDFs ermöglichen. Wir benötigen aber eine sehr viel weitergehende Funktionalität. Deswegen arbeiten wir mit unseren eigenen SPCat Templates.

Die Ausgabe des PDF Publishing Modules sind PDF Dateien mit eingebetteten 3D Objekten in unserem Template. Aber noch ohne die Möglichkeit zur Interaktion, denn dafür wir benötigen wir die Informationen aus der Stückliste.

Das ist dann die eigentlich Aufgabe unseres SPCat3D PDF Creators. Dieses Tool führt alle Informationen und Dateien zusammen. In die vorher erzeugten, statischen PDF Dateien wird die Stücklisten Information eingebettet. Es werden zusätzliche PDF Dateien erzeugt, die den Zusammenhang der einzelnen Baugruppen darstellen und die entsprechenden PDF Dateien miteinander verknüpfen.

Im Ergebnis erhält man ein Verzeichnis mit PDF Dateien, die die komplette Stückliste wiedergeben und die einzelnen 3D Illustrationen hierarchisch korrekt miteinander verbinden. Zusätzlich gibt es einen PDF Datei die einem Bestellformular entspricht und wie ein Warenkorb interaktiv aus den anderen PDF Dateien heraus gefüllt werden kann.

PDF | SPCat | TD
Monday, October 29, 2007 11:59:07 AM (W. Europe Standard Time, UTC+01:00)  #
  Disclaimer  |  Comments [0]  | 
# Thursday, October 25, 2007

Wir bieten seit langem einen elektronischen Ersatzteilkatalog an, unseren Spare Part Catalog SPCat. Diese Software kommt sehr gut mit Stücklisten und 2D Zeichnungen klar. Bei 3D CAD Daten hatten wir bisher keine Lösung. Genau diese Funktionalität wird aber immer häufiger nachgefragt.

Die Visualisierung dreidimensionaler CAD Objekte ist aber ein Problem, das eine kleine Entwicklergruppe nicht mal eben lösen kann. Man muss zum einen die Dateien aus verschiedensten CAD Programmen verarbeiten können. Zum anderen braucht es einen Viewer, der die erstellten 3D Illustrationen darstellen kann sich gut in die restliche Ersatzteilkatalog-Software integrieren lässt.

Alle mir bekannten Anbieter von elektronischen Ersatzteilkatalogen haben sich entschlossen, dieses Know-How einzukaufen. Die meisten verwenden die Produkte von Lattice3D und binden deren freien XVL Player in Ihre Kataloge ein.

Es gibt auch eine interne SPCat Demo Version mit XVL Player die ganz gut funktioniert. Aber irgendwie fand ich es langweilig, wenn am Ende alle Kataloge den gleichen 3D Viewer verwenden und habe weiter gesucht. Dabei bin ich auf die Firma Right Hemisphere gestoßen. Auch von diesem Anbieter gibt es einen Betrachter (Deep View) der sich in eigene Anwendungen einbinden lässt. Deren Produkte können über 80 CAD Formate importieren und alle von uns getesteten Dateien wurden problemlos eingelesen.

Besonders spannend wurde es aber, als ich die Zusammenarbeit von Adobe und Right Hemisphere verstanden hatte: Right Hemisphere ist der Anbieter, der die Ausschreibung von Adobe gewonnen hatte, das PDF Format um einen 3D Viewer zu erweitern. Entsprechend gut ist in deren Produkten die Erzeugung von PDF Dateien mit eingebetteten 3D Objekten realisiert.

Bisher hatten wir in Richtung einer Software mit integrierten Viewer gedacht, jetzt gibt es eine weitere Möglichkeit: Die 3D Illustrationen werden in PDF Dateien eingebetteten und die Verknüpfung zur Stückliste und die Interaktion mit dem Anwender erfolgt komplett innerhalb das Acrobat Readers. Das bedeutet die Auslieferung des fertigen Katalogs vereinfacht sich enorm. Man muss lediglich einige PDF Dateien verteilen. Der Endanwender benötigt lediglich einen installierten Acrobat Reader 8.1. Die weite Verbreitung des Readers führt dazu, dass in aller Regel gar keine Vorbereitungen oder Installationen beim Endanwender nötig sind. Er öffnet nur eine PDF Datei.

Aktuell gibt es den Acrobat Reader in der Version 8.1 für folgende Betriebssysteme: Windows, Mac, Linux und Solaris. Das heißt ein SPCat 3D PDF-Ersatzteilkatalog funktioniert plattformübergreifend.

Zum Beispiel ein Pumpstand, dargestellt mit Linux Ubuntu 6.1 und dem Acrobat Reader 8.1.1 für Linux:

SPCat3D Ubuntu 6.1 Adobe Reader 8.1.1

Der Testrechner ist nach heutigen Maßstäben wirklich langsam mit seinem Athlon 900. Ich habe eine nackte Ubuntu Installation verwendet, lediglich den Acrobat Reader 8.1.1 habe ich installiert. Es war von Seiten der Grafikkarte keinerlei 3D Unterstützung vorhanden. Trotzdem wurde das PDF mit dem 3D Objekt problemlos dargestellt und alle Interaktionen haben funktioniert. Lediglich bei Veränderung der 3D Ansicht kam das System ins Stocken und fiel auf eine Drahtgitter-Darstellung zurück.

Bei der eigentlichen Darstellung von 3D Illustrationen hat uns Adobe eine Menge Arbeit abgenommen. Wir können uns also ganz auf die Interaktivität und die Integration mit den Stücklisten und Ersatzteilinformationen konzentrieren.

Weiter geht es mit einem kleinen Überblick.

PDF | SPCat | TD
Thursday, October 25, 2007 3:34:21 PM (W. Europe Daylight Time, UTC+02:00)  #
  Disclaimer  |  Comments [0]  | 
# Friday, October 19, 2007

tekom Jahrestagung 2007Im Rahmen der tekom-Jahrestagung 2007 vom 07. bis 09. November findet eine Messe mit Ausstellern aus dem Bereich der Technischen Dokumentation statt. Da darf die CPTec GmbH natürlich nicht fehlen. Dr. Kurt Schopper und ich werden den Stand bewachen und versuchen jeden Besucher für unsere Konzepte zu interessieren.

Ich denke wir werden unsere Kompetenz in der Technischen Dokumentation und bei elektronischen Ersatzteilkatalogen überzeugend darstellen können. Ein paar Informationen gibt es bereits auf unserer Webseite. Weitere Details, insbesondere zu unseren 3D Ambitionen, folgen hier in Kürze.

Blah | SPCat | TD
Friday, October 19, 2007 1:44:12 PM (W. Europe Daylight Time, UTC+02:00)  #
  Disclaimer  |  Comments [0]  | 
# Wednesday, December 06, 2006

Irgendwie wird in diesem Monat von jeder Software, mit der ich zu tun habe, eine neue Version veröffentlicht. Jetzt ist Adobe dran. Die Version 8 vom Acrobat Reader steht zum Download bereit.

Und immer das gleiche Spiel: Im SPCat werden PDFs über den Internet Explorer in Acrobat dargestellt. Geht das jetzt auch noch? Hurra! Es geht. Bis jetzt konnte ich keine Probleme feststellen.

Dafür sieht der neue Reader hübscher aus:

 

Aber Vorsicht beim Download! Ich konnte auf der Adobe Seite keinen Link mehr finden, der nicht vorher diesen unnötigen Download Manager benötigt. Damit kriegt man zwar am Ende auch eine 22MB Installations-Datei, aber auch ein paar nervige Dialoge mehr.

Dieser Download Manager ist dann auch noch mit Sicherheitslücken versehen. Ich weiß nicht, ob das jetzt auch noch den Manager auf den aktuellen Seiten betrifft, aber trotzdem ärgerlich. Mehr auf Heise: Loch in Adobes Download Manager ermöglicht Virenbefall

Jetzt kommen sicher bald alle Analysen, ob die Version jetzt schneller/langsamer startet, als die Version XY :)

Wednesday, December 06, 2006 10:41:21 AM (W. Europe Standard Time, UTC+01:00)  #
  Disclaimer  |  Comments [0]  | 
# Tuesday, December 05, 2006

Es gibt auf unserer SPCat Webseite die Demo CD für die neueste Version unseres elektronischen Ersatzteilkatalogs zum Download.

Wie ich bereits geschrieben hatte, gab es Probleme mit dem SVG Viewer von Adobe. Wir hatten diesen Viewer für den stufenlosen Zoom im Katalog verwendet. Die nicht gezoomte Grafik wurde bereits mit GDI+ dargestellt. Mit dieser Version kommt der konsequente Schritt, auch den Zoom über GDI+ zu realisieren.

Für Bitmap Grafiken funktioniert die neue Technik besser, als der Umweg über den SVG Viewer. Die Benutzerführung ist konsistenter. Es entsteht kein Bruch in der Bedienung wenn gezoomt wird. Der Adobe SVG Viewer ließ sich nur bedingt modifizieren. Somit war dessen Maus- und Tastaturbelegung festgeschrieben und für unsere Zwecke ungewohnt.

Natürlich verlieren wir damit unmittelbar die Möglichkeit SVG Grafiken darzustellen. SVG und andere Vektor-Formate werden wieder ihren Weg in unsere Kataloge finden. Nur sicher nicht mehr mit Adobe :).

Ansonsten haben wir einige Verbesserungen im Detail. So funktioniert dieser Katalog insgesamt besser mit Vista, Internet Explorer 7 und Office 2007.

Tuesday, December 05, 2006 11:14:39 AM (W. Europe Standard Time, UTC+01:00)  #
  Disclaimer  |  Comments [0]  | 
# Tuesday, November 28, 2006

Um die Zusammenhänge in meinem vorherigen Eintrag verständlicher zu machen, hilft vielleicht ein kleines Diagramm:

So wird vielleicht klarer, wie die verschiedenen Komponenten zusammenarbeiten.

Tuesday, November 28, 2006 10:33:00 AM (W. Europe Standard Time, UTC+01:00)  #
  Disclaimer  |  Comments [0]  | 
# Monday, November 27, 2006

Unseren elektronischen Ersatzteilkatalog gibt es als Visual FoxPro Desktop Applikation (SPCat) und einer dazugehörigen Web Applikation (SQLCat). Die Daten von SPCat können in den SQLCat importiert und dort angezeigt werden. Es werden also grundsätzlich die gleichen Daten und Bilder in beiden Applikationen dargestellt. Als vor einiger Zeit der Wunsch nach einem stufenlosen Zoom der Übersichtszeichnungen aufkam, war das SVG Format eine sehr attraktive Option. Insbesondere, da der Adobe SVG Viewer (ASV) auch Bitmap Grafiken sehr schön darstellen konnte.

Unsere Desktop Applikation hatte bereits den Internet Explorer eingebunden. Darin wiederum kann der SVG Viewer als Plugin laufen. Das gleiche Plugin verwendet auch unsere Web Applikation. Dadurch konnten wir die SVG Programmierung in beiden Applikationen sehr ähnlich gestalten.

In SPCat wird für eine zoombare Bitmap Grafik zur Laufzeit eine SVG Datei erzeugt. In dieser Datei steckt als Objekt das eigentlich Bild und zusätzlicher Markup für den Birds Eye View und Javascript für die Interaktivität. Zusätzlich wird eine Html Datei erzeugt, die wiederum die SVG Datei einbindet und per Javascript die variablen, zusätzlichen Elemente in das DOM der SVG Grafik einbaut. Zur Darstellung navigiert der eingebunden IE auf diese Html Datei.

Zusätzlich kann eine Benutzeraktion in anderen Teilen von SPCat eine Veränderung in der dargestellten SVG Grafik bewirken. Über den DOM des IE ist der kann dort eine Javascript Funktion gestartet werden. Die wiederum auf den DOM der SVG Grafik einwirkt und dort die Darstellung ändert.

Also so haben wir einen Adobe SVG Viewer, der dem Internet Explorer gehorcht, der wiederum dem SPCat unterstellt ist. Mit COM Aufrufen, Javascript von IE, Javascript von Adobe und zugehörigen DOMs werden stufenlose Bitmaps auf den Bildschirm gebracht und gesteuert.

Juhu! Das Ganze hat sogar funktioniert!

Mittlerweile hat Adobe offiziell die Entwicklung und Unterstützung für den Adobe SVG Viewer eingestellt. Microsoft hat vor kurzem den Internet Explorer 7 veröffentlicht. Und siehe da! Die ganze Konstruktion funktioniert nicht mehr. Aus den Tiefen des Systems kommt bei der zweiten darzustellenden Grafik einer der erschütternden C0000005 Fehler. Irgendein Pointer zeigt ins Leere. Nix geht mehr.

Auch längeres Suchen nach einer Lösung hat nichts gebracht. Die Zusammenarbeit wurde wohl eingestellt.

Für den SPCat haben wir uns aber schon etwas Neues überlegt. Dazu in Kürze mehr!

Monday, November 27, 2006 8:22:26 PM (W. Europe Standard Time, UTC+01:00)  #
  Disclaimer  |  Comments [0]  | 
# Thursday, November 23, 2006

Wir erzeugen die Druckausgabe in unserem elektronischen Ersatzteilkatalog SPCat mit Hilfe von Word. Dabei wird über COM-Automatisierung vom Katalog Word ferngesteuert. Bilder und Stücklisten werden druckfertig eingebaut.

Angefangen von Word 97 (Version 8) bis zu Word 2003 hat diese Ausgabe immer geklappt. Ein paar Routinen sind zwar versionspezifisch, aber das meiste funktioniert unabhängig von der Word Version.

Natürlich muss der Katalog auch mit Word 2007 funktionieren. Und was ist? Es funktioniert einfach!

Ohne irgendeine Code-Änderung wird das Word Dokument automatisch erzeugt. Sehr schön und nicht selbstverständlich. Tolle Leistung von Microsoft.

Word scheint aber zu erkennen, dass irgenetwas anders ist. Es schaltet in einen "Compatibility Mode". Vielleicht liegt das an der Formatvorlage?

Thursday, November 23, 2006 4:38:39 PM (W. Europe Standard Time, UTC+01:00)  #
  Disclaimer  |  Comments [0]  | 
# Wednesday, November 22, 2006

Weitere Fortschritte mit Vista...

Unseren Ersatzteilkatalog kann man auf CD brennen. Auf dieser CD ist ein kleines Einstiegsprogramm intro.exe. Dabei kann man auswählen, ob man den Katalog von CD starten oder ihn lieber auf die lokale Platte installieren möchte. Das intro.exe führt dann den Setup durch.

Wenn man das Programm zum erstenmal startet, frägt Vista, ob man diesem bösen Programm vertraut. Natürlich vertraue ich meiner eigenen Software! Danach gehen aber diese beiden Funktionen immer noch nicht. Die stehen erst zu Verfügung, wenn ich intro.exe als Administrator starte:

Dann klappt auch die komplette Installation. Gestolpert bin ich aber darüber, dass beim nächsten Start diesem Programm vertraut wird, es aber nicht mehr als Administrator läuft. Der Setup startet zwar, scheitert aber unmittelbar. Also intro.exe immer als Administrator starten!

Klar ist mein Account lokaler Administrator, aber Dank UAC werde ich vor mir selbst beschützt.

UAC = User Account Control : Understanding and Configuring User Account Control in Windows Vista

Wednesday, November 22, 2006 10:52:54 AM (W. Europe Standard Time, UTC+01:00)  #
  Disclaimer  |  Comments [0]  | 
# Tuesday, November 21, 2006

Hurra! Auch wenn das noch kein kompletter Test ist. SPCat funktioniert unter Windows Vista RTM!

Ich habe natürlich gleichmal die x64 Variante installiert. Damit das Ganze anspruchsvoller wird.

So grundsätzlich funktioniert mal der Ersatzteilkatalog. Das Setup meldet noch einen Fehler bei der Installation. Sicher wird auch an anderen Stellen noch die eine oder andere Tücke lauern.

Spannend wird die Print-Ausgabe über Office 2007. Ob "CreateWord" diese Hürde nehmen kann?

Tuesday, November 21, 2006 6:44:53 PM (W. Europe Standard Time, UTC+01:00)  #
  Disclaimer  |  Comments [0]  | 
# Thursday, March 09, 2006
Eine ganz aktuelle Demo Version unserer elektronischen Ersatzteilkatalog Software SPCat ist erschienen. Es gibt viele Verbesserungen im Detail, aber der Umstieg auf Visual Foxpro 9 hat die deutlichste Veränderung ermöglicht.
Zur Darstellung von Graphiken mit Links wurde bisher eine selbstentwickelte Visual Basic 6 Komponente verwendet. Das hat sehr gut funktioniert, brachte aber ein paar Einschränkungen mit sich. Unter anderem konnten keine PNG Graphiken dargestellt werden und bei der Installation musste die VB6 Laufzeitumgebung eingerichtet und unser ActiveX-Control (OCX) registriert werden.
Jetzt zeichnen wir die Graphiken direkt mit VFP9 und GDI+. Damit ist unser Katalog nicht mehr auf Visual Basic angewiesen. Das verbessert die Lauffähigkeit von CD und vereinfacht die Installation. Auch PNG Graphiken können wir jetzt direkt darstellen.

Die Demo ist als selbststartende CD ausgelegt. Dazu gibt es ein ISO-Image oder den Inhalt der CD als Zip Archiv. Die schnellste Möglichkeit, den Katalog zu testen ist das Zip Archiv zu entpacken und im "cd" Verzeichnis das "intro.exe" zu starten. In dem dann erscheinenden Dialog einfach "Katalog von CD aus starten" wählen.



Wer sich mehr für die technischen Details interessiert, den verweise ich auf einen früheren Blogeintrag dazu: VFP 9: GDI+ und normale Foxpro Controls auf einer Form

Thursday, March 09, 2006 12:15:26 PM (W. Europe Standard Time, UTC+01:00)  #
  Disclaimer  |  Comments [0]  | 
# Wednesday, March 01, 2006
Ich möchte nicht auf die genauen Hintergründe des Patent-Streits zwischen Eolas und Microsoft eingehen. Das kann man in dem Artikel Patch für Internet Explorer wegen Eolas-Patent auf Golem und an anderen Stellen nachlesen.
Im Wesentlichen verletzt man das Eolas Patent, wenn interaktive Objekte in einer Webseite dargestellt werden. Microsoft versucht nun mit dem Patch KB912945  den IE so zu verändern, dass diese Objekte nicht interaktiv starten, sondern aktiviert werden müssen. In den meisten Fällen bedeutet aktivieren für den Anwender hier "hineinklicken".

Wir von CPTec haben mit SQLCat eine Internet Anwendung entwickelt, um Elektronische Ersatzteilkataloge im Browser darstellen zu können. Die hierarchische Struktur der Ersatzteile wird mit einem Java Applet visualisiert. Dieses Java Applet stellt die Struktur in einem Treeview dar.  Die Inhalte werden beim Navigieren dynamisch vom Server geladen. Das funktioniert sehr gut und schnell.
Nach der Installation des neuen Patches von Microsoft funktioniert dieses Treeview immer noch. Unter anderem navigiert das Treeview mit, wenn man einen Treffer einer Suchabfrage auswählt. Es reagiert lediglich auf Benutzereingaben, wie z.B: Mausbewegungen nicht:



Erst nach einem Click in das Control wird dieses aktiv und zeigt unter anderem im Statusbar das Ersatzteil unter dem Mauszeiger an:



Unser Treeview ist von dieser Änderung betroffen, weil es über ein "APPLET" Befehl in die HTML Seite eingebunden ist. Der Internet Explorer könnte das Eolas Patent verletzen, wenn er dieses interaktive Objekt direkt in die Seite einbindet. Also wird es nicht interaktiv eingebunden, sondern einfach deaktiviert. Die erste Benutzereingabe erweckt dann das Objekt aus seine Dornröschenschlaf und alles ist gut.

Jetzt gibt es aber noch eine andere Möglichkeit, dieses Patent zu umgehen. Microsoft dokumentiert das in Activating ActiveX Controls. Es werden einige Wege beschrieben. Aber es läuft darauf hinaus, durch Javascript die Objekte nachträglich in die Seite einzubauen. Der Benutzer sollte davon nichts merken, aber das Patent von Eolas deckt diesen Fall wohl nicht ab. Alles funktioniert wie früher, jeder Webentwickler durfte etwas Zeit investieren, Microsoft hat viele Anwälte und Entwickler beschäftigt und Eolas geht hoffentlich leer aus.

Ich wundere mich immer wieder, wieso derart allgemein gehaltene Patente erteilt werden und deren Gültigkeit vor Gericht bestätigt wird. Die Einen basteln einen realen C++ Code, der bunte, interaktive Seiten aus kleinen statischen Textdateien macht und die Anderen lassen sich ein abstraktes, allgemeines Prinzip schützen. Deswegen bereitet es mir eine diebische Freude, zu sehen, wie geschickt sich Microsoft hier aus dieser kniffeligen Patent-Falle befreit hat.

Jetzt geht es wieder zurück an den HTML Code und brav den MS Workaround einbauen...

Wednesday, March 01, 2006 2:26:41 PM (W. Europe Standard Time, UTC+01:00)  #
  Disclaimer  |  Comments [0]  | 
# Wednesday, November 16, 2005

Ich habe bereits in Ersatzteilkatalog - Bildnavigation mit GDI+ erzählt, dass ich versuche in Visual Foxpro 9 mit GDI+ direkt auf VFP Formen zu zeichnen. Inzwischen funktioniert das eigentlich ganz gut. Einige Probleme waren noch zu lösen und den Bildaufbau habe ich noch optimiert.

In Craig Boyd's Artikelserie in FoxTalk 2.0 wird eine komplette Form mit GDI+ bearbeitet. In unserer SPCat Applikation ist aber nur ein Bereich der Form für die Darstellung der Bilder genutzt. Der restliche Bereich der Form soll weiterhin von Foxpro selbst gezeichnet werden. Deswegen wollte ich die ganze Bilddarstellung in eine Container Klasse verpacken und die eigentliche Form so wenig wie möglich verändern.

Die eigentlichen GDI+ Zeichenroutinen stelle ich nicht vor. Es geht mir jetzt mehr darum wie ich diese Routinen mit den Mechanismen von VFP verheiratet habe, damit Foxpro und GDI+ Elemente auf einer Form dargestellt werden. Foxpro weiß ja nichts davon, dass man ihm mit eigenen Routinen in die Bildschirmdarstellung pfuscht. Deswegen wird es bei jedem Update des Bildschirminhalts einfach seine eigenen Elemente zeichnen. Mit BINDEVENT hat man die Möglichkeit in die Nachrichten von Windows an das Foxpro Fenster zum Neuzeichnen des Inhalts einzugreifen. Hiermit werden die relevanten Events auf die eigene Prozedur WinEventHandler umgeleitet:

#DEFINE WM_ERASEBKGND 0x0014
#DEFINE WM_PAINT 0x000F

=BINDEVENT(THISFORM.hwnd, WM_ERASEBKGND, THIS, 'WinEventHandler')
=BINDEVENT(THISFORM.hwnd, WM_PAINT, THIS, "WinEventHandler")

Wir brauchen auch noch zwei Aufrufe in die Windows API:

DECLARE LONG CallWindowProc IN User32 ; INTEGER lpPrevWndFunc, LONG HWND, ; INTEGER Msg ,INTEGER wParam, ; INTEGER lParam
DECLARE INTEGER GetUpdateRect IN User32 LONG HWND, STRING @lpRect, INTEGER bErase

CallWindowProc ruft die Routine auf, die normalerweise den WM_PAINT Event behandelt. Also in diesem Fall die interne Foxpro Funktion, die dessen Elemente zeichnet.
GetUpdateRect liefert das Rechteck innerhalb dessen etwas zu zeichnen ist. Damit kann man den Einsatz der eigenen Zeichenroutinen auf die benötigten Fälle reduzieren. Dieses Rechteck ist als folgendes Struct definiert:

typedef struct _RECT { 
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT, *PRECT;

In der WinEventHandler Prozedur werden die Windows Nachrichten bearbeitet:

PROCEDURE WinEventHandler
LPARAMETERS HWND, msg, wParam, LPARAM

#DEFINE WM_ERASEBKGND 0x0014
#DEFINE WM_PAINT 0x000F

DO CASE
    CASE msg = WM_PAINT
        WITH THIS
            IF .autodraw
                LOCAL lpRect,lnUpdate
                lpRect=SPACE(16)
                * Das Rechteck holen, in dem gezeichnet werden muss.
                lnUpdate=GetUpdateRect(HWND, @lpRect, 0)
                * Dieser Aufruf führt dazu, dass VFP alles zeichnt, wofür es zuständig ist.
                CallWindowProc(.WinProcAddress, HWND, msg, wParam, lParam)
                IF lnUpdate=1
                    * In hitdetection() wird geprüft, ob dieses Control im zu zeichnenden Rechteck liegt.
                    IF .hitdetection(lpRect)
                        .drawdb()
                    ENDIF
                ENDIF
            ELSE
                * Hier ist nur VFP für das Zeichnen verantwortlich.
                CallWindowProc(.WinProcAddress, HWND, msg, wParam, lParam)
            ENDIF
        ENDWITH
    CASE msg = WM_ERASEBKGND
        RETURN 1
ENDCASE

Die Nachricht zum Löschen des Hintergrunds WM_ERASEBKGND wird komplett ignoriert. Mit WM_PAINT treffen alle relevanten Zeichnungsanforderungen ein. Mit der autodraw Eigenschaft kann ich die eigenen GDI+ Routinen an- und ausschalten. Das ist notwendig, da das Control auch unsichtbar sein kann. Dann dürfen natürlich meine GDI+ Routinen nicht auf der Form zeichnen. Bei der Behandlung des WM_PAINT Events darf zuerst Foxpro seine Aufgabe erledigen. Danach teste ich, ob der Container im zu zeichnenden Bereich liegt und starte entsprechende meine Zeichenroutine. Diese Reihenfolge ist wichtig, damit am Ende auch meine Ausgabe zu sehen ist. Sonst würde ja Foxpro den tatsächlichen Container darüber malen.

Damit kann ich jetzt grundsätzlich auf die Fläche des Containers zeichnen und zusätzlich auf der Form weitere Foxpro Elemente anzeigen. Ich möchte aber den Container und damit die GDI+ Zeichnung unsichtbar machen können. Genau genommen möchte ich an der Stelle des Containers auch andere Objekte anzeigen können. Das läuft aber auch auf einen unsichtbaren Container hinaus.
Natürlich kann ich nicht einfach die Visible Eigenschaft auf .F. stellen. Dann würde zwar Foxpro den leeren Container nicht mehr zeichnen, aber meine Routinen würden munter weiter zeichnen. Über visible_assign werden bei Änderungen der Sichtbarkeit auch meine Zeichenroutinen mit umgestellt.

Es hat sich aber gezeigt, dass VFP seltsamerweise Teile des Containers zeichnet wenn Visible auf .T. gesetzt, obwohl der Container bereits sichtbar ist. Das führt leider zu einem Flackern. Da ich ja selbst erst nach Foxpro zeichne und damit darunterliegende Objekte kurz aufblitzen. Also wird dieser Fall auch in visible_assign abgefangen:

PROCEDURE visible_assign
LPARAMETERS vNewVal
WITH THIS
    IF m.vNewVal
        IF .Visible
            * Wenn das Control schon sichtbar ist, nicht nochmal auf sichtbar schalten.
            * Andernfalls würde VFP das Control zeichnen und es flackert.
            .clearborder()
        ELSE
            * Die eigene GDI+ Zeichenroutine anschalten.
            .redraw()
            .Visible=.T.
        ENDIF
    ELSE
        * Die eigene GDI+ Zeichenroutine abschalten.
        .autodraw=.F.
        .Visible=.F.
    ENDIF
ENDWITH

Es kann sein, dass das Bild, das mit GDI+ gezeichnet wird, kleiner als der Container ist. In WM_PAINT Routine wird aus Performance Gründen nur dieser Teil gezeichnet. Damit das Rest des Containers in der Hintergrundfarbe erscheint, lösche ich diesen Bereich von Hand mit clearborder(). Da bei einem Wechsel des Bildes auch die Visible Eigenschaft auf .T. gesetzt wird, ist das die einzige Stelle, wo dieser Rand manuell gelöscht werden muß.

Insgesamt bin ich mit dem Ergebnis jetzt sehr zufrieden. Leider feuert aus mir unbekannten Gründen unregelmässig ein WM_PAINT Event, der offensichtlich grundlos die ganze Form neu zeichnen lässt. Das führt zu einem Flackern. Insbesondere auf langsameren Rechner kann das stören. Trotzdem bin ich beeindruckt, was mit VFP 9, GDI+ und ein paar Tricks möglich ist.

Wednesday, November 16, 2005 8:55:56 PM (W. Europe Standard Time, UTC+01:00)  #
  Disclaimer  |  Comments [0]  | 
# Tuesday, October 18, 2005

In unserem Ersatzteilkatalog SPCat ist die Navigation in der Hierarchie der Ersatzteile sehr wichtig. Unter anderem besteht die Möglichkeit über graphische Links in einer Baugruppenzeichnung zu entsprechenden Unterteilen zu  springen. Diese Links in der Zeichnung werden zur Laufzeit in die Graphik gezeichnet.

Der aktuelle SPCat 6.5 ist mit Visual Foxpro 8 programmiert. Bis zu dieser Version ist Visual Foxpro  sehr limitiert in den Möglichkeiten zur Modifikation und Darstellung von Graphiken. Deswegen wurde die Darstellung der verlinkten Zeichnungen über eine ActiveX Komponente realisiert. Diese Komponente ist in Visual Basic 6 programmiert.

Mit Visual Foxpro 9 ist der Zugriff auf GDI+, der Windows Graphik Schnittstelle, sinnvoll möglich. Damit können modernere Bildformate geladen werden, unter anderem auch PNG Bilder. Alle grundlegenden graphischen Funktionen stehen zur Verfügung. Es ist aber nicht einfach möglich das Ergebnis dieser Manipulationen zusammen mit anderen Visual Foxpro Bildschirmelement darzustellen. Zu grundlegend anders ist die Art, wie Visual Foxpro seine Ausgabe erzeugt.

Craig Boyd hat einen sehr hilfreichen Artikel "GDI+ on VFP 9 Forms: Solving the Paint Problem" in FoxTalk 2.0 veröffentlicht. Die Lösung besteht im Wesentlichen darin, die Windows Ereignisse abzufangen und mit GDI+ das erzeugte Bild innerhalb von Visual Foxpro selbst zu zeichnen. Der Nachteil ist, daß in häufig aufgerufenen Ereignissen die eigene Logik zusätzlich mitläuft. Deswegen wird der zu zeichnenende Ausschnitt des Bildes mit allen Links zwischengespeichert und nur dieses Ergebnis gezeichnet (double buffer). Lediglich sich ändernde Teile, wie der Hovereffekt und Tooltips werden neu erzeugt.
Der Vorteil liegt darin, daß man die volle Kontrolle über die Ausgabe hat und Effekte möglich sind, die bisher weder Visual Foxpro noch reines Visual Basic 6 konnte.

Das Ergebnis sieht besser als die bisherige Lösung aus und eine weitere externe Abhängigkeit ist aus unserem elektronischen Ersatzteilkatalog verbannt. Ich bin jedesmal froh, wenn ich VB 6 Ballast abwerfen kann.

Tuesday, October 18, 2005 1:40:36 PM (W. Europe Daylight Time, UTC+02:00)  #
  Disclaimer  |  Comments [0]  |