Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    changing Renderpath problem

    PYTHON Development
    0
    22
    12.9k
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H
      Helper
      last edited by

      On 14/03/2013 at 05:17, xxxxxxxx wrote:

      Hello everyone,

      I'm working on a plugin written in python, and theres one thing i can't fix. I try to change the Renderpath from render to render, and i think it works, but for some reason it doesn't save the rendered image after the change in the path. No file output to anywhere. Here is the code:

        
        def renderDocument(self, layerName) :  
            """  
            Taking the document and rendering it according to the normal rendersettings of the document.  
            Ads '_LAYERNAME', LAYERNAME being the name of the layer, to the renderpath.  
            """  
            doc = c4d.documents.GetActiveDocument()  
            renderData = doc.GetActiveRenderData().GetData()  
            xResolution = int(round(renderData[c4d.RDATA_XRES]))  
            yResolution = int(round(renderData[c4d.RDATA_YRES]))  
        
            if renderData[c4d.RDATA_PATH] != "":  
                print str(renderData[c4d.RDATA_PATH])  
                renderData[c4d.RDATA_PATH] = str(renderData[c4d.RDATA_PATH]) + "_" + str(layerName)  
                print str(renderData[c4d.RDATA_PATH])  
                c4d.EventAdd()  
                  
            renderBmp = c4d.bitmaps.BaseBitmap()  
            renderBmp.Init(x=xResolution, y=yResolution, depth=32, )  
        
            result = documents.RenderDocument(doc, renderData, renderBmp, c4d.RENDERFLAGS_EXTERNAL)  
        
            if result==c4d.RENDERRESULT_OK:  
                c4d.bitmaps.ShowBitmap(renderBmp)     # show image in pictureViewer  
            return True  
      

      If I comment the red section out (the path change) it renders fine. Also, the renderpath seems to change correctly between the two print statements. Furthermore, i checked things like RDATA_SAVEIMAGE, RDATA_GLOBALSAVE, and they are both set to one (hence true?) all the time.

      Thanks for your help

      Aurel

      1 Reply Last reply Reply Quote 0
      • H
        Helper
        last edited by

        On 14/03/2013 at 05:30, xxxxxxxx wrote:

        Use either GetDataInstance() or set the data container back via SetData(). The GetData() method
        returns a copy of the original container. This information can be found in the documentation, so
        read well before using a method.

        Best,
        Niklas

        1 Reply Last reply Reply Quote 0
        • H
          Helper
          last edited by

          On 14/03/2013 at 05:57, xxxxxxxx wrote:

          Hey NiklasR,

          I see what you mean, but since i actually render the document by passing in renderData, doesn't it take the changed parameters into account anyway? -because if i use GetDataInstance(), it still doesn't actally save the images. However, the paths change, because they always concatenate the previous path with the name of the layer:

          /Users/pixcube03/Desktop/RenderTestPlugin/test  -> in the beginning
          /Users/pixcube03/Desktop/RenderTestPlugin/test_Layer1 ->after first render
          /Users/pixcube03/Desktop/RenderTestPlugin/test_Layer1_Layer2 -> after second Render...

          instead of:

          /Users/pixcube03/Desktop/RenderTestPlugin/test_Layer2

          So that's not what i was looking for.

          All images definitly get rendered, they appear in the pictureviewer, they just aren't being saved to disk.

          1 Reply Last reply Reply Quote 0
          • H
            Helper
            last edited by

            On 14/03/2013 at 06:00, xxxxxxxx wrote:

            You're right, I missed that. Hm.. Did you ensure that the 'Save' checkmark is set in the render-data?

            1 Reply Last reply Reply Quote 0
            • H
              Helper
              last edited by

              On 14/03/2013 at 06:04, xxxxxxxx wrote:

              Do you mean manually as in opening the render settings and checking the boxes? if so, yes, and also, if i don't try to tamper with the path in the plugin it renders just fine.

              If you mean checking the save-checkbox in pyhton, then no

              1 Reply Last reply Reply Quote 0
              • H
                Helper
                last edited by

                On 14/03/2013 at 06:08, xxxxxxxx wrote:

                Also, i just noticed, that the images thet appear in the picture viewer have neither a name or a directory lited under Info

                1 Reply Last reply Reply Quote 0
                • H
                  Helper
                  last edited by

                  On 14/03/2013 at 06:45, xxxxxxxx wrote:

                  you could try a raw string, python might get confused with the path seperators

                  renderData[c4d.RDATA_PATH] = r'{0}\_{1}'.format(renderData[c4d.RDATA_PATH], layerName)
                  
                  1 Reply Last reply Reply Quote 0
                  • H
                    Helper
                    last edited by

                    On 14/03/2013 at 07:40, xxxxxxxx wrote:

                    I found the solution:

                    I needed to move the .GetData() to .renderDocument(...), updated code:

                      
                      def renderDocument(self, layerName) :  
                          """  
                          Taking the document and rendering it according to the normal rendersettings of the document.  
                          Ads '_LAYERNAME', LAYERNAME being the name of the layer, to the renderpath.  
                          """  
                          doc = c4d.documents.GetActiveDocument()  
                          renderData = doc.GetActiveRenderData()  
                          xResolution = int(round(renderData[c4d.RDATA_XRES]))  
                          yResolution = int(round(renderData[c4d.RDATA_YRES]))  
                      
                          if renderData[c4d.RDATA_PATH] != "":  
                              storedPath = renderData[c4d.RDATA_PATH]  
                              print renderData[c4d.RDATA_PATH]  
                              renderData[c4d.RDATA_PATH] =r'{0}_{1}'.format(renderData[c4d.RDATA_PATH], layerName)  
                              print renderData[c4d.RDATA_PATH]  
                              c4d.EventAdd()  
                      
                          renderBmp = c4d.bitmaps.BaseBitmap()  
                          renderBmp.Init(x=xResolution, y=yResolution, depth=32, )  
                      
                          result = documents.RenderDocument(doc, renderData.GetData(), renderBmp, c4d.RENDERFLAGS_EXTERNAL)  
                          renderData[c4d.RDATA_PATH] = storedPath  
                          if result==c4d.RENDERRESULT_OK:  
                              c4d.bitmaps.ShowBitmap(renderBmp)     # show image in pictureViewer  
                          return True  
                    

                    I kept littledevils notation for combining strings though 😉 find it very neat XD

                    Thanks for your help both of you!

                    1 Reply Last reply Reply Quote 0
                    • H
                      Helper
                      last edited by

                      On 14/03/2013 at 07:59, xxxxxxxx wrote:

                      are you sure ? i don't think using the gelistnode as an interface instead of a bc
                      does make so much difference, but who knows, c4d tends to be akward ;).  and 
                      just for clarification, my example is more than a different notation.

                      this won't work as a path string in python
                      'c:\somefolder\somefile.dat'

                      but these will (the little prefix r is a raw string)
                      'c:\\somefolder\\somefile.dat'
                      r'c:\somefolder\somefile.dat'

                      http://docs.python.org/2/reference/lexical_analysis.html#literals

                      1 Reply Last reply Reply Quote 0
                      • H
                        Helper
                        last edited by

                        On 14/03/2013 at 08:06, xxxxxxxx wrote:

                        @Ferdinand: No, this is applies to string-literals only. A string that does already exist will not be
                        processed for backslash-escaping again. So the string doesn't care if there is a \n or \r or any
                        escape sequence when concatenating, just when being parsed by the Python parser. It is an
                        annotation to the coder, not a runtime thingy.

                        ref = r'Hello \nobody'
                        string_a = ref + ', how are you?'
                        string_b = '%s%s' % (ref, ', how are you?')
                        string_c = '{0}{1}'.format(ref, ', how are you?')
                          
                        assert string_a == string_b == string_c
                        

                        @Amadeo: I agree with Ferdinand, it doesn't look like there should be a semantical difference
                        in the code. Are you sure you didn't change anything else?

                        Best,
                        Niklas

                        1 Reply Last reply Reply Quote 0
                        • H
                          Helper
                          last edited by

                          On 14/03/2013 at 08:22, xxxxxxxx wrote:

                          [OK] rd = doc.GetActiveRenderData()
                          [OK] print rd[[c4d.RDATA_PATH]]
                          c:\nline\nline
                          [OK] rd[[c4d.RDATA_PATH]] + 'abc'
                          'c:\\nline\\nlineabc'
                          

                          c4d won't accept this path. so you have to force your ouput into raw again not
                          sure if string.format does this by default.

                          1 Reply Last reply Reply Quote 0
                          • H
                            Helper
                            last edited by

                            On 14/03/2013 at 08:26, xxxxxxxx wrote:

                            I don't see why it won't accept this path. Looks valid to me.

                            Btw, are the doubled brackets intended?

                            [OK] print rd **[[** c4d.RDATA_PATH **]]** 
                            
                            1 Reply Last reply Reply Quote 0
                            • H
                              Helper
                              last edited by

                              On 14/03/2013 at 08:35, xxxxxxxx wrote:

                              for brackets i don't know, haven't really seen them the console font is so tiny. the snippet is
                              directly from the console, c4d put them there. for accepting the path - does c4d accept double 
                              backlashes instead of single ones ? after __add__ the raw string is transformed into the 
                              escaped form and rdata[pathblah] actually contains the double backlashes.

                              1 Reply Last reply Reply Quote 0
                              • H
                                Helper
                                last edited by

                                On 14/03/2013 at 08:40, xxxxxxxx wrote:

                                There are no double backslashes in the string. There are double-backslashes in the output because
                                you didn't print the string. See Python's __repr__.

                                Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
                                Type "help", "copyright", "credits" or "license" for more information.
                                \>>> str = 'C:\\nobody\\noway'
                                \>>> str
                                'C:\\nobody\\noway'
                                \>>> print str
                                C:\nobody\noway
                                \>>> str + '\\notime'
                                'C:\\nobody\\noway\\notime'
                                \>>> print str + '\\notime'
                                C:\nobody\noway\notime
                                
                                1 Reply Last reply Reply Quote 0
                                • H
                                  Helper
                                  last edited by

                                  On 14/03/2013 at 09:55, xxxxxxxx wrote:

                                  ah ok, i didn't think of that, i stand corrected 😉

                                  1 Reply Last reply Reply Quote 0
                                  • H
                                    Helper
                                    last edited by

                                    On 14/03/2013 at 09:56, xxxxxxxx wrote:

                                    Hey Guys,

                                    I checked again:

                                    if i change

                                    doc.GetActiveRenderData()

                                    back to

                                    doc.GetActiveRenderData().GetData()

                                    and

                                    documents.RenderDocument(doc, renderData.GetData(), renderBmp, c4d.RENDERFLAGS_EXTERNAL)

                                    to

                                    documents.RenderDocument(doc, renderData, renderBmp, c4d.RENDERFLAGS_EXTERNAL)

                                    Thers no file output to disk anymore, just pictureviewer

                                    Is that weird?

                                    1 Reply Last reply Reply Quote 0
                                    • H
                                      Helper
                                      last edited by

                                      On 14/03/2013 at 10:00, xxxxxxxx wrote:

                                      It is indeed. Could you provide an SSCCE?

                                      -Nik

                                      1 Reply Last reply Reply Quote 0
                                      • H
                                        Helper
                                        last edited by

                                        On 14/03/2013 at 10:12, xxxxxxxx wrote:

                                        I read your link, but i'm not too sure what that's supposed to be ^^sorry

                                        would it not be an option to simply send you the code? or the plugin? because i don't think it can be trimmed to far and i don't know how to make it work without all the parts. Does that even make sense?^^

                                        1 Reply Last reply Reply Quote 0
                                        • H
                                          Helper
                                          last edited by

                                          On 14/03/2013 at 10:17, xxxxxxxx wrote:

                                          SSCCE = Short Self Contained Correct Example

                                          => Just paste some code that shows the problem and can be run right in the script
                                          manager or in a Python plugin-file. 😉

                                          You can also send it via PM if you don't want to make it public.

                                          Best,
                                          -Niklas

                                          1 Reply Last reply Reply Quote 0
                                          • H
                                            Helper
                                            last edited by

                                            On 14/03/2013 at 10:28, xxxxxxxx wrote:

                                            I'll get back to you tomorrow, is that ok?

                                            Thanks a lot,

                                            Aurel

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post