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

MAXON SDK Specialist
developers.maxon.net

@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

MAXON SDK Specialist

MAXON Registered Developer