SOLVED Changing Display Filter Does Not Work When Rendering?

Hi,

I have the following code that

  1. Stores Display Filter
  2. Turns them off
  3. Render
  4. Restore Display Filter.

The problem is when I render (#3) them the #2 is not in effect.

You can check the illustration of the problem here:
https://www.dropbox.com/s/r8cpy1lwgkmi1yj/c4d266_display_filter_not_working_rendering_python.mp4?dl=0

A "correct" render would be there should be no axis handles in the renders.
You can check the working code below:

import c4d
from c4d import gui
# Welcome to the world of Python

# Main function
def main():
        
        doc = c4d.documents.GetActiveDocument()
        obj_list = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_CHILDREN | c4d.GETACTIVEOBJECTFLAGS_SELECTIONORDER)
        bd = doc.GetActiveBaseDraw()
        displayFilter = bd.GetDisplayFilter()
        
        # Store Render Data
        rd_saved = doc.GetActiveRenderData().GetClone()
        rd = doc.GetActiveRenderData()

        stored_bounds       = bd[c4d.BASEDRAW_DISPLAYFILTER_BOUNDS]
        stored_multi_axis   = bd[c4d.BASEDRAW_DISPLAYFILTER_MULTIAXIS]
        stored_obj_handle   = bd[c4d.BASEDRAW_DISPLAYFILTER_OBJECTHANDLES]
        stored_obj_highli   = bd[c4d.BASEDRAW_DISPLAYFILTER_OBJECTHIGHLIGHTING]
        stored_world_axis   = bd[c4d.BASEDRAW_DISPLAYFILTER_WORLDAXIS]

        # Modify Render Data
        rd[c4d.RDATA_RENDERENGINE]  = c4d.RDATA_RENDERENGINE_PREVIEWHARDWARE
        rd[c4d.RDATA_XRES] = 400
        rd[c4d.RDATA_YRES] = 400
        rd[c4d.VP_PREVIEWHARDWARE_ANTIALIASING] = 3

        # Creates a Multi Pass Bitmaps that will store the render result
        bmp = c4d.bitmaps.MultipassBitmap(int(rd[c4d.RDATA_XRES]), int(rd[c4d.RDATA_YRES]), c4d.COLORMODE_RGB)

        # Adds an alpha channel
        bmp.AddChannel(True, True)

        # Renders the document
        if c4d.documents.RenderDocument(doc, rd.GetData(), bmp, c4d.RENDERFLAGS_EXTERNAL) != c4d.RENDERRESULT_OK:
            raise RuntimeError("Failed to render the temporary document.")

        bd[c4d.BASEDRAW_DISPLAYFILTER_BOUNDS]             = False
        bd[c4d.BASEDRAW_DISPLAYFILTER_MULTIAXIS]          = False
        bd[c4d.BASEDRAW_DISPLAYFILTER_OBJECTHANDLES]      = False
        bd[c4d.BASEDRAW_DISPLAYFILTER_OBJECTHIGHLIGHTING] = False
        bd[c4d.BASEDRAW_DISPLAYFILTER_WORLDAXIS]          = False    

        bd.Message(c4d.MSG_CHANGE)
        c4d.EventAdd()

        # Save Image
        c4d.bitmaps.ShowBitmap(bmp)
            
        # Restore Render Data
        rd_saved.CopyTo(rd, c4d.COPYFLAGS_NONE)

        bd[c4d.BASEDRAW_DISPLAYFILTER_BOUNDS]             = stored_bounds
        bd[c4d.BASEDRAW_DISPLAYFILTER_MULTIAXIS]          = stored_multi_axis
        bd[c4d.BASEDRAW_DISPLAYFILTER_OBJECTHANDLES]      = stored_obj_handle
        bd[c4d.BASEDRAW_DISPLAYFILTER_OBJECTHIGHLIGHTING] = stored_obj_highli
        bd[c4d.BASEDRAW_DISPLAYFILTER_WORLDAXIS]          = stored_world_axis


        bd.Message(c4d.MSG_CHANGE)
        c4d.EventAdd()

# Execute main()
if __name__=='__main__':
    main()

Hi,

you render your document before you make the changes to display filter settings of the active base draw. Because of that they do not take effect in the render ;)

PS: You could also just clone and restore the data container of the BaseDraw instead of having this long list of stored_ variables.

Cheers,
zipit

@zipit
My bad. Thanks for the catch.
Have a great day!

Hello,

thanks for the answer :)

by the way you could also clone the renderdata, modify the clone and send it to as a parameter to the function RenderDocument. That way, you don't have to "restore" them.

Just in case, don't forget that data may not be saved in the BaseContainer.

Cheers,
Manuel