Workflow automatisieren

Mark

Cinema4D
Hi Peter!

"Ausnahmen bestätigen die Regel" ;)
Schau doch bitte mal in Deiner Objekt-Hierarchie: wenn das Script bei einem Polygon-Objekt mit keinen Punkten (leeres Polygonobjekt) abbricht - so konnte ich Deinen Fehler "erzeugen" -, sollte folgende Änderung Abhilfe schaffen:
Die Funktion CollectPolyObjects "sammelt" nur Polygon-Objekte, die nicht leer sind:
Code:
// Sammelt Objekte einer Hierarchie
CollectPolyObjects(obj,found) {
 var obj_array = new(array, found);
 var collect  = obj->GetDown();
 var i=0;
 while (collect) {
  if (instanceof(collect,PointObject)) {
   if (collect->GetPointCount()) {
	obj_array[i] = collect;
	i++;
   }
  }
  collect  = collect->GetNext();
 }
 var newObj = JoinObjects(obj_array);
 newObj->SetName(obj->GetName());
 newObj->InsertUnder(collection);
}
...einfach komplette Funktion ersetzen, überschreiben (auch, wenn eigentlich ja nur eine if-Anweisung hinzu kam ;) ).
Liebe Grüße,
Mark.
 

Mark

Cinema4D
Hi nochmal!

Ui, ich habe es befürchtet: jetzt wird's echt ein "rumgefusche" von mir ;)
Auch FindPolyObjects sollte "leere Null-Objekte" nicht beachten (polyfound wird zum Erzeugen das Array genützt...).
Somit auch dort ein "IF" mehr ;) Aber diesmal nochmals der komplette Code...
(Anm.: Editieren verhunzt das Einrücken im Code-Tag, deshalb neuer Post :) )

Liebe Grüße,
Mark.

Code:
// Collection-Object
var collection;
// Ein Array von PolygonObjekten in einem PolygonObjekt zusammenfassen
JoinObjects(obj_array) {
 var i,j;
 // Neues PolygonObjekt
 var newObject  = new(PolygonObject);
 var pts_count  = 0;
 var pol_count  = 0;
 for(i=0;i<sizeof(obj_array);i++) {
  if (instanceof(obj_array[i],PointObject)) {
   var thisobj = obj_array[i];
   pts_count  += thisobj->GetPointCount();
   pol_count  += thisobj->GetPolygonCount();
  }  
 }
 var newPoints  = new(array, pts_count);
 var newPolygons = new(array, pol_count*4);
 var pts_pointer = 0;
 var pol_pointer = 0;
 for(i=0;i<sizeof(obj_array);i++) {
  if (instanceof(obj_array[i],PointObject)) {
   var thisobj  = obj_array[i];
   var thismat  = thisobj->GetMg();
   // Punkte setzen
   var pts_array = thisobj->GetPoints();
   for(j=0;j<sizeof(pts_array);j++) {
	newPoints[pts_pointer+j]  = thismat->GetMulP(pts_array[j]);
   }
   // Polygone setzen
   var pol_array = thisobj->GetPolygons();
   for(j=0;j<sizeof(pol_array);j++) {
	newPolygons[pol_pointer+j] = pol_array[j]+pts_pointer;
   }
   // Position im Array
   pts_pointer += sizeof(pts_array);
   pol_pointer += sizeof(pol_array);
  }  
 }
 var variableChanged = new(VariableChanged);
 var backupTags = new(BackupTags);
 backupTags->Init(newObject);
 variableChanged->Init(0, pts_count);
 newObject->Message(MSG_POINTS_CHANGED, variableChanged);
 backupTags->Init(newObject);
 variableChanged->Init(0, pol_count);
 newObject->Message(MSG_POLYGONS_CHANGED, variableChanged);
 newObject->SetPoints(newPoints);
 newObject->SetPolygons(newPolygons);
 newObject->Message(MSG_UPDATE);
 return newObject;
}
// Sammelt Objekte einer Hierarchie
CollectPolyObjects(obj,found) {
 var obj_array = new(array, found);
 var collect  = obj->GetDown();
 var i=0;
 while (collect) {
  if (instanceof(collect,PointObject)) {
   if (collect->GetPointCount()) {
	obj_array[i] = collect;
	i++;
   }
  }
  collect  = collect->GetNext();
 }
 var newObj = JoinObjects(obj_array);
 newObj->SetName(obj->GetName());
 newObj->InsertUnder(collection);
}
// Durchsucht eine Hierarchie
FindPolyObjects(obj) {
 var polyfound = 0;
 var search  = obj->GetDown();
 while (search) {
  // ist PolygonObject
  if (instanceof(search,PointObject)) {
   if (search->GetPointCount()) {
	polyfound++;
   }
  // weitere Hierarchie
  } else {
   FindPolyObjects(search);
  }
  search   = search->GetNext();
 }
 // Gefundene Polygonobjekte verbinden
 if (polyfound) {
  CollectPolyObjects(obj,polyfound);
 }
}
// Hauptprogramm
main(doc,op)
{
 // startet nur, wenn noch keine Collection
 if (!doc->FindObject("Collection")) {
  collection = new(NullObject);
  collection->SetName("Collection");
  doc->InsertObject(collection, NULL, op);
  // sammeln
  FindPolyObjects(op);
 }
}
 

onepeterpan

Mitglied
Hallo Mark,
es läuft ^^ ^^ ^^
Klasse! Hut ab!

******
erst jetzt sehe ich Deine zweite Post,
irgendwie hat aber auch nur mit Funktionsaustausch geklappt!
********************
es fehlt nur noch eine Kleinigkeit zum vollen Glück...
was meinst Du: wäre es möglich das script so umzubauen, dass die Struktur auch erhalten bleibt Mein Traum wäre dein script auf der obersten Ebene abzufeuern und danach auch den ursprünglichen Strukturbaum zu haben..

Ich möchte Dich keineswegs zur zusäzlichen Arbeit animieren
Du hast mir jetzt schon ganz schön geholfen, möchte aber Deine Meinung dazu hören.
Ich würde dann auch mit unserem IT Chef sprechen, vielleicht wäre es möglich Dir deinen zeitaufwand finanziell zu entschädigen.
Auf jeden Fall jetzt schon vielen, vielen Dank!
Peter