Pause for user input

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

On 13/06/2012 at 11:33, xxxxxxxx wrote:

Is there a way to have Python pause for user input and then act on that input?

For example I would like to start a script, press a number, then a comma, then another number and then 'shift' to set the render frame range.  Maybe not the most useful example, but you get the idea.

Here is a bit of code to look for the shift part, but I still don't know how to capture the number input first:

# Check for modifier keys
    bc = c4d.BaseContainer()
    if c4d.gui.GetInputState(c4d.BFM_INPUT_KEYBOARD,c4d.BFM_INPUT_CHANNEL,bc) :        
        if bc[c4d.BFM_INPUT_QUALIFIER] & c4d.QSHIFT:
            shiftMod=1
    if shiftMod==1:
.....

I would also like to start a script, get the current snap settings, let the user create a two point spline, then use that splines point data to print out a distance measure, and finally delete the spline.  This would make a quicker measure tool.

I'm starting to be fairly proficient at manipulating the data with Python, but am falling short at interactivity with the user.  Anyone?

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

On 14/06/2012 at 10:54, xxxxxxxx wrote:

The Py4D Console in Cinema 4D is only for stdout and does not accept input while running a script. You
can however use a dialog for this. There are built-in methods that show various dialogs.

import c4d  
input = c4d.gui.InputDialog()

I don't know if it's a bug, but you will not be able to recognize when the user clicks 'Cancel' on this
dialog. Just cancel your script if the user enters nothing.

import c4d  
  
def main() :  
  input = c4d.gui.InputDialog()  
  if not input:  
      c4d.gui.MessageDialog("Script canceled.")  
      return # actually only necessary if code follows this if-clause  
  else:  
      c4d.gui.MessageDialog("You've entered: %s" % input)  
  
main()

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

On 14/06/2012 at 12:09, xxxxxxxx wrote:

Thanks Nik.  I have been learning about dialogs today and have run a couple scripts that hung C4D because of no 'cancel' button.  Maybe it's because I'm using R12?  I will be using your 'cancel' code.  Anyways I'm currently struggling with trying to make tabs such as with:

import c4d
from c4d import gui
  
def main() :
 
gui.GeDialog.TagGroupBegin(id=5670,BFH_LEFT[,tabtype=TAB+TABS])
  
if __name__=='__main__':
    main()

I know that I'm missing some important code to initialize the tabbed dialog, but since I'm a beginner, I'm not sure what.  Do you suggest looking into the C++ SDK for more info?  Edit:  I'm checking out the SDK now trying to figure out how to translate the C++ code to Python.  Are there any resources for learning to do this that you know of?

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

On 15/06/2012 at 07:15, xxxxxxxx wrote:

Hi visualride,

What do you mean with "no cancel button"? I guess you are using a Mac? May you post a screenshot of the dialog that does not own a cancel button, please?

So, you want to make your own dialog?

There are some examples in the SDK that should at least give you a hint how to use it. There are also various posts on the forum on dialogs. Here is a little example:

# author: Niklas Rosenstein <[email protected]>  
  
import c4d  
  
class InputDialog(c4d.gui.GeDialog) :  
  
  INPUT = 10000  
  BTNOK = 10001  
  BTNCNCL = 10002  
  
  def __init__(self, title=None, input_text=None) :  
      self.title = title or "User Input"  
      self.input_text = input_text or ""  
      self.result = None  
  
  def CreateLayout(self) :  
      FULLFIT = c4d.BFH_SCALEFIT | c4d.BFV_SCALEFIT  
  
      self.AddEditText(self.INPUT, FULLFIT)  
      self.GroupBegin(0, FULLFIT)  
      self.AddButton(self.BTNOK, FULLFIT, name="OK")  
      self.AddButton(self.BTNCNCL, FULLFIT, name="Cancel")  
      self.GroupEnd()  
  
      return True  
  
  def InitValues(self) :  
      self.SetTitle(self.title)  
      self.SetString(self.INPUT, self.input_text)  
      return True  
  
  def Command(self, id, msg) :  
      if id == self.BTNOK:  
          close = True  
          self.result = self.GetString(self.INPUT)  
      elif id == self.BTNCNCL:  
          close = True  
          self.result = None  
      else:  
          close = False  
  
      if close:  
          self.Close()  
  
      return True  
  
def open_input_dialog(default=None, title=None, width=200) :  
  dialog = InputDialog(title, default)  
  dialog.Open(c4d.DLG_TYPE_MODAL, defaultw=width)  
  return dialog.result  
  
def main() :  
  value = open_input_dialog("Enter Text.",  
                            "I'm waiting for your input.")  
  
  if value is None:  
      print "Cancelled."  
  else:  
      print "Input:", value  
  
main()

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

On 15/06/2012 at 15:32, xxxxxxxx wrote:

Thanks Niklas.  This will be a big help.  I haven't found those snippets of code that I used yesterday that brought up a dialog with the 'cancel' and 'minimize' buttons greyed out, but since it happened more than once I assume it was because of my version (R12) or that the code was written on a PC (I am using a Mac).  If I do come across it again I will post it.

As I'm learning (I started sporadically about a month ago) I gain many more questions than I answer but it is fun, and hopefully it will even be practical soon.