SampleEtoModelessForm

Created Diff never expires
12 removals
Lines
Total226
Removed-3.5%8
Words
Total699
Removed-2.1%15
226 lines
37 additions
Lines
Total251
Added+13.1%33
Words
Total752
Added+9.0%68
251 lines
#! python3
################################################################################
################################################################################
# SampleEtoModelessForm.py
# SampleEtoModelessForm.py
# Copyright (c) 2017 Robert McNeel & Associates.
# Copyright (c) 2017 Robert McNeel & Associates.
# See License.md in the root of this repository for details.
# See License.md in the root of this repository for details.
################################################################################
################################################################################


import System
import System
import Rhino
import Rhino
import Rhino.UI
import Rhino.UI
import Eto.Drawing as drawing
import Eto.Drawing as drawing
import Eto.Forms as forms
import Eto.Forms as forms
import scriptcontext as sc
import scriptcontext as sc


################################################################################
################################################################################
# SampleEtoModelessForm class
# SampleEtoModelessForm class
################################################################################
################################################################################
class SampleEtoModelessForm(forms.Form):
class SampleEtoModelessForm(forms.Form):
# Initializer
# Initializer
def __init__(self):
def __init__(self):
super().__init__()
self.m_selecting = False
self.m_selecting = False
# Basic form initialization
# Basic form initialization
self.Initialize()
self.Initialize()
# Create the form's controls
# Create the form's controls
self.CreateFormControls()
self.CreateFormControls()
# Fill the form's listbox
# Fill the form's listbox
self.FillListBox()
self.FillListBox()
# Create Rhino event handlers
# Create Rhino event handlers
self.CreateEvents()
self.CreateEvents()
# Basic form initialization
# Basic form initialization
def Initialize(self):
def Initialize(self):
self.Title = 'Sample Modeless Form'
self.Title = 'Sample Modeless Form'
self.Padding = drawing.Padding(5)
self.Padding = drawing.Padding(5)
self.Resizable = True
self.Resizable = True
self.Maximizable = False
self.Maximizable = False
self.Minimizable = False
self.Minimizable = False
self.ShowInTaskbar = False
self.ShowInTaskbar = False
self.MinimumSize = drawing.Size(200, 150)
self.MinimumSize = drawing.Size(200, 150)
# FormClosed event handler
# FormClosed event handler
self.Closed += self.OnFormClosed
self.Closed += self.OnFormClosed
# Adds a listitem to the listbox
# Adds a listitem to the listbox
def AddObject(self, obj):
def AddObject(self, obj):
item = forms.ListItem()
item = forms.ListItem()
item.Text = obj.ShortDescription(False)
item.Text = obj.ShortDescription(False)
if obj.Name:
if obj.Name:
item.Text += " - " + obj.Name
item.Text += " - " + obj.Name
item.Tag = obj.Id
item.Tag = obj.Id
self.m_listbox.Items.Add(item)
self.m_listbox.Items.Add(item)
# Fills the listbox with document objects
# Fills the listbox with document objects
def FillListBox(self):
def FillListBox(self):
iter = Rhino.DocObjects.ObjectEnumeratorSettings()
iter = Rhino.DocObjects.ObjectEnumeratorSettings()
iter.NormalObjects = True
iter.NormalObjects = True
iter.LockedObjects = False
iter.LockedObjects = False
iter.IncludeLights = True
iter.IncludeLights = True
iter.IncludeGrips = False
iter.IncludeGrips = False
objects = sc.doc.Objects.GetObjectList(iter)
objects = sc.doc.Objects.GetObjectList(iter)
for obj in objects:
for obj in objects:
self.AddObject(obj)
self.AddObject(obj)
# CloseDocument event handler
# CloseDocument event handler
def OnCloseDocument(self, sender, e):
def OnCloseDocument(self, sender, e):
self.m_listbox.Items.Clear()
self.m_listbox.Items.Clear()
# NewDocument event handler
# NewDocument event handler
def OnNewDocument(self, sender, e):
def OnNewDocument(self, sender, e):
self.FillListBox()
self.FillListBox()
# EndOpenDocument event handler
# EndOpenDocument event handler
def OnEndOpenDocument(self, sender, e):
def OnEndOpenDocument(self, sender, e):
self.FillListBox()
self.FillListBox()
# OnAddRhinoObject event handler
# OnAddRhinoObject event handler
def OnAddRhinoObject(self, sender, e):
def OnAddRhinoObject(self, sender, e):
self.AddObject(e.TheObject)
self.AddObject(e.TheObject)
# OnDeleteRhinoObject event handler
# OnDeleteRhinoObject event handler
def OnDeleteRhinoObject(self, sender, e):
def OnDeleteRhinoObject(self, sender, e):
for item in self.m_listbox.Items:
for item in self.m_listbox.Items:
if item.Tag == e.ObjectId:
if item.Tag == e.ObjectId:
self.m_listbox.Items.Remove(item)
self.m_listbox.Items.Remove(item)
break
break
# OnSelectObjects event handler
# OnSelectObjects event handler
def OnSelectObjects(self, sender, e):
def OnSelectObjects(self, sender, e):
if self.m_selecting == True:
if self.m_selecting == True:
return
return
if e.RhinoObjects.Length == 1:
if e.RhinoObjects.Length == 1:
i = 0
i = 0
for item in self.m_listbox.Items:
for item in self.m_listbox.Items:
if item.Tag == e.RhinoObjects[0].Id:
if item.Tag == e.RhinoObjects[0].Id:
self.m_listbox.SelectedIndex = i
self.m_listbox.SelectedIndex = i
break
break
else:
else:
i += 1
i += 1
else:
else:
self.m_listbox.SelectedIndex = -1
self.m_listbox.SelectedIndex = -1
# OnDeselectAllObjects event handler
# OnDeselectAllObjects event handler
def OnDeselectAllObjects(self, sender, e):
def OnDeselectAllObjects(self, sender, e):
if self.m_selecting == True:
if self.m_selecting == True:
return
return
self.m_listbox.SelectedIndex = -1
self.m_listbox.SelectedIndex = -1
# Create Rhino event handlers
# Create Rhino event handlers
def CreateEvents(self):
def CreateEvents(self):
Rhino.RhinoDoc.CloseDocument += self.OnCloseDocument
Rhino.RhinoDoc.CloseDocument += self.OnCloseDocument
Rhino.RhinoDoc.NewDocument += self.OnNewDocument
Rhino.RhinoDoc.NewDocument += self.OnNewDocument
Rhino.RhinoDoc.EndOpenDocument += self.OnEndOpenDocument
Rhino.RhinoDoc.EndOpenDocument += self.OnEndOpenDocument
Rhino.RhinoDoc.AddRhinoObject += self.OnAddRhinoObject
Rhino.RhinoDoc.AddRhinoObject += self.OnAddRhinoObject
Rhino.RhinoDoc.DeleteRhinoObject += self.OnDeleteRhinoObject
Rhino.RhinoDoc.DeleteRhinoObject += self.OnDeleteRhinoObject
Rhino.RhinoDoc.SelectObjects += self.OnSelectObjects
Rhino.RhinoDoc.SelectObjects += self.OnSelectObjects
Rhino.RhinoDoc.DeselectAllObjects += self.OnDeselectAllObjects
Rhino.RhinoDoc.DeselectAllObjects += self.OnDeselectAllObjects
# Remove Rhino event handlers
# Remove Rhino event handlers
def RemoveEvents(self):
def RemoveEvents(self):
Rhino.RhinoDoc.CloseDocument -= self.OnCloseDocument
Rhino.RhinoDoc.CloseDocument -= self.OnCloseDocument
Rhino.RhinoDoc.NewDocument -= self.OnNewDocument
Rhino.RhinoDoc.NewDocument -= self.OnNewDocument
Rhino.RhinoDoc.EndOpenDocument -= self.OnEndOpenDocument
Rhino.RhinoDoc.EndOpenDocument -= self.OnEndOpenDocument
Rhino.RhinoDoc.AddRhinoObject -= self.OnAddRhinoObject
Rhino.RhinoDoc.AddRhinoObject -= self.OnAddRhinoObject
Rhino.RhinoDoc.DeleteRhinoObject -= self.OnDeleteRhinoObject
Rhino.RhinoDoc.DeleteRhinoObject -= self.OnDeleteRhinoObject
Rhino.RhinoDoc.SelectObjects -= self.OnSelectObjects
Rhino.RhinoDoc.SelectObjects -= self.OnSelectObjects
Rhino.RhinoDoc.DeselectAllObjects -= self.OnDeselectAllObjects
Rhino.RhinoDoc.DeselectAllObjects -= self.OnDeselectAllObjects
# Create all of the controls used by the form
# Create all of the controls used by the form
def CreateFormControls(self):
def CreateFormControls(self):
# Create table layout
# Create table layout
layout = forms.TableLayout()
layout = forms.TableLayout()
layout.Padding = drawing.Padding(10)
layout.Padding = drawing.Padding(10)
layout.Spacing = drawing.Size(5, 5)
layout.Spacing = drawing.Size(5, 5)
# Add controls to layout
# Add controls to layout
layout.Rows.Add(forms.Label(Text = 'Rhino Objects:'))
label = forms.Label()
label.Text = 'Rhino Objects:'
cell = forms.TableCell()
cell.Control = label
row = forms.TableRow()
row.Cells.Add(cell)
layout.Rows.Add(row)
layout.Rows.Add(self.CreateListBoxRow())
layout.Rows.Add(self.CreateListBoxRow())
layout.Rows.Add(self.CreateButtonRow())
layout.Rows.Add(self.CreateButtonRow())
# Set the content
# Set the content
self.Content = layout
self.Content = layout
# Listbox.SelectedIndexChanged event handler
# Listbox.SelectedIndexChanged event handler
def OnSelectedIndexChanged(self, sender, e):
def OnSelectedIndexChanged(self, sender, e):
index = self.m_listbox.SelectedIndex
index = self.m_listbox.SelectedIndex
if index >= 0:
if index >= 0:
self.m_selecting = True
self.m_selecting = True
item = self.m_listbox.Items[index]
item = self.m_listbox.Items[index]
Rhino.RhinoApp.RunScript("_SelNone", False)
Rhino.RhinoApp.RunScript("_SelNone", False)
Rhino.RhinoApp.RunScript("_SelId " + item.Tag.ToString() + " _Enter", False)
Rhino.RhinoApp.RunScript("_SelId " + item.Tag.ToString() + " _Enter", False)
self.m_selecting = False
self.m_selecting = False
# Called by CreateFormControls to creates the
# Called by CreateFormControls to creates the
# table row that contains the listbox
# table row that contains the listbox
def CreateListBoxRow(self):
def CreateListBoxRow(self):
# Create the listbox
# Create the listbox
self.m_listbox = forms.ListBox()
self.m_listbox = forms.ListBox()
self.m_listbox.Size = drawing.Size(200, 100)
self.m_listbox.Size = drawing.Size(200, 100)
self.m_listbox.SelectedIndexChanged += self.OnSelectedIndexChanged
self.m_listbox.SelectedIndexChanged += self.OnSelectedIndexChanged
# Create the table row
# Create the table row
table_cell = forms.TableCell()
table_cell.Control = self.m_listbox
table_row = forms.TableRow()
table_row = forms.TableRow()
table_row.ScaleHeight = True
table_row.ScaleHeight = True
table_row.Cells.Add(self.m_listbox)
table_row.Cells.Add(table_cell)
return table_row
return table_row
# 'Select' button click handler
# 'Select' button click handler
def OnSelectClick(self, sender, e):
def OnSelectClick(self, sender, e):
self.m_selecting = True
self.m_selecting = True
self.m_listbox.SelectedIndex = -1
self.m_listbox.SelectedIndex = -1
Rhino.RhinoApp.RunScript("_SelAll", False)
Rhino.RhinoApp.RunScript("_SelAll", False)
self.m_selecting = False
self.m_selecting = False
# 'Clear' button click handler
# 'Clear' button click handler
def OnClearClick(self, sender, e):
def OnClearClick(self, sender, e):
self.m_selecting = True
self.m_selecting = True
self.m_listbox.SelectedIndex = -1
self.m_listbox.SelectedIndex = -1
Rhino.RhinoApp.RunScript("_SelNone", False)
Rhino.RhinoApp.RunScript("_SelNone", False)
self.m_selecting = False
self.m_selecting = False
# Called by CreateFormControls to creates the
# Called by CreateFormControls to creates the
# table row that contains the button controls.
# table row that contains the button controls.
def CreateButtonRow(self):
def CreateButtonRow(self):
# Select button
# Select button
select_button = forms.Button(Text = 'Select All')
select_button = forms.Button()
select_button.Text = 'Select All'
select_button.Click += self.OnSelectClick
select_button.Click += self.OnSelectClick
# Clear button
# Clear button
clear_button = forms.Button(Text = 'Clear')
clear_button = forms.Button()
clear_button.Text = 'Clear'
clear_button.Click += self.OnClearClick
clear_button.Click += self.OnClearClick
# Create layout
# Create layout
layout = forms.TableLayout(Spacing = drawing.Size(5, 5))
layout = forms.TableLayout()
layout.Rows.Add(forms.TableRow(None, select_button, clear_button, None))
layout.Spacing = drawing.Size(5, 5)
return layout
cell_a = forms.TableCell()
cell_a.Control = None
cell_b = forms.TableCell()
cell_b.Control = select_button
cell_c = forms.TableCell()
cell_c.Control = clear_button
cell_d = forms.TableCell()
cell_d.Control = None
row = forms.TableRow()
row.Cells.Add(cell_a)
row.Cells.Add(cell_b)
row.Cells.Add(cell_c)
row.Cells.Add(cell_d)
return row
# Form Closed event handler
# Form Closed event handler
def OnFormClosed(self, sender, e):
def OnFormClosed(self, sender, e):
# Remove the events added in the initializer
# Remove the events added in the initializer
self.RemoveEvents()
self.RemoveEvents()
# Dispose of the form and remove it from the sticky dictionary
# Dispose of the form and remove it from the sticky dictionary
if sc.sticky.has_key('sample_modeless_form'):
if sc.sticky.has_key('sample_modeless_form'):
form = sc.sticky['sample_modeless_form']
form = sc.sticky['sample_modeless_form']
if form:
if form:
form.Dispose()
form.Dispose()
form = None
form = None
sc.sticky.Remove('sample_modeless_form')
sc.sticky.pop('sample_modeless_form')
################################################################################
################################################################################
# TestSampleEtoModelessForm function
# TestSampleEtoModelessForm function
################################################################################
################################################################################
def TestSampleEtoModelessForm():
def TestSampleEtoModelessForm():
# See if the form is already visible
# See if the form is already visible
if sc.sticky.has_key('sample_modeless_form'):
if sc.sticky.has_key('sample_modeless_form'):
return
return
# Create and show form
# Create and show form
form = SampleEtoModelessForm()
form = SampleEtoModelessForm()
form.Owner = Rhino.UI.RhinoEtoApp.MainWindow
form.Owner = Rhino.UI.RhinoEtoApp.MainWindow
form.Show()
form.Show()
# Add the form to the sticky dictionary so it
# Add the form to the sticky dictionary so it
# survives when the main function ends.
# survives when the main function ends.
sc.sticky['sample_modeless_form'] = form
sc.sticky['sample_modeless_form'] = form
################################################################################
################################################################################
# Check to see if this file is being executed as the 'main' python
# 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
# 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.
# This allows us to use the module which ever way we want.
################################################################################
################################################################################
if __name__ == '__main__':
if __name__ == '__main__':
TestSampleEtoModelessForm()
TestSampleEtoModelessForm()