physical renderer switch on problem

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 09/03/2012 at 03:35, xxxxxxxx wrote:

Hi there,

once again the render settings 🙂

I have a new scene. and I try to switch on the physical renderer with python. with a script like this:

  
import c4d   
from c4d import gui, documents   
  
def main() :   
    doc = documents.GetActiveDocument()   
    rd = doc.GetActiveRenderData()   
  
    def SetREN_physical(rd) :   
        rd[c4d.RDATA_RENDERENGINE] = c4d.RDATA_RENDERENGINE_PHYSICAL   
        c4d.EventAdd()   
  
    SetREN_physical(rd)   
  
if __name__=='__main__':   
    main()   

the renderengine in the dropdown (rendersettings) is named Physical,
but there is no "posteffect" Physical in the posteffect list, and if you hit render still the standard renderer is rendering.

If you have a new Dokument and you switch to physical renderer by hand and then back to standard by hand. and after that execute the script. the "posteffect" Physical will be there and the physical renderer will be the one to render.

the Question:
Is there a right/better way to switch to physical. so that it works even if the user did not switch physical and back before by hand?

thanks a lot
Jops

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 09/03/2012 at 09:05, xxxxxxxx wrote:

Hello, Jops!

As the Physical video post is not inserted automatically, we have to do it on our own. We can use c4d.BaseList2D with the appropriate constant to instantiate a new video post. However, finding constants is not always easy. To find out that the type-identifier of the Physical video post is c4d.VPxmbsampler, I did the following:

  1. Printed the type of the Physical video post to the console, using c4d.C4DAtom.GetType()
  2. Iterated through the contents of the Cinema 4D module and print out the names whose values are equal to the id
def main() :
    for k, v in c4d.\__dict\_\_.iteritems() :
        if v == 1023342:
            print k  
main()   

This reveals 2 items, c4d.RDATA_RENDERENGINE_PHYSICAL and c4d.VPxmbsampler. Since all Video-Post type-constants start with VP we're not going to use c4d.RDATA_RENDERENGINE_PHYSICAL as the values of the constants could differ in the next release of Cinema 4D.

# Set's the Cinema 4D's renderer to the Physical Sampler

import c4d

def main() :
    rdata   = doc.GetActiveRenderData()
    vpost   = rdata.GetFirstVideoPost()
    rdata[c4d.RDATA_RENDERENGINE] = c4d.RDATA_RENDERENGINE_PHYSICAL

    while vpost:
        if vpost.CheckType(c4d.VPxmbsampler) : break
        vpost = vpost.GetNext()

    if not vpost:
        vpost = c4d.BaseList2D(c4d.VPxmbsampler)
        rdata.InsertVideoPost(vpost)

    c4d.EventAdd()

main()

Cheers!
-Niklas

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 12/03/2012 at 06:57, xxxxxxxx wrote:

Hi Niklas,
once again thanks for your help 🙂

I am not shure if I understand the "if not" completely
So I changed the code to my Pidgin-Python. It works as far as I can see.
Is there any reason I shoudnt do this?

thanks
Jops

  
import c4d   
  
def main() :   
    rdata   = doc.GetActiveRenderData()   
    vpost   = rdata.GetFirstVideoPost()   
    rdata[c4d.RDATA_RENDERENGINE] = c4d.RDATA_RENDERENGINE_PHYSICAL   
       
    physical_on = False   
       
    while vpost:   
        if vpost.CheckType(c4d.VPxmbsampler) :   
            physical_on = True   
        vpost = vpost.GetNext()   
  
    if physical_on == False:   
        vpost = c4d.BaseList2D(c4d.VPxmbsampler)   
        rdata.InsertVideoPost(vpost)   
  
    c4d.EventAdd()   
  
main()   

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 12/03/2012 at 10:54, xxxxxxxx wrote:

Hi Jops,

if not vpost:
  # ...

equals your physical_on. When a Physical VP was found while iterating over the video-posts, the while loop will stop immediately because of the break keyword. In  the other case, vpost will equal None because the last video-post in the list will return None on ~.GetNext() or rdata.GetFirstVideoPost() returns None (i.e. no video-posts are available)and no iteration will take place at all .

Cheers,
niklas

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 13/03/2012 at 05:22, xxxxxxxx wrote:

Hi Niklas,

so :
if not vpost:

is the same as:
if vpost == None:

?

best regards
Jops

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 13/03/2012 at 05:42, xxxxxxxx wrote:

Hi Jops,

well, not exactly. This has nothing to do with Cinema 4D but with Python itself.

if obj:
  # ...

Checks an object for it's truth value. It is equal to

if bool(obj) == True:
  # ...

This implicit checking is necessary because Python is a type-less language.

if obj == True:
  # ...

requires obj to be exactly True. If obj is a string, an integer or any other object, the if condition will evaluate to False. Never check for truth-value explicit.

Cheers,
Niklas

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 13/03/2012 at 06:47, xxxxxxxx wrote:

Hi Niklas,

I guess I will need some time to get my head around this. but I think I got the direction 🙂

again and again, Thanks a lott
Jops