- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
Hallo Zusammen
Beim Umwandeln von einem Asset zum Arnold Legacy Material erhalte ich eine Bitmapnode welche ich alle sehr aufwendig zu image nodes umwandeln muss da ich im ACES Farbraum arbeite.
Nun habe ich versucht per Pyton ein script zu schreiben welches erstens:
das Standardmaterial mit Shader und Viewport Port verknüpft und den bitmapnode mit dem Imagenode austauschen soll.
Leider scheint das nicht zu klappen.
Hier das Script mit Versionsprüfung:
import c4d
import os
import sys
# Fügt das Skriptverzeichnis zum Systempfad hinzu
scripts_folder = "C:\\Program Files\\Maxon Cinema 4D 2023\\library\\scripts\\arnold"
if scripts_folder not in sys.path:
sys.path.append(scripts_folder)
# Importiert die spezifischen Arnold-Module
import arnold.util as arnold_util
import arnold
ARNOLD_SCENE_HOOK = 1032309
C4DTOA_MSG_TYPE = 1000
C4DTOA_MSG_GET_VERSION = 1040
C4DTOA_MSG_RESP1 = 2011
C4DTOA_MSG_RESP2 = 2012
C4DTOA_MSG_RESP3 = 2013
def GetC4DtoAVersion():
arnoldSceneHook = doc.FindSceneHook(ARNOLD_SCENE_HOOK)
if arnoldSceneHook is None:
return ""
msg = c4d.BaseContainer()
msg.SetInt32(C4DTOA_MSG_TYPE, C4DTOA_MSG_GET_VERSION)
arnoldSceneHook.Message(c4d.MSG_BASECONTAINER, msg)
return msg.GetString(C4DTOA_MSG_RESP1)
def GetC4DtoAVersionNum():
arnoldSceneHook = doc.FindSceneHook(ARNOLD_SCENE_HOOK)
if arnoldSceneHook is None:
return ""
msg = c4d.BaseContainer()
msg.SetInt32(C4DTOA_MSG_TYPE, C4DTOA_MSG_GET_VERSION)
arnoldSceneHook.Message(c4d.MSG_BASECONTAINER, msg)
arch = msg.GetInt32(3000)
major = msg.GetInt32(3001)
minor = msg.GetInt32(3002)
fix = msg.GetInt32(3003)
dev = msg.GetString(3004)
return (arch, major, minor, fix, dev)
def GetArnoldVersion():
arnoldSceneHook = doc.FindSceneHook(ARNOLD_SCENE_HOOK)
if arnoldSceneHook is None:
return ""
msg = c4d.BaseContainer()
msg.SetInt32(C4DTOA_MSG_TYPE, C4DTOA_MSG_GET_VERSION)
arnoldSceneHook.Message(c4d.MSG_BASECONTAINER, msg)
return msg.GetString(C4DTOA_MSG_RESP2)
def GetArnoldVersionNum():
arnoldSceneHook = doc.FindSceneHook(ARNOLD_SCENE_HOOK)
if arnoldSceneHook is None:
return ""
msg = c4d.BaseContainer()
msg.SetInt32(C4DTOA_MSG_TYPE, C4DTOA_MSG_GET_VERSION)
arnoldSceneHook.Message(c4d.MSG_BASECONTAINER, msg)
arch = msg.GetInt32(4000)
major = msg.GetInt32(4001)
minor = msg.GetInt32(4002)
fix = msg.GetString(4003)
return (arch, major, minor, fix)
def main():
print("C4DtoA version:", GetC4DtoAVersion())
print("C4DtoA version num:", GetC4DtoAVersionNum())
print("Arnold version:", GetArnoldVersion())
print("Arnold version num:", GetArnoldVersionNum())
# Durchläuft alle Materialien im Material-Manager
for mat in doc.GetMaterials():
# Bearbeitet das Material
edit_material(mat)
def edit_material(mat):
# Sucht nach dem Hauptknoten (main)
main_node = mat[arnold.C4DAIN_MATERIAL_MAIN]
# Verbindet den Hauptknoten (main) mit dem Arnold-Viewport und dem Arnold-Shader-Port
mat[arnold.C4DAI_VIEWPORT].SetLink(main_node)
mat[arnold.C4DAI_SHADER_PORT].SetLink(main_node)
# Ersetzt alle Bitmap-Knoten durch Image-Knoten
replace_bitmap_with_image(mat)
def replace_bitmap_with_image(mat):
# Durchläuft alle Knoten
for node in mat.GetNodes():
# Wenn der Knoten ein Bitmap-Knoten ist
if node.GetType() == arnold.C4DAI_BITMAP:
# Erstellt einen neuen Image-Knoten
image_node = arnold.AiNode("image")
# Kopiert den Dateipfad von der Bitmap zum Image-Knoten
image_node[arnold.C4DAI_IMAGE_FILENAME] = node[arnold.C4DAI_BITMAP_FILENAME]
# Ersetzt den Bitmap-Knoten durch den Image-Knoten
mat.ReplaceNode(node, image_node)
# Verbindet den Image-Knoten mit den entsprechenden Ports im Hauptknoten
node_master = mat.GetNodeMaster()
connections = node_master.GetConnections(node)
for conn in connections:
input_port_id = conn.GetInputID()
image_node.ConnectTo(main_node, input_port_id)
# Führt die Hauptfunktion aus
if __name__ == '__main__':
main()
Fehlermeldung:
C4DtoA version: 4.6.3
C4DtoA version num: (4, 6, 3, 0, '')
Arnold version: 7.2.2.0
Arnold version num: (7, 2, 2, '0')
Traceback (most recent call last):
File "C:\Users\MarcVock\Desktop\Materialexch.py", line 119, in <module>
main()
File "C:\Users\MarcVock\Desktop\Materialexch.py", line 83, in main
edit_material(mat)
File "C:\Users\MarcVock\Desktop\Materialexch.py", line 87, in edit_material
main_node = mat[arnold.C4DAIN_MATERIAL_MAIN]
AttributeError: module 'arnold' has no attribute 'C4DAIN_MATERIAL_MAIN'
Evtl. reicht es aber auch, wenn ich in der Bitmapnode den Hacken bei " Use custom color Space" setze?
Das wäre super und wenns dafür noch ein script gibt noch besser.
Danke für die Hilfe
Solved! Go to Solution.