tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
12
ZUGRIFFE
1100
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    onepeterpan onepeterpan ist offline Mitglied Bronze
    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
     

  2. #2
    styko 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.
     

  3. #3
    onepeterpan onepeterpan ist offline Mitglied Bronze
    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
     

  4. #4
    styko 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.
     

  5. #5
    onepeterpan onepeterpan ist offline Mitglied Bronze
    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
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken Workflow automatisieren-struktur.gif  
     

  6. #6
    styko 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...
     

  7. #7
    onepeterpan onepeterpan ist offline Mitglied Bronze
    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
     

  8. #8
    Avatar von Mark
    Mark Mark ist offline Mod | Cinema4D
    tutorials.de Moderator
    Registriert seit
    Aug 2003
    Ort
    Vienna:Austria
    Beiträge
    8.123
    Blog-Einträge
    10
    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

  9. #9
    onepeterpan onepeterpan ist offline Mitglied Bronze
    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
     

  10. #10
    onepeterpan onepeterpan ist offline Mitglied Bronze
    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. #11
    Avatar von Mark
    Mark Mark ist offline Mod | Cinema4D
    tutorials.de Moderator
    Registriert seit
    Aug 2003
    Ort
    Vienna:Austria
    Beiträge
    8.123
    Blog-Einträge
    10
    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 :
    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);
    }
    ...einfach komplette Funktion ersetzen, überschreiben (auch, wenn eigentlich ja nur eine if-Anweisung hinzu kam ).
    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

  12. #12
    Avatar von Mark
    Mark Mark ist offline Mod | Cinema4D
    tutorials.de Moderator
    Registriert seit
    Aug 2003
    Ort
    Vienna:Austria
    Beiträge
    8.123
    Blog-Einträge
    10
    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

  13. #13
    onepeterpan onepeterpan ist offline Mitglied Bronze
    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

  1. Workflow Language
    Von woody100 im Forum XML Technologien
    Antworten: 1
    Letzter Beitrag: 05.12.08, 16:29
  2. Ist der Workflow richtig?
    Von Zyberion im Forum Videoschnitt, Videotechnik & -produktion
    Antworten: 8
    Letzter Beitrag: 08.02.06, 02:23
  3. Workflow Boole
    Von MeJa im Forum Cinema 4D
    Antworten: 3
    Letzter Beitrag: 15.11.04, 14:09

Stichworte