Can't Close Modal Dialogs

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

On 21/07/2011 at 08:59, xxxxxxxx wrote:

Hi,

I recently heard from a Mac user that they don't get an X in their dialog window. So they can't close a modal dialog executed from a script.
Because of that. I tried to add a close button for them. But it appears that Close() is not supported in modal dialogs(in any language).
And the built-in buttons:self.AddDlgGroup() appear to not be supported in Python.

Here's a simple example:

import c4d  
from c4d import gui  
  
GROUP1 = 2000  
BUTTON1= 1002  
  
class MyDlg(gui.GeDialog) :   
  
  def CreateLayout(self) :  
      
    self.SetTitle("Modal Dialog")  
      
    self.GroupBegin(GROUP1, c4d.BFH_SCALEFIT, 1, 1)   
    self.GroupBorderNoTitle(c4d.BORDER_GROUP_OUT)  
    self.GroupBorderSpace(left = 2, top=2, right=2, bottom=2)  
    self.AddButton(BUTTON1, c4d.BFH_SCALE, name="Close")  
    self.AddDlgGroup(c4d.DR_DLGGROUP_OK) #Error: 'MyDlg' object has no attribute 'AddDlgGroup'   
    self.AddDlgGroup(c4d.DLG_OK)         #Error: 'MyDlg' object has no attribute 'AddDlgGroup'    
    self.GroupEnd()        
    return True  
  
  def Command(self, id, msg) :   
  
  if id==BUTTON1: c4d.Close()  #Error: module object has no attribute 'Close'      
  
dlg = MyDlg()  
dlg.Open(c4d.DLG_TYPE_MODAL, defaultw=200, defaulth=100)

Question#1 : Why is there no X in Mac user's modal dialog window?
Question#2:  How can I close a modal dialog with a button?

-ScottA

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

On 21/07/2011 at 09:21, xxxxxxxx wrote:

    def Command(self, id, msg) :   
    
    
            if id==BUTTON1: **self**.Close()
 You want to close the dialog, not c4d.  
  
Why do you expect an attribute "AddDlgGroup" ?  
  
Cheers,  

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

On 21/07/2011 at 10:20, xxxxxxxx wrote:

Close() does not close C4D.
It's a built in function in the GeModalDialog class.

Here the same example. But using Coffee:

var GROUP1 = 2000;  
var BUTTON1=1002;  
  
class MyDlg:GeModalDialog   
{  
public:  
  CreateLayout();  
  Command(id,msg);  
};  
  
MyDlg::CreateLayout()  
{  
AddGroupBeginV(GROUP1, BFH_SCALEFIT, 1,"", 1);  
AddDlgGroup(DR_DLGGROUP_OK);  
AddGroupEnd();        
}  
  
MyDlg::Command(id,msg)  
{  
  if(id==BUTTON1) Close();  
}  
main(doc,op)  
{  
  var d = new(MyDlg);                    
  d->Open(-1,-1);  
  var result = d->GetResult();  
  if(result==FALSE) return;  
}

Clicking the button closes the dialog just fine and dandy with Coffee.
But since AddDlgGroup() is apparently not supported by Python(did Sebastian miss it?) There's no way that I can find to close a modal dialog with a button.
And since Mac users don't get that X in their dialog menu(Why is that?) the only way for them to close a modal dialog is to press the escape key(ouch!).

-ScottA

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

On 21/07/2011 at 10:26, xxxxxxxx wrote:

Close() does not close C4D.
It's a built in function in the GeModalDialog class.

Yea, I know. But you called c4d.Close() and I wanted to make a tiny joke of it because it look like you wanted to close C4d.
Anyway, you must call the Dialogs Close() method. The c4d module does not have a Close() attribute, and if there was one, it wouldn't make sense if it would close a dialog, and not c4d.
See my above codesnippet for the correct use.

I can't help you with your other questions here, I'm on a PC and I did not write the C++ API Wrapper for Python.

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

On 21/07/2011 at 10:46, xxxxxxxx wrote:

Oh. Sorry about that.
I didn't notice the way you used "self" in your example.

That works.👍
I'm still trying to wrap my head around the whole "self" thing. I'm not used to using that. And in Python it's used a LOT. It's something I have to get a better grip on.

Thanks for the help.🍺

-ScottA

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

On 21/07/2011 at 11:03, xxxxxxxx wrote:

Np. 🙂
It's not hard. You know the this keyword in C++, right ? self is in this case exactly the same. But in Pyhton you *have* to call methods & attributes using "this".

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

On 21/07/2011 at 12:55, xxxxxxxx wrote:

I have the same trouble with the "this" keyword in C++.
I know what they do. But because I don't use them very often I sometimes goof them up.
I just need to use them more often to get a better handle on them.

It seems that AddDLGGroup() is missing from Python.
It should either be added. Or they should make a note that it's not supported in the SDK. So nobody else goes through the same problem trying to get it to work.

-ScottA

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

On 29/02/2012 at 10:56, xxxxxxxx wrote:

Hi all just been going thro the code above it works ok for me till i click the close button then get the error message below any ideal why the bool is giveing none.
 
def Command(self, id, msg) :#<------------error bool is exspected not none.
 
 
cheers Ray.

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

On 29/02/2012 at 12:09, xxxxxxxx wrote:

Hello Ray,

well.. returning a boolean value would be the solution then, wouldn't it? I'd recommend you to read a bit about Python.

def Command(self, id, msg) :  
  # ...  
  return True

As the documentation say, returning False would notify Cinema 4D that something did not go the correct way. (However, I haven't noticed that will change any behaviour, yet ..)

-Niklas

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

On 29/02/2012 at 13:59, xxxxxxxx wrote:

Ok ive stoped the error message ive put a 
     return True   
statment after the 
    if id==BUTTON1: c4d.Close()    
statement thanks Niklas.
 
 Cheers.  Ray.