CINEMA 4D - forum Strona Główna
forum.c4d-pl.org
Forum użytkowników pakietu Maxon Cinema 4D


Poprzedni temat «» Następny temat
Operacje na obiektach w Pythonie i export do OBJ
Autor Wiadomość
macsurf78 

Dołączył: 05 Maj 2012
Posty: 110
Skąd: Kołobrzeg
Wysłany: 2017-06-30, 19:34   Operacje na obiektach w Pythonie i export do OBJ

Z uwagi na to iż dokumentacja dotycząca skryptowania w C4D wykorzystując Pythona jest najdelikatniej mówiąc zrobiona na odwal się a i w sieci znalezienie nawet czegoś podstawowego graniczy z cudem to mam pytanie odnośnie zrobienia kilku operacji:

1. Zaznaczyć wszystkie obiekty MographCloner i przekonwertować je na edytowalne
2. Po konwersji zaznaczenie wszystkich obiektów i scalenie je w jeden ( Connect Objects + Delete )
3. Optymalizacja wybranych obiektów edytowalnych ( Optimize z 1.8cm )
4. Skasowanie wszystkich obiektów, które są ukryte
5. Export do OBJ

Choć najważniejsze są 4 punkty bo później to mogę sobie już ręcznie wyeksportować.

[ Dodano: 2017-07-02, 14:44 ]
Napisałem część skryptu, niestety problem jest, że connect objects+delete powoduje, że nie ma następnej itereacji w rekurencji. A to dlatego, iż wcześniej zaznaczone są wszystkie childrensy obiektu wraz z samym obiektem. Niestety nie udało mi się deaktywować selekcję samego rodzica bo to zapewne rozwiązało by problem.



Kod:

import c4d

bc = c4d.BaseContainer()
i = 0

def recursiveObj(obj, callback):
    global i
    while obj:
        if(isinstance(obj, (c4d.BaseObject)) == False):
            print 'This is not instance of BaseObject'
            return 0
        #print obj
        i = i+1
        print i
        callback(obj)
        recursiveObj(obj.GetDown(), callback)
        obj = obj.GetNext()


def experiment(obj):
    print obj
    if(obj.GetType() == 1018544):
        doc.SetActiveObject(obj)
        c4d.CallCommand(100004768, 100004768) # Select Children
        c4d.CallCommand(12236) # Make Editable
        c4d.CallCommand(100004767) # Deselect All
        obj.SetBit(c4d.BIT_ACTIVE)
        c4d.CallCommand(100004768, 100004768) # Select Children
        c4d.Deselect()
        c4d.CallCommand(16768, 16768) # Connect Objects + Delete

    c4d.EventAdd()
   

def convertToExport(obj):
    global bc
    #objList = ['Door Tubes', 'Tubes', 'Screws']
    #for o in objList:
    #doc.SetActiveObject(obj)
    print 'type of object: ' + str(obj.GetType())
    if(obj.GetType() == 1018544):    # Only Mograph Object Conversion
        #doc.SetActiveObject(obj)
        print 'Convert: ' + obj.GetName()
        print obj
        c4d.CallCommand(100004768, 100004768) # Select Children
        c4d.CallCommand(12236) # Make Editable
        c4d.CallCommand(100004768, 100004768) # Select Children
        c4d.CallCommand(16768, 16768) # Connect Objects + Delete
        if(obj.GetName() == 'Door Tubes'):
            bc.SetData(c4d.MDATA_OPTIMIZE_TOLERANCE, 1.8)
        c4d.CallCommand(12139) # Points
        c4d.CallCommand(13323, 13323) # Select All
        c4d.CallCommand(14039, 14039) # Optimize...
        bc.SetData(c4d.MDATA_OPTIMIZE_TOLERANCE, 0.01)
        return True
    return False
       
   

           

def main():
   
    #obj = doc.SearchObject('Cloner')

    recursiveObj(doc.GetFirstObject(), experiment)
    #c4d.CallCommand(60000, 9) # Export Filter
    return 0

   
   
   

if __name__=='__main__':
    main()



[ Dodano: 2017-07-02, 21:40 ]
OK udało się rozwiązać problem poprzez usunięcie selecji rodzica poprzez metodę doc.SetActiveObject(obj, c4d.SELECTION_SUB). A tu poprawkony kod:

Kod:
import c4d

bc = c4d.BaseContainer()


def recursiveObj(obj, callback):
    while obj:
        if(isinstance(obj, (c4d.BaseObject)) == False):
            print 'This is not instance of BaseObject'
            return 0
        #print obj
        callback(obj)
        recursiveObj(obj.GetDown(), callback)
        obj = obj.GetNext()


def experiment(obj):
    if(obj.GetType() == 1018544):
        doc.SetActiveObject(obj)
        #c4d.CallCommand(100004767) # Deselect All
        c4d.CallCommand(100004768, 100004768) # Select Children
        c4d.CallCommand(12236) # Make Editable
        #obj.SetBit(c4d.BIT_ACTIVE)
        c4d.CallCommand(100004768, 100004768) # Select Children
        doc.SetActiveObject(obj, c4d.SELECTION_SUB) # Deselect Active Object
        c4d.CallCommand(16768, 16768) # Connect Objects + Delete
   
    c4d.EventAdd()
  
 
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Nie możesz ściągać załączników na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group