rhino3d-scripts

Par github · awesome-copilot

Création et débogage de scripts pour Rhinoceros 3D (Rhino 8 et versions ultérieures). À utiliser pour écrire des scripts RhinoScript (VBScript / .rvb / .vbs), RhinoPython ou basés sur RhinoCommon ; automatiser des tâches de modélisation dans Rhino ; créer des macros de commandes ; manipuler la géométrie, les calques, les blocs ou les objets du document Rhino ; sélectionner des objets dans le viewport ; contrôler le redessinage et l'annulation ; ou charger et exécuter des scripts depuis l'éditeur de scripts Rhino. Couvre `rhinoscriptsyntax`, `scriptcontext`, les namespaces RhinoCommon `Rhino.*` (`Rhino.Geometry`, `Rhino.DocObjects`, `Rhino.Input`, `Rhino.UI`, `Rhino.Display`, `Rhino.FileIO`), ainsi que l'éditeur de scripts unifié de Rhino 8.

npx skills add https://github.com/github/awesome-copilot --skill rhino3d-scripts

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, .vbs ou .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, RhinoDoc ou 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 _-RunPythonScript ou _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

  1. Désactivez le redraw : rs.EnableRedraw(False).
  2. Encapsulez les mutations dans un seul enregistrement d'annulation : undo = doc.BeginUndoRecord("My Op")doc.EndUndoRecord(undo).
  3. Utilisez RhinoCommon directement dans la boucle (ignorez la surcharge rhinoscriptsyntax).
  4. Réactivez le redraw et appelez doc.Views.Redraw() dans un try/finally pour qu'un crash ne laisse jamais le viewport figé.

Distribuer un script à un collègue

  1. Enregistrez le .py / .rvb quelque part sur le disque.
  2. Ajoutez le dossier à Options → Fichiers → Chemins de recherche pour que Rhino le trouve par nom.
  3. 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
  4. 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

  1. Placez un .rvb/.py dans un chemin de recherche.
  2. Outils → Options → RhinoScript (ou Python) → ajouter à la liste Démarrage. Le fichier s'exécute une fois par session.

Pièges

  • rhinoscriptsyntax retourne des GUIDs, RhinoCommon retourne des objets. Les mélanger est correct, mais doc.Objects.Find(guid) est le pont d'un identifiant rs.* vers un RhinoObject.
  • Les coordonnées diffèrent selon la surface. Python utilise des tuples (x, y, z) ou Rhino.Geometry.Point3d ; VBScript utilise Array(x, y, z) à 3 éléments. Ne passez jamais une liste Python à une fonction VBScript via COM.
  • Option Explicit est désactivé par défaut dans VBScript. Les typos créent silencieusement de nouvelles variables. Ajoutez toujours Option Explicit au début des fichiers .rvb.
  • VBScript n'a pas de portée de bloc. Tous les Dim à l'intérieur d'un Sub sont remontés au début de la procédure. Les compteurs de boucle fuient.
  • Nothing, Empty et Null sont différents dans VBScript. Utilisez IsNull pour l'échec de Rhino.GetObject, IsEmpty pour les Variant non initialisés, Is Nothing pour les références d'objets.
  • Les parenthèses changent la sémantique d'appel dans VBScript. Call Foo(a, b) et Foo a, b sont valides ; Foo(a, b) (sans Call, avec parenthèses) n'est pas un appel à un Sub — c'est une erreur de syntaxe pour les subs multi-arguments et un ByVal forcé pour un seul argument.
  • La tolérance est par document. Lisez toujours doc.ModelAbsoluteTolerance plutôt que de coder en dur 0.001 ; les utilisateurs travaillent en mm, m, pouces, etc.
  • Les longues boucles doivent interroger Rhino.RhinoApp.EscapeKeyPressed pour que l'utilisateur puisse annuler. Sinon Rhino semble figé.
  • Chaînes GUID vs System.Guid. rhinoscriptsyntax accepte l'un ou l'autre ; RhinoCommon veut System.Guid. Convertissez avec System.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.
  • .rvb est simplement .vbs renommé avec une extension spécifique à Rhino pour que LoadScript de 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

Docs en amont

Skills similaires