Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python 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

    'Copy from IRR' command

    SDK Help
    0
    12
    1.2k
    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

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

      On 05/05/2011 at 07:20, xxxxxxxx wrote:

      User Information:
      Cinema 4D Version:   R12 
      Platform:   Windows  ;   Mac OSX  ; 
      Language(s) :     C++  ;

      ---------
      There's a handy button in the render settings dialog labelled 'Copy from IRR' which when clicked copies the current coordinates of the IRR into the edit fields in the render settings dialog. It's a nice way to render only a region of the image to the picture viewer.

      In my plugin I can get the values in the edit fields without problem, but they are always zero unless I click the 'Copy from IRR' button first.

      What I'd like to do is call the command associated with that button from my plugin, but it's not in the command manager and I can't find it anywhere in the SDK docs or header files.

      It may be that that command isn't available via the SDK, but it would be useful to have that confirmed so that I can stop trying to find it! Anyone know if it's possible to do this?

      Thanks,

      Steve

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

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

        On 06/05/2011 at 06:11, xxxxxxxx wrote:

        To execute a button click you need to send MSG_DESCRIPTION_COMMAND and MSG_DESCRIPTION_CHECKUPDATE messages to the RenderData.

        Sample code:

          
        RenderData *rdata = doc->GetActiveRenderData();  
          
        BaseContainer msg(BFM_ACTION);  
        msg.SetLong(BFM_ACTION_ID, 1440);  
        msg.SetLong(BFM_ACTION_VALUE, TRUE);  
          
        DescriptionCommand dc;  
        dc.id = DescID(DescLevel(RDATA_FROMIRR, DTYPE_BUTTON, rdata->GetType()));  
          
        DescriptionCheckUpdate du;  
        du.doc = doc;  
        du.descid = &dc.id;  
        du.drawflags = 0;  
          
        rdata->Message(MSG_DESCRIPTION_COMMAND, (void* )&dc);  
        rdata->Message(MSG_DESCRIPTION_CHECKUPDATE, (void* )&du);  
          
        EventAdd();  
        

        cheers,
        Matthias

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

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

          On 06/05/2011 at 07:22, xxxxxxxx wrote:

          Now that is extremely useful to know. Many thanks indeed, Matthias!

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

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

            On 06/05/2011 at 07:25, xxxxxxxx wrote:

            Btw. this does not only work with RenderData but also with objects, tags etc. Basically everything derived from BaseList2D.

            cheers,
            Matthias

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

              On 09/06/2013 at 01:30, xxxxxxxx wrote:

              Sorry to use this post, but I like to do the same in Python.
              So I should use statements like:
                  rdata = doc.GetActiveRenderData()
                  NodeData.Message(self, node, type, data)

              However, I'm not sure about the container.

              Could you do the same example in Python?

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

                On 09/06/2013 at 06:52, xxxxxxxx wrote:

                Originally posted by xxxxxxxx

                Sorry to use this post, but I like to do the same in Python.
                So I should use statements like:
                    rdata = doc.GetActiveRenderData()
                    NodeData.Message(self, node, type, data)

                However, I'm not sure about the container.

                Could you do the same example in Python?

                The method named Message() in the example is not the overridable method Message()
                in NodeData. It refers to the Message() implementation in C4D Atom which can be used
                to send messages to an atom. I am not sure if the approach is applicable on Python as
                we are missing some classes / structs form the example(the description stuff). I know 
                that the description command is listed under the atom messages in the Python SDK, but 
                I have never tried it, as the whole documentation about the data parameter is non 
                existent.

                Your best shot might be c4d.CallButton() in Python. As the BaseList2D to pass you will 
                have to grab the Render Settings BasePlugin. But i do not know if it will actually work, 
                as CallButton() is not very consistent.

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

                  On 10/06/2013 at 08:34, xxxxxxxx wrote:

                  This Python script will execute the Copy From IRR button:

                  import c4d  
                  def main() :  
                     
                    rdata = doc.GetActiveRenderData()  
                    c4d.CallButton(rdata, c4d.RDATA_FROMIRR)   
                    c4d.EventAdd()  
                    
                  if __name__=='__main__':  
                    main()
                  

                  -ScottA

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

                    On 10/06/2013 at 10:37, xxxxxxxx wrote:

                    Thanks, very much.
                    I tought CallButton needed a tool, but this examples shows it can be done differently.

                    Below my not functioning attempt / code.

                                tool = c4d.plugins.FindPlugin(50000, c4d.PLUGINTYPE_ANY)
                                print tool
                                c4d.CallButton(tool, c4d.RDATA_FROMIRR)
                                c4d.EventAdd()
                    
                    1 Reply Last reply Reply Quote 0
                    • H
                      Helper
                      last edited by

                      On 10/06/2013 at 10:56, xxxxxxxx wrote:

                      The CallButton takes many different things: tags, tools, etc..
                      None of this is documented very well (if at all). So I've had to ask lots of questions about it. And create my own documentation for it.

                      Here's my personal notes about the CallButton() function in Python:

                        
                      #These are the various plugin types and their ID's.That are used in the CallButton() function  
                        
                      PLUGINTYPE_ANY=0,  
                      PLUGINTYPE_SHADER=1,  
                      PLUGINTYPE_MATERIAL=2,  
                      PLUGINTYPE_COFFEEMESSAGE=3,  
                      PLUGINTYPE_COMMAND=4,  
                      PLUGINTYPE_OBJECT=5,  
                      PLUGINTYPE_TAG=6,  
                      PLUGINTYPE_BITMAPFILTER=7,  
                      PLUGINTYPE_VIDEOPOST=8,  
                      PLUGINTYPE_TOOL=9,  
                      PLUGINTYPE_SCENEHOOK=10,  
                      PLUGINTYPE_NODE=11,  
                      PLUGINTYPE_LIBRARY=12,  
                      PLUGINTYPE_BITMAPLOADER=13,  
                      PLUGINTYPE_BITMAPSAVER=14,  
                      PLUGINTYPE_SCENELOADER=15,  
                      PLUGINTYPE_SCENESAVER=16,  
                      PLUGINTYPE_COREMESSAGE=17,  
                      PLUGINTYPE_CUSTOMGUI=18,  
                      PLUGINTYPE_CUSTOMDATATYPE=19,  
                      PLUGINTYPE_RESOURCEDATATYPE=20,  
                      PLUGINTYPE_MANAGERINFORMATION=21,  
                      PLUGINTYPE_CTRACK=32,  
                      PLUGINTYPE_FALLOFF=33,  
                      PLUGINTYPE_VMAPTRANSFER=34,  
                      PLUGINTYPE_PREFS=35,  
                        
                        
                        
                        
                      #This example executes the Restore Selection button on a Selection Object  
                      #Other buttons code can be found in the "../../resource/res/description/Oselection.h" file  
                        
                      import c4d  
                      from c4d import *  
                        
                      def main() :  
                       obj = doc.GetFirstObject()  
                       c4d.CallButton(obj,c4d.SELECTIONOBJECT_RESTORE)   #Executes the "Restore Selection" button  
                       c4d.EventAdd()  
                        
                        
                      if __name__=='__main__':  
                        main()  
                        
                        
                        
                        
                        
                        
                      Tpolygonselection  
                        
                      #This example executes the Restore Selection button on a Polygon Selection Tag  
                      #Other buttons code can be found in the "../../resource/res/description/Tpolygonselection.h" file  
                        
                      import c4d  
                        
                      def main() :  
                        obj = doc.GetActiveObject()  
                        if obj is None: return False  
                        
                        tags = obj.GetTags()  
                        for tag in tags:  
                            if tag.GetType() == c4d.Tpolygonselection:               #A Polygon Selection Tag  
                                tag.SetBit(c4d.BIT_ACTIVE)  
                                c4d.CallButton(tag,c4d.POLYGONSELECTIONTAG_COMMAND1) #Execute the Restore Selection button  
                        
                        c4d.EventAdd()  
                        
                      if __name__=='__main__':  
                        main()  
                        
                        
                        
                        
                      #This example executes the Restore Selection button on a Edge Selection Tag  
                      #Other buttons code can be found in the "../../resource/res/description/Tedgeselection.h" file  
                      #This uses a message to call to and execute the button  
                      #R13++ only  
                        
                        
                      import c4d  
                        
                      def main() :  
                          
                        obj = doc.GetActiveObject()  
                        edgetag = obj.GetFirstTag()                                       #The first tag should be an edge Selection Tag    
                          
                        dc = {}  
                        dc['id'] = c4d.DescID(c4d.EDGESELECTIONTAG_COMMAND1)  
                        edgetag.Message(c4d.MSG_DESCRIPTION_COMMAND, dc)                  #instead of simulating the button click, send a message to the tag, which should be thread safe  
                        c4d.utils.SendModelingCommand(c4d.MCOMMAND_EDGE_TO_SPLINE, [obj]) #Converts the selected edges to a spline object  
                        
                      if __name__=='__main__':  
                        main()  
                        
                        
                        
                        
                        
                      #This script executes the mirror tool options  
                      #Only works in R13+  
                        
                      import c4d  
                      from c4d import gui  
                        
                      def main() :  
                        
                        c4d.CallCommand(1019953)  
                        tool=doc.GetAction()  
                        tool=c4d.plugins.FindPlugin(tool, c4d.PLUGINTYPE_TOOL)  
                        c4d.CallButton(tool, c4d.ID_CA_MIRROR_TOOL)  
                        c4d.EventAdd()  
                        
                      if __name__=='__main__':  
                        main()  
                        
                        
                        
                      #This is the shorter version  
                      c4d.CallButton(c4d.plugins.FindPlugin(tool,c4d.PLUGINTYPE_TOOL), c4d.ID_CA_MIRROR_TOOL)  
                        
                        
                        
                        
                        
                      #This script executes the Naming tool options  
                      #Only works in R13+  
                        
                      import c4d  
                      from c4d import gui  
                        
                      def main() :  
                        
                        c4d.CallCommand(1019952)  
                        tool=doc.GetAction()  
                        tool=c4d.plugins.FindPlugin(tool, c4d.PLUGINTYPE_TOOL)  
                        tool[c4d.ID_CA_JOINT_NAMING_REPLACE] = "Cube"               #Set the text to replace  
                        tool[c4d.ID_CA_JOINT_NAMING_REPLACE_WITH]= "fdsdf"          #Set the new text      
                        c4d.CallButton(tool, c4d.ID_CA_JOINT_NAMING_REPLACE_APPLY)  
                        c4d.EventAdd()  
                        
                      if __name__=='__main__':  
                        main()  
                        
                        
                        
                        
                        
                        
                        
                        
                      #This code executes the Apply button from the "Apply,NewTransformation,Reset" options  
                        
                      import c4d  
                      from c4d import plugins  
                        
                      def main() :  
                        
                        movedObj = doc.SearchObject("Sphere")  
                        targetObj = doc.SearchObject("Cube")  
                          
                        c4d.CallCommand(c4d.ID_MODELING_TRANSFER_TOOL)   #Launch the Transfer tool  
                          
                        tool = plugins.FindPlugin(doc.GetAction(), c4d.PLUGINTYPE_TOOL)  
                        if tool is not None:  
                            tool[c4d.MDATA_TRANSFER_OBJECT_LINK] = targetObj  
                            c4d.CallButton(tool, c4d.MDATA_APPLY)  
                        c4d.EventAdd()  
                        
                      if __name__=='__main__':  
                        main()  
                        
                        
                        
                        
                        
                        
                      #This example shows how to execute the buttons in the multishader shader  
                      #Other ID's can be found in: ..\..\..\CINEMA 4D R13\modules\mograph\res\description\xmg_multi.h  
                        
                      import c4d  
                        
                      def main() :  
                          
                        mat = doc.GetFirstMaterial()           #Get the material  
                        shdr = mat[c4d.MATERIAL_COLOR_SHADER]  #Get the shader in the color channel  
                        
                        c4d.CallButton(shdr, c4d.MGMULTISHADER_ADD)   #Adds a new shader to the list      
                        c4d.CallButton(shdr, c4d.MGMULTISHADER_CLEAR) #Removes the last shader from the list      
                         
                        c4d.EventAdd()  
                        
                      if __name__=='__main__':  
                        main()  
                        
                        
                        
                        
                        
                      #This executes the "Copy From IRR" button in the render settings  
                        
                      import c4d  
                      def main() :  
                          
                        rdata = doc.GetActiveRenderData()  
                        c4d.CallButton(rdata, c4d.RDATA_FROMIRR)   
                        c4d.EventAdd()  
                        
                      if __name__=='__main__':  
                        main()  
                        
                      

                      I also have lots of notes on how to execute various types of buttons in C++ too.
                      I had to bug Matthias with a lot of silly questions to compile them. If anyone wants them. I'll post them too. Because they aren't in the docs.
                      Between my C++ notes and my Python notes. I can usually (but not always) figure out how to execute almost any button.

                      -ScottA

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

                        On 11/06/2013 at 08:39, xxxxxxxx wrote:

                        Yes, please. The more examples, the better.
                        E.g. in the Content Browser go to a specific directory.
                        Go Presets, Favorites is simple, but a specific directory is more complicated.
                        d:\c4d\presets\small\

                        Here an example of Bake Texture.
                        It creates the tag, does some settings and give the command.

                        def AddBakeTag(bakeobject, w,h, naam) :
                          
                            c4d.CallCommand(1011133) # Bake Texture
                            tag = bakeobject.GetTag(c4d.Tbaketexture) 
                            
                            tag[c4d.ID_BASELIST_NAME] = "Naam"
                            tag[c4d.BAKETEXTURE_FORMAT] = c4d.FILTER_HDR
                            tag[c4d.BAKETEXTURE_WIDTH] = w
                            tag[c4d.BAKETEXTURE_HEIGHT] = h
                            tag[c4d.BAKETEXTURE_CHANNEL_REFLECTION] = True
                            
                            if (not naam == "") : tag[c4d.BAKETEXTURE_NAME]  = naam
                          
                            c4d.CallButton(tag, c4d.BAKETEXTURE_BAKE)
                          
                            return tag
                        
                        1 Reply Last reply Reply Quote 0
                        • H
                          Helper
                          last edited by

                          On 11/06/2013 at 08:47, xxxxxxxx wrote:

                          Originally posted by xxxxxxxx

                          The CallButton takes many different things: tags, tools, etc..
                          None of this is documented very well (if at all).

                          It actually is documented:

                          Originally posted by xxxxxxxx

                          c4d.CallButton(op, id)
                          _<_dt id="c4d.call" style=": rgb251, 234, 174;"_>_

                          Simulate a click of a button.
                          For example, here is how to call the 'Apply' button of a Tool:

                          import c4d

                          c4d.CallCommand(c4d.ID_MODELING_TRANSFER_TOOL) # Set Transfer as current Tool

                          tool = plugins.FindPlugin(doc.GetAction(), c4d.PLUGINTYPE_TOOL) # Search Transfer Tool instance
                          if tool is not None:
                          c4d.CallButton(tool, c4d.MDATA_APPLY)
                          c4d.EventAdd()

                          _Parameters:|

                          • op  (BaseList2D) – The object.
                          • id  (int) – The ID of the button._/ul>

                          CallButton() accepts a BaseList2D object. This includes tags, objects, materials, xpresso nodes,
                          render data, layer objects, curves, tracks, shaders...

                          Originally posted by xxxxxxxx

                          #These are the various plugin types and their ID's.That are used in the CallButton() function

                          1. The PLUGINTYPE_ constants are defined in the c4d module 2. they are not used with CallButton(),
                          indirectly they are, yes. But not in all cases so it can not be generalized.

                          Kind regards,
                          -Niklas

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

                            On 11/06/2013 at 12:50, xxxxxxxx wrote:

                            Niklas,

                            The docs do not explain what you think they do. You're seeing things that aren't there.
                            You're using knowledge you've picked up as tools to decrypt what's implied...but not actually written in them.
                            You're no longer reading the docs. You're interpreting them using years of tips and tricks you've collected.

                            If I took you for a ride in my time machine back about three or four years. And gave you the current docs and said "There you go..everything you need is in there". You'd probably call me dirty name after reading them. Tongue

                            -ScottA

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