Erstellen eines Plugins fuer A:M V9 und höher

Als erstes solltet Ihr Euch das Beispielprojekt  hier herunterladen .
Nach dem starten von Visual C++, erstellen wir ein neues Projekt ueber Datei->Neu. Das Arbeitsfenster sollte dann wie folgt aussehen
Bild2
Hier waehlen wir den MFC-Anwendungs-Assistent, geben unserem Projekt einen Namen (sample) , und waehlen auch noch unser Arbeitsverzeichniss aus . Beim Auswaehlen des Arbeitsverzeichnisses, indem das Projekt dann angelegt wird , ist es sinnvoll
dies unter AM90SDK\PLUGIN\HXT anlegen zu lassen , das Verzeichniss in dem das Projekt dann liegt, wird automatisch erstellt.
Im Beispiel waere es dann AM90SDK\PLUGIN\HXT\sample .

Nach dem Betaetigen von OK geht's weiter mit dem Anwendungsassistent, hier wir brauchen nichts zu aendern und so koennen wir gleich auf Fertigstellen klicken .
Bild2

Nachdem wir wieder im Hauptfenster sind , muessen noch einige Einstellungen getaetigt werden , um den Pfad zu den Inludes und
Libaries des AM-SDK's unserer Applikation bekanntzumachen . Dies geschieht ueber Projekt->Einstellungen .

Als erstes waehlen wir die Seite C/C++ an , dort Praeprozessor sowie alle Konfigurationen und tragen bei Zusaetzliche Include-Verzeichnisse den Pfad zu den Inlude Dateien des AMSDK's ein . Am einfachsten per relativer Pfadadressierung, im Beispiel ..\..\..\include .
Bild3

So jetzt muessen wir noch die Erweiterung der zu erzeugenden Datei auf .hxt aendern sowie, die einzubindenden Bibliotheken des SDK's festlegen . Diese Einstellungen nehmen wir auf der Seite Linker vor .
Als erstes fuer die Debug-Version
Bild7
Und dann auch gleich noch fuer die Release-Version
Bild8
Hierbei sollte darauf geachtet werden, dass die beiden Versionen in unterschiedlichen Verzeichnisssen erzeugt werden (ebenfalls wieder relative Adressierung) sowie bei beiden , die Dateinamenserweiterung auf .hxt geaendert wird .
Das waeren dann auch schon alle wichtigen Aenderungen fuer die Projekteinstellungen .

Weiter gehts im Hauptfenster .
Um A:M mitzuteilen, welcher Text fuer unser Plugin im Menu angezeigt werden soll , legen wir als naechstes eine Stringressource am .
Dies geschieht mittels Einfuegen->Ressource .
Bild9
Hier wird String Table gewaehlt und mittels Neu auch erzeugt .
Jetzt wird im ersten Eintrag unter IDS_STRING1 der Titel eingegeben .
Bild10
Wobei hier schon der erste Fallstrick lauert , wenn die ID des Stringes IDS_STRING1 lautet muss dann auch diese ID verwendet werden, wenn man den Menunamen in der Funktion HxtOnAddCommandMenu in entry.cpp dem Menu hinzufuegt .

Als naechstes erstellen wir einen einfachen Dialog mittels Einfuegen->Ressource Dialog .
Bild12
Schon haetten wir unseren einfachen Dialog .
Jetzt wird ueber den Klassenassistenten eine neue Klasse fuer diesen Dialog erstellt .
Bild13
Hier waehlen wir eine neue Klasse und im naechsten Arbeitsschritt geben wir dieser den Namen sample_dialog .
Bild14
So , dass Grundgeruest steht nun erstmal . Jetzt gehts an's eingemachte . Dafuer waere es hilfreich , wenn Ihr das Sampleprojekt schon heruntergeladen habt . Da es jetzt nur noch um den Sourcecode geht .
Als erstes muss eine neue C++-Quellcodedatei in Euer Projekt eingefuegt werden , nennen wir sie Entry.cpp . In dieser Datei
sind die Initialisierungsfunktionen, also HxtLoadCommandEntry (legt fest, welcher Typ eines Objektes von AM erzeugt werden soll,Definitionen in includes\objtype.h), HxtOnAddCommandMenu (legt den Namen fest , unter dem das Plugin im Menu angezeigt
wird sowie den Typ des Plugins), sowie HxtOnCommand (die Funktion, die ausgefuehrt werden soll, wenn das Plugin aufgerufen wird).
Zu beachten ist auch , dass die Includes richtig gesetzt werden . Die Funktionen am einfachsten aus dem Beispielprojekt kopieren.
 

Als naechstes sind noch Aenderungen in sample.h vorzunehmen .
Dort fuegen wir folgenden zusaetzlichen Includes ein.
#include "SDK\HPropert.h"
#include "SDK\HPropDri.h"
#include "SDK\HPatch.h"
#include "SDK\HModel.h"
Ebenso die Klassen
class HModelCache;
class HGroupCP;
Ausserdem die Funktion
BOOL OnSampleWizard(HModelCache *hmc);
sowie
virtual BOOL InitInstance();
virtual int  ExitInstance();
(Die Stellen , an denen dies eingefuegt wird , koennt Ihr in sample.h sehen :-))
Die neuen Funktionen muessen natuerlich auch noch mit Leben gefuellt werden und wie nicht anders zu erwarten geschieht dies in
sample.cpp . Ich gehe hier nur auf die wichtigste Funktion ein, OnSampleWizard .
BOOL CSampleApp::OnSampleWizard(HModelCache *hmc)
{
   sample_dialog dlg(NULL); //Erzeugung des Dialogs
   if (dlg.DoModal()!=IDOK)
      return TRUE;

   return TRUE; //hier wird ansonsten die Funktion uebergeben, die etwas bewirken soll, bei unserem Beispielprojekt tut sie nichts, //dewegen nur return TRUE
                          // andernfalss z.B. return NewShape(hmc) , zu sehen in Grid\HXT.cpp Grid\evalute.cpp
}

Das war's schon , bei einem Druck auf F7 sollte sich das Beispielprojekt , ohne zu murren kompilieren lassen . Wenn nicht,
vergleicht am besten den Quellcode des Beispielprojektes mit Euer eigenem , meist sind vergessene Includes schuld .
Nach erfolgreichem Kompilieren , die Datei sample.hxt in's AM HXT Verzeichniss kopieren und beim naechsten Start von
A:M sollte ,das Plugin schon sichtbar sein , wenn Ihr ein Objekt oder ein Modell selektiert habt .
Um zu sehen, wie man dann das Plugin auch mit richtigen Leben erfuellt , ist dann als naechstes ein Studium der Sourcen von
Plugins angesagt , wobei mir das Grid-Plugin da am meisten geholfen hat (das war auch die Vorlage fuer mein erstes Plugin).
Wie man ein solches Plugin debuggt, zeigt mein 2.kleines Minitutorial .
 
Zurück zur Übersicht