ERLEDIGT
NEIN
NEIN
ANTWORTEN
12
12
ZUGRIFFE
1100
1100
EMPFEHLEN
-
08.03.05 08:52 #1
- Registriert seit
- Feb 2005
- Beiträge
- 31
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
-
08.03.05 16:55 #2styko Tutorials.de Gastzugang
Mit COFFEE geht das sicher ganz komfortabel, hab mich auch gleich mal hingesetzt und bin noch am Tüfteln

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.
-
09.03.05 08:49 #3
- Registriert seit
- Feb 2005
- Beiträge
- 31
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
-
09.03.05 14:00 #4styko Tutorials.de Gastzugang
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.
-
09.03.05 15:55 #5
- Registriert seit
- Feb 2005
- Beiträge
- 31
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
-
09.03.05 18:21 #6styko Tutorials.de Gastzugang
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...
-
10.03.05 07:54 #7
- Registriert seit
- Feb 2005
- Beiträge
- 31
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...72188&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
-
10.03.05 16:07 #8
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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
// 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); } }... bitte keine C4D-Fragen per PN ...
+++ OUT NOW for CINEMA4D: Al'em - Free Align Plugin + Shaderpack Vol 1 - Free Shaders + Roll-It v1.0 - Free Roll Plugin + Egg-Objekt - Free Egg Primitive +++
eggtion.net
-
10.03.05 21:06 #9
- Registriert seit
- Feb 2005
- Beiträge
- 31
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
-
11.03.05 09:16 #10
- Registriert seit
- Feb 2005
- Beiträge
- 31
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
-
11.03.05 14:10 #11
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:
...einfach komplette Funktion ersetzen, überschreiben (auch, wenn eigentlich ja nur eine if-Anweisung hinzu kamCode :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
// 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); }
).
Liebe Grüße,
Mark.... bitte keine C4D-Fragen per PN ...
+++ OUT NOW for CINEMA4D: Al'em - Free Align Plugin + Shaderpack Vol 1 - Free Shaders + Roll-It v1.0 - Free Roll Plugin + Egg-Objekt - Free Egg Primitive +++
eggtion.net
-
11.03.05 14:16 #12
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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
// 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); } }... bitte keine C4D-Fragen per PN ...
+++ OUT NOW for CINEMA4D: Al'em - Free Align Plugin + Shaderpack Vol 1 - Free Shaders + Roll-It v1.0 - Free Roll Plugin + Egg-Objekt - Free Egg Primitive +++
eggtion.net
-
11.03.05 16:05 #13
- Registriert seit
- Feb 2005
- Beiträge
- 31
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
Ähnliche Themen
-
Workflow Language
Von woody100 im Forum XML TechnologienAntworten: 1Letzter Beitrag: 05.12.08, 16:29 -
Ist der Workflow richtig?
Von Zyberion im Forum Videoschnitt, Videotechnik & -produktionAntworten: 8Letzter Beitrag: 08.02.06, 02:23 -
Workflow Boole
Von MeJa im Forum Cinema 4DAntworten: 3Letzter Beitrag: 15.11.04, 14:09





Zitieren

Login







Cinema 4D Tutorial - Ketten erstellen mit Cinema 4D (R11.5)