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