Gemini AI tutorial companion test: level 1 exercise 11

I am exploring what is possible with Gemini AI and the Rhino Level 1 practical exercises. Using natural language, I asked Gemini to create a script for Chapter 3, Exercise 11. After a bit of back-and-forth, this is what it came up with (Python script attached).

# -*- coding: utf-8 -*-
#! python 3
import Rhino
import Eto.Drawing as drawing
import Eto.Forms as forms
import Rhino.Geometry as rg
import Rhino.Input as input
import Rhino.DocObjects as docobj

class Exercise11Workbook(forms.Form):
    def __init__(self):
        super(Exercise11Workbook, self).__init__()
        self.Title = "Rhino Level 1: Exercise 11"
        self.Topmost = True 
        self.Size = drawing.Size(450, 550)
        self.Padding = drawing.Padding(20)
        self.BackgroundColor = drawing.Color.FromArgb(45, 45, 48)
        
        # Step Data from the Book
        # (Step, Label, Delta X, Delta Y)
        self.steps = [
            (1, "Start: 8,0", None, None), # Absolute
            (2, "Next: R5,5", 5, 5),      # Relative
            (3, "Next: R-5,0", -5, 0),    # Relative
            (4, "Close (C)", None, None)  # Closure
        ]

        # UI: Instruction Header
        self.title_lbl = forms.Label(
            Text="EXERCISE 11 TUTORIAL", 
            Font=drawing.Font(drawing.FontFamilies.Sans, 12, drawing.FontStyle.Bold), 
            TextColor=drawing.Colors.White
        )
        
        # UI: The Instruction List
        instr_text = (
            "1. Command: Polyline\n"
            "2. Start: 8,0\n"
            "3. Next point: R5,5\n"
            "4. Next point: R-5,0\n"
            "5. Type 'C' and press Enter to close.\n\n"
            "Then, select your curve and click Verify."
        )
        self.instr_lbl = forms.Label(
            Text=instr_text, 
            TextColor=drawing.Colors.LightGrey, 
            Font=drawing.Font(drawing.FontFamilies.Monospace, 10)
        )
        
        # UI: Audit Log
        self.audit_log = forms.TextArea(
            ReadOnly=True, Height=180, 
            TextColor=drawing.Colors.LightGrey, 
            BackgroundColor=drawing.Color.FromArgb(30, 30, 30),
            Font=drawing.Font(drawing.FontFamilies.Monospace, 9)
        )
        
        self.verify_btn = forms.Button(Text="Select Curve & Verify Work")
        self.verify_btn.Click += self.OnVerifyClick
        
        # Layout
        layout = forms.DynamicLayout()
        layout.Spacing = drawing.Size(5, 12)
        layout.AddRow(self.title_lbl)
        layout.AddRow(self.instr_lbl)
        layout.AddRow(forms.Label(Text="VERIFICATION LOG:", TextColor=drawing.Colors.DarkGray, Font=drawing.Font(drawing.FontFamilies.Sans, 8)))
        layout.AddRow(self.audit_log)
        layout.AddRow(self.verify_btn)
        self.Content = layout

    def OnVerifyClick(self, sender, e):
        self.Visible = False
        go = input.Custom.GetObject()
        go.SetCommandPrompt("Select the Exercise 11 Polyline")
        go.GeometryFilter = docobj.ObjectType.Curve
        go.Get()
        
        if go.CommandResult() == Rhino.Commands.Result.Success:
            self.run_audit(go.Object(0).Curve())
        
        self.Visible = True

    def run_audit(self, curve):
        self.audit_log.Text = ""
        polyline = curve.ToPolyline()
        
        # Exercise 11 (Triangle/Wedge) should have 4 points (Start, 2 moves, Close)
        if polyline.Count != 4:
            self.audit_log.Append("ERROR: Expected 4 points (Triangle). Found {}.\n".format(polyline.Count), True)
            self.BackgroundColor = drawing.Color.FromArgb(60, 45, 45)
            return

        all_pass = True
        for i in range(len(self.steps)):
            step_num, label, tx, ty = self.steps[i]
            user_pt = polyline[i]

            if step_num == 1:
                # Absolute check for 8,0
                if user_pt.DistanceTo(rg.Point3d(8,0,0)) < 0.1:
                    self.audit_log.Append("STEP 1: OK (Started at 8,0)\n", True)
                else:
                    self.audit_log.Append("STEP 1: FAILED (Wrong start point)\n", True)
                    all_pass = False

            elif step_num == 4:
                # Closure check
                if curve.IsClosed:
                    self.audit_log.Append("STEP 4: OK (Closed correctly)\n", True)
                else:
                    self.audit_log.Append("STEP 4: FAILED (Shape is open)\n", True)
                    all_pass = False

            else:
                # Relative Move (Delta) check
                prev_pt = polyline[i-1]
                dx, dy = user_pt.X - prev_pt.X, user_pt.Y - prev_pt.Y
                
                if abs(dx - tx) < 0.1 and abs(dy - ty) < 0.1:
                    self.audit_log.Append("STEP {}: OK ({})\n".format(step_num, label), True)
                else:
                    all_pass = False
                    self.audit_log.Append("STEP {}: FAILED ({})\n".format(step_num, label), True)
                    self.audit_log.Append("   > You moved: @{},{}\n".format(int(dx), int(dy)), True)

        if all_pass:
            self.BackgroundColor = drawing.Color.FromArgb(43, 87, 46)
            self.audit_log.Append("\nEXERCISE COMPLETE: Perfect relative moves.", True)
        else:
            self.BackgroundColor = drawing.Color.FromArgb(60, 45, 45)

if __name__ == "__main__":
    # Start fresh
    Rhino.RhinoApp.RunScript("! _-New _None", True)
    lab = Exercise11Workbook()
    lab.Show()