'Copy from IRR' command

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

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

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!

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

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?

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.

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

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()

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

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

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

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.

-ScottA