Objekte hinzufügen mit Coffee

wayne42

Mitglied
Hi Leute,

ist es möglich mit Coffee externe Modelle in Cinema zu laden. Externe Dateien kann man ja lesen und ich frag mich gerade, ob man auch in einer Textdatei eine Liste von Objekten mit Position etc. speichern könnte um sie danach in Cinema zum bestehenden Projekt zu laden. Also je nachdem, was die Liste sagt auch gleiche mehere in einem Rutsch
 
Hi!

Hm, ja, warum sollte das nicht gehen ;)

Die Frage ist, was Du mit "externe Modelle" meinst. Dir muß halt bekannt sein, wie die "externe Datei" aufgebaut ist, diese Daten dann lesen und interpretieren.
So könnte die Datei einfach eine Liste aller Punkte und Polygone eines Objekts besitzen und Coffee erzeugt daraus ein "Polygon-Objekt"...

Grüße,
Mark.
 
Und wenn Du die R10.5 Dein Eigen nennst und die externen Objekte C4d-Dateien sind, dann benutz doch einfach die X-Refs.
 
Es wäre eine Liste mit Pfaden zu .3ds Modellen und deren Position + Skalierung. sowas in der Art :

Code:
C:\models\foo.3ds 0 0 0 ...
C:\models\bar.3ds 10 10 0...

usw.
Die Infos müsste ich einlesen und dann im meinem jetzigen Projekt haben. Ich bin mir nur unsicher, ob das mit Coffee so funktioniert.
 
Hi!

Hm, das sollte doch durchaus funktionieren...

Textfile einlesen und parsen wird wohl das einfachste sein (BaseFile/Open ...)
Anschließend über z.B. LoadDocument ( ? ) die 3dsmax-Szene in ein neues Dokument laden (und somit importieren ... das Interpretieren des 3dsmax-Formats entfällt).
Dort ggf. einem Null-Objekt unterordnen und dieses per GetClone und InsertObject ( ? ) in das Haupt-Document übertragen.
Dort die gewünschten (geparsten) Positions-Werte zuführen.

... sehe so spontan keine gröberen Hürden ;)

Liebe Grüße,
Mark.
 
Moin Leute,

falls jemand auch mal verschiedenste Objekte zu seiner Szene hinzuladen möchte, hier ein möglicher Weg.

Die Textdatei mit den Verweisen sieht bei mir wie folgt aus :

Code:
C:\1.3ds?0?-300?0?C:\2.3ds?1000?0?100?C:\3.3ds?2330?340?670?

die Fragezeichen gelten als Trennzeichen für : Pfade, x, y, z (weil Fragezeichen genrell nich in Dateinamen erwünscht sind).. für mich is es nur en Hilfetool, um die Arbeit zu erleichtern, deshalb die workaround Lösung.

Der Loader wird einfach aufgerufen und das Dokument übergeben, in das die Objekte geladen werden sollen. Die Datei mit den Daten heißt objects.txt und liegt einfach im Cinema ordern rum.

Der Quellcode für den Loader ist wie folgt :

Code:
class Loader
{
	public:
	
	Loader();
	Initialize(baseDocument);
	
	private:
	
	var basicDocument;
	GetDataSize(path);
}

struct LoaderObj
{
  var path;
  var x;
  var y;
  var z;
  
  LoaderObj(path,x,y,z);
}

LoaderObj::LoaderObj(ppath,px,py,pz)
{
  // Construct
  path = ppath;
  x = px;
  y = py;
  z = pz;
}

Loader::Loader(){}

Loader::Initialize(baseDocument)
{
  basicDocument = baseDocument;
  println("Loading Objects");
  var LookUpFile = GeGetStartupPath();
  LookUpFile->AddLast("objects.txt");
  var modelStructArray = new(array,int(GetDataSize("objects.txt")));
  var file = new(BaseFile);
  file->Open(LookUpFile, GE_READ);
  var mode = 1; //mode für struct lesen 1 steht für pfad, 2 ist x, 3 y, 4z etc.
  var currentPath = "";
  var currentX = "";
  var currentY = "";
  var currentZ = "";
  var i = 0; //Pseudo Zählschleife für die Objektstrukturen
  
  while(file->GetPosition()<file->GetLength())
  {
    var currentChar = file->ReadString(1);
    if(currentChar=="?")
    {
      if(mode>3) //nächstes Object
      {
        //alles wegspeichern
        var temp = new(LoaderObj,currentPath,currentX,currentY,currentZ);
        modelStructArray[i] = temp;
        
        mode=1;
        i++;
        currentPath = "";
        currentX = "";
        currentY = "";
        currentZ = "";
      }
      else
      {
        mode++;
      }
    }
    else
    {
      switch(mode)
      {
        case 1 : currentPath = stradd(currentPath,currentChar); break;
        case 2 : currentX = stradd(currentX,currentChar); break;
        case 3 : currentY = stradd(currentY,currentChar); break;
        case 4 : currentZ = stradd(currentZ,currentChar); break;
      }
    }
  }
  
  //Modelle ins aktuelle Project laden
  
  for (i=0; i<sizeof(modelStructArray); i++)
  {    
    var filename = GeGetStartupPath();
    filename->SetFullString(tostring(modelStructArray[i]->path)); 
  
    if(LoadDocument(filename))
    {
      println("import ",stradd(modelStructArray[i]->path,"|",modelStructArray[i]->x,"|",modelStructArray[i]->y,"|",modelStructArray[i]->z));
            
      //das aktuelle Dokument ist das geladene File
      
      var currentDoc = GetActiveDocument()->GetFirstObject()->GetClone(CL_NO_BITS);
      basicDocument->InsertObject(currentDoc,NULL,NULL);
      currentDoc->SetPosition(vector(evaluate(modelStructArray[i]->x),evaluate(modelStructArray[i]->y),evaluate(modelStructArray[i]->z)));
      KillDocument(GetActiveDocument());
    }
    else
    {
      println("no import possible");
    } 
  }
}

Loader::GetDataSize(path)
{
  //file einmal durchlaufen und gucken, wie viele Modelle drin sein könnten um 
  //dementsprechend ein array zu erstellen :-S
  var LookUpFile = GeGetStartupPath();
  var MarkCount = 0;
  LookUpFile->AddLast(path);
  var file = new(BaseFile);
  file->Open(LookUpFile, GE_READ);
  
  while(file->GetPosition()<file->GetLength())
  {
    var currentChar = file->ReadString(1);
    if(currentChar=="?")
    {
      MarkCount++;
    }
  }
  
  //return / die anzahl der Parameter, die man so hat
  return (MarkCount + 1/*wegen dem ersten Fragezeichen, was ja nich mit drin ist*/) / 4;
}

wenn jemand damit was anfangen kann, viel Erfolg. Vielen Dank für die Hinweise.

EDIT : hey... mein 42.er Beitrag. Das ging ja schnell :-D
Schönen Tach noch und vielen Dank für den Fisch ;-)
 
Zuletzt bearbeitet:
Zurück