PDA

Voir la version complète : python : accéder aux préférences de Cinema4D



oli_d
24/11/2014, 17h34
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 ?

valkaari
24/11/2014, 18h56
t'as essayé avec GetWorldContainerInstance() ?

oli_d
24/11/2014, 20h56
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 (http://frenchcinema4d.fr/showthread.php?77996-Modifier-les-param%E8tres-d-import-export) 3 lignes plus bas (oui je sais j'aurais pu faire une recherche avant :icon_wip: ). J'ai pas tout compris mais j'm'en va tester

oli_d
24/11/2014, 22h21
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 :


import c4d
from c4d import plugins

def main():
plugs = plugins.FilterPluginList(c4d.PLUGINTYPE_SCENELOADE R, True)
for plug in plugs:
print plug.GetName(), '-', plug.GetID()

if __name__=='__main__':
main()

Je trouve l'id 1001037 pour 3ds

Si je fouille les sous containers pour trouver le bon ...

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()

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().

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 ...

valkaari
25/11/2014, 00h22
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)




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

valkaari
25/11/2014, 01h39
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



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(

oli_d
25/11/2014, 07h22
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 :icon_wip:)

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 ...

valkaari
26/11/2014, 01h49
cool :D

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 ...)




"""
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()

oli_d
26/11/2014, 07h31
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.



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()

César Vonc
26/11/2014, 08h34
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.

valkaari
26/11/2014, 14h16
ç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 ^^')

oli_d
26/11/2014, 15h40
Merci pour les tests, donc j'abandonne en attendant que mes étudiants aient la r16 ....



on retrouve bien les résultats des tests de yann :)

Je me sens un peu boulet, là .... :whistling:

valkaari
26/11/2014, 17h49
on retrouve bien les résultats des tests de yann :)



Merci pour les tests, donc j'abandonne en attendant que mes étudiants aient la r16 ....


Je me sens un peu boulet, là .... :whistling:

les tests de yann et de césar