• How can I make a simple input form for my Python script?

    Moved
    3
    0 Votes
    3 Posts
    1k Views
    ferdinandF
    Hello @delizade, thank you for reaching out to us. I am a bit confused when you say: I'm new about Python and Cinema 4D scripting. You have more than 20 postings in your account, asking Python questions which I would hardly classify as being new? Nonetheless, windows or 'input forms' are called dialogs in Cinema 4D and represented by the type c4d.gui.GeDialog. There is also another form of GUI definitions called descriptions, but they are tied to classic API nodes, e.g., a Cube object or a Noise shader. Dialogs can be modal and non-modal. In a 'Script [Manager script]' you are bound to modal dialogs, i.e., the user can only interact with the dialog until the dialog has been closed. We also have a series of GeDialog related example scripts on GitHub. I also provided a small example which probably does some things you want to do. Cheers, Ferdinand The result: [image: 1649416639788-simple_dialog.gif] The code: """Simple example for a custom dialog in Cinema 4D. The example will contain a file selection element and a button, as well as a multiline text box. Pressing the button will load the content of a selected file into the text box. Windows are represented by the class c4d.gui.GeDialog in Cinema 4D. There are two ways to define dialogs, programmatically, as shown here, or with the help of something which is called a resource file. Resource files work similarly to other GUI markups, as for example XAML for C# or QT-XML for QT. The dialog raised here is modal, i.e., the user must focus on the dialog. For async, i.e., non-modal dialogs you must write a plugin and cannot use a script (there are ways to wiggle around that restriction, but it is not recommended to do that.) For more information, see the Python and C++ documentation of Cinema 4D on dialogs and dialog ressources. """ import c4d import os class MyDialog(c4d.gui.GeDialog): """Defines a dialog. """ ID_TEXT = 1000 ID_CHECKBOX = 1001 ID_FILENAME = 1002 ID_MULTILINE = 1003 ID_BUTTON = 1004 ID_GROUP = 10000 def CreateLayout(self) -> bool: """Called by Cinema 4D to populate the dialog with gadgets. """ # Set the title of the dialog. self.SetTitle("My Dialog") # Open a container to put other elements into. self.GroupBegin(id=MyDialog.ID_GROUP, flags=c4d.BFH_SCALEFIT, cols=1) self.GroupSpace(spacex=5, spacey=5) # Add a text box and a check box. self.AddEditText(id=MyDialog.ID_TEXT, flags=c4d.BFH_SCALEFIT) self.AddCheckbox(id=MyDialog.ID_CHECKBOX, flags=c4d.BFH_SCALEFIT, initw=0, inith=0, name="Check") # A Filename, i.e., an interface to select a file is a bit more fringe and must be added # over its custom GUI. self.AddCustomGui(id=MyDialog.ID_FILENAME, pluginid=c4d.CUSTOMGUI_FILENAME, name="Path", flags=c4d.BFH_SCALEFIT, minw=0, minh=0, customdata=c4d.BaseContainer()) # Add text box spanning multiple lines (that is set to read only mode). self.AddMultiLineEditText(id=MyDialog.ID_MULTILINE, flags=c4d.BFH_SCALEFIT, inith=50, style=c4d.DR_MULTILINE_READONLY) # Add a button. self.AddButton(id=MyDialog.ID_BUTTON, flags=c4d.BFH_SCALEFIT, name="Run") # Close the lyaout group. self.GroupEnd() return super().CreateLayout() def InitValues(self) -> bool: """Called by Cinema 4D to initialize a layout. """ self.SetString(MyDialog.ID_TEXT, "Hello World!") self.SetBool(MyDialog.ID_CHECKBOX, True) self.SetFilename(MyDialog.ID_FILENAME, "") self.SetString(MyDialog.ID_MULTILINE, "") return super().InitValues() @staticmethod def ReadFile(filename: str) -> str: """Custom static function to read the content of a file into a string. """ if not os.path.exists(filename): raise OSError("Could not access file.") try: with open(filename, mode="rt") as f: return f.read() except Exception as e: raise OSError(f"Could not read access file {filename}.") def Command(self, mid: int, msg: c4d.BaseContainer) -> bool: """Called by Cinema 4D when the user interacts with one of the gadgets in the dialog. """ # The "Run" button has been pressed. if mid == MyDialog.ID_BUTTON: # Read the content of the file if it has been selected and put it into the multiline # text box, otherwise open an error dialog. filename = self.GetFilename(MyDialog.ID_FILENAME) if filename: self.SetString(MyDialog.ID_MULTILINE, MyDialog.ReadFile(filename)) else: c4d.gui.MessageDialog("Please select a file first.") return super().Command(mid, msg) def main(): """Opens the dialog. """ # Instantiate the dialog. dialog = MyDialog() # Open the dialog in modal mode, i.e., it will be the only thing the user can focus on. dialog.Open(dlgtype=c4d.DLG_TYPE_MODAL_RESIZEABLE, defaultw=400, xpos=-2, ypos=-2) if __name__=='__main__': main()
  • BaseTake AddTake

    c++ r20 sdk
    4
    1 Votes
    4 Posts
    1k Views
    J
    Thanks for the response Ferdinand, I thought that that would be the case. John Terenece
  • Child render setting does not inhertit from parent

    s24 python
    7
    2
    0 Votes
    7 Posts
    1k Views
    A
    Hi, I stumbled upon the same problem. The script from bonsak didn't solve the problem for me. But thanks to a tip I found a working solution. It is possible to make a parent-child setup. But you have to change the values in the parent settings after creating the child settings. import c4d from c4d import gui import redshift def main(): #Create main render setting rd = c4d.documents.RenderData() rd.SetName('render_group') rd[c4d.RDATA_RENDERENGINE] = redshift.VPrsrenderer rd_red = redshift.FindAddVideoPost(rd, redshift.VPrsrenderer) doc.InsertRenderData(rd) #Create child render setting child_setting = c4d.documents.RenderData() child_setting.SetName('child setting') child_setting[c4d.RDATA_RENDERENGINE] = redshift.VPrsrenderer doc.InsertRenderData(child_setting , rd) redshift.FindAddVideoPost(child_setting, redshift.VPrsrenderer) doc.InsertRenderData(child_setting , rd) #Change main render settings rd[c4d.RDATA_XRES] = 1920.0 rd[c4d.RDATA_YRES] = 1080.0 rd[c4d.RDATA_FRAMERATE] = 25.0 rd[c4d.RDATA_FORMAT] = 1023671 #PNG rd[c4d.RDATA_FORMATDEPTH] = 1 #depth 16bit #Change Redshift post effect rd_red[c4d.REDSHIFT_RENDERER_ENABLE_AUTOMATIC_SAMPLING] = 0 rd_red[c4d.REDSHIFT_RENDERER_UNIFIED_MIN_SAMPLES] = 32 rd_red[c4d.REDSHIFT_RENDERER_UNIFIED_MAX_SAMPLES] = 256 rd_red[c4d.REDSHIFT_RENDERER_MOTION_BLUR_ENABLED] = 1 rd_red[c4d.REDSHIFT_RENDERER_COLOR_MANAGEMENT_OCIO_VIEW] = 'Un-tone-mapped' if __name__=='__main__': main()
  • Discovering Channel Identifiers of a Substance Shader

    python r25
    1
    2
    3 Votes
    1 Posts
    305 Views
    No one has replied
  • Adding Node Descriptions Pragmatically

    c++ r25
    9
    0 Votes
    9 Posts
    2k Views
    O
    Thank you. I was getting a unique ID indeed but had declared it as a global (I don't know how I missed it after checking couple of times) and using it like that in the lambda function was causing the issue. All good now, thank you very much. Cheers, Ogers
  • Force 'Pause'/Wait when switching between Takes at Batch Render

    Moved
    9
    0 Votes
    9 Posts
    1k Views
    M
    H @tim97 , if you read the previous answers from Manuel, we were not able to reproduce the behavior, since you are looking for the solution I guess you have the same issue. Would it be possible for you to share a scene and a script? Thanks in advance, Cheers, Maxime.
  • 0 Votes
    4 Posts
    525 Views
    ferdinandF
    Dear community, this question has been answered by mail and is unfortunately not available for the public in its entirety. The core of the answer was: if node.GetName() == 'Base Color' and node.GetTypeName() == 'C4D Shader': # Import the new substance as an asset into the document. res, asset, _ = c4d.modules.substance.ImportSubstance( doc, substance_path, c4d.SUBSTANCE_IMPORT_COPY_NO, False, False, False) if res != c4d.SUBSTANCE_IMPORT_RESULT_SUCCESS: raise IOError(f"Could not load substance file: {substance_path}") # Create a shader for the substance asset. shader = c4d.modules.substance.CreateSubstanceShader(asset) if not isinstance(shader, c4d.BaseShader): raise MemoryError("Unable to allocate substance shader.") # Insert the new shader into the material and set the shader # as the shader of the C4D Shader node. material.InsertShader(shader) node[c4d.GV_REDSHIFT_BAKER_SHADER] = shader Cheers, Ferdinand
  • Message for closed documents?

    python r25
    9
    0 Votes
    9 Posts
    1k Views
    fwilleke80F
    Ah, damn, I forgot that Python doesn't have SceneHookData. Sorry.
  • How to select an Edge

    s22 python
    8
    1
    0 Votes
    8 Posts
    2k Views
    chuanzhenC
    @ferdinand Thanks your reply!
  • How to read JSON using Maxon API?

    c++
    5
    0 Votes
    5 Posts
    716 Views
    kbarK
    Works great, thanks again Manuel.
  • Bitmaps module missing from Auto Completion Dummy Package

    python r25 s24
    3
    1 Votes
    3 Posts
    715 Views
    H
    Ok, thanks for the confirmation. Already fixed it manually myself.
  • Creating shaders from PSD files

    python
    11
    1
    0 Votes
    11 Posts
    2k Views
    M
    Hi Been a few years now, any changes on this, I would love a script that iterated through a PSD file, create a material for each layer and set the Alphas for each layer
  • R21 c4dpy LoadFile always return False

    sdk python
    6
    2
    0 Votes
    6 Posts
    761 Views
    S
    @ferdinand wow, awesome. It works! thank you so much.
  • Object size not updated after points move

    python r25
    3
    0 Votes
    3 Posts
    721 Views
    P
    Well, that indeed fixed the issue, now the size gets properly updated! Thank you very much for the help
  • 0 Votes
    11 Posts
    2k Views
    ferdinandF
    Hello @pyxelrigger, without any further activity before Wednesday, the 16.03.2022, we will consider this topic as solved and remove the "unsolved" state from this topic. Thank you for your understanding, Ferdinand
  • Test "Lock Overrides" in Python

    python
    4
    0 Votes
    4 Posts
    710 Views
    ferdinandF
    Hello @danielsian, without any further activity before Wednesday, the 16.03.2022, we will consider this topic as solved and remove the "unsolved" state from this topic. Thank you for your understanding, Ferdinand
  • Strip Texture Path using Python

    python
    5
    0 Votes
    5 Posts
    930 Views
    ferdinandF
    Hello @djoneeeee, without any further activity before Wednesday, the 16.03.2022, we will consider this topic as solved and remove the "unsolved" state from this topic. Thank you for your understanding, Ferdinand
  • The second "call command" cannot be executed

    python s24
    6
    0 Votes
    6 Posts
    1k Views
    ferdinandF
    Hello @mari, without any further activity before Wednesday, the 16.03.2022, we will consider this topic as solved and remove the "unsolved" state from this topic. Thank you for your understanding, Ferdinand
  • Normal tangents to world

    7
    0 Votes
    7 Posts
    1k Views
    ferdinandF
    Hello @wickedp, without any further activity before Wednesday, the 16.03.2022, we will consider this topic as solved and remove the "unsolved" state from this topic. Thank you for your understanding, Ferdinand
  • Calling an existing user data preset onto a python tag.

    python r25
    7
    0 Votes
    7 Posts
    1k Views
    ferdinandF
    Hello @z-prich, without any further activity before Wednesday, the 16.03.2022, we will consider this topic as solved and remove the "unsolved" state of this topic. Thank you for your understanding, Ferdinand