Bonjour,
Est-ce qu'un pythonneur fou connaitrait la formule magique pour accéder aux préférence générales de Cinema4D. J'ai un script qui traite différents fichiers 3DS et j'aimerais mettre systématiquement les options d'importation en mètre.
Est-ce possible ?
t'as essayé avec GetWorldContainerInstance() ?
Merci Val, cela me sera aussi utile, mais pour mon problème de paramètres d'import 3Ds (je sais la question était mal posée ) je viens de voir le post de César 3 lignes plus bas (oui je sais j'aurais pu faire une recherche avant ). J'ai pas tout compris mais j'm'en va tester
Bon ça m'a l'air bien pourri tout ça, si je lance le script qui me permet de retrouver les id des plugins d'import :
Je trouve l'id 1001037 pour 3dsCode:import c4d from c4d import plugins def main(): plugs = plugins.FilterPluginList(c4d.PLUGINTYPE_SCENELOADER, True) for plug in plugs: print plug.GetName(), '-', plug.GetID() if __name__=='__main__': main()
Si je fouille les sous containers pour trouver le bon ...
J'obtiens bien un tuple (1.0, 3) qui correspond à l'échelle et à l'unité. Mais j'ai beau essayer de le modifier directement dans l'interface il me donne toujours la même chose. C'est exactement la même chose si je passe par GetWorldPluginData().Code:import c4d def main(): for i,data in c4d.GetWorldContainer(): if type(data) == c4d.BaseContainer: for i2,val in data: if i2 == 1001037: print val[c4d.F3DSIMPORTFILTER_SCALE].GetUnitScale() if __name__=='__main__': main()
Si c'est effectivement impossible de le modifier, j'aimerais au minimum pouvoir vérifier que l'unité d'import du format 3ds est bien en mètres ...
j'ai cherché la fonction c4d.plugins.GetWorldPluginData dans l'aide python
dans la description il y a un script pour l'export d'alembic (une traduction de l'exemple en c++ que l'on retrouve dans le post de césar)
par contre j'ai l'ID 1001038 pour le plug. je retrouves les data correspondant à l'export.
le getUnitScale te donne les deux valeurs, réel et l'entier de la liste déroulante.
En r16 ça a l'air de fonctionner en tout cas (ce qui était pas le cas en r15)
Code:import c4d from c4d import documents, plugins, storage def main(): plug = plugins.FindPlugin(1001038, c4d.PLUGINTYPE_SCENESAVER) if plug is None: return op = {} # Send MSG_RETRIEVEPRIVATEDATA to Alembic export plugin if plug.Message(c4d.MSG_RETRIEVEPRIVATEDATA, op): print op if "imexporter" not in op: return # BaseList2D object stored in "imexporter" key hold the settings abcExport = op["imexporter"] if abcExport is None: return print abcExport[c4d.F3DSEXPORTFILTER_SCALE].GetUnitScale() print abcExport[c4d.F3DSEXPORTFILTER_GROUP] if __name__=='__main__': main()
edit :
j'aurais bien poussé les tests un peu plus loin mais je reprends la prog là, j'ai peur de me froisser un muscle T.T
Dernière modification par valkaari ; 25/11/2014 à 00h24.
le code, c'est comme le vélo, quand t'en fait pas pendant longtemps t'as mal au cul quand tu reprends.
Je comprends pas trop la fonction pour merge le document.
Bref ça fonctionnouille en r16. (j'ai pas dépassé le test du fichier 3DS avec uniquement un cube dedans sans autre info)
(j'ai confondu pendant un moment le load et le export, donc un mauvais ID de plugin et tout et tout bref T.T)
je passe par une variable intermédiaire pour utiliser la fonction SetUnitScale, directement ça fonctionne pas T.T
Code:import c4d,os from c4d import documents, plugins, storage def main(): # Get 3DS Import plugin, 1001037 is its ID plug = plugins.FindPlugin(1001037, c4d.PLUGINTYPE_SCENELOADER) if plug is None: return # Get a path to open the files filePath = storage.LoadDialog( title="Select Directory", flags=c4d.FILESELECT_DIRECTORY, force_suffix="abc") if filePath is None: return # op = {} if plug.Message(c4d.MSG_RETRIEVEPRIVATEDATA, op): if "imexporter" not in op: return # BaseList2D object stored in "imexporter" key hold the settings abcExport = op["imexporter"] if abcExport is None: return # Change Alembic export settings scale = abcExport[c4d.F3DSIMPORTFILTER_SCALE] scale.SetUnitScale(0.5,3) abcExport[c4d.F3DSIMPORTFILTER_SCALE] = scale abcExport[c4d.F3DSIMPORTFILTER_RENAMETEXTURES] = True abcExport[c4d.F3DSIMPORTFILTER_TEXTURESUFFIX] = "tata" dirList=os.listdir(filePath) for fname in dirList: if os.path.splitext(fname)[1] == '.3ds': if (c4d.documents.MergeDocument(doc, os.path.join(filePath, fname),c4d.SCENEFILTER_OBJECTS)): continue else: print "error while loading files fuck shit !!!" break c4d.EventAdd() if __name__=='__main__': main(
Dernière modification par valkaari ; 25/11/2014 à 01h42.
Merci, merci , merci, ça marche en r14, r 15 et r16. J'étais un peu fatigué (et énervé) et je n'ai pas pensé pouvoir utiliser Message ailleurs que dans un plugin (pourtant César montrait un exemple plus bas dans son post )
C'est quand même un peu tordu toutes ces lignes de code pour pouvoir modifier un seul paramètre.
Encore merci d'avoir pris le temps, t'as beau avoir mal au cul tu as encore un sacré coup de pédale ! Je te dois au moins une barrique de cervoise tiède ...
Dernière modification par oli_d ; 25/11/2014 à 07h25.
cool
tant qu'on y est je mets l'exemple de la doc comme je disais plus haut pour l'export de donnée
Comme ça on a deux exemple pour l'export et l'import.
(tu me dira c'est pas forcement le plus hard de passer de l'un à l'autre. bien que ...)
Code:""" Export Settings Example This example shows how to change an exporter settings. This works also for importers/scene loaders. """ import c4d from c4d import documents, plugins, storage def main(): # Get Alembic export plugin, 1028082 is its ID plug = plugins.FindPlugin(1028082, c4d.PLUGINTYPE_SCENESAVER) if plug is None: return # Get a path to save the exported file filePath = storage.LoadDialog(title="Save File for Alembic Export", flags=c4d.FILESELECT_SAVE, force_suffix="abc") if filePath is None: return op = {} # Send MSG_RETRIEVEPRIVATEDATA to Alembic export plugin if plug.Message(c4d.MSG_RETRIEVEPRIVATEDATA, op): print op if "imexporter" not in op: return # BaseList2D object stored in "imexporter" key hold the settings abcExport = op["imexporter"] if abcExport is None: return # Change Alembic export settings abcExport[c4d.ABCEXPORT_SELECTION_ONLY] = True abcExport[c4d.ABCEXPORT_PARTICLES] = True abcExport[c4d.ABCEXPORT_PARTICLE_GEOMETRY] = True # Finally export the document if documents.SaveDocument(doc, filePath, c4d.SAVEDOCUMENTFLAGS_DONTADDTORECENTLIST, 1028082): print "Document successfully exported to:" print filePath else: print "Export failed!" if __name__=='__main__': main()
C'est à devenir fou cette histoire, tout marchait bien sur mon mac avec OSX 10.9.4, je teste sur PC : marche pas. Je me dis c'est la faute à Bill Gates, je me remets sur un MAC avec OSX 10.6.8 marche pas non plus, sur r14,r15 (r16 tourne pas sur 10.6).
Est-ce que quelqu'un pourrait confirmer qu ce n'est pas à cause de mon signe du zodiaque (gémeau ascendant balance) que tout foire. Coller ce bout de script dans le gestionnaire de script, éxécuter et ouvrir la console, si ça marque 'ok' c'est que ça devrait marcher et si ça marque "pas de data pour l'import 3Ds", c'est foireux.
Code:import c4d def main(): plug = c4d.plugins.FindPlugin(1001037, c4d.PLUGINTYPE_SCENELOADER) if plug is None: print "pas de module d'import 3DS" return op = {} if plug.Message(c4d.MSG_RETRIEVEPRIVATEDATA, op): import_data = op.get("imexporter",None) if not import_data: print "pas de data pour l'import 3Ds" return # Change 3DS import settings scale = import_data[c4d.F3DSIMPORTFILTER_SCALE] scale.SetUnitScale(1,c4d.DOCUMENT_UNIT_M) import_data[c4d.F3DSIMPORTFILTER_SCALE] = scale print 'ok' if __name__=='__main__': main()
En R16 sous Win 7, ça semble bien fonctionner !
Par contre en R15 sous Win, ça foire, op est toujours vide, comme dans mes précédents essais de l'autre sujet.
Dernière modification par César Vonc ; 26/11/2014 à 08h41.
ça m'étonnais que ça fonctionne sur les versions précédente
sur osx 10.9.5
R16.027 --> ok
R15.064 --> ok
R14.042 --> ok
R13.061 --> pas de data, l'op reste vide
windows 7 (j'ai profité de faire des mises à jours pour tester pleins de versions)
14.014 --> pas de data
14.041 --> ok
14.042 --> ok
13.058 --> pas de data
13.061 --> pas de data
12.043 --> me dit d'aller me faire mettre avec mon vieux truc !!!
windows 10 :
R16.027 --> ok
on retrouve bien les résultats des tests de yann
(j'ai pas de r15 sous windows moi tient ^^')