Hello, I’m creating a table to generate a sole scale. However, when I click the Calculate button, Rhino is closing unexpectedly. Any help or guidance would be greatly appreciated.
import rhinoscriptsyntax as rs
import Rhino as r
import Eto.Forms as f
import Eto.Drawing as d
import System
class EscalaSolado(f.Form):
def __init__(self):
super(EscalaSolado, self).__init__()
self.Title = "Sole Scaling"
self.Size = d.Size(700,570)
self.Resizable = True
# ----------- Fields -----------
self.StarCode = f.Label()
self.StarCode.Text = "Start Code"
self.StarForms = f.TextBox()
self.EndCode = f.Label()
self.EndCode.Text = "End Code"
self.EndForms = f.TextBox()
self.BaseCode = f.Label()
self.BaseCode.Text = "Base Code"
self.BaseForms = f.TextBox()
self.HalSize = f.Label()
self.HalSize.Text = "Half Size"
self.DropEscala = f.DropDown()
self.DropEscala.Items.Add("0.5")
self.DropEscala.Items.Add("1")
self.DropEscala.SelectedIndex = 0
self.TamXModelo = f.Label()
self.TamXModelo.Text = "Model Size X"
self.TamXForms = f.TextBox()
self.TamYModelo = f.Label()
self.TamYModelo.Text = "Model Size Y"
self.TamYForms = f.TextBox()
self.TamZModelo = f.Label()
self.TamZModelo.Text = "Model Size Z"
self.TamZForms = f.TextBox()
self.FatorXEscala = f.Label()
self.FatorXEscala.Text = "Scale Factor X"
self.FatorXForms = f.TextBox()
self.FatorXForms.Text = "5"
self.FatorYEscala = f.Label()
self.FatorYEscala.Text = "Scale Factor Y"
self.FatorYForms = f.TextBox()
self.FatorYForms.Text = "3"
self.FatorZEscala = f.Label()
self.FatorZEscala.Text = "Scale Factor Z"
self.FatorZForms = f.TextBox()
self.FatorZForms.Text = "3"
# ----------- Buttons -----------
self.BotaoSel = f.Button()
self.BotaoSel.Text = "Select"
self.BotaoSel.Click += self.SelecionarModelo
self.BotaoCalcular = f.Button()
self.BotaoCalcular.Text = "Calculate"
self.BotaoCalcular.Click += self.CalcularTabela
self.BotaoGerar = f.Button()
self.BotaoGerar.Text = "Generate"
# ----------- Grid -----------
self.GridEscala = f.GridView()
self.GridEscala.Size = d.Size(-1, -1)
col_codigo = f.GridColumn()
col_codigo.HeaderText = "Code"
col_codigo.DataCell = f.TextBoxCell(0)
col_codigo.Width = 80
col_base = f.GridColumn()
col_base.HeaderText = "Base"
col_base.DataCell = f.TextBoxCell(1)
col_base.Width = 80
col_x = f.GridColumn()
col_x.HeaderText = "X"
col_x.DataCell = f.TextBoxCell(2)
col_x.Width = 80
col_y = f.GridColumn()
col_y.HeaderText = "Y"
col_y.DataCell = f.TextBoxCell(3)
col_y.Width = 80
col_z = f.GridColumn()
col_z.HeaderText = "Z"
col_z.DataCell = f.TextBoxCell(4)
col_z.Width = 80
self.GridEscala.Columns.Add(col_codigo)
self.GridEscala.Columns.Add(col_base)
self.GridEscala.Columns.Add(col_x)
self.GridEscala.Columns.Add(col_y)
self.GridEscala.Columns.Add(col_z)
# ----------- Layout -----------
topLayout = f.DynamicLayout()
topLayout.Spacing = d.Size(5, 5)
topLayout.AddRow(self.StarCode,self.StarForms,self.TamXModelo,self.TamXForms,self.FatorXEscala,self.FatorXForms,self.BotaoSel)
topLayout.AddRow(self.EndCode,self.EndForms,self.TamYModelo,self.TamYForms,self.FatorYEscala,self.FatorYForms,self.BotaoCalcular)
topLayout.AddRow(self.BaseCode,self.BaseForms,self.TamZModelo,self.TamZForms,self.FatorZEscala,self.FatorZForms,self.BotaoGerar)
topLayout.AddRow(self.HalSize,self.DropEscala)
bottomLayout = f.DynamicLayout()
bottomLayout.AddRow(None)
mainLayout = f.DynamicLayout()
mainLayout.Padding = d.Padding(10)
mainLayout.Spacing = d.Size(5, 5)
mainLayout.Add(topLayout)
mainLayout.Add(self.GridEscala, yscale=True)
mainLayout.Add(bottomLayout)
self.Content = mainLayout
# ----------- Visual Debug -----------
def MostrarErro(self, ex):
f.MessageBox.Show(
str(ex),
"Script Error",
f.MessageBoxButtons.OK,
f.MessageBoxType.Error
)
def SelecionarModelo(self, sender, e):
try:
obj = rs.GetObject("Select the Model", preselect=True)
if not obj:
return
Box = rs.BoundingBox(obj)
ValorX = rs.Distance(Box[0], Box[1])
ValorY = rs.Distance(Box[1], Box[2])
ValorZ = rs.Distance(Box[0], Box[4])
self.TamXForms.Text = f"{ValorX:.5f}"
self.TamYForms.Text = f"{ValorY:.5f}"
self.TamZForms.Text = f"{ValorZ:.5f}"
except Exception as ex:
self.MostrarErro(ex)
def CalcularTabela(self, sender, e):
try:
start = float(self.StarForms.Text)
end = float(self.EndForms.Text)
base = float(self.BaseForms.Text)
tamX = float(self.TamXForms.Text)
tamY = float(self.TamYForms.Text)
tamZ = float(self.TamZForms.Text)
fatorX = float(self.FatorXForms.Text)
fatorY = float(self.FatorYForms.Text)
fatorZ = float(self.FatorZForms.Text)
passo = float(self.DropEscala.SelectedValue)
if passo <= 0:
raise Exception("Half Size must be greater than zero")
except Exception as ex:
self.MostrarErro(ex)
return
dados = System.Collections.ArrayList()
atual = start
contador = 0
while atual <= end + 0.0001:
diferenca = atual - base
escalaX = tamX + (diferenca * fatorX)
escalaY = tamY + (diferenca * fatorY)
escalaZ = tamZ + (diferenca * fatorZ)
linha = System.Array[object]([
f"{atual:.2f}",
f"{base:.2f}",
f"{escalaX:.2f}",
f"{escalaY:.2f}",
f"{escalaZ:.2f}"
])
dados.Add(linha)
atual += passo
contador += 1
if contador > 1000:
raise Exception("Too many rows generated. Check the values.")
self.GridEscala.DataStore = dados
def main():
form = EscalaSolado()
form.Owner = r.UI.RhinoEtoApp.MainWindow
form.Show()
main()