Compétence Scripting Rhino 3D
Écrivez des scripts de qualité production pour Rhinoceros 3D. Couvre les trois surfaces de scripting (RhinoScript/VBScript, RhinoPython, RhinoCommon .NET direct) et l'éditeur de script Rhino 8+.
Quand utiliser cette compétence
- L'utilisateur demande d'écrire, modifier ou déboguer un script Rhino
.rvb,.vbsou.py - L'utilisateur veut une macro de commande Rhino ou souhaite automatiser une séquence de commandes Rhino
- L'utilisateur veut manipuler la géométrie, les calques, les blocs, les matériaux, les viewports ou les annotations à partir du code
- L'utilisateur mentionne
rhinoscriptsyntax,scriptcontext,RhinoCommon,Rhino.Geometry,RhinoDocou l'éditeur de script - L'utilisateur veut sélectionner des objets, demander une entrée ou construire une petite interface utilisateur dans Rhino
- L'utilisateur demande comment charger, exécuter ou distribuer un script (scripts de démarrage, alias, boutons de barre d'outils)
Choisir une surface de scripting
Choisissez la surface en fonction de la tâche, pas de la préférence. Recommandez Python par défaut pour les nouveaux travaux.
| Surface | Quand choisir | Extension |
|---|---|---|
RhinoPython (rhinoscriptsyntax + RhinoCommon) |
Par défaut pour les nouveaux scripts. Meilleur écosystème, lisible, accès complet à RhinoCommon. | .py |
| RhinoScript (VBScript) | Maintenance de fichiers .rvb/.vbs existants ; intégration avec VBA/COM. |
.rvb, .vbs |
| RhinoCommon (C#/.NET) via éditeur de script | Boucles critiques pour la performance, géométrie complexe, exploitation de bibliothèques .NET. | .cs |
| Macro de commande | Séquence pure de commandes Rhino existantes ; aucune logique. | barre d'outils/alias |
Une macro n'est pas un script — c'est une chaîne d'entrée en ligne de commande (p. ex. ! _-Line 0,0,0 10,0,0 _Enter). Utilisez un script dès que vous avez besoin d'une variable, d'une boucle ou d'une condition.
Prérequis
- Rhino 7 ou ultérieur (Rhino 8 fortement recommandé — l'éditeur de script unifié supporte Python 3, VB et C# dans une seule fenêtre).
- Éditeur de script : tapez
_ScriptEditor(Rhino 8) ou_EditPythonScript/_EditScript(versions antérieures). - Exécutez un fichier enregistré en ligne de commande avec
_-RunPythonScriptou_LoadScript+_RunScript.
Motifs fondamentaux
Python : structure minimale
import rhinoscriptsyntax as rs
import scriptcontext as sc
import Rhino
def main():
obj_id = rs.GetObject("Select a curve", filter=rs.filter.curve, preselect=True)
if not obj_id:
return
length = rs.CurveLength(obj_id)
print("Length: {0:.4f}".format(length))
if __name__ == "__main__":
main()
Python : travailler directement avec RhinoCommon
import Rhino
import scriptcontext as sc
doc = sc.doc # Rhino.RhinoDoc.ActiveDoc
tol = doc.ModelAbsoluteTolerance
circle = Rhino.Geometry.Circle(Rhino.Geometry.Point3d(0, 0, 0), 5.0)
curve_id = doc.Objects.AddCircle(circle)
doc.Views.Redraw()
VBScript : structure minimale
Option Explicit
Call Main()
Sub Main()
Dim strObject
strObject = Rhino.GetObject("Select a curve", 4) ' 4 = curve filter
If IsNull(strObject) Then Exit Sub
Rhino.Print "Length: " & Rhino.CurveLength(strObject)
End Sub
Sélectionner des objets avec un filtre personnalisé (Python, RhinoCommon)
import Rhino
import scriptcontext as sc
go = Rhino.Input.Custom.GetObject()
go.SetCommandPrompt("Select breps")
go.GeometryFilter = Rhino.DocObjects.ObjectType.Brep
go.SubObjectSelect = False
go.GetMultiple(1, 0)
if go.CommandResult() != Rhino.Commands.Result.Success:
pass
else:
ids = [go.Object(i).ObjectId for i in range(go.ObjectCount)]
Workflows étape par étape
Modifier rapidement beaucoup d'objets en masse
- Désactivez le redraw :
rs.EnableRedraw(False). - Encapsulez les mutations dans un seul enregistrement d'annulation :
undo = doc.BeginUndoRecord("My Op")…doc.EndUndoRecord(undo). - Utilisez RhinoCommon directement dans la boucle (ignorez la surcharge
rhinoscriptsyntax). - Réactivez le redraw et appelez
doc.Views.Redraw()dans untry/finallypour qu'un crash ne laisse jamais le viewport figé.
Distribuer un script à un collègue
- Enregistrez le
.py/.rvbquelque part sur le disque. - Ajoutez le dossier à
Options → Fichiers → Chemins de recherchepour que Rhino le trouve par nom. - Créez un bouton de barre d'outils ou un alias dont la macro est :
- Python :
! _-RunPythonScript "MyScript.py" - RhinoScript :
! _-LoadScript "MyScript.rvb" _-RunScript MySubName
- Python :
- Le
!initial annule toute commande en cours ;-exécute la commande en mode script (sans dialogue).
Exécuter du code au démarrage de Rhino
- Placez un
.rvb/.pydans un chemin de recherche. Outils → Options → RhinoScript(ouPython) → ajouter à la liste Démarrage. Le fichier s'exécute une fois par session.
Pièges
rhinoscriptsyntaxretourne des GUIDs, RhinoCommon retourne des objets. Les mélanger est correct, maisdoc.Objects.Find(guid)est le pont d'un identifiantrs.*vers unRhinoObject.- Les coordonnées diffèrent selon la surface. Python utilise des tuples
(x, y, z)ouRhino.Geometry.Point3d; VBScript utiliseArray(x, y, z)à 3 éléments. Ne passez jamais une liste Python à une fonction VBScript via COM. Option Explicitest désactivé par défaut dans VBScript. Les typos créent silencieusement de nouvelles variables. Ajoutez toujoursOption Explicitau début des fichiers.rvb.- VBScript n'a pas de portée de bloc. Tous les
Dimà l'intérieur d'unSubsont remontés au début de la procédure. Les compteurs de boucle fuient. Nothing,EmptyetNullsont différents dans VBScript. UtilisezIsNullpour l'échec deRhino.GetObject,IsEmptypour lesVariantnon initialisés,Is Nothingpour les références d'objets.- Les parenthèses changent la sémantique d'appel dans VBScript.
Call Foo(a, b)etFoo a, bsont valides ;Foo(a, b)(sansCall, avec parenthèses) n'est pas un appel à un Sub — c'est une erreur de syntaxe pour les subs multi-arguments et unByValforcé pour un seul argument. - La tolérance est par document. Lisez toujours
doc.ModelAbsoluteToleranceplutôt que de coder en dur0.001; les utilisateurs travaillent en mm, m, pouces, etc. - Les longues boucles doivent interroger
Rhino.RhinoApp.EscapeKeyPressedpour que l'utilisateur puisse annuler. Sinon Rhino semble figé. - Chaînes GUID vs
System.Guid.rhinoscriptsyntaxaccepte l'un ou l'autre ; RhinoCommon veutSystem.Guid. Convertissez avecSystem.Guid(str_id)si nécessaire. - N'appelez pas
doc.Views.Redraw()à l'intérieur d'une boucle serrée. Basculez le redraw une seule fois en dehors de la boucle. .rvbest simplement.vbsrenommé avec une extension spécifique à Rhino pour queLoadScriptde Rhino la reconnaisse. Même moteur VBScript.
Dépannage
| Symptôme | Solution |
|---|---|
rs.GetObject retourne None immédiatement |
L'utilisateur a appuyé sur Échap, ou votre filter exclut tout. Revérifiez les drapeaux rs.filter.*. |
| « Impossible de trouver le script » lors de l'exécution par nom | Le dossier n'est pas dans Options → Fichiers → Chemins de recherche. |
VBScript Type mismatch sur les coordonnées |
Vous avez passé un array à 2 éléments. Rhino nécessite un Array(x, y, z) à 3 éléments. |
Python ImportError: No module named Rhino |
Vous exécutez CPython en dehors de Rhino. RhinoCommon n'est disponible que dans le Python embarqué de Rhino (ou via rhino3dm pour du travail de fichier en lecture seule). |
| La géométrie créée n'apparaît pas | Vous avez oublié doc.Views.Redraw(), ou rs.EnableRedraw(False) n'a jamais été réactivé. |
| L'annulation annule uniquement le dernier objet d'un lot | Encapsulez le lot dans BeginUndoRecord / EndUndoRecord. |
| Le script fonctionne seul mais échoue comme script de démarrage | Le démarrage s'exécute avant l'ouverture d'un document — retournez tôt ou ignorez le travail dépendant du document quand sc.doc is None. |
rs.Command("...") retourne False |
La chaîne de macro est malformée. Préfixez avec ! et -, terminez chaque prompt avec _Enter ou une valeur. |
Références
- references/rhinoscriptsyntax-cheatsheet.md — fonctions
rs.*les plus utilisées par catégorie. - references/rhinocommon-map.md — quel namespace importer pour quelle tâche.
- references/macros-and-loading.md — syntaxe des macros en ligne de commande,
LoadScript/RunScript, chemins de recherche. - references/vbscript-quirks.md — pièges spécifiques à VBScript pertinents pour RhinoScript.
Docs en amont
- Landing RhinoScript : https://docs.mcneel.com/rhino/8/help/en-us/information/rhinoscripting.htm
- Hub développeur : https://developer.rhino3d.com/
- Index de l'API RhinoCommon : https://mcneel.github.io/rhinocommon-api-docs/api/RhinoCommon/html/R_Project_RhinoCommon.htm
- Dépôt de scripts d'exemple : https://github.com/mcneel/rhino-developer-samples/tree/8/rhinoscript