ETO Forms McNeel Example

Hi,

Just tried the McNeel Python example script attached and it doesn’t seem to run correct when I copy and paste it into the Python editor maybe someone can take a look and see what is wrong, as a nubie to Python I am using the examples as reference as I learn so would like to find out what any issues were with the script. Looking at the code I would expect to see the drop down menu have all the options listed but all I get is “Density” the first option in the list.

All advice welcome.

################################################################################

SampleEtoCollapsibleDialog.py

Copyright © 2017 Robert McNeel & Associates.

See License.md in the root of this repository for details.

################################################################################

import scriptcontext

import rhinoscriptsyntax as rs

import Rhino.UI

import Eto.Drawing as drawing

import Eto.Forms as forms

################################################################################

Sample dialog class extending the Eto Dialog([T])

################################################################################

class CollapsableEtoDialog (forms.Dialog[bool]): # return True or False from ShowModal()

def init (self):

self.Title = “My Collapsible Eto Form”

self.Resizable = False

self.Padding = drawing. Padding (5)

Custom label helper to set alignment

def L (text):

m_label = forms. Label ()

m_label.Text = text

m_label.VerticalAlignment = forms.VerticalAlignment.Center

m_label.TextAlignment = forms.TextAlignment.Right

return m_label

set content of the collapsed section

self.collapsePanel = forms. DynamicLayout (Visible = False , Padding = drawing. Padding (40, 10), DefaultSpacing = drawing. Size (5, 5))

self.collapsePanel. BeginVertical ()

self.collapsePanel. AddRow ( None , L (“Density:”), forms. NumericUpDown ())

self.collapsePanel. AddRow ( None , L (“Maximum angle:”), forms. NumericUpDown ())

self.collapsePanel. AddRow ( None , L (“Maximum aspect ratio:”), forms. NumericUpDown ())

self.collapsePanel. AddRow ( None , L (“Minimum edge length:”), forms. NumericUpDown ())

self.collapsePanel. AddRow ( None , L (“Maximum edge length:”), forms. NumericUpDown ())

self.collapsePanel. AddRow ( None , L (“Maximum distance, edge to surface:”), forms. NumericUpDown ())

self.collapsePanel. AddRow ( None , L (“Minimum initial grid quads:”), forms. NumericUpDown ())

self.collapsePanel. EndVertical ()

self.collapsePanel. BeginVertical ()

self.collapsePanel. AddRow ( None , forms. CheckBox (Text = “Refine mesh”))

self.collapsePanel. AddRow ( None , forms. CheckBox (Text = “Jagged seams”), forms. CheckBox (Text = “Pack textures”), None )

self.collapsePanel. AddRow ( None , forms. CheckBox (Text = “Simple planes”))

self.collapsePanel. EndVertical ()

button to toggle collapsing

self.collapseButton = forms. Button (Text = “v”, MinimumSize = drawing.Size.Empty)

self.collapseButton.Click += self.collapseButton_Click

a few buttons always shown at the bottom

self.previewButton = forms. Button (Text = “Preview”)

self.cancelButton = forms. Button (Text = “Cancel”)

self.cancelButton.Click += self.cancelButton_Click;

self.okButton = forms. Button (Text = “OK”)

self.okButton.Click += self.okButton_Click

set default buttons when user presses enter or escape anywhere on the form

self.DefaultButton = self.okButton

self.AbortButton = self.cancelButton

toleranceUpDown = forms. NumericUpDown ()

our main layout

layout = forms. DynamicLayout (DefaultSpacing = drawing. Size (2,2))

layout. AddSeparateRow ( None , L (“Tolerance”), toleranceUpDown, L (“millimeters”), self.collapseButton)

layout. AddCentered (self.collapsePanel) # we need this auto-sized so we can get its width to adjust form height

layout. Add ( None ); # expanding space, in case you want the form re-sizable

layout. AddSeparateRow ( None , self.previewButton, self.cancelButton, self.okButton);

self.Content = layout;

def collapseButton_Click (self, sender, e):

if self.collapsePanel.Visible:

self.ClientSize = drawing. Size (self.ClientSize.Width, self.ClientSize.Height - self.collapsePanel.Height)

self.collapsePanel.Visible = False

self.collapseButton.Text = “^”

else :

self.collapsePanel.Visible = True

self.collapseButton.Text = “v”

self.ClientSize = drawing. Size ( max (self.ClientSize.Width, self.collapsePanel.Width), self.ClientSize.Height + self.collapsePanel.Height)

except:

print “Unexpected error:”, sys.exc_info()[0]

pass # so we don’t bring down rhino if there’s a bug in the script

def cancelButton_Click (self, sender, e):

self. Close ( False )

def okButton_Click (self, sender, e):

self. Close ( True )

if self. ShowModal ():

print “Do something, user clicked OK”

################################################################################

Creating a dialog instance and displaying the dialog.

################################################################################

def TestCollapseEtoDialog ():

dialog = CollapsableEtoDialog ()

dialog. ShowModal (Rhino.UI.RhinoEtoApp.MainWindow)

################################################################################

Check to see if this file is being executed as the “main” python

script instead of being used as a module by some other python script

This allows us to use the module which ever way we want.

################################################################################

if name == “main”:

TestCollapseEtoDialog ()

Hi RogerD,

With python, one of the most important things is get indentation correct. The script you have posted lack indentation meaning it is impossible to tell where any definition, if and loops start or end.

There is an option for preformatted code when posting and you will need to use that to post the code here.

From,
Chris

Thank you Chris I have a lot to learn so every little bit of information is appreciated.

There has likely been a change in the way the form is rendered. You will need to set Resizable to True.

self.Resizable = True

You can then resize the form initially before you toggle the collapse.

From,
Chris