Workflow automatisieren

onepeterpan

Mitglied
Hallo zusammen,
ich arbeite viel mit aus der CAD importieren Daten. Das sind meistens sehr umfangreiche Datensätze mit vielen Einzelteilen die ich als vrml einlese.
Nach dem Importieren habe ich im Objekte Browser z.B. ein Strukturbaum der aus z.B. 100 Objekten besteht die den Einzelteilen (wie Schrauben, Muttern, etc.) entsprechen.
Diese Objekte bestehen wieder aus vielen Polygon-Objekten.
Meine Vorgehensweise ist dabei:
-ich klicke mit dem Auswahlpfeil auf das Teil im Ansichtfenster
-im Objekte Fenster lasse ich über Objekte/Aktives Objekt suchen das angewähte Polygon-Objekt suchen
-dann gehe ich in Strukturbaum zu übergeordnetem Objekt (das einem Einzelteil entspricht)
-mit "Unterobjekte auswählen" wähle ich alle untergeordnete Polygon-Objekte an
-ich verbine sie mir "verbinden"
-das neue, "verbundene" Objekt erscheint oben im Strukturbaum, ich lösche das alte
-ich wähle das neue, "verbundene" Objekt, optimiere es über Struktur/Optimieren und Struktur/Normalen ausrichten

Ihr könnt Euch vorstellen wie viele Stunden ich dafür brauche bei einem Datensatz mit 100, 200 oder noch mehr Teilen... :(

Kann man diesen Vorgang vereinfachen, automatisieren oder irgendwie anders (schneller..) machen

Gruß an alle
Peter
 
S

styko

Mit COFFEE geht das sicher ganz komfortabel, hab mich auch gleich mal hingesetzt und bin noch am Tüfteln :D

Frage: Wie viele Hierarchieebenen hat deine Szene? Nur zum Bleistift:
Schraube
-Kopf
-Gewinde
Mutter
-Gewinde
-Kopf

oder noch mehr?

Ich hab bis jetzt eine Expression zusammengebracht, die dir das übergeordnete Objekt des ausgewählten anzeigt. Theoretisch müsste man dann nur noch die Unterobjeke auswählen, Verbinden, nach dem alten Objekt suchen, Löschen, das neue Suchen, und Optimieren + Normalen ausrichten.... Dann müsste man halt auf jedes unterobjekt draufklicken, aber das is ja nich soo tragisch. Mein Problem ist nur, ich finde keine Funktionen fürs Auswählen, Optimieren.....

Wenn mir jemand diese Funktionen sagen kann, wär ich sehr dankbar und sicher auch bereit, so eine Expression zu machen.
 

onepeterpan

Mitglied
Es sind schon ein paar Ebenen, auch wenn noch relativ übersichtlich z.B.:

-Gesammtumfang
- - Teilumfang 1
- - - Teilumfang 11
- - - - Teilumfang 111
- - - - -einzelne Polygonobjekte

Auf jeder Ebene unter dem "Gesammtumfang" gibt es natürlich mehrere, parallele Teilumfänge.
Letzte Woche habe ich z.B. eine Hinterachshälfte als vrml bekommen und war den ganzen, vollen Tag damit beschäftigt nur zu optimieren, verbinden, strukturieren...

Ich selbst kann nicht programieren, also für mich käme nur eine fertige Lösung in Frage - falls es sowas gibt ;)
 
S

styko

Wie gesagt, ich würd dir echt gerne nen Plugin bzw nen COFFEE Script schreiben, mir fehlen nur leider die Befehle für:
1. Objekte löschen
2. Objekte verbinden

Wenn ich dich richtig verstanden habe, willst du jeweils nur Polygonobjekte aus 2 Hierarchieebenen zusammenfassen?

-Gesammtumfang
- - Teilumfang 1
- - - Teilumfang 11
- - - - Teilumfang 111
- - - - -einzelne Polygonobjekte

Da also z.B. nur das:
- - - - Teilumfang 111
- - - - -einzelne Polygonobjekte

oder alles? Poste doch mal nen Screenshot deines Objektmanagers mit einem konkreten Beispiel, welche Objekte du zusammenfassen willst.
 

onepeterpan

Mitglied
Ich hänge ein screenshot dran.
Also, optimal wäre, wenn ich in der oberen Ebene, wie im screenshot: "Kraftstoffsystem" sagen könnte: gehe den ganzen Strukturbaum durch und mache folgendes:
in jedem untersten Knoten, wie z.B. in meinem screenshot "_1A76E738" verbinde alle Polygon-Objekte zu einem Objekt (kann auch "_1A76E738" bleiben), optimiere und richte die Normalen aus. Die einzelnen Polygon-Objekte können dann gelöscht werden.
Diese untersten Knoten, wie eben "_1A76E738" entprechen nähmlich (meistens) den kleinsten Einzelteilen wie eine Mutter, Bolzen oder auch den Solids bei komplizierteren Teilen.
Ist sowas machbar?

Kann das jemand machen...?

Gruß
Peter
 

Anhänge

  • Struktur.gif
    Struktur.gif
    16,8 KB · Aufrufe: 122
S

styko

Ich denke schon, mir fehlen nur die Befehle. Ich würde ein Programm schreiben, dass sich von Anfang an in die unterste Hierarchieebene vorarbeitet, dann einen Schritt hochgeht (das müsste ja dann ein Nullobjekt sein), Unterobjekte auswählt, verbindet, löscht, optimiert, Normalen ausrichtet.
Ich wurschtel mich dann nochmal durch die COFFEE Referenz durch und schau ob ich was find...
 

onepeterpan

Mitglied
hallo Stykolai,
es wäre echt super, wenn Du es schaffen würdest!
Ich habe das selbe Thema noch mal auf c4D-Treff Forum unter:
http://c4dtreff.de/c4dforum/read.php?f=3&i=172188&t=172188
gepostet.
Es kam etwas mehr feedback, aber auch keine echte Lösung...
Es wundert mich ein wenig, da ich bestimmt nicht der einzige bin der grössere Datensätze aus CAD als VRML bekommt.
Wegen der fehlenden Befehle kannst Du vielleicht bei Maxon Support direkt nachfragen, ich könnte das auch machen, wenn Du möchtest.
Viele Grüße
 

Mark

Cinema4D
Hi!

Weiß nicht, ob's noch gebraucht wird, aber "interessant" ist es allemal ;)

Anbei Coffee-Script, welches sich durch die komplette Hierarchie - ab dem Coffee-Tag "Träger-Objekt" - hangelt. Bei Auffinden von Polygonobjekten einer Hierarchie, werden diese in einem neuen Polygonobjekt "zusammengefasst": das neue PolygonObjekt trägt den Namen des übergeordneten (Null-)Objekts. Alle "gefundenen Objekte" werden unterhalb des Null-Objekts "Collection" (wird vom Script erzeugt) gesammelt (Script läuft nur, wenn "Collection" nicht existiert).
Anm. bzgl. "Verbinden": es wird ein neues Polygon-Objekt auf (0/0/0) erzeugt und die Punkte und Polygone der Objekte einer Hierarchie dahineinkopiert: Tags o.ä. gehen dabei natürlich verloren...
Diese "Art" des "Verbindens" und auch das Script selbst sind sicher nicht optimal, also wie immer:
Nutzung auf eigene Gefahr, übernehme keine Haftung für garnix :)
(die Arbeitsschritte "Optimieren" und "Normalen ausrichten" müssen "händisch" durchgeführt werden, funktionieren aber ja auch bei einer "Mehrfachauswahl" ;) )

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)) {
   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)) {
   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
Mark,
das hört sich alles sehr gut an!
Ich werde mich gleich morgen damit beschäftigen, hoffentlich komme ich weiter, da bisher bedeute für mich Coffee nur mein Morgengetränk ;)
Danke!
Peter
 

onepeterpan

Mitglied
Das skript funktioniert... - teilweise :-(
es geht ungefähr die Hälfte des Strukturbaums durch und verbindet schön die einzelnen Polygonobjekte zu übergeordneten Objekten, eigentlich wie gewünscht...
Auch wenn es Sinn macht nur bei flachen Hierarchien.
Leider macht es die andere Hälfte nicht, unten im Expression-Editor steht:
Zeile 27, Pos.1
Incompatible values... INTEGER/NIL

Schade, dass ich nicht programmieren kann, man könnte es bestimmt ziemlich leicht verbessern...

Trotzdem Vielen Dank!
Peter