/******************************************************************** Erzeugt aus einem Polygonobjekt eine geodätische Kuppel Plugin für Cinema Version 7 - 9 (c) Jürgen Meier www.3d-meier.de Version : 1.00 09.01.2006 *********************************************************************/ // Globale Variablen und Konstanten // Plugin ID Nummer const var cPluginID = 1019304; // Pluginname const var cPlugName = "Kuppel"; // Pluginhilfstext const var cPlugHelp = "Erzeugt eine geodätische Kuppel"; // Breite des Menütextes var Breite=200; // Maximalwerte var cMaxFloat=10000000000; // Objektvariable var poly,para; // Dialogvariable var gDial; // Variablen für die Berechnung var P_Punktzahl; // Anzahl Punkte des Polygonobjektes var P_Polygonzahl; // Anzahl Polygone des Polygonobjektes var P_Name; // Name des Polygonobjektes var P_Punkt; // Vektor fÜr einen Polygonpunkt var P_PolyArray; // Array für die Polygone var i; // Indizes fÜr die Schleifen var SP,SQ; var vVarChanged,vBackupTags; var vPointAry, // Array für die Punkte vPolyAry; // Array für die Polygone var P1,P2,P3,P4; // Punkte des Polygons var x,y,z,vv,w,p,s; // Koordinaten var r=100; // Radius der Kuppel // ****************************************************************** // Funktion zum Objekt aktivieren (c) h.g.seib // ****************************************************************** fSetActiveObject(vDoc,vObj) { // Aktives Objekt ermitteln var vAObj = GetActiveObject(vDoc); // Active object Bit bzw. Flag setzen if (vAObj) vAObj->DelBit(BIT_AOBJ); vObj->SetBit(BIT_AOBJ); // Änderung im Dokument bekanngeben (neues Objekt selektiert) GeEventAdd(NEW_ACTIVE_OBJECT); } // ****************************************************************** // Funktion zur Erzeugung der Kuppel // ****************************************************************** fDome(vDoc) { // Aktives Objekt ermitteln poly = GetActiveObject(vDoc); // Prüfen ob es sich um ein Polygonobjekt handelt if (instanceof(poly,PolygonObject)) { // Anzahl Punkte des Polygonobjektes ermitteln P_Punktzahl=poly->GetPointCount(); // Anzahl Polygone des Polygonobjektes ermitteln P_Polygonzahl=poly->GetPolygonCount(); // Name des Polygonobjektes ermitteln P_Name=poly->GetName(); // Neues Polygonobjekt erzeugen para=new(PolygonObject); if (!para) return NULL; para->SetName("Dome"); vDoc->StartUndo(); vDoc->AddUndo(UNDO_OBJECT_NEW,para); vDoc->EndUndo(); vVarChanged = new(VariableChanged); vBackupTags = new(BackupTags); // Parameter des Polygonobjektes berechnen // Anzahl Punkte des Polygonobjektes SP= P_Punktzahl; // Anzahl Polygone des Polygonobjektes SQ= P_Polygonzahl; // Anzahl Punkte festlegen vPointAry = new(array, SP); para->SetPoints(vPointAry); vBackupTags->Init(para); vVarChanged->Init(0, SP); if (!para->Message(MSG_POINTS_CHANGED, vVarChanged)) {vBackupTags->Restore(); return NULL; } // Anzahl Polygone festlegen vPolyAry = new(array, SQ*4); para->SetPolygons(vPolyAry); vBackupTags->Init(para); vVarChanged->Init(0, SQ); if (!para->Message(MSG_POLYGONS_CHANGED, vVarChanged)) { vBackupTags->Restore(); return NULL; } // Objekt in die Objekthirarchie einfügen vDoc->InsertObject(para,NULL,NULL); GeEventAdd(DOCUMENT_CHANGED); // Punkte neu berechnen for (i=0;iGetPoint(i); x= P_Punkt.x; y= P_Punkt.y; z= P_Punkt.z; // Kugelkoordinaten berechnen w= y*y+x*x; if (w==0) { if (z>0) { p=PI/2; } if (z<0) { p=-PI/2; } } else { p=atan(z/(sqrt(w))); } if (x==0) { if (y>0) { s=PI/2; } if (y<0) { s=3*PI/2; } } else { if (x>0) {s=atan(y/x);} else {s=PI+atan(y/x);} } // rechtwinklige Koordinaten neu berechnen x=r*cos(p)*cos(s); y=r*cos(p)*sin(s); z=r*sin(p); // Punkt setzen para->SetPoint(i,vector(x,y,z)); } // Polygone erzeugen P_PolyArray = new(array,P_Polygonzahl*4); P_PolyArray = poly->GetPolygons(); for (i=0;iSetPolygon(i,P1,P2,P3,P4); } // Objekt aktivieren fSetActiveObject(vDoc,para); GeEventAdd(DOCUMENT_CHANGED); para->Message(MSG_UPDATE); } else { // Objekt ist kein Polygonobjekt println("Objekt ist kein Polygonobjekt"); } return TRUE; } // ****************************************************************** // Ableitung der Klasse MyDialog von GeDialog // ****************************************************************** class MyDialog : GeDialog { public: MyDialog(); CreateLayout(); Init(); CoreMessage(vID,vMSG); Command(vID,vMSG); } // ****************************************************************** // Deklaration des Konstruktors MyDialog::MyDialog() { // Konstruktor der parent class aufrufen super(cPluginID); } // ****************************************************************** // Deklaration der Methode CreateLayout MyDialog::CreateLayout() { // Plugintitel setzen SetTitle(cPlugName); // Gruppe fÜr die Parameter der Iteration AddGroupBeginV(1002,BFH_CENTER,2,"",0); { AddStaticText(0,BFH_LEFT,0,0," Radius : ",0); AddEditNumber(2001,BFH_LEFT,100,0); } // Vertikal orientierte Gruppe schliessen AddGroupEnd(); // Waagerechte Trennlinie AddSeparatorH(0); // Button für den Start AddButton (3000,BFH_CENTER,200,0,"Start"); // Waagerechte Trennlinie AddSeparatorH(0); // Impressum AddStaticText(0,BFH_CENTER,Breite,0," (c) 2006 Jürgen Meier",0); AddStaticText(0,BFH_CENTER,Breite,0," www.3d-meier.de",0); return TRUE; } // ****************************************************************** // Deklaration der Methode Init MyDialog::Init() { // Startwerte setzen SetFloat(2001,r,1,cMaxFloat,0); return TRUE; } // ****************************************************************** // Deklaration der Methode CoreMessage MyDialog::CoreMessage(vID,vMSG) { switch (vID) { case NEW_DOCUMENT: case DOCUMENT_CHANGED: case NEW_ACTIVE_OBJECT: case ACTIVE_OBJECT_CHANGED: return TRUE; break; } return FALSE; } // ****************************************************************** // Deklaration der Methode Command MyDialog::Command(vID,vMSG) { var vDoc; // StopAllThreads(); switch (vID) { case 2001 : { r=GetFloat(2001); break; } case 3000 : // Start Button gedrÜckt { vDoc = GetActiveDocument(); if (!vDoc) return FALSE; fDome(vDoc); } } return TRUE; } // ****************************************************************** // Ableitung der Klasse MyMenuPlugin von MenuPlugin // ****************************************************************** class MyMenuPlugin : MenuPlugin { public: MyMenuPlugin(); GetID(); GetName(); GetHelp(); Execute(doc); RestoreLayout(secret); } // ****************************************************************** // Deklaration des Konstruktors MyMenuPlugin::MyMenuPlugin() { super(); } // ****************************************************************** // Deklaration der Methode GetID MyMenuPlugin::GetID() { return cPluginID; } // ****************************************************************** // Deklaration der Methode GetName MyMenuPlugin::GetName() { return cPlugName; } // ****************************************************************** // Deklaration der Methode GetHelp MyMenuPlugin::GetHelp() { return cPlugHelp; } // ****************************************************************** // Deklaration der Methode Execute MyMenuPlugin::Execute(doc) { if (!gDial) gDial=new(MyDialog); gDial->Open(TRUE,-1,-1); } // ****************************************************************** // Deklaration der Methode RestoreLayout MyMenuPlugin::RestoreLayout(secret) { if (!gDial) gDial=new(MyDialog); gDial->RestoreLayout(secret); } // ****************************************************************** main() { Register(MyMenuPlugin); }