Help with Eto

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()

Hi , i’ve made two small changes to make it run:

passo = float(self.DropEscala.SelectedValue)

above gives you a Eto.Forms.ListItem and not the value of it, so i used below:

passo = float(self.DropEscala.SelectedValue.Text)

When building the GridView content, i removed ArrayList, just use a python list instead:

dado = []

And to add items to the list, i used below instead of dado.Add(linha)

dado.append(f.GridItem(linha))

here is the script: Roberto_TestScript.py (6.6 KB)

_

c.

1 Like

thank you very much for the help.