/******************************************************************** Oloid Plugin für Cinema Version 8.0 (c) Jürgen Meier (www.3d-meier.de) Version : 1.00 22.02.2004 *********************************************************************/ // Globale Variablen und Konstanten // Plugin ID Nummer const var cPluginID = 1015337; // Pluginname const var cPlugName = "Oloid"; // Pluginhilfstext const var cPlugHelp = "Erzeugt den Oloid"; // Objektname const var cObjName = "Oloid"; // Breite des Menütextes var Breite=200; // Maximalwerte var cMaxFloat=10000000000; var cMaxInt=100000000; // Objektvariable var para; // Dialogvariable var gDial; // Parameter des Oloid var uMin = -3.5; var uMax = 2.0; var f = 100; var Nu; var Nu05 = 10; var L; var N = 10000; var Delta=0.005; // Variablen für die Berechnung var i,j; // Indizes für die Schleifen var zz; // Zähler var du; // Segmentbreite u var dv; // Segmentbreite v var SP; // Anzahl Punkte des Polygonobjektes var SQ; // Anzahl Quadrate des Polygonobjektes var x,y,z; // Koordinaten eines Punktes var u,v; // Parameter für die Fläche var v1,v2; // Vektoren var P1,P2,P3,P4; // Punkte für ein Quadrat var Abstand; // Abstand zwischen zwei Punkten // 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 // ****************************************************************** // 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 Berechnung der parametrischen Fläche // ****************************************************************** fPara(vDoc) { var vVarChanged,vBackupTags; // Neues Polygonobjekt erzeugen para=new(PolygonObject); if (!para) return NULL; para->SetName(cObjName); vDoc->StartUndo(); vDoc->AddUndo(UNDO_OBJECT_NEW,para); vDoc->EndUndo(); vVarChanged = new(VariableChanged); vBackupTags = new(BackupTags); // Parameter des Polygonobjektes berechnen Nu05=2*Nu05; Nu=2*Nu05; // Anzahl Punkte des Polygonobjektes SP=4*Nu05+2; // Anzahl Quadrate des Polygonobjektes SQ=4*Nu; // 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 setzen (1. Scheibe) // Zähler zurücksetzen zz=0; // Segmentbreiten berechnen du=(uMax-uMin)/Nu05; // Ersten Punkt setzten // Berechnung der Koordinaten x= 0; y= sin(-PI/1.5); z= 1+cos(-PI/1.5); // Punkt speichern para->SetPoint(zz,vector(x*f,y*f,z*f)); // Zähler erhöhen zz=zz+1; // Parameterbereich durchlaufen for (i=1;iSetPoint(zz,vector(x*f,y*f,z*f)); // Zähler erhöhen zz=zz+1; } // Mittleren Punkt setzten // Berechnung der Koordinaten x= 0; y= sin(0); z= 1+cos(0); // Punkt speichern para->SetPoint(zz,vector(x*f,y*f,z*f)); // Zähler erhöhen zz=zz+1; // Punkte spiegeln for (i=1;iGetPoint(Nu05-i); // Punkt speichern para->SetPoint(zz,vector(v1.x,-v1.y,v1.z)); // Zähler erhöhen zz=zz+1; } // Letzten Punkt setzten // Berechnung der Koordinaten x= 0; y= sin(PI/1.5); z= 1+cos(PI/1.5); // Punkt speichern para->SetPoint(zz,vector(x*f,y*f,z*f)); // Zähler erhöhen zz=zz+1; // Punkte erzeugen (2. Scheibe) // Segmentbreiten berechnen uMin = -PI/1.5; var uMax = 0; du=(uMax-uMin)/100000; // Normlänge einer Tangente L=sqrt(3)*f; // Mittleren Punkt setzten // Berechnung der Koordinaten x= sin(0); y= 0; z= -cos(0); // Punkt speichern para->SetPoint(zz,vector(x*f,y*f,z*f)); // Zähler erhöhen zz=zz+1; // Erste Hälfte der Punkte durchlaufen for (i=1;iGetPoint(i); // Parameterbereich (2. Kreis) durchlaufen for (j=0;j<=100000;j++) { // Berechnung der Parameter u=uMin+j*du; // Berechnung der Koordinaten x= sin(u); y= 0; z= -cos(u); // Vektor erzeugen v2= vector(x*f,y*f,z*f); // Abstand berechnen Abstand=sqrt((v1.x-v2.x)*(v1.x-v2.x)+(v1.y-v2.y)*(v1.y-v2.y)+(v1.z-v2.z)*(v1.z-v2.z)); // Abstand prüfen if (abs(Abstand-L)<0.005) { // Punkt speichern para->SetPoint(zz,v2); // Zähler erhöhen zz=zz+1; // Schleife beenden break; } } // Ende j } // Ende i // Endpunkt setzten // Berechnung der Koordinaten x= sin(-PI/1.5); y= 0; z= -cos(-PI/1.5); // Punkt speichern para->SetPoint(zz,vector(x*f,y*f,z*f)); // Zähler erhöhen zz=zz+1; // Punkte spiegeln for (i=2*Nu05+2;i<3*Nu05+1;i++) { // Punkte holen v1=para->GetPoint(i); // Punkt speichern para->SetPoint(zz,vector(-v1.x,v1.y,v1.z)); // Zähler erhöhen zz=zz+1; } // Endpunkt setzten // Berechnung der Koordinaten x= sin(PI/1.5); y= 0; z= -cos(PI/1.5); // Punkt speichern para->SetPoint(zz,vector(x*f,y*f,z*f)); // Zähler erhöhen zz=zz+1; // Polygone // Polygone setzen Teil 1 // Zähler zurücksetzen zz=0; // Schleife for (i=0;iSetPolygon(zz,P1,P2,P3,P4); // Zähler erhöhen zz=zz+1; } // Polygone setzen Teil 2 // Schleife for (i=0;iSetPolygon(zz,P1,P2,P3,P4); // Zähler erhöhen zz=zz+1; } // Punkte für ein Quadrat definieren P1=2*Nu05; P2=2*Nu05-1; P4=2*Nu05+1; P3=2*Nu05+2; // Quadrat speichern para->SetPolygon(zz,P4,P3,P2,P1); // Zähler erhöhen zz=zz+1; // Polygone setzen Teil 3 // Schleife for (i=1;iSetPolygon(zz,P4,P3,P2,P1); // Zähler erhöhen zz=zz+1; } // Punkte für ein Quadrat definieren P1=0; P2=1; P3=3*Nu05+2; P4=2*Nu05+1; // Quadrat speichern para->SetPolygon(zz,P4,P3,P2,P1); // Zähler erhöhen zz=zz+1; // Punkte für ein Quadrat definieren P2=4*Nu05; P3=4*Nu05+1; P4=Nu05; P1=Nu05-1; // Quadrat speichern para->SetPolygon(zz,P1,P2,P3,P4); // Zähler erhöhen zz=zz+1; // Polygone setzen Teil 4 // Schleife for (i=0;iSetPolygon(zz,P4,P3,P2,P1); // Zähler erhöhen zz=zz+1; } // Punkte für ein Quadrat definieren P1=2*Nu05+1; P2=3*Nu05+2; P4=2*Nu05; P3=2*Nu05-1; // Quadrat speichern para->SetPolygon(zz,P4,P3,P2,P1); // Objekt aktivieren fSetActiveObject(vDoc,para); GeEventAdd(DOCUMENT_CHANGED); para->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); // Gruppe für die Parameter der Iteration AddGroupBeginV(1002,BFH_CENTER,2,"",0); { AddStaticText(0,BFH_LEFT,Breite,0," Skalierungsfaktor",0); AddEditNumber(2502,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," Nu/4",0); AddEditNumber(2503,BFH_LEFT,100,0); } // Vertikal orientierte Gruppe schliessen AddGroupEnd(); // Waagerechte Trennlinie AddSeparatorH(0); AddGroupBeginV(1002,BFH_CENTER,2,"",0); { AddStaticText(0,BFH_LEFT,Breite,0," Anzahl Schritte",0); AddEditNumber(2000,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," Delta",0); AddEditNumber(2001,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," min",0); AddEditNumber(2002,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," max",0); AddEditNumber(2003,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"); return TRUE; } // ****************************************************************** // Deklaration der Methode Init MyDialog::Init() { // Startwerte setzen SetFloat(2502,f,-cMaxFloat,cMaxFloat,0); SetInt(2503,Nu05,0,cMaxInt,0); SetInt(2000,N,0,cMaxInt,0); SetFloat(2001,Delta,0,cMaxFloat,0); SetFloat(2002,uMin,-cMaxFloat,cMaxFloat,0); SetFloat(2003,uMax,0,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 3000 : // Start Button gedrückt { vDoc = GetActiveDocument(); if (!vDoc) return FALSE; fPara(vDoc); } case 2502 : f=GetFloat(2502); case 2503 : Nu05=GetInt(2503); case 2000 : N=GetInt(2000); case 2001 : Delta=GetFloat(2001); case 2002 : uMin=GetFloat(2002); case 2003 : uMax=GetFloat(2003); } 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); }