/******************************************************************** Zell Automat I Plugin für Cinema Version 8.0 (c) Jürgen Meier (www.3d-meier.de) Version : 1.00 30.09.2004 *********************************************************************/ // Globale Variablen und Konstanten // Plugin ID Nummer const var cPluginID = 1016496; // Pluginname const var cPlugName = "Zell Automat I"; // Pluginhilfstext const var cPlugHelp = "Zellulärer Automat"; // Breite des Menütextes var Breite=200; // Maximalwerte var cMaxFloat=10000000000; var cMaxInt=100000000; // Objektvariable var para; // Dialogvariable var gDial; // Variablen für die Berechnung var i,j; // Indizes für die Schleifen var zz; // Zähler var SP; // Anzahl Punkte des Polygonobjektes var SQ; // Anzahl Quadrate des Polygonobjektes var x,y,z; // Koordinaten eines Punktes var N=10000; // Anzahl Punkte var Dx,Dy; // Punktgröße var D=10; // Punktgröße var G=64; // Anzahl Generationen // Variablen für das Polygonobjekt var vObj, vSP, // Anzahl der Punkte vPointAry, // Array für die Punkte vSQ, // Anzahl der Polygone vPolyAry; // Array für die Polygone // Variablen für die Regel var B; var B0=0; var B1=1; var B2=0; var B3=1; var B4=1; var B5=0; var B6=1; var B7=0; var Regel; var Feld; var R; // ****************************************************************** // 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 des Dreiecks // ****************************************************************** fAuto(vDoc) { // Name der Regel ermitteln Regel=B0*1+B1*2+B2*4+B3*8+B4*16+B5*32+B6*64+B7*128; // Array erzeugen Feld= new(array,G+1,2*G+3); // Array löschen for (i=0;iSetName("Regel "+tostring(Regel)); // Nullobjekt in die Szene einfügen vDoc->InsertObject(attraktor,NULL,NULL); zz=1; // Quadrate erzeugen for (i=0;iSetName("Quadrat "+tostring(zz)); vDoc->StartUndo(); vDoc->AddUndo(UNDO_OBJECT_NEW,para); vDoc->EndUndo(); vVarChanged = new(VariableChanged); vBackupTags = new(BackupTags); // Parameter des Polygonobjektes // Anzahl Quadrate des Polygonobjektes SQ=4; // Anzahl Punkte des Polygonobjektes SP=4; // 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,attraktor,NULL); GeEventAdd(DOCUMENT_CHANGED); // Punkte setzen para->SetPoint(0,vector(j*D,i*D,0)); para->SetPoint(1,vector(j*D+D,i*D,0)); para->SetPoint(2,vector(j*D+D,i*D+D,0)); para->SetPoint(3,vector(j*D,i*D+D,0)); // Polygon setzen para->SetPolygon(0,0,1,2,3); para->Message(MSG_UPDATE); // Zähler erhöhen zz=zz+1; } } } // Objekt aktivieren fSetActiveObject(vDoc,attraktor); GeEventAdd(DOCUMENT_CHANGED); attraktor->Message(MSG_UPDATE); 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); // Regel bestimmen AddStaticText(0,BFH_LEFT,Breite,0," Regel erzeugen",0); AddGroupBeginV(1000,BFH_CENTER,2,"",0); { AddStaticText(0,BFH_LEFT,Breite,0," 0 000",0); AddEditNumberArrows(2000,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," 1 001",0); AddEditNumberArrows(2001,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," 2 010",0); AddEditNumberArrows(2002,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," 3 011",0); AddEditNumberArrows(2003,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," 4 100",0); AddEditNumberArrows(2004,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," 5 101",0); AddEditNumberArrows(2005,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," 6 110",0); AddEditNumberArrows(2006,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," 7 111",0); AddEditNumberArrows(2007,BFH_LEFT,100,0); } // Vertikal orientierte Gruppe schliessen AddGroupEnd(); // Waagerechte Trennlinie AddSeparatorH(0); // Gruppe für die Parameter der Berechnung AddGroupBeginV(1002,BFH_CENTER,2,"",0); { AddStaticText(0,BFH_LEFT,Breite,0," Anzahl Generationen",0); AddEditNumber(2008,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," Kantenlänge",0); AddEditNumber(2009,BFH_LEFT,100,0); } // Vertikal orientierte Gruppe schliessen AddGroupEnd(); // Waagerechte Trennlinie AddSeparatorH(0); // Button für den Start der Berechnung AddButton (3000,BFH_CENTER,200,0,"Start"); // Waagerechte Trennlinie AddSeparatorH(0); // Impressum AddStaticText(0,BFH_CENTER,Breite,0," (c) 2004 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 SetInt(2000,B0,0,1,1); SetInt(2001,B1,0,1,1); SetInt(2002,B2,0,1,1); SetInt(2003,B3,0,1,1); SetInt(2004,B4,0,1,1); SetInt(2005,B5,0,1,1); SetInt(2006,B6,0,1,1); SetInt(2007,B7,0,1,1); SetInt(2008,G,0,cMaxInt,1); SetInt(2009,D,0,cMaxInt,1); 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 3000 : // Start Button gedrückt { vDoc = GetActiveDocument(); if (!vDoc) return FALSE; fAuto(vDoc); } case 2000 : B0=GetInt(2000); case 2001 : B1=GetInt(2001); case 2002 : B2=GetInt(2002); case 2003 : B3=GetInt(2003); case 2004 : B4=GetInt(2004); case 2005 : B5=GetInt(2005); case 2006 : B6=GetInt(2006); case 2007 : B7=GetInt(2007); case 2008 : G=GetInt(2008); case 2009 : D=GetInt(2009); } 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); }