L'interface de script Ayam se compose d'un certain nombre de procédures Tcl et de commandes Tcl qui sont également utilisées en interne par l'application.
L'entrée du menu principal "File/New"
par exemple appelle la commande de l'interface de script "newScene"
(parmi d'autres commandes).
Utiliser l'interface de script signifie appeler ces commandes par vous-même, éventuellement en les mélangeant avec du code de script Tcl standard.
De plus, en utilisant Tcl et ses capacités d'introspection, vous pourriez facilement modifier le code dont est composé Ayam. Cela n'est cependant pas recommandé pour de bonnes raisons (à moins que vous ne lisiez le code source de Ayam et que vous sachiez vraiment ce que vous faites). Faites donc attention aux procédures et commandes déjà existantes lorsque vous implémentez les vôtres. L'utilisation de procédures et de commandes non mentionnées dans cette documentation est également dangereuse. L'implémentation et les interfaces de ces procédures et commandes peuvent changer dans les futures versions de Ayam sans préavis.
Dans Tcl, toutes les variables, procédures et commandes sont sensibles à la casse, ce qui fait que "sL"
est différent de "sl"
, de "Sl"
et de "SL"
.
L'interface de script peut être utilisée directement depuis la console de Ayam.
Vous pouvez, bien sûr, également écrire des scripts dans vos propres fichiers de script Tcl, qui peuvent être chargés à tout moment dans Ayam en utilisant la console et la commande Tcl "source"
.
Vous pouvez également faire en sorte qu'un fichier script soit exécuté automatiquement à chaque démarrage de l'application en utilisant le paramètre de préférence "Main/Scripts"
.
De plus, sur les systèmes X11 et Aqua window, Ayam est capable d'exécuter du code script envoyé via la commande Tk "send"
ou la commande AppleScript "tell"
à partir d'applications externes.
Contrairement à d'autres environnements de modélisation, dans Ayam, il existe encore une autre façon d'exécuter des scripts. Dans Ayam, les scripts peuvent également être attachés à des objets Script et s'exécuter lorsque le mécanisme de notification met à jour la scène. Voir aussi la section L'objet Script.
Même les objets normaux peuvent déclencher des scripts sur notification en utilisant les balises BNS ou ANS. Voir aussi la sections Balise BNS (Before Notify Script) et Balise ANS (After Notify Script).
Notez que la plupart des commandes de l'interface de script énumérées dans cette documentation fonctionnent en arrière-plan, sans rien changer à l'interface graphique Ayam et aux fenêtres de visualisation Ayam, pour des raisons de rapidité d'exécution. Si vous souhaitez que vos modifications soient visibles, vous devez mettre à jour les différentes parties de l'interface graphique (propriétés des interfaces graphiques, fenêtres de visualisation) de manière explicite (Voir aussi la section Mettre à jour l'interface graphique).
Cependant, depuis Ayam 1.13, il est également possible d'exécuter automatiquement des commandes de mise à jour de l'interface graphique dans la console en utilisant <Shift+Return>
au lieu de <Return>
lors de l'émission de commandes de l'interface de script.
Notez cependant que même si aucune mise à jour de l'interface graphique n'a lieu, tous les processus de notification sont exécutés immédiatement.
La scène sera cohérente et mise à jour lorsque la commande de l'interface de script sera renvoyée.
Si vous souhaitez que vos modifications soient enregistrées dans la mémoire tampon d'annulation, vous devez également le faire manuellement (voir la documentation de la commande d'annulation : Annuler).
À partir de scripts, il peut être nécessaire de vérifier si une erreur s'est produite lors de l'exécution d'une commande.
Toutes les commandes renvoient TCL_OK
dans tous les cas, donc la vérification de leur valeur de retour n'aboutit à rien, mais elles fixent la variable globale Tcl "ay_error"
à une valeur supérieure à 1 si une erreur s'est produite.
Vous devez mettre "ay_error" à zéro avant et vérifier sa valeur après l'opération en question pour voir si l'opération s'est bien déroulée :
proc myProc { } { set ::ay_error 0 copOb if { $::ay_error > 1 } { ayError 2 "myProc" "Error copying object!" } }
Plusieurs variables et tableaux globaux existent dans le contexte Tcl de Ayam, et qui peuvent être utiles pour les scripts.
La variable globale "ay_error"
contient l'état d'erreur actuel.
Voir aussi la section
Signalement d'erreur.
La variable globale "i"
est utilisée par toutes les variantes de la commande "forAll"
.
Voir aussi la section
Appliquer des commandes à un certain nombre d'objets.
Les variables globales "u"
et "v"
sont définies par les actions find u/uv.
Voir aussi la sections
Trouver des points sur les courbes and
Trouver des points sur les surfaces.
Le tableau global "ay"
contient les variables d'état de l'application.
En outre, vous pouvez trouver dans ce tableau les chemins d'accès aux widgets importants (par exemple le widget d'arbre pour la hiérarchie d'objets ou la vue actuellement active).
Utilisez "parray ay"
dans la console pour voir ce qui s'y trouve.
Plus de documentation à venir.
Le tableau global "ayprefs"
contient des données sur les préférences.
Le tableau complet est enregistré dans le fichier ayamrc à la sortie, donc soyez prudent lorsque vous ajoutez de nouveaux éléments à ce tableau.
Voir aussi la section
Le fichier Ayamrc.
Utilisez "parray ayprefs"
dans la console pour voir ce qui s'y trouve.
Plus de documentation à venir.
Notez que les modifications apportées à ce tableau du côté Tcl ne prennent pas effet immédiatement car les données doivent être transférées dans le contexte C à l'aide de la commande "setPrefs"
.
Voir aussi la section
Gestion des préférences.
Le tableau global "aymark"
contient une copie de la position actuelle de la marque. [∗]
Il est mis à jour chaque fois que la marque est définie, par exemple en utilisant l'action "set mark" (voir la section
Définir une marque).
Les modifications manuelles apportées à ce tableau n'ont aucun effet sur la marque.
Pour chaque type d'objet, il existe une variable globale correspondante, qui contient les noms des propriétés de ce type d'objet sous forme de liste.
Le nom de la variable est simplement le nom du type d'objet suivi de _props
(pour les propriétés).
Par exemple, pour le type d'objet NCurve, cette variable est nommée "NCurve_props"
et la liste qu'elle contient ressemble à ceci :
{ Transformations Attributes Tags NCurveAttr }
Cette liste est consultée chaque fois qu'un seul objet est sélectionné dans l'arborescence ou dans l'objet liste des widget et son contenu est utilisé pour remplir les propriétés de la listbox du widget. (????) Voir aussi la section Propriétés.
Notez que la liste peut être manipulée ultérieurement par les balises "NP"
et "RP"
de l'objet sélectionné.
Pour chaque propriété, il existe un tableau global correspondant, où la propriété est gérée. Pour la propriété Transformations, ce tableau ressemble à ceci :
Transformations { arr transfPropData sproc setTrafo gproc getTrafo w fTrafoAttr }
"arr"
, désigne le nom du tableau global de données de propriété (ainsi, les données de transformation sont stockées dans un tableau appelé "transfPropData"
).
Ce tableau ne contient des données utiles que lorsqu'il a été rempli explicitement par le retour de la procédure "get-property" si bien nommée.
Les entrées "sproc"
et "gproc"
désignent les procédures ou commandes de rappel "set-property" et "get-property".
Elles sont appelées, respectivement, lorsque le bouton "Apply"
est utilisé ou que la propriété est sélectionnée dans la liste des propriétés.
Si "sproc" ou "gproc" sont des chaînes vides (""
), les retours standards nommés "setProp"
ou "getProp"
seront utilisés pour obtenir ou définir les valeurs des propriétés.
Mais pour la propriété Transformations, les commandes "setTrafo"
et "getTrafo"
doivent être utilisées.
La flexibilité acquise par les procédures individuelles de "sproc"/"gproc" est utilisée pour nettoyer les entrées de l'utilisateur, exécuter un code de mise à jour supplémentaire de l'interface graphique ou réaliser des interfaces graphiques de propriétés dynamiques.
La dernière entrée, "w"
, est le nom de la fenêtre principale de l'interface graphique des propriétés.
Pour obtenir le chemin complet et utilisable du widget de cette fenêtre, la valeur actuelle de l'entrée du tableau "ay(pca)"
doit être préfixée : $ay(pca).$Transformations(w)
.
Notez que pour de nombreux types d'objets, la variable propriété et les tableaux de gestion de propriété spécifiques au type d'objet n'existent qu'après une procédure d'initialisation spécifique au type d'objet, dérivée du nom du type, appelée, par exemple, "init_Box"
.
Ces type sont : "ACurve", "Bevel", "Birail1", "Birail2", "Box", "BPatch", "Cap", "ConcatNC", "ConcatNP", "Cone", "Cylinder", "Disk", "ExtrNC", "ExtrNP", "Hyperboloid", "ICurve", "IPatch", "NCircle", "OffsetNC", "OffsetNP", "PatchMesh", "Paraboloid", "Revolve", "RiInc", "RiProc", "Script", "SDMesh", "Select", "Sphere", "Sweep", "Swing", "Torus", et "Trim".
Depuis Ayam 1.16, le tableau global de gestion des propriétés peut être créé facilement en utilisant la nouvelle commande de l'interface de script "addPropertyGUI"
.
Voir aussi la section
Gestion de l'interface graphique des propriétés.
Les tableaux globaux suivants et les retours pour obtenir ou définir les données existent :
property | array | get-property callback | set-property callback |
Transformations | transfPropData | getTrafo | setTrafo |
Attributes | attrPropData | getAttr | setAttrp |
Material | matPropData | getMat | setMat |
Tags | tagsPropData | getTagsp | setTagsp |
MaterialAttr | MaterialAttrData | "" | setMaterialAttrp |
Surface | ay_shader | shader_getSurf | shader_setSurf |
Displacement | ay_shader | shader_getDisp | shader_setDisp |
Interior | ay_shader | shader_getInt | shader_setInt |
Exterior | ay_shader | shader_getExt | shader_setExt |
Light | ay_shader | light_getShader | light_setShader |
LightAttr | LightAttrData | light_getAttr | "" |
ViewAttrib | ViewAttribData | "" | setViewAttr |
Camera | CameraData | "" | setCameraAttr |
NCurveAttr | NCurveAttrData | "" | "" |
NPatchAttr | NPatchAttrData | "" | "" |
ICurveAttr | ICurveAttrData | "" | "" |
NCircleAttr | NCircleAttrData | "" | "" |
Notez que cette liste est assez incomplète, mais les informations peuvent toujours être facilement déduites en utilisant la commande "parray"
dans la console Ayam :
» parray NCurveAttr
Voir aussi la section
Manipuler les propriétés pour plus d'informations sur la façon de modifier les valeurs des propriétés à partir de l'interface de script.
Cette section fournit une documentation sur les procédures et les commandes les plus importantes de l'interface de scripting de Ayam, classées par catégorie.
Notez que la commande "help"
dans la console Ayam peut être utilisée pour passer directement à la sous-section appropriée de cette partie de la documentation.
Toutes les procédures et commandes sont documentées selon le schéma suivant :
"commande param1 param2 [optionalparam1]"
(syntaxe de la commande et de ses paramètres),"commande 1 2"
(exemple d'application de la commande avec explication des résultats attendus).Depuis Ayam 1.8.2, une commande d'interface de script appelée "help"
est disponible, qui affiche l'aide des commandes d'interface de script utilisant un navigateur web (similaire à la fonction "Help on Object"
) :
"help command"
"help help"
affiche l'aide de la procédure d'aide.
Pour créer de nouveaux objets, la commande "crtOb"
peut être utilisée.
"crtOb type [args]"
"crtOb"
,
"type"
peut être dérivé des noms de types d'objets, tels qu'ils sont affichés dans l'arborescence.
Le nouvel objet sera créé et lié à la scène comme le dernier objet du niveau actuel, aucune partie de l'interface graphique (widget de sélection des objets, interface graphique des propriétés, vues) ne sera mise à jour.
En outre, le nouvel objet ne sera pas sélectionné.
Selon le type, d'autres arguments peuvent (ou doivent) être donnés ; certains types d'objets s'attendent à ce que d'autres objets soient sélectionnés lors de leur création.
Tous les arguments se composent d'une partie nom d'option et d'une partie valeur (c'est-à-dire que c'est "-center 1"
et non "-center"
et non plus "-center=1"
).
Les noms des options peuvent être abrégés.
Il existe des valeurs par défaut et des valeurs de repli utiles (voir ci-dessous).
Les arguments peuvent être mélangés librement (leur ordre n'est pas important) et répétés.
Si les arguments sont répétés, seule la dernière valeur définie est utilisée, même si cela entraîne des erreurs et l'application de valeurs de repli par la suite.
Voici une liste complète des arguments disponibles, triés par type d'objet :
"NCurve"
: Les courbes NURBS acceptent les arguments suivants :
"-length"
: longueur de la nouvelle courbe, la longueur par défaut est de 4."-order"
: ordre de la nouvelle courbe, l'ordre par défaut est 4.
Si une valeur supérieure à la longueur est spécifiée, l'ordre sera rendu identique à la valeur de la longueur."-kt"
: le type de noeud de la nouvelle courbe, doit être l'un des suivants : 0 – Bezier, 1 – BSpline, 2 – NURB, 3 – Custom, 4 – Chordal, 5 – Centripetal.
Un vecteur de noeud du type spécifié sera automatiquement créé.
Le type de noeud est par défaut 2 – NURB.
Si un vecteur de noeud personnalisé est spécifié en utilisant l'option "-kv"
ci-dessous, le type de noeud sera toujours défini sur 3 –"-kv"
: le vecteur de noeud de la nouvelle courbe.
La valeur de cette option est une liste de nombres à virgule flottante de la longueur de la courbe plus l'ordre de la courbe, par exemple pour une courbe avec 2 points de contrôle et d'ordre 2, spécifiez 4 noeuds : "-kv {0.0 0.0 1.0 1.0}"
.
Par défaut, le vecteur noeuds est un vecteur noeuds créé automatiquement du type spécifié par l'option "-kt"
ci-dessus."-kn"
: le vecteur de noeud de la nouvelle courbe.
La valeur de cette option est un nom de variable (avec un tableau et un espace de noms optionnels).
La valeur de cette variable doit être compatible avec l'option "-kv"
ci-dessus."-cv"
: le vecteur de contrôle de la nouvelle courbe.
La valeur de cette option est une liste de nombres à virgule flottante qui décrivent les coordonnées du rationnel (poids non multipliés) euclidien 4D des points de contrôle."-cv {0.0 0.0 0.0 1.0 1.0 0.0 0.0 1.0 2.0 0.0 0.0 1.0}"
."-cn"
: le vecteur de contrôle de la nouvelle courbe.
La valeur de cette option est un nom de variable (avec un tableau et un espace de noms optionnels).
La valeur de cette variable doit être compatible avec l'option "-cv"
ci-dessus."-dx"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension x, la valeur par défaut est 0.25."-dy"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension y, la valeur par défaut est 0.0."-dz"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension z, la valeur par défaut est 0.0"-center"
: Si la valeur de l'option "-center"
est 1, la nouvelle courbe sera centrée.
La valeur par défaut est 0, pas de centrage.
Cette option n'est en vigueur que si aucune option "-cv"
n'est spécifiée."-createmp"
: L'option "-createmp"
active la création de points multiples.
La valeur par défaut est 0."crtOb NCurve"
"crtOb NCurve -center 1"
"crtOb NCurve -length 5 -center 1 -dx 0.5"
Dans les versions de Ayam antérieures à la version 1.17, les courbes NURBS n'acceptaient que l'argument "-length"
.
Voir aussi la section
L'objet NCurve (NURBS).
"ICurve"
: Les courbes d'interpolation acceptent les arguments suivants :
"-type"
: le type de la nouvelle courbe, doit être : 0 – Open, 1 – Closed; la valeur par défaut est 0."-length"
: la longueur (nombre de points de données à interpoler) de la nouvelle courbe ; la longueur est par défaut de 4."-order"
: ordre de la nouvelle courbe, l'ordre par défaut est 4.
Si une valeur supérieure à la longueur est spécifiée, l'ordre sera rendu identique à la valeur de la longueur."-pt"
: le type de paramètre de la nouvelle courbe, doit être : 0 – Chordal, 1 – Centripetal, 2 – Uniform; la valeur par défaut est 0."-cv"
: le vecteur de contrôle de la nouvelle courbe.
La valeur de cette option est une liste de nombres à virgule flottante qui décrivent les coordonnées 3D (non rationnelles) des points de contrôle.
Cette liste peut également ne spécifier qu'un seul point, qui est alors pris comme point de départ et DX/DY/DZ (voir ci-dessous) sont utilisés pour créer automatiquement les points de contrôle manquants.
Pour spécifier un vecteur de contrôle complet, cette liste doit avoir une longueur de courbe*3 éléments, par exemple pour une courbe de longueur 3, spécifier 9 valeurs : "-cv {0.0 0.0 0.0 1.0 0.0 0.0 2.0 0.0 0.0}"
."-cn"
: le vecteur de contrôle de la nouvelle courbe.
La valeur de cette option est un nom de variable (avec un tableau et un espace de noms optionnels).
La valeur de cette variable doit être compatible avec l'option "-cv"
ci-dessus."-dx"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension x, la valeur par défaut est 0.25."-dy"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension y, la valeur par défaut est 0.0."-dz"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension z, la valeur par défaut est 0.0"-center"
: Si la valeur de l'option "-center"
est 1, la nouvelle courbe sera centrée.
La valeur par défaut est 0, pas de centrage.
Cette option n'est en vigueur que si aucune option "-cv"
n'est spécifiée."-derivs"
: la valeur de cette option contrôle si les dérivés finaux définis par l'utilisateur doivent être utilisés : 0 – non, 1 – oui, la valeur par défaut est 0."-sdlen"
: la valeur de cette option spécifie la longueur relative (par rapport à la distance du premier et du deuxième point de contrôle) de la dérivée de départ, la valeur par défaut est 0.125."-sderiv"
: est la dérivée de départ, spécifiée comme une liste de trois valeurs flottantes.
La dérivée est spécifiée par rapport au premier point de contrôle.
La dérivée de départ est par défaut une dérivée créée automatiquement d'une direction prise à partir des deux premiers points de contrôle et de la longueur spécifiée par l'option "-sdlen"
."-edlen"
: la valeur de cette option spécifie la longueur relative (par rapport à la distance de l'avant-dernier et du dernier point de contrôle) de la dérivée finale, la valeur par défaut est 0.125."-ederiv"
: est la dérivée finale, spécifiée comme une liste de trois valeurs flottantes.
La dérivée est spécifiée par rapport au dernier point de contrôle.
La dérivée finale est par défaut une dérivée créée automatiquement d'une direction prise à partir des deux derniers points de contrôle et de la longueur spécifiée par l'option "-edlen"
."crtOb ICurve"
"crtOb ICurve -l 5 -sderiv {0.0 -0.5 0.0} -ederiv {0.0 -0.5 0.0} -derivs 1 -center 1"
Dans les versions de Ayam antérieures à la version 1.17, les courbes d'interpolation n'acceptaient que l'argument "-length"
.
Voir aussi la section
Les courbes interpolées (ICurve).
"ACurve"
: Les courbes d'approximation acceptent les arguments suivants :
"-type"
: le type de la nouvelle courbe, doit être : 0 – Ouvert, 1 – Fermé; la valeur par défaut est 0."-length"
: longueur (nombre de points de données à approximer) de la nouvelle courbe, la longueur par défaut est de 4."-alength"
: le nombre de points de contrôle NURBS à utiliser pour la courbe d'approximation doit être inférieur à la longueur ci-dessus ; ce paramètre est par défaut de length-1."-order"
: ordre de la nouvelle courbe, l'ordre par défaut est 3.
Si une valeur supérieure à la longueur de sortie est spécifiée, l'ordre sera rendu identique à la valeur de la longueur de sortie.
Actuellement, seules les valeurs supérieures à 2 sont prises en charge."-symmetric"
: bascule la création de courbes symétriques, doit être l'un des éléments suivants : 0 – Asymétrique, 1 – Symétrique ; la valeur par défaut est 0."-cv"
: le vecteur de contrôle de la nouvelle courbe.
La valeur de cette option est une liste de nombres à virgule flottante qui décrivent les coordonnées 3D (non rationnelles) des points de contrôle.
Cette liste peut également ne spécifier qu'un seul point, qui est alors pris comme point de départ et DX/DY/DZ (voir ci-dessous) sont utilisés pour créer automatiquement les points de contrôle manquants.
Pour spécifier un vecteur de contrôle complet, cette liste doit avoir une longueur de courbe*3 éléments, par exemple pour une courbe de longueur 3, spécifier 9 valeurs : "-cv {0.0 0.0 0.0 1.0 0.0 0.0 2.0 0.0 0.0}"
."-cn"
: le vecteur de contrôle de la nouvelle courbe.
La valeur de cette option est un nom de variable (avec un tableau et un espace de noms optionnels).
La valeur de cette variable doit être compatible avec l'option "-cv"
ci-dessus."-dx"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension x, la valeur par défaut est 0.25."-dy"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension y, la valeur par défaut est 0.0."-dz"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension z, la valeur par défaut est 0.0"-center"
: Si la valeur de l'option "-center"
est 1, la nouvelle courbe sera centrée.
La valeur par défaut est 0, pas de centrage.
Cette option n'est en vigueur que si aucune option "-cv"
n'est spécifiée."crtOb ACurve -length 6"
"crtOb ACurve -l 5 -center 1"
Dans les versions de Ayam antérieures à 1.17, les courbes d'approximation n'acceptaient que l'argument "-length"
.
Voir aussi la section
Les courbes approximées (ACurve).
"NPatch"
: Les patchs NURBS acceptent les arguments suivants :
"-width"
: largeur du nouveau patch, la largeur par défaut est de 4."-height"
: hauteur du nouveau patch, la hauteur par défaut est de 4."-uorder"
: l'ordre du nouveau patch dans la dimension paramétrique U, l'ordre est par défaut de 4.
Si une valeur supérieure à la largeur est spécifiée, l'ordre sera rendu identique à la valeur de la largeur."-ukt"
: le type de noeud U du nouveau patch, doit être une des valeurs suivantes : 0 – Bezier, 1 – BSpline, 2 – NURB, 3 – Custom, 4 – Chordal, 5 – Centripetal.
Un vecteur de noeud du type spécifié sera automatiquement créé.
Le type de noeud est par défaut 2 – NURB.
Si un vecteur de noeud personnalisé est spécifié en utilisant l'option "-ukv"
ci-dessous, le type de noeud sera – Custom."-ukv"
: le vecteur du noeud U du nouveau patch.
La valeur de cette option est une liste de nombres à virgule flottante de longueur, largeur et ordre U du patch, par exemple pour un patch de largeur 2 et d'ordre U 2, spécifiez 4 noeuds : "-ukv {0.0 0.0 1.0 1.0}"
.
Par défaut, le vecteur noeud est un vecteur noeud créé automatiquement du type spécifié par l'option "-ukt"
ci-dessus."-un"
: le vecteur du noeud U du nouveau patch.
La valeur de cette option est un nom de variable (avec un tableau et un espace de noms optionnels).
La valeur de cette variable doit être compatible avec l'option "-ukv"
ci-dessus."-vorder"
: l'ordre du nouveau patch en dimension paramétrique V, l'ordre est par défaut de 4.
Si une valeur supérieure à la hauteur est spécifiée, l'ordre sera rendu identique à la valeur de la hauteur."-vkt"
: le type de noeud V du nouveau patch, doit être l'une des valeurs suivantes : 0 – Bezier, 1 – BSpline, 2 – NURB, 3 – Custom, 4 – Chordal, 5 – Centripetal.
Un vecteur de noeud du type spécifié sera automatiquement créé.
Le type de noeud est par défaut 2 – NURB.
Si un vecteur de noeud personnalisé est spécifié en utilisant l'option "-vkv"
ci-dessous, le type de noeud sera 3 – Custom."-vkv"
: le vecteur noeud V du nouveau patch.
La valeur de cette option est une liste de nombres à virgule flottante de la hauteur de la longueur plus l'ordre V du patch, par exemple pour un patch de hauteur 2 et d'ordre V 2, spécifiez 4 noeuds : "-vkv {0.0 0.0 1.0 1.0}"
.
Par défaut, le vecteur noeud est un vecteur noeud créé automatiquement du type spécifié par l'option "-vkt"
ci-dessus."-vn"
: le vecteur noeud V du nouveau patch.
La valeur de cette option est un nom de variable (avec un tableau et un espace de noms optionnels).
La valeur de cette variable doit être compatible avec l'option "-vkv"
ci-dessus."-cv"
: le vecteur de contrôle du nouveau patch.
La valeur de cette option est une liste de nombres à virgule flottante qui décrivent les coordonnées du rationnel (poids non multiplié) euclidien 4D des points de contrôle.
Cette liste peut également ne spécifier qu'un seul point, qui est alors pris comme point de départ et les points de contrôle manquants sont créés automatiquement à l'aide de UDX/UDY/UDZ et VDX/VDY/VDZ (voir ci-dessous).
Pour spécifier un vecteur de contrôle complet, cette liste doit avoir width*height*4 éléments, par exemple pour un patch de largeur 2 et de hauteur 2, spécifiez 16 valeurs : "-cv {0.0 0.0 0.0 1.0 1.0 0.0 0.0 1.0 2.0 0.0 0.0 1.0 2.0 1.0 0.0 1.0}"
."-cn"
: le vecteur de contrôle du nouveau patch.
La valeur de cette option est un nom de variable (avec un tableau et un espace de noms optionnels).
La valeur de cette variable doit être compatible avec l'option "-cv"
ci-dessus."-udx"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension x entre les points d'une ligne (dimension paramétrique U, le long de la largeur), la valeur par défaut est 0.25."-udy"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension y entre les points d'une ligne (dimension paramétrique U, le long de la largeur), la valeur par défaut est 0.0."-udz"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension z entre les points d'une rangée (dimension paramétrique U, le long de la largeur), la valeur par défaut est 0.0"-vdx"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension x entre les points d'une colonne (dimension paramétrique V, le long de la hauteur), la valeur par défaut est 0.0."-vdy"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension y entre les points d'une colonne (dimension paramétrique V, le long de la hauteur), la valeur par défaut est 0.25."-vdz"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension z entre les points d'une colonne (dimension paramétrique V, le long de la hauteur), la valeur par défaut est 0.0"-center"
: Si la valeur de l'option "-center"
est 1, le nouveau patch sera centré.
La valeur par défaut est 0, pas de centrage.
Cette option n'est en vigueur que si aucune option "-cv"
n'est spécifiée."-createmp"
: L'option "-createmp"
active la création de points multiples.
La valeur par défaut est 0."crtOb NPatch"
"crtOb NPatch -vdy 0 -vdz 0.25"
"crtOb NPatch -udy 0.25"
"crtOb NPatch -udy 0.25 -vdz 0.25"
"crtOb NPatch -width 2 -height 2 -center 1 -udx 2 -vdy 2"
"crtOb NPatch -width 3 -height 2 -uorder 2 -cv {-1 0 1 1 1 0 1 1 -1 0 0 1 1 0 0 1 -1 1 0 1 1 1 0 1}"
-uorder 2
pour obtenir une forme lisse).Dans les versions de Ayam antérieures à la version 1.17, les correctifs NURBS n'acceptaient que l'argument " -width "
et " -height "
.
Voir aussi la section
Patch NURBS (NPatch).
"IPatch"
: Les patches interpolés acceptent les arguments suivants :
"-width"
: largeur du nouveau patch, la largeur par défaut est de 4."-height"
: hauteur du nouveau patch, la hauteur par défaut est de 4."-uorder"
: l'ordre du nouveau patch dans la dimension paramétrique U, l'ordre est par défaut de 4.
Si une valeur supérieure à la largeur est spécifiée, l'ordre sera rendu identique à la valeur de la largeur.
Une valeur de 0 désactive l'interpolation le long de U."-ukt"
: le type de paramétrage U, doit être l'un des suivants : 0 – Chordal (par défaut), 1 – Centripetal, 2 – Uniform."-vorder"
: l'ordre du nouveau patch en dimension paramétrique V, l'ordre est par défaut de 4.
Si une valeur supérieure à la hauteur est spécifiée, l'ordre sera rendu identique à la valeur de la hauteur.
Une valeur de 0 désactive l'interpolation le long de V."-vkt"
: le type de paramétrage V, doit être l'un des suivants : 0 – Chordal (par défaut), 1 – Centripetal, 2 – Uniform."-deriv_u"
: le mode dérivé final pour U, doit être l'un des suivants : 0 – None (par défaut), 1 – Automatic, ou 2 – Manual.
En mode manuel, les vecteurs dérivés complets doivent être fournis via "-ederiv_u"
et "-sderiv_u"
."-edlen_u"
: la longueur des dérivés finaux calculés automatiquement à la fin du patch en U (par défaut 0.125)."-sdlen_u"
: la longueur des dérivés de fin calculés automatiquement au début du patch en U (par défaut 0.125)."-ederiv_u"
: les dérivés finaux pour U à la fin du patch.
La valeur de cette option est une liste de 3*height nombres à virgule flottante.
Il n'y a pas de valeur par défaut."-sderiv_u"
: les dérivés finaux pour U à la fin du patch.
La valeur de cette option est une liste de nombres à virgule flottante de 3*hauteurs.
Il n'y a pas de valeur par défaut."-deriv_v"
: le mode de dérivation finale pour V, doit être l'un des suivants : 0 – None (par défaut), 1 – Automatic, ou 2 – Manual. En mode manuel, les vecteurs dérivés complets doivent être fournis via "-ederiv_v"
et "-sderiv_v"
."-edlen_v"
: la longueur des dérivés finaux calculés automatiquement à la fin du patch en V (par défaut 0.125)."-sdlen_v"
: la longueur des dérivés de fin calculés automatiquement au début du patch en V (par défaut 0.125)."-ederiv_v"
: les dérivés finaux pour le V à la fin du patch.
La valeur de cette option est une liste de nombres à virgule flottante de 3*largeur.
Il n'y a pas de valeur par défaut."-sderiv_v"
: les dérivés de fin pour le V au début du patch.
La valeur de cette option est une liste de nombres à virgule flottante de 3*largeur.
Il n'y a pas de valeur par défaut."-cv"
: le vecteur de contrôle du nouveau patch.
La valeur de cette option est une liste de nombres à virgule flottante qui décrivent les coordonnées 3D non rationnelles des points de données à interpoler."-cv {0.0 0.0 0.0 1.0 0.0 0.0 2.0 0.0 0.0 2.0 1.0 0.0}"
."-cn"
: le vecteur de contrôle du nouveau patch.
La valeur de cette option est un nom de variable (avec un tableau et un espace de noms optionnels).
La valeur de cette variable doit être compatible avec l'option "-cv"
ci-dessus."-udx"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension x entre les points d'une ligne (dimension paramétrique U, le long de la largeur), la valeur par défaut est 0.25."-udy"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension y entre les points d'une rangée (dimension paramétrique U, le long de la largeur), la valeur par défaut est 0.0."-udz"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension z entre les points d'une rangée (dimension paramétrique U, le long de la largeur), la valeur par défaut est 0.0"-vdx"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension x entre les points d'une colonne (dimension paramétrique V, le long de la hauteur), la valeur par défaut est 0.0."-vdy"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension y entre les points d'une colonne (dimension paramétrique V, le long de la hauteur), la valeur par défaut est 0.25."-vdz"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension z entre les points d'une colonne (dimension paramétrique V, le long de la hauteur), la valeur par défaut est 0.0"-center"
: Si la valeur de l'option "-center"
est 1, le nouveau patch sera centré.
La valeur par défaut est 0, pas de centrage.
Cette option n'est en vigueur que si aucune option "-cv"
n'est spécifiée."crtOb IPatch"
"crtOb IPatch -vdy 0 -vdz 0.25"
"crtOb IPatch -udy 0.25"
"crtOb IPatch -udy 0.25 -vdz 0.25"
"crtOb IPatch -width 3 -height 3 -center 1 -udx 2 -vdy 2"
Voir aussi la section Les patch interpolés (IPatch).
"PatchMesh"
: Les patch maillés acceptent les arguments suivants :
"-type"
: Le type de maillage du nouveau patch doit être l'un des suivants : 0 – bilinéaire ou 1 – bicubique, par défaut 1."-width"
: largeur du nouveau patch, la largeur par défaut est de 4.
Les valeurs valides pour les mailles de patchs bicubes dépendent de la fermeture et de la taille des pas dans le sens U.
Voir également la discussion dans la section
Propriété PatchMeshAttr.
"-height"
: Les valeurs valides pour les mailles de patchs bicubes dépendent de la fermeture et de la taille des marches dans la direction V.
Voir également la discussion dans la section
Propriété PatchMeshAttr.
"-closeu"
: détermine si le maillage du patch est fermé dans la direction du U ; doit être soit 0 – ouvert (par défaut) ou 1 – fermé."-closev"
: détermine si le maillage du patch est fermé dans la direction V ; doit être soit 0 – ouvert (par défaut) ou 1 – fermé."-ubt"
: le type de base U, doit être l'un des suivants : 0 – Bezier (par défaut), 1 – B-Spline, 2 – Catmull-Rom, 3 – Hermite, 4 – Power, 5 – Custom."-vbt"
: le type de base V, doit être l'un des suivants : 0 – Bezier (par défaut), 1 – B-Spline, 2 – Catmull-Rom, 3 – Hermite, 4 – Power, 5 – Custom."-ubasis"
: la base U ; doit être constituée de 16 valeurs flottantes dans l'ordre de la colonne principale.
Si elle est définie, le type de base U sera automatiquement réglé sur "Custom" et la taille du pas doit être spécifiée (si elle est différente de 3)."-ubn"
: la base U.
La valeur de cette option est un nom de variable (avec un tableau et un espace de noms optionnels).
La valeur de cette variable doit être compatible avec l'option "-ubasis"
ci-dessus."-vbasis"
: la base V ; doit être constituée de 16 valeurs flottantes dans l'ordre de la colonne principale.
S'il est défini, le type de base V sera automatiquement réglé sur Custom et la taille de l'échelon doit être spécifiée (si elle est différente de 3)."-vbn"
: la base V.
La valeur de cette option est un nom de variable (avec un tableau et un espace de noms optionnels).
La valeur de cette variable doit être compatible avec l'option "-vbasis"
ci-dessus."-ustep"
: la taille de l'échelon de base U ; doit être de 1, 2, 3 ou 4. Peut être omis pour tous les types de base non personnalisés."-vstep"
: la taille de l'échelon de base V ; doit être de 1, 2, 3 ou 4. Peut être omis pour tous les types de base non personnalisés."-cv"
: le vecteur de contrôle du nouveau patch maillé.
La valeur de cette option est une liste de nombres à virgule flottante qui décrivent les coordonnées rationnelles 3D des points de contrôle."-cv {0.0 0.0 0.0 1.0 1.0 0.0 0.0 1.0 2.0 0.0 0.0 1.0 2.0 1.0 0.0 1.0}"
."-cn"
: le vecteur de contrôle du nouveau patch maillé. La valeur de cette option est un nom de variable (avec un tableau et un espace de noms optionnels). La valeur de cette variable doit être compatible avec l'option "-cv"
ci-dessus."-udx"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension x entre les points d'une ligne (dimension paramétrique U, le long de la largeur), la valeur par défaut est 0.25."-udy"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension y entre les points d'une rangée (dimension paramétrique U, le long de la largeur), la valeur par défaut est 0.0."-udz"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension z entre les points d'une rangée (dimension paramétrique U, le long de la largeur), la valeur par défaut est 0.0"-vdx"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension x entre les points d'une colonne (dimension paramétrique V, le long de la hauteur), la valeur par défaut est 0.0."-vdy"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension y entre les points d'une colonne (dimension paramétrique V, le long de la hauteur), la valeur par défaut est 0.25."-vdz"
: la valeur de cette option spécifie la distance des points de contrôle créés automatiquement dans la dimension z entre les points d'une colonne (dimension paramétrique V, le long de la hauteur), la valeur par défaut est 0.0"-center"
: Si la valeur de l'option "-center"
est 1, le nouveau patch sera centré. La valeur par défaut est 0, pas de centrage. Cette option n'est en vigueur que si aucune option "-cv"
n'est spécifiée."crtOb PatchMesh"
"crtOb PatchMesh -vdy 0 -vdz 0.25"
"crtOb PatchMesh -udy 0.25"
"crtOb PatchMesh -udy 0.25 -vdz 0.25"
"crtOb PatchMesh -type 0 -width 3 -height 3 -center 1 -udx 2 -vdy 2"
Voir aussi la section Les patchs maillés (PatchMesh).
"PolyMesh"
: Les maillages polygonaux acceptent les paramètres suivants :
"-polys"
: la valeur de cette option spécifie le nombre de polygones/faces dans le maillage. Par défaut, le nombre de polygones est de 0."-loops"
: la valeur de cette option précise le nombre de boucles par polygone. Il s'agit donc d'une liste de valeurs entières positives d'une longueur égale à la valeur de l'option "-polys"
. La valeur par défaut de cette option est une liste de longueur correcte avec tous les éléments mis à 1 (seuls les polygones normaux, sans trous, sont spécifiés)."-nverts"
: la valeur de cette option précise le nombre de sommets par boucle. Il s'agit donc d'une liste de valeurs entières positives d'une longueur égale à la somme de tous les éléments de l'option "-loops"
. La valeur par défaut de cette option est une liste de longueur correcte avec tous les éléments fixés à 3 (seuls les triangles sont dans la maille)."-iverts"
: la valeur de cette option spécifie tous les indices (basés sur le zéro) des sommets de toutes les boucles. Il s'agit donc d'une liste de valeurs entières d'une longueur égale à la somme de tous les éléments de l'option "-nverts"
. La valeur par défaut de cette option est une liste de longueur appropriée dont les éléments sont fixés à une séquence d'entiers de sorte que les points de contrôle sont utilisés dans le même ordre que celui spécifié par l'option "-cv"
(0, 1, 2, 3, ...)"-cv"
: les points de contrôle du nouveau maillage. La valeur de cette option est une liste de nombres à virgule flottante qui décrivent les coordonnées 3D (non rationnelles) des points de contrôle. Les indices spécifiés via l'option "-iverts"
pointent vers cette liste. Si l'option "-vnormals"
est 1, les normales des sommets sont également spécifiées dans cette liste (directement après les valeurs des coordonnées de chaque point de contrôle) et la distance de foulée est 6, sinon la distance de foulée est 3. Cette liste doit avoir une longueur de foulée correspondant à la valeur la plus élevée de la liste fournie par l'option "-iverts"
. La valeur par défaut de cette option est une liste vide, ce qui implique que cette option doit être spécifiée pour créer un objet PolyMesh non vide."-cn"
: les points de contrôle du nouveau maillage. La valeur de cette option est un nom de variable (avec un tableau et un espace de noms optionnels). La valeur de cette variable doit être compatible avec l'option "-cv"
ci-dessus."-vnormals"
: détermine si les normales des sommets sont présentes. La valeur par défaut est 0 – aucune normale de sommet n'est présente."crtOb PolyMesh -p 1 -cv {0 0 0 1 0 0 0 1 0}"
"crtOb PolyMesh -p 2 -cv {0 0 0 1 0 0 1 1 0 0 1 0} -iv {0 1 2 0 2 3}"
"crtOb PolyMesh -p 3 -cv {0 0 0 1 0 0 1 1 0 0 1 0 1.5 0 0 1.5 1 0} -iv {0 1 2 0 2 3 1 4 5 2} -nv {3 3 4}"
"crtOb PolyMesh -p 1 -loops {2} -cv {0 0 0 1 0 0 0 1 0 .25 .25 0 .5 .25 0 .25 .5 0}"
Voir aussi la section L'objet PolyMesh.
"SDMesh"
: Les maillages de subdivision acceptent les arguments suivants:
"-scheme"
: la valeur de cette option précise le schéma de subdivision, elle peut être fixée à 0 – Catmull-Clark ou 1 – Boucle seulement. La valeur par défaut est 0."-faces"
: la valeur de cette option précise le nombre de faces dans le maillage. Le nombre de faces est par défaut de 0."-nverts"
: Nonmbre de sommets par face. Il s'agit donc d'une liste de valeurs entières positives d'une longueur égale au nombre de faces. La valeur par défaut de cette option est une liste de longueur correcte avec tous les éléments définis à 3 (seuls les triangles sont dans le maillage)."-verts"
: la valeur de cette option spécifie tous les indices (basés sur le zéro) des sommets de toutes les faces. Il s'agit donc d'une liste de valeurs entières d'une longueur égale à la somme de tous les éléments de l'option "-nverts"
. La valeur par défaut de cette option est une liste de longueur appropriée dont les éléments sont fixés à une séquence d'entiers de sorte que les points de contrôle sont utilisés dans le même ordre que celui spécifié par l'option "-cv"
(0, 1, 2, 3, ...)."-cv"
: La valeur de cette option est une liste de nombres à virgule flottante qui décrivent les coordonnées 3D (non rationnelles) des points de contrôle. Les indices spécifiés via l'option "-verts"
pointent vers cette liste. Cette liste doit avoir une longueur de 3 multipliée par la valeur la plus élevée de la liste fournie via l'option "-verts"
. La valeur par défaut de cette option est une liste vide, ce qui implique que cette option doit être spécifiée pour créer un objet SDMesh non vide."-cn"
: les points de contrôle du nouveau maillage. La valeur de cette option est un nom de variable (avec un tableau et un espace de noms optionnels). La valeur de cette variable doit être compatible avec l'option "-cv"
ci-dessus."-tags"
: la valeur de cette option spécifie un nombre de balises. Il s'agit donc d'une liste de valeurs entières positives de longueur quelconque. Les seules valeurs autorisées sont 0 – trous, 1 – coins, 2 – plis, et 3 – interpolateboundary. La valeur par défaut de cette option est une liste vide : pas de balises."-args"
: la valeur de cette option spécifie le nombre d'arguments entiers et à virgule flottante par balise. Il s'agit donc d'une liste de valeurs entières positives de longueur double du nombre de balises. Les entrées paires spécifient le nombre d'entiers et les entrées impaires le nombre d'arguments en virgule flottante par balise. Le contenu de cette liste est partiellement dicté par l'option "-tags"
, par exemple une entrée de pli a au moins deux arguments entiers et un argument à virgule flottante. La valeur par défaut de cette option est une liste de longueur appropriée, avec tous les éléments mis à zéro (aucune balise n'a d'argument)."-intargs"
: la valeur de cette option spécifie les arguments entiers de toutes les balises. Il s'agit donc d'une liste de valeurs entières de la somme des longueurs de tous les éléments pairs donnée par l'option "-args"
."-doubleargs"
: la valeur de cette option spécifie les arguments en virgule flottante de toutes les balises. Il s'agit donc d'une liste de valeurs doubles de la somme des longueurs de tous les éléments impairs donnés par l'option "-args"
."crtOb SDMesh -f 4 -v {0 1 3 1 2 3 0 3 2 0 2 1} -cv {0 0 0 1 0 0 0 0 -1 0.5 1 -0.5}"
"crtOb SDMesh -f 4 -v {0 1 3 1 2 3 0 3 2 0 2 1} -cv {0 0 0 1 0 0 0 0 -1 0.5 1 -0.5} -tags {1} -args {1 1} -intargs {0} -doubleargs {3.0}"
"crtOb SDMesh -f 4 -v {0 1 3 1 2 3 0 3 2 0 2 1} -cv {0 0 0 1 0 0 0 0 -1 0.5 1 -0.5} -tags {1} -args {2 1} -intargs {0 1} -doubleargs {10.0}"
Voir aussi la section L'objet SDMesh.
"Level"
: ces objets peuvent être dotés d'un argument de type supplémentaire, cet argument peut être l'un des suivants "0"
(niveau - par défaut), "1"
(union), "2"
(intersection), "3"
(différence), ou "4"
(primitive).
Exemples:
"crtOb Level 0"
"crtOb Level 3"
Voir aussi la section L'objet Level (niveau).
"Material"
: Les matériaux doivent être accompagnés d'un argument supplémentaire indiquant le nom du nouveau matériau.
Si un matériau portant le nom choisi existe déjà, aucun objet ne sera créé.
Exemple :
"crtOb Material Wood"
Voir aussi la section Les matériaux.
"Instance"
: crée une instance de l'objet sélectionné.
Exemple :
"crtOb Sphere; selOb -1; crtOb Instance"
Voir aussi la section L'objet Instance.
"crtOb Sphere; uS; rV"
.crtNCircle – créé un cercle NURBS:
"crtNCircle [-r radius] [-a arc]"
-r
et un arc défini par l'option -a
.
La courbe commence toujours sur l'axe X positif.
Le rayon est par défaut de 1,0 et l'arc de 360,0.
L'option arc prend en charge les valeurs négatives.
Voir aussi la section Outil cercle NURBS (NURBCircle).
crtClosedBS – créer une B-Spline fermée (circulaire) :
"crtClosedBS [-s sections] [-o order] [-a arc] [-r radius]"
Voir aussi la section Outil courbes B-spline circulaires (Circular B-Spline).
crtNRect – créer une courbe NURBS rectangulaire :
"crtNRect [-w width] [-h height]"
crtTrimRect – créer une courbe de coupe rectangulaire de délimitation :
"crtTrimRect"
"CreateAtMark"
cette option est ignorée.
Voir aussi la section Outil rectangle de trim (TrimRect).
delOb – supprime un(des) object(s):
"delOb"
Ces commandes permettent d'interroger les objets sur différents aspects.
"getType [varname]"
varname
.
Les types sont les chaînes de caractères bien connues qui sont affichées dans la zone de liste de la hiérarchie si les objets ne sont pas nommés (NPatch, NCurve, Sphere, etc.).
Si aucun nom de variable n'est spécifié, la commande renvoie le(s) résultat(s) correspondant(s).[∗]
Si plusieurs objets sont sélectionnés, une liste est renvoyée."getName [-s] [varname]"
varname
.
Si l'objet n'a pas de nom, un message d'avertissement sera émis (sauf si l'option "-s"
est donnée).
Si aucun nom de variable n'est spécifié, la commande renvoie le(s) résultat(s) correspondant(s). [∗]
Si plusieurs objets sont sélectionnés, une liste est renvoyée."hasChild"
1
si l'objet sélectionné a des objets enfants, sinon 0
est renvoyé.
Si plusieurs objets sont sélectionnés, une liste est renvoyée."hasMat"
1
si un matériau est affecté à l'objet sélectionné, sinon 0
est renvoyé.
Si plusieurs objets sont sélectionnés, une liste est renvoyée."hasRefs"
1
si l'objet sélectionné a des références (par exemple si c'est un maître), sinon 0
est renvoyé.
Si plusieurs objets sont sélectionnés, une liste est renvoyée.
candelOb – peut être supprimé :
"candelOb"
1
si le ou les objets sélectionnés peuvent être supprimés sans erreur et sans déplacer les objets à la fin du niveau actuel, sinon 0
est renvoyé.
hasTrafo – a une transformation :
"hasTrafo [-r
|
-s
|
-t]"
1
si l'objet sélectionné n'a pas des attributs de transformation par défaut, sinon 0
est renvoyé.
Si plusieurs objets sont sélectionnés, une liste est renvoyée."-r"
est fourni, la commande ne vérifie que les attributs de rotation."-s"
est fourni, la commande ne vérifie que les attributs de l'échelle."-t"
est fourni, la commande ne vérifie que les attributs de translation."isCurve"
1
si l'objet sélectionné est (ou fournit / convertit en) une courbe paramétrique, sinon 0
est renvoyé.
Si plusieurs objets sont sélectionnés, une liste est renvoyée."isSurface"
1
si l'objet sélectionné est (ou fournit / convertit en) une surface paramétrique, sinon 0
est renvoyé.
Si plusieurs objets sont sélectionnés, une liste est renvoyée.
getBB – obtenir la boîte de délimitation :
"getBB"
getPlaneNormal – obtenir le plan normal d'un objet :
"getPlaneNormal [-t]"
"-t"
est donnée, la normale sera transformée par les attributs de transformation des objets.
Si l'objet n'est pas plan, une normale moyenne sera calculée. Si la normale ne peut pas être calculée parce que, par exemple, la courbe sélectionnée est une ligne droite ou dégénérée, le vecteur retourné sera 0.0, 0.0, 0.0.
Cette commande supporte des types d'objets quelconques qui ont juste besoin de fournir leurs points.
"isClosed [-u
|
-v]"
1
si l'objet sélectionné est une courbe paramétrique fermée ou une surface, sinon 0
est renvoyé.[∗]
Le paramètre optionnel "-u"
/"-v"
détermine la dimension d'une surface à vérifier.
Si plusieurs objets sont sélectionnés, une liste est renvoyée.
Cette commande supporte des types d'objets quelconques qui n'ont besoin que de fournir des courbes ou des surfaces NURBS.
isPlanar – vérifier la planéité :
"isPlanar"
1
si l'objet sélectionné est une courbe paramétrique plane ou une surface, sinon 0
est renvoyé.[∗]
Si plusieurs objets sont sélectionnés, une liste est renvoyée.
Cette commande supporte des types d'objets quelconques qui n'ont besoin que de fournir des courbes ou des surfaces NURBS.
isDegen – vérifier la dégénérescence :
"isDegen"
1
si l'objet sélectionné est une courbe paramétrique dégénérée (forme de point) ou une surface (forme de point ou de ligne), sinon 0
est renvoyé.[∗]
Si plusieurs objets sont sélectionnés, une liste est renvoyée.
Cette commande prend en charge des types d'objets quelconques qui ont juste besoin de fournir des courbes ou des surfaces NURBS.
"isParent"
1
si l'objet sélectionné est un parent potentiel, sinon 0
est renvoyé.[∗]
Si plusieurs objets sont sélectionnés, une liste est renvoyée."isTrimmed"
1
si l'objet sélectionné est une surface paramétrique non trivialement découpée, sinon 0
est renvoyé.[∗]
Si plusieurs objets sont sélectionnés, une liste est renvoyée.
Cette commande supporte des types d'objets quelconques qui ont juste besoin de fournir une surface NURBS.
Ces commandes sont probablement les plus importantes, car de nombreuses autres commandes de l'interface de script ne fonctionnent que sur des objets sélectionnés :
selOb – selectionner un(des) objet(s):
"selOb ([-get
|
-end
|
-clear] | [index] | [first-last])"
index
peut être un indice unique (basé sur le zéro), une liste ordonnée d'indices ou une plage."-get"
est spécifiée, la sélection actuelle sera retournée tout comme la commande "getSel"
le fait."-clear"
est spécifiée, la sélection actuelle sera effacée."-end"
est spécifiée, le dernier objet du niveau actuel sera sélectionné."selOb"
"selOb 0"
"selOb 0 1"
"selOb 0 3-8"
"selOb 1-end"
sL – sélectionne le(s) dernier(s) objet(s) :
"sL [count]"
# create object crtOb NCurve # update tree uCR # select new object sL
"uCR"
, car l'accès à l'interface graphique est de toute façon bloqué dans ce contexte :
# create object crtOb NCurve # select new object sL
sL
est une procédure qui fonctionne sur la base d'informations dans le seul contexte de Tcl.
L'appel de sL
sur des données de hiérarchie obsolètes (par exemple en omettant uS
ou uCR
après la création de l'objet) entraînera éventuellement la sélection de mauvais objets.
hSL – cache la sélection des derniers objets :
"hSL [count]"
"sL"
.Cette commande permet de manipuler la sélection des points.
selPnts – sélection des points :
"selPnts [(-count
|
-get) [vname] | -has | -all | -none | index1 index2 ...]"
"-count"
, cette commande place le nombre de tous les points actuellement sélectionnés dans la variable spécifiée par l'argument "vname"
.
Si aucun nom de variable n'est fourni, le nombre est renvoyé.[∗]"-get"
, cette commande place les indices de tous les points actuellement sélectionnés dans la variable spécifiée par l'argument "vname"
.
Si aucun nom de variable n'est fourni, les indices sont renvoyés.[∗]"-has"
, cette commande renvoie "1"
si au moins un des objets sélectionnés a des points sélectionnés.
Sinon, la commande renvoie "0"
.[∗]"-all"
, cette commande sélectionne tous les points."-none"
, cette commande désélectionne tous les points."selPnts -all"
"selPnts 0 2"
Ces procédures permettent d'accéder facilement aux propriétés des objets à partir de l'interface de script :[∗]
getProperty – récupére la valeur d'une propriété unique
"getProperty propname(elemname) [varname] [-s
|
-i]"
elemname
à partir de la propriété nommée propname
de l'objet actuellement sélectionné et écrit le résultat dans la variable nommée varname
.
Plusieurs objets sélectionnés sont pris en charge et conduisent à une liste de valeurs produites dans la variable de sortie.[∗]
Si "varname"
est omis, la procédure retournera la ou les valeurs extraites, sinon la valeur retournée sera "1"
pour les opérations réussies et "0"
autrement.[∗]
Si l'option "-s"
est spécifiée, aucune erreur ne sera signalée.[∗]
Si l'option "-i"
est spécifiée, les balises "RP"
seront ignorées.[∗]
"NP"
/"RP"
sont également traitées de manière transparente."r"
facilement en utilisant la commande
getProperty SphereAttr(Radius) r
Contrairement à l'utilisation de "getProperty"
, voici un exemple équivalent pour l'accès direct (rapide) aux valeurs des propriétés :
getProp
set r $::SphereAttrData(Radius)
Voir aussi la section
Gestion des propriétés et tableaux de données.
setProperty – fixer la valeur d'une propriété unique
"setProperty propname(elemname) value"
elemname
de la propriété nommée propname
pour l'objet actuellement sélectionné à la nouvelle valeur donnée dans value
.
Plusieurs objets sélectionnés sont pris en charge.[∗]"3.0"
facilement en utilisant la commande
setProperty SphereAttr(Radius) 3.0
Contrairement à l'utilisation de "setProperty"
, voici un exemple équivalent pour l'accès direct (rapide) aux valeurs des propriétés :
getProp
set SphereAttrData(Radius) 3.0
setProp
Voir aussi la section
Gestion des propriétés et tableaux de données.
Ces commandes font fonctionner le presse-papiers d'objet :
copOb – copie le(s) objet(s) :
"copOb [-append]"
"-append"
est utilisée, le presse-papiers ne sera pas effacé avant cette opération.
cutOb – cCoupe le(s) objet(s):
"cutOb [-append]"
"-append"
est utilisée, le presse-papiers ne sera pas effacé avant cette opération.
pasOb – Colle le(s) objet(s) :
"pasOb [-move]"
"-move"
est donnée, les objets sont déplacés et non copiés, c'est-à-dire qu'après un "pasOb -move"
, le presse-papiers est vide et aucun compteur de référence ne sera modifié.
repOb – remplace le contenu du presse-papiers par le(s) objet(s) sélectionné(s) :
"repOb"
clearClip – vide le presse papier des objets :
"clearClip"
Les procédures suivantes font fonctionner le presse-papiers des propriétés, qui est totalement indépendant du presse-papiers des objets.
copyProp – copie une propriété dans le presse-papiers des propriétés.
"copyProp [mode]"
mode
est égal à 0 (par défaut), toutes les entrées marquées seront omises.
Si mode
est égal à 1, seules les entrées marquées seront copiées.
Les entrées de propriété sont généralement marquées par un double clic sur les étiquettes d'entrée respectives, mais elles peuvent également être marquées par programmation en ajoutant les noms des éléments de propriété respectifs au tableau global "pclip_omit"
.
pasteProp – Colle une propriété.
"pasteProp"
Ces commandes manipulent le niveau actuel de Ayam :
"goDown index"
index
.
Si index
est 0 et que le niveau actuel se trouve à l'intérieur d'un objet quelconque, le niveau parent sera saisi à la place.
Si index
est égal à -1, le dernier objet du niveau actuel sera saisi."crtOb Level; goDown -1; crtOb Sphere"
crée un niveau simple, y entre, et crée une sphère comme enfant de ce niveau."goUp"
"goTop"
upOb – déplacer le(s) objet(s) vers l'arrière dans le niveau actuel :
"upOb"
Les objets déplacés restent sélectionnés, c'est-à-dire que cette commande peut être utilisée plusieurs fois de suite.
downOb – déplacer le(s) objet(s) vers l'avant dans le niveau actuel :
"downOb"
Les objets déplacés restent sélectionnés, c'est-à-dire que cette commande peut être utilisée plusieurs fois de suite.
Ces commandes transforment des objets ou des points sélectionnés d'objets :
"movOb dx dy dz"
dx
dans la direction de l'axe X, de dy
dans la direction de l'axe Y, et de dz
dans la direction de l'axe Z."rotOb (dx dy dz | -a ax ay az a)"
dx
degrés autour de l'axe X, puis de dy
degrés autour de l'axe Y, et enfin de dz
degrés autour de l'axe Z.
Notez l'ordre des rotations.-a
, ils désignent un axe de rotation suivi de l'angle en degrés.[∗]"rotOb 0 0 45"
"rotOb -a 1 1 0 45"
"1 1 0"
."scalOb dx dy dz"
dx
sur l'axe X, par un facteur de dy
sur l'axe Y, et par un facteur de dz
sur l'axe Z.
movPnts – déplace les points sélectionnés :
"movPnts dx dy dz"
dx
sur l'axe X, par dy
sur l'axe Y, et par dz
sur l'axe Z.
rotPnts – tourne les points sélectionnés :
"rotPnts (dx dy dz | -a ax ay az a)"
dx
degrés autour de l'axe X, puis de dy
degrés autour de l'axe Y, et enfin de dz
degrés autour de l'axe Z.
Notez l'ordre des rotations.-a
, ils désignent un axe de rotation suivi de l'angle en degrés.[∗]"rotPnts 0 0 45"
"rotPnts -a 1 1 0 45"
"1 1 0"
.
scalPnts – zoome les points sélectionnés :
"scalPnts dx dy dz"
dx
sur l'axe X, par un facteur de dy
sur l'axe Y, et par un facteur de dz
sur l'axe Z.
delegTrafo – délègue les transformations :
"delegTrafo"
Cette opération échoue pour les configurations complexes (c'est-à-dire si la combinaison de la transformation des parents et des enfants est une transformation de cisaillement).
applyTrafo – applique les transformations :
"applyTrafo [-sel]"
"-sel"
est donnée) sont modifiés.
Il n'y a pas d'erreur, si un objet n'a pas de points du tout ou si les points sont en lecture seule.
En outre, si des points d'un objet sont modifiés, les transformations de cet objet seront réinitialisées aux valeurs par défaut.
normTrafos – normalise les valeurs de transformation :
"normTrafos"
"NormalizeDigits"
(par défaut 6).
normPnts – normalise les points :
"normPnts"
"NormalizeDigits"
(par défaut 6).
normVar – normalise la variable :
"normVar varname"
"NormalizeDigits"
(par défaut 6).Ces commandes font fonctionner les propriétés de l'ombre :
"shaderSet shadertype [varname]"
shadertype
d'ombre pour l'objet sélectionné.
Le type peut être l'un des suivants : "surface"
, "displacement"
, "light"
, "imager"
, "atmosphere"
, "exterior"
ou "interior"
.
Si varname
n'est pas donné, l'ombre en question est supprimée de l'objet.
Sinon, varname
renvoie à un tableau associé qui contient les données (arguments) de l'ombre.
Un exemple de contenu peut être créé avec la commande "shaderGet"
ci-dessous.
Les données ne sont pas vérifiées par rapport à la base de données interne de l'ombre pour s'assurer qu'elles sont correctes ou complètes.
Cette commande échoue, si l'objet sélectionné ne supporte pas une ombre d'un type donné."shaderGet shadertype varname"
shadertype
de l'ombre pour l'objet sélectionné.
Le type peut être l'un des suivants : "surface"
, "displacement"
, "light"
, "imager"
, "atmosphere"
, "exterior"
ou "interior"
.
Les données de l'ombre seront écrites dans un tableau associé pointé par varname
.Ces commandes peuvent être utilisées pour modifier les balises d'un objet (Voir aussi la section Tags).
Lors du traitement de balises de type inconnu ou non enregistré, un message d'avertissement correspondant peut être émis.
Cet avertissement peut être désactivé en utilisant le paramètre de préférence cachée "WarnUnknownTag"
ou en enregistrant le type de balise à l'aide de la commande "registerTag"
(voir ci-dessous).
"setTag type value"
type
et la chaîne de valeurs value
pour le ou les objets actuellement sélectionnés.""
comme paramètre de valeur.
C'est par exemple le cas pour le type de balise "NoExport"
."setTag NoExport """
"NoExport"
aux objets sélectionnés."setTag RP Transformations"
"RP"
(remove property) aux objets sélectionnés qui masque l'interface graphique des propriétés des transformations."addTag type value"
type
et la chaîne de valeur value
aux objets actuellement sélectionnés.""
comme paramètre de valeur.
C'est par exemple le cas pour le type de balise "NoExport"
."addTag NoExport """
"NoExport"
aux objets sélectionnés."addTag RP Transformations"
"RP"
(remove property) aux objets sélectionnés qui masque l'interface graphique des propriétés des transformations."hasTag type [value]"
"1"
si l'objet sélectionné possède au moins une balise du type désigné.
Sinon, la commande renvoie "0"
.
Si une valeur est fournie, cette chaîne est comparée à la valeur potentielle de la balise, elle peut également contenir l'une des valeurs *?[]
pour des formes plus complexes de correspondance.
"delTags [type]"
"all"
, toutes les balises sont supprimées des objets actuellement sélectionnés."delTags"
"delTags RP"
"RP"
des objets sélectionnés."getTags tvname vvname"
tvname
pour les types de balises et vvvname
pour les valeurs des balises."setTags tagslist"
tagslist
.
Les types de balises sont repris des éléments de la liste dont les numéros d'index sont pairs et les chaînes de valeur des balises des éléments de la liste dont les numéros d'index sont impairs."setTags {RP Transformations RP Attributes}"
"RP"
."getTag type [vname]"
""
.
Si aucun nom de variable n'est fourni, la valeur de la balise est renvoyée."registerTag type"
Ces commandes fonctionnent sur des courbes paramétriques :
"openC"
Voir aussi la section Outil d'ouverture (Open).
"closeC"
Voir aussi la section Outil de fermeture (Close).
"refineC"
Voir aussi la section Outil d'affinage (Refine).
coarsenC – émousse une courbe : (????)
"coarsenC"
"coarsenNC"
, l'ancien nom est toujours disponible pour la compatibilité mais son utilisation est obsolète.
Voir aussi la section Outil d'approximation (Coarsen).
revertC – renverser une courbe :
"revertC"
Voir aussi la section Outil de renversement (Revert).
shiftC – décale les points de contrôle d'une courbe (fermée) :
"shiftC i"
i
(qui peut être négatif pour inverser le sens du décalage).
Pour une courbe fermée simple, en se déplaçant avec i=1
, le premier point de contrôle obtiendra les coordonnées de l'ancien dernier point de contrôle.
Cela signifie que des décalages positifs se produisent dans la direction de la courbe.
Notez que pour les courbes NURBS fermées et périodiques, les points multiples seront gérés correctement.
Voir aussi la section Outil de décalage de courbe fermée.
toXYC – tourne une courbe dans le plan XY
"toXYC"
Voir aussi la section Outil de retournement vers XY (To XY).
concatC – concaténer des courbes :
"concatC [-c closed | -k knottype | -f fillets | -fl len]"
L'option "-c"
permet de créer une courbe fermée (0 – ouvert, 1 – fermé ; par défaut 0).
L'option "-k"
permet de définir un type de noeud (0 – NURB, 1 – Custom ; 0 – par défaut ; NURB).
L'option "-f"
détermine si des filets doivent être créés ou non (0 – non, 1 – oui ; 0 par défaut).
L'option "-fl"
permet de définir la longueur des filets.
Voir aussi la section Propriété ConcatNCAttr pour plus d'informations sur ces options
Ces commandes opèrent sur des surfaces paramétriques :
revertuS – retourne les surfaces sur U :
"revertuS"
Voir aussi la section Outil de reversement sur U (Revert U).
revertvS – retourne les surfaces sur V :
"revertvS"
Voir aussi la section Outil de reversement sur V (Revert V).
swapuvS – échanger les dimensions des surfaces:
"swapuvS"
Voir aussi la section Outil de renversement UV (Swap UV).
concatS – concatène les surfaces:
"concatS [-o order | -t type | -k knottype | -u uvselect]"
L'option "-o"
détermine l'ordre souhaité de la surface dans la direction U.
L'option "-t"
permet de définir un type de surface (0 – ouvert, 1 – fermé, 3 – périodique ; par défaut 0).
L'option "-k"
permet de définir un type de noeud (par défaut 1 – NURB).
Enfin, l'option "-u"
permet de spécifier la chaîne de sélection uv.
Voir aussi la section Propriété ConcatNPAttr pour plus d'informations sur ces options.
Il s'agit de commandes plus spécialisées permettant de modifier les propriétés des courbes NURBS :
clampNC – resserrer la courbe NURBS :
"clampNC [-s
|
-e]"
"Custom"
et les noeuds auront des valeurs égales à o du ou des côtés souhaités, où o est l'ordre de la courbe.
Si le paramètre de côté est omis, les deux côtés sont serrés.
Si le paramètre de côté est "-s"
seulement le début, et s'il est "-e"
seulement la fin est serrée.
Dans les versions de Ayam antérieures à 1.18, c'était une erreur si la courbe était déjà serrée d'un côté ou de l'autre, ce n'est plus le cas. En outre, les courbes comportant plusieurs noeuds dans la ou les régions d'extrémité ne pouvaient pas être serrées, ce qui fonctionne bien maintenant.
Voir aussi la section Outil de resserrage (Clamp).
unclampNC – desserrer une courbe NURBS :
"unclampNC [-s
|
-e]"
"Custom"
.
Si le paramètre latéral est omis, les deux côtés sont desserrés.
Si le paramètre latéral est "-s"
seulement le début, et s'il est "-e"
seulement la fin sont desserrés.
Voir aussi la section Outil de desserrage (Unclamp).
extendNC – étendre une courbe NURBS :
"extendNC (x y z [w] | -vn varname | -m)"
Voir aussi la section Outil d'extension (Extend).
elevateNC – augmente l'ordre d'une courbe NURBS :
"elevateNC [n]"
n
des courbes NURBS sélectionnées sans en modifier la forme.
Si le paramètre n
est omis, une valeur par défaut de 1 est utilisée.
Le type de noeud des courbes élevées sera modifié en "Custom"
.
Voir aussi la section Outil d'élévation (Elevate).
reduceNC – diminue l'ordre d'une courbe NURBS :
"reduceNC [tol]"
tol
en aucun point.
Si le paramètre tol
est omis, une valeur par défaut de 0.0 est utilisée, c'est-à-dire que l'ordre n'est réduit que si la courbe ne change pas.
Le type de noeud des courbes réduites sera changé en "Custom"
.
Voir aussi la section Outil de réduction (Reduce).
insknNC – insérer des noeuds dans une courbe NURBS :
"insknNC u r"
r
fois, un nouveau noeud à la position spécifiée par u
.
La plage valable pour u
est déterminée par le vecteur de noeud actuel U comme suit : U[p] <= u <= U[n]
, où p
est le degré (ordre-1) de la courbe et n
est la longueur de la courbe.
Le type de noeud des courbes sera toujours changé en "Custom"
, mais la forme des courbes ne changera pas.
Voir aussi la section Outil d'insertion de noeud (Insert Knot).
remknNC – supprime des noeuds d'une courbe NURBS :
"remknNC (u | -i ind) r [tol]"
r
fois de la courbe, un noeud à la position spécifiée par u
(u doit être dans la plage valide du vecteur noeud de la courbe sélectionnée).
Depuis Ayam 1.20, le noeud à supprimer peut également être spécifié en utilisant son indice (basé sur le zéro) dans le vecteur de noeud (c'est-à-dire utiliser "remknNC -i 3 1"
au lieu de "remknNC 0.5 1"
pour le vecteur de noeud "0 0 0 0.5 1 1 1"
).
Notez que la forme de la courbe peut être modifiée par cet outil, sauf si le paramètre tol
est spécifié.
Si tol
est spécifié, la nouvelle courbe ne s'écarte pas de la courbe originale de plus de tol
en tout point de la courbe.
Si le noeud ne peut pas être supprimé r
fois en raison de la tolérance, une erreur est signalée et la courbe originale reste inchangée.
Cette opération échoue également, si l'élimination du noeud entraîne une courbe d'ordre inférieur.
Voir aussi la section Outil de suppression de noeud (Remove Knot).
remsuknNC – supprime les noeuds supperflus d'une courbe NURBS :
"remsuknNC [tol]"
tol
.
La valeur par défaut de ce paramètre est de 0.0.
Il n'y a pas d'erreur si aucun noeud ne peut être enlevé.
Voir aussi la section Outil de suppression des noeuds superflus.
refineknNC – Affiner le vecteur noeud d'une courbe NURBS :
"refineknNC [{u1 u2 un}]"
{u1 u2 un}
.
Si aucune liste de nouveaux noeuds n'est donnée, un nouveau noeud est inséré dans chaque intervalle de l'ancien vecteur de noeuds.
Voir aussi la section Outil d'affinage des noeuds (Refine Knots).
tweenNC – interpoler des courbes :
"tweenNC [r]"
r
définit le rapport d'influence de la première et de la deuxième courbe (cette dernière utilisant 1-r
).
Ce paramètre a pour valeur par défaut 0.5.r
est ignoré et cette troisième courbe définit le rapport d'influence avec ses coordonnées y.
Voir aussi la section Outil courbes interpolées (Tween Curve).
rescaleknNC – repositionner les noeuds d'une courbe NURBS :
"rescaleknNC [-r rmin rmax | -d mindist]"
rmin
, rmax
] si l'argument "-r"
est donné ou à la distance minimale mindist
si l'argument "-d"
est utilisé.
La mise à l'échelle à une distance minimale garantit que tous les noeuds (sauf les noeuds multiples) ont une distance supérieure à mindist
par la suite.
Depuis Ayam 1.20, le type de noeud de la courbe ne doit plus être "Custom"
.
De plus, le fait de redimensionner les noeuds ne change pas le type de noeud.
Cette opération ne modifie pas la forme de la courbe.
Voir aussi la section Outil de répartition des noeuds sur une plage (Rescale Knots to Range).
splitNC – couper une courbe NURBS :
"splitNC [-a
|
-r] u"
u
en deux courbes, en créant une nouvelle courbe et en modifiant la courbe originale sélectionnée.
Si l'option "-r"
est présente, la valeur paramétrique est interprétée de manière relative et doit donc se situer dans la plage [0, 1].<[∗]
Si l'option "-a"
est présente, la ou les nouvelles courbes seront ajoutées au niveau actuel.
Sinon, la ou les nouvelles courbes seront insérées dans le niveau juste après la ou les courbes respectives à scinder.[∗]
Voir aussi la section Outil de fractionnement (Split).
extrNC – extraire une courbe NURBS :
"extrNC [-relative] umin umax"
umin
et umax
qui doivent être dans la plage de noeuds valide respective.
Si l'argument facultatif "-relative"
est spécifié, les valeurs paramétriques sont interprétées de manière relative et doivent donc se situer dans la plage [0,1].
trimNC – ajuste une courbe NURBS :
"trimNC [-relative] umin umax"
Si l'argument facultatif "-relative"
est spécifié, les valeurs paramétriques sont interprétées de manière relative et doivent donc se situer dans la plage [0, 1].
Voir aussi la section Outil des courbes de trim (Découpe).
estlenNC – estimer la longueur d'une courbe NURBS :
"estlenNC [-trafo | -refine n] [varname]"
"-trafo"
est donné, les attributs de transformation de la courbe seront appliqués aux points de contrôle pour l'estimation de la longueur."-refine"
est donné, la courbe sera affinée n
fois avant l'estimation de la longueur, ce qui augmente la précision de l'estimation.[∗]
reparamNC – reparamétriser une courbe NURBS :
"reparamNC type"
0
), ou des noeuds centripètes (type : 1
).
Le type de noeud de la courbe sera changé en "Custom"
."isCompNC [-l level]"
1
si les courbes NURBS sélectionnées sont compatibles (c'est-à-dire définies sur le même vecteur de noeud), sinon elle renvoie 0
.
Si "level"
est 0
, seuls les ordres des courbes sont comparés.
Si "level"
est 1
, seuls les ordres et les longueurs des courbes sont comparés.
makeCompNC – rendre les courbes NURBS compatibles :
"makeCompNC [-f | -l level]"
Si l'option "-f"
est présente, il n'y aura pas de contrôle de compatibilité préalable.
Si "level"
est 0
, seules les ordres seront adaptées.
Si "level"
est 1
, seuls les ordres et les longueurs seront adaptés.
Voir aussi la section Outil pour rendre compatible (Make Compatible).
interpNC – interpoler des courbes NURBS :
"interpNC [-order order | -ptype type | -closed (0|1) | -sdlen length | -edlen length]"
"-closed"
le demande, mais cela augmentera également la longueur de la courbe NURBS résultante.
La valeur par défaut est de créer une courbe ouverte pour les courbes d'entrée ouvertes et une courbe fermée pour les courbes d'entrée fermées ou périodiques.
En utilisant les options "-sdlen"
et "-edlen"
(qui sont toutes deux par défaut à 0.0), la longueur des dérivés de début/fin créés automatiquement peut être ajustée.
Si l'une d'entre elles n'est pas à 0.0, un algorithme d'interpolation différent sera utilisé, ce qui augmente la longueur de la courbe NURBS résultante.
La courbe interpolera tous les points de contrôle actuels après l'interpolation et la position de certains points de contrôle sera modifiée au cours de ce processus de sorte que, après l'interpolation, les nouveaux points de contrôle ne seront pas interpolés par la courbe. La courbe interpolera plutôt les positions des ancien points de contrôle.
Le type de noeud des courbes interpolées sera changé en "Custom"
.
Voir aussi la section Outil d'interpolation (Interpolate).
approxNC – approximer une courbe NURBS :
"approxNC [-order o | -length l | -closed (0|1) | -tesselate t]"
L'ordre par défaut est celui de la courbe NURBS respective et doit être au moins égal à 2. Si une valeur inférieure est fournie, la commande reviendra à la valeur par défaut sans notification.
La longueur par défaut correspond à la longueur de la courbe NURBS respective et doit être supérieure à 2. Si une valeur inférieure est fournie, la commande reviendra à la valeur par défaut sans signification.
Si le paramètre "-closed"
est réglé sur "1"
une courbe périodique fermée sera créée.
Par défaut, la création ou non d'une courbe fermée sera dérivée du type de courbe à approximer.
Le paramètre "-tesselate"
permet de spécifier un paramètre pour la tessellation de la courbe à approximer.
Le type de noeud des courbes traitées sera modifié en "Custom"
.
Voir aussi la section Outil d'approximation (Approximate).
curvatNC – calculer la courbure :
"curvatNC [-r] -u u"
u
.Si l'option "-r"
est présente, la valeur paramétrique est interprétée de manière relative et doit donc se situer dans la plage suivante [0, 1].
Si plusieurs objets sont sélectionnés, une liste de valeurs de courbure est renvoyée.
Voir aussi la section Outil de tracé de courbure (Plot Curvature).
fairNC – Améliorer la forme de la courbe :
"fairNC [tol]"
Si une valeur de tolérance est présente, les points de contrôle traités ne se déplacent pas plus que la valeur donnée.
Si des points sont sélectionnés, seuls ceux-ci seront traités.
Il s'agit de commandes plus spécialisées pour modifier les propriétés des surfaces NURBS :
clampuNP – resserer un patch NURBS dans la direction U :
"clampuNP [-s
|
-e]"
"Custom"
et les noeuds auront des valeurs o égales au début et à la fin (où o est l'ordre du patch dans la direction U).
Si le paramètre de côté est omis, les deux côtés sont resserrés.
Si le paramètre de côté est "-s"
seulement le début, et s'il est "-e"
seulement la fin est resserrée.
Dans les versions de Ayam antérieures à la version 1.18, c'était une erreur si le patch était déjà resserré de chaque côté, ce n'est plus le cas. De plus, les patchs avec plusieurs noeuds dans la ou les régions d'extrémité ne pouvaient pas être resserrés, cela fonctionne bien maintenant.
Voir aussi la section Outil de serrage de surface (Clamp Surface).
clampvNP – resserer un patch NURBS dans la direction V :
"clampvNP [-s
|
-e]"
"Custom"
et les noeuds auront des valeurs o égales au début et à la fin (où o est l'ordre du patch dans la direction V).
Si le paramètre de côté est omis, les deux côtés sont resserrés.
Si le paramètre de côté est "-s"
seulement le début, et s'il est "-e"
seulement la fin est resserrée.
Dans les versions de Ayam antérieures à la version 1.18, c'était une erreur si le patch était déjà resserré de chaque côté, ce n'est plus le cas. De plus, les patchs avec plusieurs noeuds dans la ou les régions d'extrémité ne pouvaient pas être resserrés, cela fonctionne bien maintenant.
Voir aussi la section Outil de serrage de surface (Clamp Surface).
unclampuNP – desserer un patch NURBS dans la direction U :
"unclampuNP [-s
|
-e]"
"Custom"
et les noeuds auront des valeurs o égales au début et à la fin (où o est l'ordre du patch dans la direction U).
Si le paramètre de côté est omis, les deux côtés sont desserrés.
Si le paramètre de côté est "-s"
seulement le début, et s'il est "-e"
seulement la fin est desserrée.
Voir aussi la section Outil de desserrage des surfaces (Unclamp Surface).
unclampvNP – desserer un patch NURBS dans la direction V :
"unclampvNP [-s
|
-e]"
"Custom"
et les noeuds auront des valeurs o égales au début et à la fin (où o est l'ordre du patch dans la direction U).
Si le paramètre de côté est omis, les deux côtés sont desserrés.
Si le paramètre de côté est "-s"
seulement le début, et s'il est "-e"
seulement la fin est desserrée.
Voir aussi la section Outil de desserrage des surfaces (Unclamp Surface).
rescaleknNP – répartir les noeuds d'un patch NURBS :
"rescaleknNP [-r[u|v] rmin rmax | -d[u|v] mindist]"
rmin
, rmax
] si l'argument "-r"
est donné ou à la distance minimale mindist
si l'argument "-d"
est utilisé.
Le repositionnement à une distance minimale garantit que tous les noeuds (sauf les noeuds multiples) ont une distance supérieure à mindist
par la suite.
Les variantes "-ru"
, "-rv"
, "-du"
, et "-dv"
ne repositionnent que sur la dimension désignée.
Les courbes de trim, si elles existent, seront également échelonnées pour correspondre à la nouvelle gamme.
Depuis Ayam 1.20, le type de noeud de la courbe ne doit plus être "Custom"
.
De plus, le fait de rééchelonner les noeuds ne change pas le type de noeud.
Cette opération ne modifie pas la forme du patch.
Voir aussi les sections Outil de redimensionnent des noeuds en fonction de la plage (Rescale Knots to Range) et Outil Redimensionnent des noeuds à la distance minimale (Rescale Knots to Mindist).
"rescaleknNP -ru 0.2 0.3"
échelonne le vecteur de noeuds u des objets patchs NURBS sélectionnés sur la nouvelle plage [0.2, 0.3].
insknuNP – insère des noeuds dans un patch NURBS :
"insknuNP u r"
u
, r
fois.
u
doit se trouver dans la plage valide du vecteur de noeud correspondant des patchs sélectionnés.
La plage valide est déterminée par le vecteur de noeud actuel U comme suit : U[p] <= u <= U[n]
, où p
est le degré (ordre-1) du patch dans la direction U et n
est la largeur du patch.
Le type de noeud u des patchs sera toujours changé en "Custom"
mais la forme des patchs ne changera pas.
Voir aussi la section Outil d'insertion de noeuds (Insert Knot Surface).
insknvNP – insére des noueuds dans un patch NURBS :
"insknvNP v r"
v
, r
fois.
v
doit se trouver dans la plage valide du vecteur de noeud correspondant des patchs sélectionnés.
La plage valide est déterminée par le vecteur de noeud actuel V comme suit : V[p] <= v <= V[n]
, où p
est le degré (ordre-1) du patch dans la direction V et n
est la largeur du patch.
Le type de noeud v des patchs sera toujours changé en "Custom"
mais la forme des patchs ne changera pas.
Voir aussi la section Outil d'insertion de noeuds (Insert Knot Surface).
remknuNP – enlever des noeuds u d'une surface NURBS :
"remknuNP (u | -i ind) r [tol]"
r
fois un noeud à la position spécifiée par u
(u
doit être dans la plage valide du vecteur noeud de la surface sélectionnée) de la surface.
Depuis Ayam 1.20, le noeud à supprimer peut également être spécifié en utilisant son indice (basé sur le zéro) dans le vecteur noeud (c'est-à-dire en utilisant "remknuNP -i 3 1"
au lieu de "remknuNP 0.5 1"
pour le vecteur noeud "0 0 0 0.5 1 1 1"
).
Notez que la forme de la surface peut être modifiée par cet outil, à moins que le paramètre tol
ne soit spécifié.
Si tol
est spécifié, la nouvelle surface ne s'écarte pas de la surface d'origine de plus de la tolérance en tout point.
Si le noeud ne peut pas être supprimé r fois en raison de la tolérance, une erreur est signalée et la surface d'origine reste inchangée.
Cette opération échoue également, si l'élimination du noeud conduisait à une surface de moindre ordre.
Voir aussi la section Outil de suppression de noeuds (Remove Knot Surface).
remknvNP – enlever des noeuds v d'une surface NURBS :
"remknvNP (v | -i ind) r [tol]"
r
fois un noeud à la position spécifiée par v
(v
doit être dans la plage valide du vecteur noeud de la surface sélectionnée) de la surface.
Depuis Ayam 1.20, le noeud à supprimer peut également être spécifié en utilisant son indice (basé sur le zéro) dans le vecteur noeud (c'est-à-dire en utilisant "remknvNP -i 3 1"
au lieu de "remknvNP 0.5 1"
pour le vecteur noeud "0 0 0 0.5 1 1 1"
).
Notez que la forme de la surface peut être modifiée par cet outil, à moins que le paramètre tol
ne soit spécifié.
Si tol
est spécifié, la nouvelle surface ne s'écarte pas de la surface d'origine de plus de la tolérance en tout point.
Si le noeud ne peut pas être supprimé r fois en raison de la tolérance, une erreur est signalée et la surface d'origine reste inchangée.
Cette opération échoue également, si l'élimination du noeud conduisait à une surface de moindre ordre.
Voir aussi la section Outil de suppression de noeuds (Remove Knot Surface).
remsuknuNP – enlève les noeuds superflus d'une surface NURBS :
"remsuknuNP [tol]"
tol
.
La valeur par défaut de ce paramètre est 0.0.
Il n'y a pas d'erreur si aucun noeud ne peut être enlevé.
Voir aussi la section Outil de suppression des noeuds superflus.
remsuknvNP – enlève les noeuds superflus d'une surface NURBS :
"remsuknvNP [tol]"
tol
.
La valeur par défaut de ce paramètre est 0.0.
Il n'y a pas d'erreur si aucun noeud ne peut être enlevé.
Voir aussi la section Outil de suppression des noeuds superflus (Remove Superfluous Knots).
refineuNP – affiner la surface des NURBS dans la direction du U :
"refineuNP [{u1 u2 un}]"
{u1 u2 un}
sans modifier leur forme.
Si aucune liste de nouveaux noeuds n'est donnée, un nouveau noeud est inséré dans chaque intervalle de l'ancien vecteur de noeuds.
Le type de noeud u des surfaces affinées peut être modifié en "Custom"
.
Voir aussi la section Outil de raffinage des noeuds de surface (Refine Knots Surface).
refinevNP – affiner la surface des NURBS dans la direction V :
"refinevNP [{v1 v2 vn}]"
{v1 v2 vn}
sans modifier leur forme.
Si aucune liste de nouveaux noeuds n'est donnée, un nouveau noeud est inséré dans chaque intervalle de l'ancien vecteur de noeuds.
Le type de noeud v des surfaces affinées peut être modifié en "Custom"
.
Voir aussi la section Outil de raffinage des noeuds de surface (Refine Knots Surface).
elevateuNP – élever la surface des NURBS dans la direction du U :
"elevateuNP [n]"
n
.
Si le paramètre n
est omis, une valeur par défaut de 1 est utilisée.
Le type de noeud u des surfaces élevées sera modifié en "Custom"
.
Voir aussi la section Outil d'augmentation de l'ordre de la surface (Elevate Surface).
elevatevNP – élever la surface des NURBS dans la direction V :
"elevatevNP [n]"
n
.
Si le paramètre n
est omis, une valeur par défaut de 1 est utilisée.
Le type de noeud v des surfaces élevées sera modifié en "Custom"
.
Voir aussi la section Outil d'augmentation de l'ordre de la surface (Elevate Surface).
reduceuNP – diminuer l'ordre d'une courbe NURBS dans la direction U :
"reduceuNP [tol]"
tol
en aucun point.
Si le paramètre tol
est omis, une valeur par défaut de 0.0 est utilisée, c'est-à-dire que l'ordre n'est réduit que si la surface ne change pas.
Le type de noeud des surfaces réduites sera changé en "Custom"
.
Voir aussi la section Outil de réduction de l'ordre des surfaces (Reduce Surface).
reducevNP – diminuer l'ordre d'une courbe NURBS dans la direction V :
"reducevNP [tol]"
tol
en aucun point.
Si le paramètre tol
est omis, une valeur par défaut de 0.0 est utilisée, c'est-à-dire que l'ordre n'est réduit que si la surface ne change pas.
Le type de noeud des surfaces réduites sera changé en "Custom"
.
Voir aussi la section Outil de réduction de l'ordre des surfaces (Reduce Surface).
splituNP – divise un patch NURBS dans la direction U :
"splituNP [-a
|
-r] u"
u
, créant ainsi un nouvel objet NPatch et en modifiant l'objet NPatch original sélectionné.
Si l'option "-r"
est présente, la valeur paramétrique est interprétée de manière relative et doit donc se situer dans la plage [0, 1].
Si l'option "-a"
est présente, le ou les nouveaux objets NPatch seront ajoutés au niveau actuel.
Sinon, le ou les nouveaux objets NPatch seront insérés dans le niveau juste après le ou les objets NPatch respectifs à diviser.
C'est la nouvelle valeur par défaut.[∗]
Voir aussi la section Outil de fractionnement de la surface (Split Surface).
splitvNP – divise un patch NURBS dans la direction V :
"splitvNP [-a
|
-r] v"
v
, créant ainsi un nouvel objet NPatch et en modifiant l'objet NPatch original sélectionné.
Si l'option "-r"
est présente, la valeur paramétrique est interprétée de manière relative et doit donc se situer dans la plage [0, 1].
Si l'option "-a"
est présente, le ou les nouveaux objets NPatch seront ajoutés au niveau actuel.
Sinon, le ou les nouveaux objets NPatch seront insérés dans le niveau juste après le ou les objets NPatch respectifs à diviser.
C'est la nouvelle valeur par défaut.[∗]
Voir aussi la section Outil de fractionnement de la surface (Split Surface).
extrNP – extraire un patch NURBS :
"extrNP [-relative] umin umax vmin vmax"
umin
, umax
, vmin
, et vmax
qui doivent être dans la plage de noeuds valide respective.
Si l'argument optionnel "-relative"
est spécifié, les valeurs paramétriques sont interprétées de manière relative et doivent par conséquent se situer dans la plage [0,1].
Voir aussi la section Outil d'extraction de patch (Extract Patch).
tweenNP – interpoler (tween) des surfaces:
"tweenNP [r]"
r
définit le rapport d'influence du premier et du second patch (ce dernier utilisant 1-r
).
Ce paramètre est fixé par défaut à 0,5.r
est ignoré et cette troisième surface définit le rapport d'influence avec ses coordonnées y.
Voir aussi la section Outil d'interpolation de surfaces (Tween Surfaces).
interpuNP – interpoler la surface des NURBS dans la direction U :
"interpuNP [-order order | -ktype type | -closed (0|1) | -sdlen length | -edlen length]"
"-closed"
le demande, mais cela augmentera également la largeur de la surface NURBS résultante.
La valeur par défaut est de créer une surface ouverte pour les surfaces d'entrée ouvertes et une surface fermée pour les surfaces d'entrée fermées ou périodiques.
En utilisant les options "-sdlen"
et "-edlen"
(qui sont toutes deux par défaut à 0.0), la longueur des dérivés de début/fin créés automatiquement peut être ajustée.
Si l'une d'entre elles n'est pas à 0.0, un algorithme d'interpolation différent sera utilisé, ce qui augmente la largeur de la surface NURBS résultante.
La surface interpolera tous les points de contrôle actuels après l'interpolation et la position de certains points de contrôle sera modifiée au cours de ce processus de sorte que, après l'interpolation, les nouveaux points de contrôle ne seront pas interpolés par la surface. La surface interpolera plutôt les positions des ancien points de contrôle.
Le type de noeud u des surfaces interpolées sera changé en "Custom"
.
Si l'option "-closed"
n'est pas présente, la surface interpolée sera fermée pour les surfaces fermées et périodiques.
Voir aussi la section Outil d'interpolation de surface (Interpolate Surface).
interpvNP – interpoler la surface des NURBS dans la direction V :
"interpvNP [-order order | -ktype type | -closed (0|1) | -sdlen length | -edlen length]"
"-closed"
le demande, mais cela augmentera également la largeur de la surface NURBS résultante.
La valeur par défaut est de créer une surface ouverte pour les surfaces d'entrée ouvertes et une surface fermée pour les surfaces d'entrée fermées ou périodiques.
En utilisant les options "-sdlen"
et "-edlen"
(qui sont toutes deux par défaut à 0.0), la longueur des dérivés de début/fin créés automatiquement peut être ajustée.
Si l'une d'entre elles n'est pas à 0.0, un algorithme d'interpolation différent sera utilisé, ce qui augmente la largeur de la surface NURBS résultante.
La surface interpolera tous les points de contrôle actuels après l'interpolation et la position de certains points de contrôle sera modifiée au cours de ce processus de sorte que, après l'interpolation, les nouveaux points de contrôle ne seront pas interpolés par la surface. La surface interpolera plutôt les positions des ancien points de contrôle.
Le type de noeud v des surfaces interpolées sera changé en "Custom"
.
Si l'option "-closed"
n'est pas présente, la surface interpolée sera fermée pour les surfaces fermées et périodiques.
Voir aussi la section Outil d'interpolation de surface (Interpolate Surface).
breakNP – décomposer le patch NURBS en courbes :
"breakNP [-r | -a | (-u | -v)]"
"-u"
ou "-v"
est spécifiée, la valeur par défaut est U).
Si l'option "-a"
est spécifiée, les transformations des objets NPatch seront appliquées aux points de contrôle et les objets NCurve seront créés avec des attributs de transformation par défaut, sinon les points de contrôle seront copiés mot pour mot et les objets NCurve recevront les attributs de transformation du NPatch respectif.
Si l'option "-r"
est spécifiée, les nouveaux objets de courbe remplaceront chaque objet NPatch au lieu d'être ajoutés au niveau actuel.
Ils seront également sélectionnés immédiatement.[∗]
Voir aussi la section Outil décomposition en courbes (Break into Curves).
buildNP – construire un patch NURBS à partir de courbes :
"buildNP [-r|-a (0|1) | -o order | -t type | -k knottype]"
L'option "-a"
contrôle si les attributs de transformation des courbes NURBS doivent être appliqués aux points de contrôle respectifs avant de construire le patch (par défaut 1 – oui).
L'option "-o"
détermine l'ordre souhaité de la surface dans la direction U (par défaut min(4,largeur)).
L'option "-t"
permet de définir un type de surface (0 – ouvert, 1 – fermé, 3 – périodique ; par défaut 0).
L'option "-k"
permet de définir un type de noeud (0 – Bezier, 1 – B-Spline, 2 – NURB, 4 – Chordal, 5 – Centripetal, 2 – par défaut ; NURB).
Les noeuds personnalisés ne sont pas pris en charge.
Si l'option "-r"
est présente, les nouveaux objets NPatch remplaceront le premier objet NCurve sélectionné au lieu d'être ajoutés au niveau actuel, les autres objets NCurve seront supprimés.
Voir aussi la section Outil de construction à partir de courbes (Build from Curves).
"isCompNP [(-u
|
-v) | -l level]"
1
si les surfaces NURBS sélectionnées sont compatibles (c'est-à-dire définies sur le même vecteur de noeud), sinon elle renvoie 0
.
Si l'option "-u"
est donnée, seule la dimension U sera vérifiée.
Si l'option "-v"
est donnée, seule la dimension V sera vérifiée.
Si "niveau"
est 0
, seuls les ordres des surfaces sont comparés.
Si "level"
est 1
, la largeur/hauteur et les ordres des surfaces sont comparés.
makeCompNP – rendre les surfaces NURBS compatibles :
"makeCompNP [-f | (-u
|
-v) | -l level]"
Si l'option "-f"
est présente, il n'y aura pas de contrôle de compatibilité préalable.
Si l'option "-u"
est donnée, seule la dimension U sera adaptée.
Si l'option "-v"
est donnée, seule la dimension V sera adaptée.
Si "level"
est 0
, seules les commandes seront adaptées.
Si "level"
est 1
, seuls les ordres et les longueurs seront adaptés.
Voir aussi la section Outil pour rendre les surfaces compatibles (Make Surfaces Compatible).
curvatNP – calculer la courbure gaussienne :
"curvatNP [-r] -u u -v v"
u
et v
.Si l'option "-r"
est présente, les valeurs paramétriques sont interprétées de manière relative et doivent donc se situer dans la plage [0, 1].
Si plusieurs objets sont sélectionnés, une liste de valeurs de courbure est renvoyée.
tobasisPM – convertir un PatchMesh sur une autre base :
"tobasisPM [-t type | -s step | -b basis]"
L'option "-t"
contrôle le nouveau type de base (0 – "Bezier"
, 1 – "B-Spline"
, 2 – "Catmull-Rom"
, 3 – "Hermite"
, 4 – "Power"
, 5 – "Custom"
), la valeur par défaut est 1 (conversion en "B-Spline"
).
L'option "-s"
détermine la nouvelle taille de pas (1 à 4), elle prend par défaut la taille de pas naturelle du type de base cible et peut donc être omise sans risque, sauf si le type de base cible est "Custom"
, auquel cas la taille de pas doit être spécifiée.
L'option "-b"
permet de convertir en une base personnalisée et est donc une liste de 16 valeurs en virgule flottante spécifiant une matrice de base 4 par 4 dans l'ordre principal des colonnes.
Si "-b"
est donné, le type de cible est par défaut "Custom"
et l'option "-t"
peut être omise.
"tobasisPM -t 0"
"tobasisBC [-t type | -s step | -b basis]"
L'option "-t"
contrôle le nouveau type de base (0 – "Bezier"
, 1 – "B-Spline"
, 2 – "Catmull-Rom"
, 3 – "Hermite"
, 4 – "Power"
, 5 – "Custom"
), la valeur par défaut est 1 (conversion en "B-Spline"
).
L'option "-s"
détermine la nouvelle taille de pas (1 à 4), elle correspond par défaut à la taille de pas naturelle du type de base cible et peut donc être omise sans risque, sauf si le type de cible est "Custom"
, auquel cas la taille de pas doit être spécifiée.
L'option "-b"
permet de convertir en une base personnalisée et est donc une liste de 16 valeurs en virgule flottante spécifiant une matrice de base 4 par 4 dans l'ordre principal des colonnes.
Si "-b"
est donné, le type de cible est par défaut "Custom"
et l'option "-t"
peut être omise.
"tobasisBC -t 0"
Il s'agit de commandes plus spécialisées pour modifier les propriétés des objets PolyMesh :
genfnPo – générer des normales à la face :
"genfnPo"
Les normales générées seront stockées dans une balise PV.
gensnPo – générer des normales régulières :
"gensnPo"
Les normales de sommet déjà existantes seront détruites.
Si des normales de face existent déjà, elles seront utilisées, sinon, de nouvelles normales de face seront générées en utilisant le même algorithme que celui mis en oeuvre dans la commande "genfnPo"
ci-dessus.
remsnPo – supprimer des normales régulières :
"remsnPo"
flipPo – retourner les normales ou les boucles :
"flipPo [0|1|2]"
Utilisez ces deux commandes pour lire ou manipuler les points de contrôle des objets qui supportent l'édition de points.
getPnt – obtenir un ou des points :
"getPnt [-trafo | -world | -eval | -relative] (index | indexu indexv | u | u v ([varx vary varz [varw]] | -vn [varname]) | -all [varname] | -sel [varname])"
varx
, vary
, varz
, et (si l'objet supporte des coordonnées rationnelles) varw
.
Les arguments d'index nécessaires dépendent du type d'objet sélectionné. Par exemple, la lecture des points d'une courbe NURBS ne nécessite qu'un seul paramètre d'index (index
), alors que la lecture des points d'un patch NURBS nécessite la spécification de deux paramètres d'index (indexu
et indexv
).
Si l'argument optionnel "-trafo"
est donné, les coordonnées seront en outre transformées par les valeurs données dans la propriété Transformation de l'objet.
Si l'argument optionnel "- world "
est utilisé, les coordonnées seront en outre transformées en espace mondial.
Si l'argument optionnel "-eval"
est spécifié, les valeurs "indexu"
et "indexv"
sont interprétées comme des valeurs paramétriques d'une courbe ou d'une surface NURBS et le point correspondant sur la courbe ou la surface est restitué en varx
, vary
, et varz
.
Si l'argument optionnel "-relative"
est spécifié, la valeur paramétrique pour la courbe NURBS ou l'évaluation de la surface est interprétée de manière relative et doit par conséquent se situer dans la plage [0,1].
Si l'argument alternatif "-vn"
est donné, les valeurs des coordonnées seront ajoutées à la variable de liste spécifiée par "varname"
.
Si l'argument alternatif "-all"
est utilisé, toutes les valeurs de coordonnées des objets sélectionnés seront ajoutées à la variable de liste spécifiée par "varname"
.
Si l'argument alternatif "-sel"
est utilisé, les valeurs des coordonnées des points actuellement sélectionnés des objets sélectionnés seront ajoutées à la variable de liste spécifiée par "varname"
.[∗]
Si l'un des arguments du nom de la variable est omis, la commande renvoie les résultats respectifs.[∗]
"getPnt 1 x y z w"
"x y z w"
."getPnt -eval 0.5 x y z"
"0.5"
et écrit les valeurs des coordonnées dans les variables "x y z"
.
setPnt – Définir un ou des points :
"setPnt [-world] (index | indexu indexv) (x y z [w] | -vn varname) | (-all|-sel) varname)"
Les arguments d'index nécessaires dépendent du type d'objet sélectionné, par exemple la manipulation des points d'une courbe NURBS ne nécessite qu'un seul paramètre d'index (index), alors que la manipulation des points d'un patch NURBS nécessite la spécification de deux paramètres d'index (indexu et indexv).
Si le paramètre facultatif "-world"
est donné, les valeurs des coordonnées sont exprimées dans l'espace mondial et seront transformées en coordonnées appropriées de l'espace objet avant d'être définies.
Si le paramètre optionnel "w"
est omis, mais que l'objet sélectionné a des points rationnels, une valeur par défaut de 1.0 sera utilisée pour le poids.
Si le paramètre alternatif "-vn"
est utilisé, les valeurs des coordonnées seront lues à partir de la variable spécifiée par "varname"
qui doit être une liste de valeurs doubles.
Si le paramètre alternatif "-all"
est fourni, tous les points de contrôle des objets sélectionnés seront définis et les valeurs des coordonnées seront lues à partir de la variable spécifiée par "varname"
qui doit être une liste de valeurs doubles.
Si l'argument alternatif "-sel"
est utilisé, tous les points de contrôle sélectionnés des objets sélectionnés seront définis et les valeurs des coordonnées seront lues à partir de la variable spécifiée par "varname"
qui doit être une liste de valeurs doubles.[∗]
Lors de la lecture des données des variables de liste, aucune précision ne sera perdue car il n'y a pas de double chaine - double conversion impliquée.
"setPnt 1 0.0 0.2 0.3 1.0"
"0.0 0.2 0.3 1.0"
."setPnt -world 0 0 0 0"
"setPnt 2 1 0.0 0.2 0.3"
"0.0 0.2 0.3 1.0"
.Ces procédures mettent à jour diverses parties de l'interface utilisateur de Ayam :
rV – redessiner toutes les vues :
"rV"
uS – mettre à jour ce qui est sélectionné :
"uS [update_prop maintain_selection]"
Si update_prop est égal à 0, aucune mise à jour des GUI de propriété n'aura lieu.
Si maintain_selection est à 1, l'ancienne sélection sera rétablie.
Si les deux arguments sont omis, update_prop prend par défaut la valeur 1 et maintain_selection la valeur 0.
"ay(ul)"
(UpdateLevel) peut être mise au niveau actuel avant d'appeler "uS"
.
Cela ne supprimera pas et ne mettra pas à jour la scène complète, mais seulement la partie située en dessous de "ay(ul)"
.
Exemple :
global ay; set ay(ul) $ay(CurrentLevel); uS;
"uCR"
peut être utilisée à la place de "uS"
."uCL cl"
peut être utilisée au lieu de "uS"
.
uCL – mettre à jour le niveau actuel :
"uCL mode [args]"
"uS"
ci-dessus.
Le paramètre "mode"
peut être "cl" ou "cs", où "cl" est le mode de fonctionnement normal, et "cs" efface simplement la sélection.
uCR – mettre à jour le niveau actuel après une création :
"uCR"
"uS"
ci-dessus.
plb_update – mise à jour de la liste des propriétés :
"plb_update"
<Shift+Return>
au lieu de <Return>
.
Les commandes du réglage des préférences cachées "AUCommands"
seront exécutées après les commandes de la ligne de commande, si la touche <Shift>
est maintenue enfoncée.
<Shift+Retour>
peut également être utilisé sans commandes sur la ligne de commande.
Par défaut, les "AUCommands"
sont "uS; rV;"
, ce qui permet de mettre à jour l'arbre d'objets, l'interface graphique des propriétés et les vues.
Ces commandes gèrent les données des préférences :
getPrefs – obtenir des données sur les préférences :
"getPrefs"
setPrefs – Définir les données des préférences :
"setPrefs"
"ayprefs"
pour permettre à tous les changements de prendre effet.Cette commande gère les objets personnalisés (plugins) :
loadPlugin – charger un objet personnalisé / plugin :
"loadPlugin name"
name
est un nom de fichier complet et que le fichier désigné existe, il sera chargé directement.
Sinon, le fichier à charger sera recherché dans la liste des répertoires de plugins configurés (voir "Plugins"
réglage des préférences).
Notez qu'il n'est actuellement pas possible de décharger un objet ou un plugin personnalisé de Ayam.
Ces procédures et commandes permettent d'appliquer des commandes quelconques à un certain nombre d'objets sélectionnés.
"forAll [(-recursive|-r) r | (-type|-t) t] command"
Si r
est égal à 1 (c'est la valeur par défaut), forAll se reproduira dans chaque objet (s'il a des objets enfants) avant l'exécution de la commande.
Si r
est égal à 2, la récursion se produira après l'exécution de la commande.
Si r
est égal à 0, seuls les objets du niveau actuel seront traités.
Si l'option "-type"
est donnée, seuls les objets du type spécifié t
seront traités.
Avant Ayam 1.22, les erreurs potentielles des commandes étaient supprimées et le traitement se poursuivait malgré tout.
Mais cela rendait l'utilisation interactive et le débogage inutilement difficiles.
À partir de 1.22, les erreurs sont signalées à l'utilisateur et le traitement s'arrête immédiatement.
Les erreurs peuvent encore être supprimées à l'aide de la commande "catch"
comme celle-ci :
"forAll { catch { commands } }"
Comme la commande sera potentiellement appelée plusieurs fois, les valeurs résultat de toute sorte ne peuvent pas être fournies à l'aide de la commande "return"
mais doivent plutôt être stockées dans des variables globales.
En fait, renvoyer toute valeur qui n'est pas -1
sera interprété comme une erreur et le traitement s'arrêtera immédiatement.
Le renvoi de -1
dans une forAll récursive arrêtera le traitement sans provoquer d'erreur.
La variable globale "ay(CurrentLevel)"
sera maintenue tandis qu'un forAll récursif parcourt la scène.
De plus, la variable globale "i"
sera définie sur l'index de l'objet courant.
Notez que forAll fonctionnera lentement si une interface graphique de propriété est affichée. Si la propriété actuelle est d'abord désélectionnée (en utilisant par exemple le menu contextuel de la propriété), elle s'exécutera beaucoup plus rapidement.
En outre, la sélection actuelle est correctement maintenue.
"-type"
dans ce cas."forAll { uplevel #0 { commands } }"
"forAll { global arrayname; commands }"
withOb – exécuter une commande sur certains des objet(s) sélectionné(s) :
"withOb index [do] command"
"withOb 2 {movOb 0 1 0}"
Ces commandes permettent de charger des scènes et de les enregistrer dans des fichiers de scènes Ayam :
"replaceScene filename"
"filename"
."insertScene filename"
"filename"
."saveScene filename [selected]"
" filename "
.
Si le paramètre optionnel "selected"
est égal à 1, seuls les objets sélectionnés seront sauvegardés."newScene"
Cette commande permet d'exporter la scène en cours vers un fichier RIB (RenderMan Interface Bytestream):
"wrib filename [-image imagename] [-smonly | -selonly | -objonly]"
"filename"
.
Si l'argument "-image"
est donné, le fichier RIB créera un fichier image nommé "imagename"
lors du rendu.
L'exportation utilisera la transformation de la caméra à partir de l'objet Camera actuellement sélectionné.
Si l'argument "-smonly"
est fourni, un RIB pour rendre les cartes d'ombrage sera créé et l'argument de "-image"
sera ignoré.
Voir aussi la section
Utilisation des ombrages (ShadowMaps).
Si l'argument "-selonly"
est utilisé, seuls les objets (géométriques) sélectionnés seront exportés, ce qui résultera en un fichier RIB non adapté au rendu (aucune configuration, transformation de caméra ou lumières n'y figurent) mais fait pour l'inclusion dans d'autres scènes via RiArchive.
Voir aussi la section
L'objet RiInc.
De même, "-objonly"
conduit à un fichier RIB contenant tous les objets de la scène mais ne se prêtant pas au rendu.
La commande "wrib"
nécessite toujours un objet caméra sélectionné (sauf si les options "-selonly"
ou "-objonly"
sont données) ; s'il n'y en a pas ou si les transformations de la caméra associée à une fenêtre de vue doivent être utilisées, le Togl callback (????) correspondant pour la vue peut être utilisé comme ceci à la place :
.view1.f3D.togl wrib -file filename.rib
"wrib"
.
"-filename"
, ce n'est plus le cas.Cette commande sert à signaler les erreurs des scripts :
"ayError code place detail"
ayError
doit être préféré à puts
parce que le mécanisme de rapport d'erreurs de Ayam comporte une sortie formatée de manière cohérente, la compression des messages répétés et l'enregistrement.
Le paramètre de code doit être l'un des suivants : 1 – avertissement, 2 – erreur, 3 – messages de vidange, 4 – sortie non spécifiée.
Il existe d'autres codes définis (voir ayam.h, chercher Codes de retour/d'erreur) mais ils ne sont généralement pas nécessaires dans le contexte d'un script Tcl.
Le paramètre " place " doit décrire la procédure dans laquelle l'erreur s'est produite.
Le paramètre "detail" est la chaîne de caractères de sortie."ErrorLevel"
voir section
Préférences diverses.
Ces procédures aident à gérer les GUI de propriété. Voir aussi la section Gestion des propriétés et tableaux de données.
"addPropertyGUI name"
Le tableau sera configuré de manière à ce que le tableau de données de la propriété soit nommé comme la propriété avec la chaîne Data
annexée, c'est-à-dire que pour MyProperty
il sera MyPropertyData
.
Les entrées de la procédure "Get/Set" seront laissées vides.
Après la création des éléments de l'interface graphique de propriété, les balises "NP"
doivent être utilisées pour rendre la nouvelle propriété visible par l'utilisateur.
Voir aussi la section
Balise NP (New Property).
Un exemple complet est disponible dans la section Exemple de ligne paramétrique.
"set w [addPropertyGUI MyProperty]"
"addPropertyGUI"
.
addParam:
"addParam window arrayname paramname [defaults]"
Le paramètre "window"
doit contenir le nom de la fenêtre tel que renvoyé par
"addPropertyGUI"
ci-dessus.
Le paramètre "arrayname"
est le nom du tableau de données correspondant à la propriété.
Le paramètre "paramname"
est le nom du paramètre.
Le paramètre "defaults"
est une liste de valeurs par défaut.
Ces valeurs seront présentées à l'utilisateur sous la forme d'un menu déroulant supplémentaire sur le côté droit de l'élément d'interface.
"addParam $w MyPropertyData MyFloat {0.1 0.5 1.5}"
addString:
"addString window arrayname paramname [defaults]"
Le paramètre "window"
doit contenir le nom de la fenêtre tel que renvoyé par "addPropertyGUI"
ci-dessus.
Le paramètre "arrayname"
est le nom du tableau de données correspondant à la propriété.
Le paramètre "paramname"
est le nom du paramètre.
Le paramètre "defaults"
est une liste de valeurs par défaut.
Ces valeurs seront présentées à l'utilisateur sous la forme d'un menu déroulant supplémentaire sur le côté droit de l'élément d'interface.
Si la liste contient une entrée "..."
, la sélection de cette entrée effacera le champ de saisie de la chaîne et déplacera le focus de saisie vers le champ.
"addString $w MyPropertyData MyString {"a" "b" "abc"}"
"addCheck window arrayname paramname [onoffvalues]"
Le paramètre "window"
doit contenir le nom de la fenêtre tel que renvoyé par "addPropertyGUI"
ci-dessus.
Le paramètre "arrayname"
est le nom du tableau de données correspondant à la propriété.
Le paramètre "paramname"
est le nom du paramètre.
Le paramètre facultatif "onoffvalues"
est une liste de deux valeurs qui seront utilisées lors de la définition de la variable correspondante lorsque le bouton de contrôle est activé ou désactivé.
Les valeurs par défaut sont 0 et 1.
"addCheck $w MyPropertyData MyBool"
addColor:
"addColor window arrayname paramname [defaults]"
Le paramètre "window"
doit contenir le nom de la fenêtre tel que renvoyé par "addPropertyGUI"
ci-dessus.
Le paramètre "arrayname"
est le nom du tableau de données correspondant à la propriété.
Le paramètre "paramname"
est le nom du paramètre.
Le paramètre "defaults"
est une liste de valeurs par défaut.
Ces valeurs seront présentées à l'utilisateur sous la forme d'un menu déroulant supplémentaire sur le côté droit de l'élément d'interface.
"addColor $w MyPropertyData MyColor"
addMatrix:
"addMatrix window arrayname paramname"
Le paramètre "window"
doit contenir le nom de la fenêtre tel que renvoyé par "addPropertyGUI"
ci-dessus.
Le paramètre "arrayname"
est le nom du tableau de données correspondant à la propriété.
Le paramètre "paramname"
est le nom du paramètre.
Les noms des variables individuelles de la valeur de la matrice seront formés en ajoutant un "_0"
à "_15"
au "paramname"
.
"addMatrix $w MyPropertyData MyMatrix"
"addMenu window arrayname paramname choices"
Le paramètre "window"
doit contenir le nom de la fenêtre tel que renvoyé par "addPropertyGUI"
ci-dessus.
Le paramètre "arrayname"
est le nom du tableau de données correspondant à la propriété.
Le paramètre "paramname"
est le nom du paramètre.
Le paramètre "choices"
est une liste de chaînes de caractères qui seront présentées dans le menu.
Contrairement aux autres éléments de l'interface utilisateur générant des procédures, l'entrée correspondante dans le tableau des données de propriété doit exister avant que cette procédure ne soit appelée.
"addMenu $w MyPropertyData MyMenu {Choice1 Choice2}"
addFile:
"addFile window arrayname paramname [defaults]"
Le paramètre "window"
doit contenir le nom de la fenêtre tel que renvoyé par "addPropertyGUI"
ci-dessus.
Le paramètre "arrayname"
est le nom du tableau de données correspondant à la propriété.
Le paramètre "paramname"
est le nom du paramètre.
Le paramètre "defaults"
est une liste de valeurs par défaut.
Ces valeurs seront présentées à l'utilisateur sous la forme d'un menu déroulant supplémentaire sur le côté droit de l'élément d'interface.
"addSFile"
"addFile $w MyPropertyData MyFile {"/tmp/file1" "/tmp/file2"}"
addCommand:
"addCommand window name text command"
Le paramètre "window"
doit contenir le nom de la fenêtre tel que renvoyé par "addPropertyGUI"
ci-dessus.
Le paramètre "name"
est le nom du widget de bouton correspondant.
Les noms doivent être uniques dans chaque interface graphique de propriété.
Le paramètre "text"
est la chaîne de caractères à placer sur le bouton.
Le paramètre "command"
est la commande à exécuter lorsque le bouton est enfoncé.
"addCommand $w b1 PushMe {puts pushed}"
"addText window name text"
Le paramètre "window"
doit contenir le nom de la fenêtre tel que renvoyé par "addPropertyGUI"
ci-dessus.
Le paramètre "name"
est le nom du widget d'étiquette correspondant.
Les noms doivent être uniques dans chaque GUI de propriété.
Le paramètre "text"
est la chaîne de caractères à afficher.
"addText $w t1 "Angular Parameters:""
addInfo:
"addInfo window arrayname paramname"
Le paramètre "window"
doit contenir le nom de la fenêtre tel que renvoyé par "addPropertyGUI"
ci-dessus.
Le paramètre "arrayname"
est le nom du tableau de données correspondant à la propriété.
Le paramètre "paramname"
est le nom du paramètre dont la valeur doit être affichée.
Chaque fois que la valeur de cette variable change, l'étiquette correspondante est automatiquement mise à jour.
Si une deuxième variable nommée "paramname"
mais avec un "Ball"
supplémentaire existe, sa valeur sera affichée sous forme de bulle d'aide, lorsque le pointeur de la souris survole l'étiquette.
De cette façon, des informations plus longues ou plus complexes peuvent être présentées.
"addInfo $w MyPropertyData NumGeneratedElems"
addProgress:
"addProgress window arrayname paramname"
Le paramètre "window"
doit contenir le nom de la fenêtre tel que renvoyé par "addPropertyGUI"
ci-dessus.
Le paramètre "arrayname"
est le nom du tableau de données correspondant à la propriété.
Le paramètre "paramname"
est le nom du paramètre où la progression est stockée en pourcentage.
"addProgress $w MyPropertyData Progress"
"addVSpace window name height"
Le paramètre "window"
doit contenir le nom de la fenêtre tel que renvoyé par "addPropertyGUI"
ci-dessus.
Le paramètre "name"
est le nom du widget correspondant.
Les noms doivent être uniques dans chaque GUI de propriété.
Le paramètre "height"
est la hauteur souhaitée en pixels.
"addVSpace $w v1 20"
addOptionToggle:
"addOptionToggle window arrayname paramname text cmd"
Le paramètre "window"
doit contenir le nom de la fenêtre tel que renvoyé par "addPropertyGUI"
ci-dessus.
Le paramètre "arrayname"
est le nom du tableau de gestion de la propriété.
Le paramètre "paramname"
est le nom d'une variable qui contient l'état de visibilité actuel.
Le paramètre "text"
est le texte à afficher sur le widget de basculement, il s'agit généralement d'une chaîne comme "Advanced Options"
.
Le paramètre "cmd"
est le nom d'une procédure qui, sur la base de l'état de visibilité actuel, crée ou détruit les autres éléments de l'interface graphique de propriété.
proc toggleAdvanced { } { global MyProp set w $MyProp(w) if { $MyProp(ShowAdvanced) } { addCheck $w MyPropData AdvancedOption } else { catch {destroy $w.fAdvancedOption} } } set w [addPropGUI MyProp] set MyProp(w) $w addCheck $w MyPropData CommonOption addOptionToggle $w MyProp ShowAdvanced "Advanced Options" \ toggleAdvanced
Commandes diverses :
"convOb [-inplace [type] | -check type]"
Si l'option "-inplace"
est utilisée, le(s) nouvel(s) objet(s) remplacera(ont) l'ancien(s) objet(s).
Si, en outre, un type de cible est spécifié, la conversion sera répétée jusqu'à ce que l'objet soit du type demandé (et aucune conversion n'est tentée si l'objet est déjà du type demandé).[∗]
Si l'option "-check"
est donnée, la commande convOb ne convertit pas mais vérifie, si une conversion vers un type d'objet donné serait réussie, le résultat de la vérification sera renvoyé sous la forme 0 – non, ou 1 – oui.
Notez que seules les conversions immédiates, en une étape, sont vérifiées, et non les conversions en plusieurs étapes comme celles effectuées par les conversions en place avec le type d'objet cible.
"undo [redo | save opname [0|1] | clear | rewind]"
"redo"
, cette commande effectue l'opération de refaire."save"
, les objets actuellement sélectionnés sont enregistrés dans le tampon d'annulation pour les opérations d'annulation futures.
Le nom de l'opération de modélisation suivante doit être fourni dans un second argument ("opname"
).
Ce nom sera affiché dans l'invite de la console par défaut, pour informer l'utilisateur de l'opération qui serait annulée/rétablie, si undo/redo serait utilisé (par exemple : "[undo:MoveObj/Redo:none].../bin>"
).
Depuis Ayam 1.13, un troisième argument peut être donné, qui contrôle si tous les enfants des objets sélectionnés doivent également être sauvegardés.
Cela peut être nécessaire si l'action de modélisation qui suit la sauvegarde d'annulation est sur le point de modifier les objets sélectionnés et aussi leurs enfants. Remarque : l'annulation de l'enregistrement n'échoue pas si aucun objet n'est sélectionné."clear"
, tous les états actuellement sauvegardés seront effacés du tampon d'annulation."rewind"
est disponible depuis Ayam 1.14.
Avec cette commande, vous pouvez annuler la dernière opération d'annulation de sauvegarde.
Cela peut être nécessaire, si une opération de modélisation a échoué.
Il faut cependant faire attention à ne pas rembobiner l'état d'annulation, lorsqu'une opération de modélisation a échoué seulement pour certains (pas pour tous) des objets sélectionnés.undo save "MovOb" set ay_error "" movOb 0 1 0 if { $ay_error > 1 } { undo rewind }
"runTool vars labels commands title [doc]"
vars
et labels
, et si le dialogue est fermé via le bouton "Ok"
, exécute les commandes spécifiées.
"vars"
est une liste de noms de variables, les noms de tableaux sont autorisés.
Si les variables spécifiées existent déjà, leurs valeurs actuelles seront utilisées pour déduire un type de paramètre permettant de présenter à l'utilisateur un composant d'interface graphique spécifique.
La détection du type utilise la fonction string is
de Tcl.
Si la valeur actuelle est de type entier et qu'il existe une deuxième variable (nommée comme la variable originale avec en appendice _l
), un composant de menu sera utilisé et les choix de menu seront pris dans la deuxième variable.
"labels"
est une liste de chaînes d'étiquettes pour les paramètres.
"commands"
est le code qui appelle l'outil et exécute une mise à jour supplémentaire de l'interface graphique.
Si le code contient des chaînes comme %0
, celles-ci seront remplacées par la valeur de paramètre correspondante demandée avant l'exécution du code.
"title"
est la chaîne de titre de la fenêtre de dialogue. Elle peut être utilisée pour transmettre le nom ou la description de l'outil à l'utilisateur.
"doc"
est un argument optionnel qui contient une URL de documentation pour l'outil.
Cet URL sera ouvert lorsque la touche <F1>
sera enfoncée dans le dialogue.
runTool {x} {"X:"} {moveOb %0 0 0;plb_update;rV} "MoveX"
runTool {x y} {"X:" "Y:"} {moveOb %0 %1 0;plb_update;rV} "MoveXY"
set l 0 set l_l {"Start" "End" "Both"} runTool {l} {"Side:"} { switch %0 { 0 {clampNC -s} 1 {clampNC -e} 2 {clampNC} } plb_update;rV } "Clamp"
"notifyOb [-all | -modified | -parent]"
Si le paramètre "-modified"
est utilisé, seuls les objets modifiés seront notifiés.
Si le paramètre "-all"
est utilisé, tous les objets seront notifiés, quelle que soit la sélection.
Si le paramètre "-parent"
est utilisé, seul l'objet parent actuel du niveau actuel sera notifié.
Avant Ayam 1.20, cette commande était nommée "forceNot"
, l'ancien nom est toujours disponible pour la compatibilité mais son utilisation est obsolète.
∗: Depuis la version 1.21, cette commande est également disponible dans l'interpréteur de sécurité avec des fonctionnalités limitées : seuls les rappels de notification des objets sélectionnés seront exécutés. Aucune balise BNS ou ANS ne sera prise en compte, la notification des parents ne sera pas effectuée, et la notification complète sera également omise. Par conséquent, dans l'interpréteur sûr, cette commande ignore tous les paramètres.
Voir aussi la section Le concept de modélisation outils-objets.
"nameOb name"
"setMark [x y z | l]"
Si aucun argument n'est fourni, la marque globale est effacée.
Cette procédure ne fonctionne que s'il y a au moins une vue.
Voir aussi la section Définir une marque.
"setMark 0 0 0"
"getMark"
Cette procédure ne renvoie des données significatives que s'il existe au moins une vue.
Voir aussi la section Définir une marque.
"tmpGet tmpdir varname [ext]"
varname
."whatis this"
"this"
dans le contexte du script Tcl vers la console.
Cette procédure peut être utilisée pour s'enquérir de l'existence de variables, de widgets, ou pour savoir si quelque chose est une commande ou une procédure."whatis ."
conduit au résultat :
.
is a command.
.
is a widget.
"addToProc procedure addition"
addition
à la procédure Tcl procedure
."return ;"
.Diverses entrées de dialogue pour la création d'objets et les outils de modélisation prennent en charge les variables et expressions Tcl. Il est par exemple possible d'entrer :
$::u
u
(qui peut avoir été définie avant d'utiliser l'action de modélisation find u) et insérer un noeud au point choisi.
Il est également possible de saisir des expressions mathématiques complexes :
[expr sin(45)]
[myproc]
"myproc"
est défini ailleurs (par exemple dans un fichier de script Tcl chargé via le paramètre de préférence "Scripts"
) comme suit :
proc myproc { } { return [expr sin(45)]; }
<Ctrl+T>
), exécutera à nouveau l'expression fournie.
Cela signifie qu'un certain nombre de courbes de longueur croissante peuvent être créées en entrant dans la console Ayam :
set ::myvar 1
[incr ::myvar]
<Ctrl+T>
.
Voici quelques exemples complets de scripts pour l'interface de script Tcl de Ayam.
Tous les exemples peuvent être copiés à partir de la documentation et collés directement dans la console de Ayam.
L'exemple de script suivant montre comment déplacer un objet sélectionné vers une position spécifiée dans l'espace.
proc placeOb { x y z } { global transfPropData # copy Transformations-property data to # global array "transfPropData" getTrafo # set array values according to procedure parameters set transfPropData(Translate_X) $x set transfPropData(Translate_Y) $y set transfPropData(Translate_Z) $z # copy Transformations-property data from # global array "transfPropData" to selected object setTrafo } # placeOb
forAll -recursive 0 {placeOb 1 1 1}
"placeOb"
(définie ci-dessus) avec elles :
global ay $ay(cm) add command -label "Place Object(s)" -command { runTool {x y z} {"X:" "Y:" "Z:"} {forAll -recursive 0 {placeOb %0 %1 %2}; plb_update; rV } "Place Object(s)" }
"plb_update ; rV"
garantit que l'interface graphique est correctement mise à jour et que toutes les vues affichent la nouvelle position des objets
L'exemple de scénario suivant montre comment déplacer les points de contrôle d'une courbe NURBS.
# first, we create a new NURBS curve with 30 control points set len 30 crtOb NCurve -length $len # update selection uS # select last object (the newly created curve) sL # prepare moving set i 0 set r 3.0 set angle 0 set angled [expr 3.14159265/2.0] while { $i < $len } { set x [expr $r*cos($angle)] set y [expr $r*sin($angle)] set z [expr $i/3.0] # move control point to new position setPnt $i $x $y $z 1.0 set angle [expr $angle + $angled] incr i } # redraw all views rV
L'exemple de script suivant montre comment créer facilement un balayage à partir d'une courbe de chemin sélectionnée (en évitant la création et le paramétrage long et manuel d'une section transversale appropriée).
proc easySweep { } { # first, we create a sweep object crtOb Sweep # now, we need to move the selected curve (path) to # the sweep and create a cross-section curve there too # for that, we move the currently selected curve to the clipboard cutOb # enter the Sweep (the last object in the current level) goDown -1 # now, we create a new curve (a closed B-Spline suitable as cross section) crtClosedBS -s 8 # select the new object selOb 0 # now, we rotate and scale the curve rotOb 0 90 0 scalOb 0.25 0.25 1.0 # move trajectory back (we use "-move", because we # really want to move (and not copy) the curve object pasOb -move # go up to where we came from goUp # finally, update the GUI... uS sL # ...and redraw all views rV } # easySweep
Exécutez cette procédure en sélectionnant un objet courbe NURBS, puis tapez dans la console :
» easySweep
Cette commande peut également être ajoutée au menu principal :
global ay $ay(cm) add command -label "Easy Sweep" -command { easySweep }
"Custom/Easy Sweep"
qui appelle la procédure easySweep
.
Voici un autre exemple de script qui montre comment les boutons peuvent être ajoutés à la boîte à outils. myImage doit être une image créée par exemple à partir d'un fichier GIF de taille 25 par 25 pixels.
global ay ayprefs # create an image from a GIF file: image create photo myImage -format gif -file /home/user/giffile set b $ay(tbw).mybutton # if the button does not already exist: if { ![winfo exists $b] } { # create it: button $b -padx 0 -pady 0 -image myImage -command myCommand # tell Ayam about the new button: # you can use "linsert", to insert the button in a specific # place or just append to the end of the list using "lappend" lappend ay(toolbuttons) mybutton # display the button: toolbox_layout # from now on, the button will be under the # automatic toolbox layout management }
"ay(tbw)"
(il s'agit de ".tbw.f"
pour les configurations d'interface graphique multi-fenêtres ou ".fv.fTools.f"
pour les configurations d'interface graphique à fenêtre unique),"ay(toolbuttons)"
, l'ordre dans cette liste est l'ordre dans lequel les boutons apparaissent dans la boîte à outils,"toolbox_layout"
.L'ajout de boutons ne comportant que du texte est un peu plus compliqué, car la taille de ces boutons ne s'intègre pas toujours bien dans le schéma des boutons à icônes, dont la taille est constante.
Cependant, la procédure "toolbox_add"
peut être d'une aide considérable.[∗]
Voir aussi le script "scripts/topoly.tcl"
pour un exemple.
Le script d'exemple suivant ajoute deux boutons au bas de la boîte à outils couvrant toute la fenêtre (cela fonctionne mieux avec la disposition standard de la boîte à outils de 4 par 12 boutons utilisée dans la configuration de l'interface graphique multi-fenêtres) :
global ay # create a frame: set f [frame $ay(tbw).fcollex] # calculate the row number below the last row: set row [expr [lindex [grid size $ay(tbw)] 1] + 1] # now display the frame at calculated row, spanning the whole window: grid $f -row $row -column 0 -columnspan [lindex [grid size $ay(tbw)] 0]\ -sticky we # create two buttons inside the frame: button $f.b1 -width 5 -text "Coll." -command { collMP; rV; } button $f.b2 -width 5 -text "Expl." -command { explMP; rV; } pack $f.b1 $f.b2 -side left -fill x -expand yes
Cette section contient la documentation de certains scripts d'aide qui sont distribués avec Ayam.
Les scripts d'aide peuvent être exécutés via le menu contextuel de la console, la commande Tcl "source"
dans la console, ou le paramètre de préférence "Scripts"
de Ayam à chaque démarrage (ce dernier à l'exception des scripts dits external "repairAyam.tcl"
, "bgconvert.tcl"
, et "aytest.tcl"
).
Tous les autres scripts interne peuvent être combinés arbitrairement, à l'exception de "kdialog.tcl"
, "zdialog.tcl"
, et "intfd.tcl"
, qui sont mutuellement exclusifs.
Le script externe Tcl "repairAyam.tcl"
peut être utilisé pour réparer l'état de l'application Ayam, si elle est bloquée, par exemple, dans une boucle sans fin de messages d'erreur Tcl.[∗]
Sur les systèmes Unix, "repairAyam"
peut être lancé depuis n'importe quel shell en tapant simplement :
» ./repairAyam.tcl
ou
» wish repairAyam.tcl
à l'invite de commande ; si le script détecte qu'il fonctionne sous Unix et non en Ayam, il s'enverra à l'interprète Tcl qu'Ayam utilise en utilisant la commande Tk send.
Sous Mac OS X Aqua (pas X11 !), les événements AppleScript seront utilisés à la place de la commande Tk send.
Si cela ne fonctionne pas comme prévu, "repairAyam.tcl"
peut toujours être lancé via la console Ayam (comme sur Win32).
Sur Win32 "repairAyam.tcl"
doit être lancé depuis la console Ayam à l'aide de la commande :
» source scripts/repairAyam.tcl
ou via le menu contextuel des consoles : "Console/Load File"
.
Le script "repairAyam.tcl"
doit être considéré comme un dernier recours pour aider à sauvegarder l'état actuel des objets modifiés.
Le script va fermer toutes les vues, nettoyer les variables d'état de l'application, réinitialiser le curseur de la souris et l'invite de la console, et essayer de mettre à jour les widgets importants de la fenêtre principale.
De plus, le script va également vider la console et essayer de briser d'éventuelles boucles sans fin en cours d'exécution, par exemple dans la console ou dans les objets du script.[∗]
A Après avoir exécuté "repairAyam.tcl"
la scène (ou les objets les plus importants sur lesquels on travaille actuellement) devrait être immédiatement sauvegardée dans un nouveau fichier de scène, mais pas le fichier actuellement chargé, en utilisant "File/Save As"
ou "Special/Save Selected"
) et Ayam devrait être redémarré après.
La simple sauvegarde de la scène en utilisant "File/Save"
ou <Ctrl+s>
doit être évitée car les vues ont peut-être été supprimées.
Le script external "aytest.tcl"
permet de tester l'implémentation de Ayam en créant des objets avec diverses combinaisons de paramètres et en exécutant des opérations standard et des actions de modélisation sur ceux-ci.
Le script externe Tcl "bgconvert.tcl"
convertit les fichiers de scènes d'un format de fichier 3D à un autre, avec l'aide de Ayam qui tourne en arrière-plan.[∗]
Dans sa forme la plus simple, bgconvert peut être utilisé à partir d'une ligne de commande Unix (ou d'un script shell) comme ceci :
» bgconvert.tcl infile.x3d outfile.dxf
La commande ci-dessus chargerait le fichier X3D "infile.x3d"
dans Ayam et exporterait la scène sous forme de fichier DXF vers "outfile.dxf"
.
Pour une conversion réussie, Ayam doit fonctionner et les plugins requis pour les processus d'importation et d'exportation doivent être disponibles et correctement configurés (vérifiez le paramètre de préférence "Plugins"
).
Les plugins nécessaires à la conversion seront chargés automatiquement.
Des options d'importation et d'exportation peuvent également être données de cette manière :
» bgconvert.tcl "infile.rib -p 1" outfile.dxf
Dans l'exemple ci-dessus, l'option "-p 1"
active la lecture des fichiers RIB partiels.
Les options disponibles et leur syntaxe peuvent être demandées aux scripts Tcl des plugins d'importation et d'exportation (par exemple : "plugins/rrib.tcl"
).
Le script Tcl "slxml.tcl"
permet à la machine d'analyse des ombrages de Ayam de reconnaître les méta-informations basées sur XML intégrées dans les commentaires du langage de shading.[∗]
De cette façon, la base de données des ombres pour les objets Material peut être constituée à partir de fichiers sources en langue de shading, au lieu d'ombres compilées.
Les balises XML ne seront pas analysées par un véritable analyseur XML, de sorte qu'il n'y a pas de problème de forme.
Toutefois, les attributs doivent être ordonnés d'une certaine manière.
Pour spécifier une ombre, utilisez :
<shader type="stype" name="sname">
où stype
est l'un des noms suivants : surface
, displacement
, volume
, light
, imager
, ou transformation
et sname
est le nom de l'ombre qui doit également correspondre au nom du fichier source de l'ombre sans extension.
Pour spécifier un paramètre d'ombre, utilisez une ligne du type :
<argument name="argname" type="argtype" value="argval">
où argname
est le nom du paramètre, argtype
est à choisir parmi float
, string
, matrix
, color
, point
, normal
, ou vector
et argval
est la valeur par défaut.
Voir également l'exemple suivant de source d'ombre :
/* myshader.sl: * Author: Randolf Schultz * <shader type="surface" name="myshader"> * <argument name="Ka" type="float" value="0.5"> * <argument name="Kd" type="float" value="0.9"> * <argument name="ic" type="color" value="0 1 0"> */ surface myshader(float Ka = 0.5, Kd = 0.9; color ic = color (0, 1, 0);) { color mycolor; ... Ci = Cs*mycolor*(Ka*ambient()+Kd*diffuse(faceforward(normalize(N),I))); }
Les restrictions/limites suivantes (par opposition à l'analyse normale des ombres) s'appliquent :
Le script "topoly.tcl"
parcourt récursivement la scène et convertit tout en une représentation polygonale.[∗]
Après l'exécution du script, il y a un nouveau bouton dans la boîte à outils nommé "ToPolyMesh"
.
De plus, il y a une entrée correspondante dans le menu principal "Custom"
.
En appuyant sur le bouton ou en utilisant l'entrée de menu, le processus de conversion démarre immédiatement.
Comme les modifications de la conversion ne peuvent pas être annulées, la conversion ne sera pas exécutée si la scène contient des modifications non sauvegardées.
La conversion utilisera les paramètres actuels des paramètres de préférence "SMethod"
, "SParamU"
, et "SParamV"
; les balises "TP"
(si présentes) remplaceront ces paramètres.
Les balises TP peuvent être créées facilement à l'aide de l'outil de tessellation, Voir aussi la section
Outil de tessellation (triangularisation).
Le script "tonpatch.tcl"
parcourt récursivement la scène et convertit tout en une représentation patch NURBS, aplatissant ainsi la hiérarchie des objets de l'outil.[∗]
Après l'exécution du script, il y a un nouveau bouton dans la boîte à outils nommé "ToNPatch"
.
De plus, il y a une entrée correspondante dans le menu principal "Custom"
.
En appuyant sur le bouton ou en utilisant l'entrée de menu, le processus de conversion démarre immédiatement.
Comme les modifications de la conversion ne peuvent pas être annulées, la conversion ne sera pas exécutée si la scène contient des modifications non enregistrées.
Le script "2lcons.tcl"
(pour une console à deux lignes) peut être utilisé pour restreindre l'espace occupé par la console à l'écran.
Normalement, la console Ayam est redimensionnée avec la fenêtre principale et occupe une quantité variable d'espace sur l'écran. Après l'exécution du script, la console sera toujours redimensionnée à exactement deux lignes de texte. Différentes valeurs peuvent être choisies facilement en adaptant le script.
Le script "colfocus.tcl"
(pour colored focus) peut être utilisé pour peindre la bague de mise au point dans une couleur plus visible.
Après l'exécution du script, l'anneau de mise au point sera peint en bleu (au lieu du noir) : les sous-fenêtres de mise au point (vues, console, arbre d'objets) seront plus facilement reconnaissables. D'autres couleurs peuvent être utilisées en éditant le script.
Le script "aac.tcl"
(pour aautomatique about center) peut être utilisé pour passer automatiquement toutes les actions de modélisation à leurs variantes environnantes avec la marque placée au centre de la sélection actuelle.
Après avoir exécuté le script, invoquer par exemple l'action d'échelle 2D en utilisant le raccourci <s>
permettra :
<sac>
)<saC>
)Notez que la marque n'est pas réinitialisée à un nouveau centre, lorsque la sélection change. Après un changement de sélection (par exemple en sélectionnant des points dans une vue différente), il suffit de relancer l'action pour transformer à partir du nouveau centre.
Pour effectuer une rotation ou une mise à l'échelle autour d'un point différent du centre, la marque peut toujours être placée manuellement en utilisant <a>
.
Pour désactiver temporairement le comportement modifié, le raccourci clavier global <F11>
peut être utilisé.
Le script "apnt.tcl"
(pour aautomatic point) peut être utilisé pour passer automatiquement en mode de modélisation ponctuelle après une sélection de points.
Après l'exécution du script, la sélection (marquage) d'un point à l'aide de l'action "Sélectionner un point" (raccourci <t>
) fera automatiquement basculer la vue vers la modélisation de points, de sorte que les prochaines actions de modélisation (par exemple, déplacer, via le raccourci <m>
) transformeront toujours les points et ne modifieront pas les transformations des objets.
Notez qu'actuellement, le passage à la modélisation par points se fera également, si aucun point n'est effectivement sélectionné, c'est juste le clic de la souris qui compte.
La sélection de tous les points via le raccourci clavier <A>
permet en outre de passer à la modélisation de points et la désélection de tous les points via <N>
permet en outre de passer à la modélisation d'objets.[∗]
Il est également toujours possible de revenir à la modélisation d'objets à tout moment via le raccourci clavier <o>
.
Pour désactiver temporairement le comportement modifié, le raccourci clavier global <F12>
peut être utilisé.
Le script "ssp.tcl"
(pour save selected ppoints) permet d'enregistrer la sélection de points sur des balises de type SP
.[∗]
Après l'exécution du script, deux nouveaux boutons apparaissent dans la boîte à outils qui permettent respectivement de sauvegarder et de restaurer la sélection de points. Voir également le tableau ci-dessous.
Operation | Icon |
Save | |
Restore |
Il y a également deux entrées correspondantes dans le menu personnalisé.
Notez que les balises peuvent être enregistrées dans des fichiers de scène et également copiées sur différents objets.
Le script "rc.tcl"
(pour revert cursor) peut être utilisé pour obtenir un comportement plus utile de la touche curseur dans les vues de modélisation primaires (vues parallèles).
Après l'exécution du script, les raccourcis clavier pour la rotation et le panoramique dans des vues parallèles sont permutés, par exemple, il suffit d'appuyer sur la touche <Left>
pour effectuer un panoramique de la vue, au lieu de la faire tourner.
Les raccourcis seront à nouveau échangés, lorsque la vue changera de type pour devenir "Perspective"
.
Le script "zap.tcl"
montre comment une fonctionnalité de base arbitraire, qui n'est disponible que par une entrée du menu principal ou l'interface de script, peut être facilement accessible via la fenêtre de la boîte à outils.
Après l'exécution du script "zap.tcl"
, il y aura un nouveau bouton de la boîte à outils, appelé "Zap !"
, qui lance simplement la commande zap (qui iconifie l'application complète).
Le script "kdialog.tcl"
permet à tous les dialogues de fichiers de Ayam d'utiliser l'application kdialog du projet KDE au lieu du dialogue de fichiers Tk natif.
Le script ajoute également une entrée personnalisée dans le menu principal pour annuler tout changement.
Le script "zdialog.tcl"
bascule tous les dialogues de fichiers de Ayam pour utiliser l'application zenity du projet Gnome au lieu du dialogue de fichiers Tk natif.
Le script ajoute également une entrée personnalisée dans le menu principal pour annuler tout changement.
Le script "intfd.tcl"
fait passer tous les dialogues de fichiers de Ayam à la version interne de Tcl/Tk au lieu des dialogues de fichiers natifs fournis par le système d'exploitation.
Le script "useaqsisapp.tcl"
configure Ayam pour utiliser Aqsis à partir de la structure du répertoire des applications ("/Applications/Aqsis.app"
) sur Mac OS X.
C'est l'emplacement d'installation par défaut d'Aqsis sur Mac OS X.
Le script adapte les chemins de recherche des exécutables et des ombres. De plus, les variables d'environnement vitales pour le fonctionnement d'Aqsis seront correctement configurées.
Notez que le script ne change pas les préférences "RIB-Export/Renderer"
, vous devez toujours passer à Aqsis en utilisant le menu principal "Special/Select Renderer"
une fois.
Le script "usepixie.tcl"
configure Ayam pour utiliser Pixie depuis le répertoire "/Library/pixie"
sous Mac OS X. C'est l'emplacement d'installation par défaut de Pixie sur Mac OS X.
Le script adapte les chemins de recherche de l'exécutable, de la bibliothèque partagée et des ombres. De plus, les variables d'environnement vitales pour le fonctionnement de Pixie seront correctement configurées.
Notez que le script ne modifie pas les préférences "RIB-Export/Renderer"
, vous devez toujours passer à Pixie en utilisant le menu principal "Special/Select Renderer"
une fois.
Le script "myicons.tcl"
permet de remplacer les icones de l'interface utilisateur Ayam, par exemple les icones de la boîte à outils, par des icones définies par l'utilisateur.
Les nouveaux icones doivent être des fichiers images GIF de taille 25 par 25 et résider dans le répertoire "icons"
relatif à l'exécutable Ayam.
Les noms des fichiers d'images peuvent être obtenus à partir du script ou par la commande suivante de l'interface de script (dans la console Ayam) :
» image names
Des variants d'icones d'action (par exemple pour l'échelle relative aux actions) peuvent également être créés automatiquement en modifiant la variable "createVariants"
dans le fichier de script.
Le script "dtree.tcl"
(arbre dynamique/rapide) remplace une partie du code de l'arbre BWidgets pour une interaction plus rapide dans les scènes avec de nombreux objets.
Le widget d'arbre BWidget original (et le code de script qui l'accompagne en Ayam) crée un élément de canevas pour chaque objet de la scène, même s'il n'est pas visible dans le widget d'arbre.
Par conséquent, les opérations de mise à jour de l'arbre qui ont lieu, par exemple, après le chargement d'une scène ou après des opérations de glisser-déposer, peuvent devenir très lentes, lorsqu'une scène comporte de nombreux objets.
Si le script d'arbre est actif, il n'y a qu'autant d'éléments de canevas qu'il y a de noeuds visibles dans la région de défilement actuelle.
Par conséquent, le travail avec de nombreux objets dans de longues listes devient beaucoup plus rapide pour les opérations qui nécessitent des mises à jour de l'arbre.
Cependant, les opérations telles que l'ouverture ou la fermeture de sous-arbres ou même le simple défilement dans l'arbre deviendront un peu plus lentes, car les éléments de canevas doivent être créés en continu.
Le script "cvview.tcl"
(control sommet view) permet de visualiser les points de contrôle des objets de surface ou de courbe NURBS comme propriété, voir aussi l'image ci-dessus.
Le script prend actuellement en charge les types d'objets suivants : NPatch, NCurve, IPatch, PatchMesh, ACurve, ICurve, BCurve, et SDCurve.
En outre, les objets qui fournissent des objets NPatch/NCurve et qui affichent une entrée NPInfo/NCInfo dans leur propriété de paramètre sont également pris en charge.[∗]
Si le script est chargé, il y a une nouvelle entrée dans le menu "Custom"
qui permet d'ajouter une nouvelle propriété à une surface individuelle ou à un objet "Curve".
La propriété "CVView"
affiche tous les sommets de contrôle dans une grille régulière.
Les coordonnées de chaque sommet seront affichées lorsque le pointeur de la souris le survole.
Cela fonctionne également si les points de contrôle se regroupent dans l'espace 3D ou ont des valeurs inhabituelles.
En outre, la sélection actuelle des points est visualisée en peignant les sommets sélectionnés en rouge et la sélection peut également être ajustée en cliquant sur les cercles.
Il est également possible de faire glisser la sélection.[∗]
Le script "curvature.tcl"
permet de visualiser la courbure des courbes NURBS et la courbe NURBS fournissant des objets comme propriété, voir aussi l'image ci-dessus.
Si le script est chargé, il y a une nouvelle entrée dans le menu "Custom"
qui permet d'ajouter une nouvelle propriété à un objet de courbe individuel.
La nouvelle propriété affiche la courbure de la courbe sous la forme d'un diagramme interactif et en temps réel.
Le diagramme sera mis à jour si la courbe change.
Le diagramme peut être zoomé en le faisant glisser avec le bouton le plus à gauche de la souris et déplacé en le faisant glisser avec le bouton le plus à droite de la souris (en état zoomé).
Le zoom est également possible à l'aide de la molette de la souris.
L'état zoomé est transmis par l'ajout de "..." à l'étiquette correspondante de l'échelle horizontale.
Notez que lors d'un panoramique, la nouvelle section de la courbe sera redimensionnée pour remplir complètement l'axe Y.
Pour les objets de la courbe NURBS, la plage de valeurs réelles des noeuds sera affichée sur l'axe des x, tandis que pour les objets de la courbe NURBS fournissant des objets, une plage de valeurs relatives des noeuds ([0, 1]) sera affichée.
Un clic sur l'étiquette "k"
permet de basculer entre l'échelle absolue et l'échelle logarithmique de l'axe Y.
Il y a une poignée de redimensionnement qui permet d'adapter la taille du diagramme au canevas des propriétés.
Le script "x3dom-nurbs"
implémente les noeuds <NurbsPatchSurface>
et <NurbsTrimmedSurface>
X3D NURBS pour x3dom (voir http://www.x3dom.org/
) en JavaScript.
Après le chargement de la scène dans le navigateur web, les surfaces NURBS de ces noeuds sont tesselées en noeuds <IndexedTriangleSet>
.
Cela permet de publier directement les modèles NURBS sur le web sans conversion préalable en une représentation polygonale, ce qui est lourd, rigide et entraîne une consommation de bande passante plus importante.
Le tessellateur est basé sur une idée et un exemple de code provenant de A. J. Chung et A. J. Field: "A Simple Recursive Tessellator for Adaptive Surface Triangulation" in Journal of Graphics Tools Vol. 5, Iss. 3, 2000.
La mise en oeuvre s'étend sur quatre fichiers de script :
x3dom-nurbs-nodes.js
– interface du tesselateur vers x3domx3dom-nurbs-pool.js
– gestion des travailleurs (la taille actuelle du pool est de 3)x3dom-nurbs-worker.js
– un travailleurx3dom-nurbs-tess.js
– le tessellateur"x3dom.js"
:
<script type="text/javascript" src="x3dom-nurbs-pool.js"/>
<script type="text/javascript" src="x3dom-nurbs-nodes.js"/>
Le tesselateur étant entièrement automatique, aucun autre réglage n'est nécessaire.
Des fichiers XHTML appropriés peuvent être créés en utilisant l'exportation X3D en mode x3dom, voir la section
Options d'exportation X3D.
Alors que le tessellateur fonctionne en arrière-plan, une représentation polygonale initiale qui est directement dérivée du polygone de contrôle de la surface NURBS est affichée.
De plus, une invite d'occupation est affichée, voir aussi l'image ci-dessous.
Comme l'invite d'occupation est dérivée de l'invite de chargement de x3dom, elle peut également être stylisée avec le "x3dom-progress"
style dans "x3dom.css"
.
"x3dom-nurbs-pool.js"
(par exemple si votre CPU cible moyenne a plus de coeurs).
Notez que chaque webworker pavera une seule surface NURBS, c'est-à-dire que les scènes avec une seule surface ne bénéficieront pas du parallélisme.
Par défaut, le tessellateur tente de créer un pavage qui représente toutes les caractéristiques importantes de la surface de manière à ce qu'une inspection visuelle de moyenne à proche distance ne révèle pas la nature de la représentation triangulaire sous-jacente.
Cela peut être trop fin/lent pour des objets qui ne sont jamais vus de près ou trop grossier pour des objets très détaillés.
Par conséquent, et en accord avec les suggestions respectives de la spécification X3D, la qualité et la vitesse du pavement peuvent être ajustées à l'aide des attributs "uTessellation"
et "vTessellation"
des noeuds <NurbsPatchSurface>
ou <NurbsTrimmedSurface>
comme expliqué dans les sections suivantes.
Si aucun attribut "uTessellation"
n'est spécifié, ou si sa valeur est positive, le tessellateur utilise le mode dit object space sampling.
Dans ce mode, le tessellateur subdivise un ensemble initial de triangles de manière récursive jusqu'à ce que tous les bords de ces triangles soient plus courts qu'une valeur seuil donnée (dans l'espace objet).
La valeur seuil est réglée automatiquement de manière à ce qu'un objet s'étendant d'une unité par une unité dans l'espace objet soit subdivisé à environ 15 par 15 par deux triangles.
La valeur de l'attribut "uTessellation"
est simplement multipliée dans ce seuil déterminé automatiquement.
Par conséquent, les valeurs de "uTessellation"
supérieures à 1.0 conduisent à une chaussée plus grossière et plus rapide, tandis que les valeurs inférieures à 1.0 conduisent à une chaussée plus fine et plus lente.
Notez que dans ce mode, la valeur de l'attribut "vTessellation"
n'est pas considérée du tout.
Notez également que dans les régions fortement courbées de la surface et aux bords de coupe, des triangles encore plus petits que ceux déterminés par le critère de longueur de bord peuvent être créés.
Si la valeur de l'attribut "uTessellation"
est négative, le tessellateur passe à un échantillonnage spatial paramétrique.
Dans ce mode, l'attribut "vTessellation"
est également pris en compte.
Comme dans le mode d'échantillonnage de l'espace objet, une valeur seuil automatique est calculée, mais ici, l'extension de l'objet dans l'espace paramétrique (c'est-à-dire le nombre de points de contrôle) est utilisée.
Cela donne en fait deux valeurs seuils, une pour chaque dimension paramétrique.
Les attributs "uTessellation"
et "vTessellation"
sont multipliés dans ces seuils.
Par conséquent, les valeurs supérieures à -1.0 (en valeur absolue) conduisent à un pavement plus grossier et plus rapide dans la dimension respective.
Les valeurs inférieures à -1.0 (en valeur absolue) conduisent à un pavement fin et plus lent dans la dimension respective.
Cela signifie qu'une valeur de -2.0 entraîne environ la moitié du nombre de triangles par rapport à la valeur par défaut et qu'une valeur de -0.5 entraîne deux fois plus de triangles par rapport à la valeur par défaut dans la dimension paramétrique respective.
Comme le calcul de la longueur des bords est plus simple et qu'aucune analyse de courbure n'est effectuée, l'échantillonnage paramétrique de l'espace est considérablement plus rapide que l'échantillonnage de l'espace de l'objet.
Notez qu'aux bords de la courbe de coupe, des triangles encore plus petits que ceux déterminés par le critère de longueur de bord peuvent être créés.
Pour faciliter le paramétrage des attributs "uTessellation"
et "vTessellation"
, un attribut "normalPerSommet"
peut être ajouté au noeud respectif <NurbsPatchSurface>
ou <NurbsTrimmedSurface>
.
Cet attribut sera alors également défini pour le noeud <IndexedTriangleSet>
correspondant qui est créé par le tessellateur.
Si la valeur de cet attribut est "false"
, x3dom affichera cette surface dans un style ombré plat et les triangles de tesselé seront visibles, ce qui permettra de juger et d'ajuster plus facilement la qualité de la tessellation.
En raison de la mémorisation des points de surface, les valeurs paramétriques ne doivent pas dépasser :
Les coordonnées de la texture sont toujours directement dérivées des valeurs paramétriques. Les normales de surface ne sont pas calculées par le tessellateur, mais par x3dom. Cela peut conduire à des normales qui sont fausses pour des pavements très grossiers mais qui sont beaucoup plus rapides. Un autre avantage de cette approche est que les normales en des points de surface non différentiables (par exemple les pôles de la sphère standard NURBS) ne s'inversent pas. Il n'y a pas de prise en charge pour les noeuds suivants :
<NurbsTextureCoordinate>
,<NurbsSet>
,<NurbsSweptSurface>
,<NurbsSwungSurface>
,<NurbsCurve>
, and all<Nurbs*Interpolator>
nodes.Ces scripts mettent en oeuvre des objets Script, Voir aussi la section L'objet Script.
Le fichier "tcone.tcl"
est un script objet Script qui crée des cônes tronqués avec des arguments similaires à la primitive cylindre, voir aussi l'image ci-dessus.
Ce script doit être utilisé dans un objet Script de type "Create"
(voir section
L'objet Script).
Pour plus de commodité, il existe également une interface graphique de propriété ; il faut ajouter une balise "NP"
de valeur "TConeAttr"
à l'objet Script pour la voir.
Les paramètres du cône tronqué sont :
"Closed"
permet de déterminer si l'objet doit être automatiquement scellé (fermé par des surfaces bouchon)."ThetaMax"
est l'angle de balayage du cône en degrés, la valeur par défaut est 360."ZMin"
est la base du cône, la valeur par défaut est 0."ZMax"
est le sommet du cône, la valeur par défaut est 1."RMin"
est le rayon du cône à la base, la valeur par défaut est 1."RMax"
est le rayon du cône au sommet, la valeur par défaut est 0.5.
En interne, le script crée un Hyperboloid ; de plus amples informations sur les capacités de conversion et l'exportation RIB se trouvent dans la section
L'objet hyperboloïde (Hyperboloid)."ayam/scn/scripts/tcone.ay"
.
Le fichier "cbox.tcl"
est un script objet Script qui crée une surface NURBS sous la forme d'une boîte à topologie cylindrique, voir aussi l'image ci-dessus.
Ce script doit être utilisé dans un objet Script de type "Create"
(voir section
L'objet Script).
Pour plus de commodité, il existe également une interface graphique de propriété ; il faut ajouter une balise "NP"
de valeur "CBoxAttr"
à l'objet Script pour la voir.
Les paramètres de la boîte cylindrique sont :
"Width"
extension de la boîte le long de l'axe des X, la valeur par défaut est 1.0."Depth"
extension de la boîte le long de l'axe des Z, la valeur par défaut est 1.0."Height"
extension de la boîte le long de l'axe des Y, la valeur par défaut est 1.0."ayam/scn/scripts/cbox.ay"
.
Le fichier "tcircle.tcl"
est un script objet qui crée des cercles NURBS avec une base triangulaire, voir aussi l'image ci-dessus.
Contrairement au cercle NURBS standard de neuf points à base rectangulaire, le cercle triangulaire ne comporte que sept points de contrôle. Cela permet d'économiser de la mémoire, par exemple dans le cas d'objets à balayage long. Cependant, le paramétrage du cercle triangulaire est également légèrement moins bon. En outre, seuls les cercles complets qui commencent sur l'axe X positif sont pris en charge.
Ce script doit être utilisé dans un objet Script de type "Create"
(voir section
L'objet Script).
Pour plus de commodité, il existe également une interface graphique de propriété ; il faut ajouter une balise "NP"
de valeur "TCircleAttr"
à l'objet Script pour la voir.
Le paramètre du cercle triangulaire est :
"Radius"
rayon du cercle, la valeur par défaut est 1.0."ayam/scn/scripts/tcircle.ay"
.
Le script "helix.tcl"
crée une courbe NURBS qui forme une hélicoïde, voir aussi l'image ci-dessus.
Ce script doit être utilisé dans un objet Script de type "Create"
(voir section
L'objet Script).
Une interface graphique de propriété est également fournie ; il faut ajouter une balise "NP"
de valeur "HelixAttr"
à l'objet Script pour la voir.
Les paramètres de l'hélicoïde sont :
"Length"
est le nombre de points de contrôle dans la courbe, la valeur par défaut est 30."Radius"
est le rayon de l'hélicoïde, la valeur par défaut est 2.0."Angle"
est l'angle de décalage d'un point à l'autre, la valeur par défaut est 45.0."DZ"
est le décalage le long de z d'un point à l'autre, la valeur par défaut est 0.25."ayam/scn/scripts/helix.ay"
.
Le script "spiral.tcl"
crée une courbe NURBS qui forme une spirale, voir aussi l'image ci-dessus.
Ce script doit être utilisé dans un objet Script de type "Create"
(voir section
L'objet Script).
Une interface graphique de propriété est également fournie ; il faut ajouter une balise "NP"
de valeur "SpiralAttr"
à l'objet Script pour le voir.
Les paramètres de la spirale sont :
"Length"
est le nombre de points de contrôle dans la courbe, la valeur par défaut est 30."Angle"
est l'angle de décalage d'un point à l'autre, la valeur par défaut est 45.0."RMin"
est la valeur du rayon de départ, la valeur par défaut est 0.1."RDiff"
est la différence de rayon d'un point à l'autre, la valeur par défaut est 0.1."ayam/scn/scripts/spiral.ay"
.
Le fichier "dualsweep.tcl"
est un script objet Script qui crée une surface NURBS à partir de trois courbes paramètres similaires au birailing mais avec des courbes de section transversale perpendiculaires aux deux rails, voir aussi l'image ci-dessus.
La première courbe est dite section transversale (cross section).
Cette courbe doit être plane et définie dans le plan YZ.
C'est la courbe ouverte la plus à gauche dans l'image de l'exemple ci-dessus.
La deuxième courbe est la première courbe rail.
Cette courbe doit commencer au point de départ de la courbe de la section transversale.
C'est la courbe fermée inférieure dans l'image de l'exemple ci-dessus.
La troisième courbe de paramètres est la deuxième courbe rail.
Cette courbe doit commencer au point final de la courbe de la section transversale.
C'est la courbe fermée supérieure dans l'image de l'exemple ci-dessus.
Ce script doit être utilisé dans un objet Script de type "Modify"
(voir section
L'objet Script).
Pour plus de commodité, il existe également une interface graphique de propriété ; il faut ajouter une balise "NP"
de valeur "DualSweepAttr"
à l'objet Script pour le voir.
Les paramètres du double balayage sont :
"Type"
similaire à la propriété correspondante de l'objet Sweep, cela permet de définir le type de la surface résultante (ouverte, fermée ou périodique)."Sections"
nombre de sections à utiliser, fonctionne également de la même manière que pour l'objet Sweep (voir aussi
Propriété SweepAttr).
La valeur par défaut est 0, c'est-à-dire que le nombre de sections est déterminé à partir des dimensions des courbes de paramètres."ayam/scn/scripts/dualsweep.ay"
.
Le script "tsurf.tcl"
crée une surface par translation à partir de deux courbes de paramètres, voir aussi l'image ci-dessus.
Les points de contrôle de la surface par translation sont créés en copiant les points de contrôle de la première courbe n fois, où n est le nombre de points de contrôle de la seconde courbe, tout en décalant également les points en fonction du décalage du point de contrôle nth au premier point de contrôle de la seconde courbe.
Les courbes n'ont pas besoin de se toucher en un point quelconque, mais si elles commencent au même point, la surface par translation interpolera les deux courbes.
Les courbes de paramètres rationnelles ne sont actuellement pas prises en charge.
Ce script doit être utilisé dans un objet Script de type "Modify"
(voir section
L'objet Script).
Comme la surface est entièrement définie par les courbes de paramètres, il n'y a pas de paramètres supplémentaires et, par conséquent, il n'y a pas non plus d'interface graphique de propriétés.
Un exemple de fichier de scène contenant un tel objet est distribué avec Ayam, voir le fichier :
"ayam/scn/scripts/tsurf.ay"
.
Le script "extruden.tcl"
extrude une courbe NURBS le long de sa normale, voir aussi l'image ci-dessus.
Si l'objet courbe a une balise MN, celle-ci aura la priorité sur le calcul normal via "getPlaneNormal"
.
Cela est plus rapide et permet également de créer des extrusions cisaillées.[∗]
En interne, le script crée une peau à partir de deux courbes, donc des courbes arbitrairement orientées et non planes sont prises en charge.
Ce script doit être utilisé dans un objet Script de type "Modify"
(voir section
L'objet Script).
Pour plus de commodité, il existe également une interface graphique de propriété ; il faut ajouter une balise "NP"
de valeur "ExtrudeNAttr"
à l'objet Script pour le voir.
Le paramètre de l'extrusion est :
"Height"
est le déplacement de la deuxième courbe le long de la normale, la valeur par défaut est 1.0."ayam/scn/scripts/extruden.ay"
.
"jtD"
Depuis Ayam 1.18, il existe un script d'exemple complet pour l'interface de script JavaScript distribué sous la forme "polyhedron.js"
qui crée des polyèdres à partir de notations Conway.
Le script est basé sur le générateur "VRML Polyhedron" en ligne de George W. Hart:
http://www.georgehart.com/virtual-polyhedra/conway_notation.html
Ce script doit être utilisé dans un objet Script de type "Create"
(voir section
L'objet Script).
Pour plus de commodité, il existe également une interface graphique de propriété ; pour rendre cette interface visible, une balise "NP"
de valeur "PolyhedronAttr"
doit être ajoutée à l'objet Script.
La notation Conway définit un ensemble d'opérations exécutées consécutivement sur une graine / forme de base. Le script supporte actuellement les graines et opérations suivantes (informations tirées des pages web de George W. Harts, voir ci-dessus).
Seeds:
Les solides de Platon sont désignés par les lettres T, O, C, I et D, selon leur première lettre.
Les autres polyèdres qui sont mis en oeuvre ici comprennent les prismes : Pn, antiprismes : An, et les pyramides : Yn, où n est un nombre (3 ou plus) qui doit être spécifié pour indiquer la taille de la base, par exemple, Y3=T, P4=C, et A3=O.
Operations:
Actuellement, d, t, k, a, j, s, g, e, b, o, m, r et p sont définis.
Ils sont alimentés par les opérations nécessaires pour créer les solides d'Archimède et leurs équivalents à partir des solides de Platon.
Les tableaux suivants expliquent les opérations plus en détail :
Letter | Name | Description |
d | dual | Le double d'un polyèdre a un sommet pour chaque face, et une face pour chaque sommet, du polyèdre original, par exemple dC=O. |
t / t n | truncate all / just n-fold vertices | La troncature d'un polyèdre coupe chaque sommet, produisant une nouvelle face n fois orientée pour chaque sommet n fois dupliqué. (????) |
k / k n | kis all / just n-sided faces | L'opération kis divise chaque face n fois orientée en n triangles. Un nouveau sommet est ajouté au centre de chaque face. |
a | ambo | On peut considérer que l'opération "Ambo" se limite aux points médians de la bordure. Elle produit un polyèdre, aX, avec un sommet pour chaque bord de X. |
j | join | L'opérateur "join" est dual de "ambo", donc jX=dadX=daX.jX est comme kX sans les bords originaux de X. |
e | expand | Chaque face de X est séparée de toutes ses voisines et reconnectée avec une nouvelle face à 4 côtés, correspondant à un bord de X.Un n-polygone (????) est ensuite ajouté pour relier les faces quadrilatérales à chaque sommet n-fold. |
s | snub | L'opération de "snub" peut être considérée comme une opération "eC" suivie d'une opération de découpage de chacune des nouvelles faces quadruples le long d'une diagonale en deux triangles.Grâce à la maniabilité de ces coupes, tous les sommets de "sX" sont quintuplés. |
g | gyro | L'opération duale à s est g.g est comme k mais avec les nouvelles arêtes reliant les centres des faces aux points 1/3 des arêtes plutôt qu'aux sommets. |
b | bevel | L'opération de biseau peut être définie par bX=taX. |
o | ortho | Dual à e, oX=deX=jjX.oX a pour effet de placer de nouveaux sommets au milieu de chaque face de X et de les relier, avec de nouvelles arêtes, aux points médians des arêtes de X. |
m | meta | Dual à b, m est comme k et o combinés ; de nouvelles arêtes relient les nouveaux sommets au centre des faces aux anciens sommets et les nouveaux sommets aux points médians des arêtes. |
Letter | Name | Description |
r | reflect | Transforme un solide de gauche en solide de droite, ou inversement, mais n'a aucun effet sur un solide réflexif.Donc rC=C, mais comparez sC et rsC. |
p | propellor | Fait de chaque face de n-polygone une "hélice" de n-polygone entourée de n quadrilatères, par exemple, pT est l'icosaèdre tétraédrique stellé.Essayez pkD et pt6kT.p est une opération auto-duale, c'est-à-dire dpdX=pX et dpX=pdX, et p fait également la navette avec a et j, c'est-à-dire paX=apX. |
Cette section contient la documentation de l'interface de script JavaScript qui est disponible après le chargement du plugin "jsinterp"
.
L'interface de script JavaScript existe depuis Ayam 1.18 et est basée sur le moteur JavaScript de Mozilla SpiderMonkey.
Au chargement, le plugin "jsinterp"
crée un contexte JavaScript qui existe (avec toutes les variables et objets qui y sont définis) jusqu'à la sortie de Ayam.
La fonctionnalité JavaScript est accessible depuis l'interface de script Tcl via la commande "jsEval"
.
La commande peut être utilisée soit pour exécuter directement le code JavaScript fourni via l'argument de commandes (code Tcl en gras) :
» jsEval {var a = 0; a = a + 5.5; tclset("a", a);}
ou pour exécuter du code JavaScript à partir d'un fichier :
» jsEval -f scriptfile.js
Notez que cette commande n'est pas disponible dans l'interpréteur sécurisé.
En outre, les objets script peuvent également être implémentés en JavaScript, à condition que la première ligne du script soit un commentaire qui indique à Ayam d'utiliser l'interpréteur JavaScript :
/* Ayam, use: JavaScript */
var a = 0;
...
Notez que le contexte de script JavaScript hérite des limitations du contexte Tcl appelant.
Par exemple, lors de l'exécution d'un objet Script, le code suivant échoue :
tcleval("exit");
parce que la commande Tcl "exit"
n'est pas disponible dans l'interpréteur sécurisé. La commande n'échouera pas, lorsque le contexte d'appel est l'interpréteur Tcl principal ; on peut par exemple taper dans la console Ayam :
» jsEval {tcleval("exit");}
and Ayam quits (Voir aussi la section:
Interpréteur sécurisé).
Cette sous-section renseigne sur les fonctions globales supplémentaires disponibles dans l'interpréteur JavaScript Ayam.
Il s'agit de commandes Tcl converties (par exemple : "crtOb()"
), "tcleval()"
, "tclvar()"
, et "tclset()"
.
Commandes converties :
La fonctionnalité de Ayam est accessible à partir de JavaScript via un ensemble plus large de fonctions globales, appelées commandes Tcl correspondantes.
Par exemple, les objets Ayam peuvent être créés en JavaScript en utilisant un appel de fonction comme celui-ci :
crtOb("NCircle");
or, with additional arguments:
crtOb("NCircle", "-radius", 3.0);
En général, toutes les commandes disponibles dans l'interpréteur Ayam Tcl sécurisé sont également disponibles comme fonction (voir la section
Procédures and Commandes pour une liste plus ou moins complète de ces commandes).
Notez que les procédures Tcl ne sont généralement pas disponibles en tant que fonction JavaScript globale, mais elles peuvent être appelées en utilisant "tcleval()"
comme indiqué dans le paragraphe suivant.
tcleval():
Cette fonction JavaScript globale permet d'évaluer des scripts Tcl quelconques, fournis en argument sous forme de chaîne :
var a = 42;
a = tcleval("puts " + a + "; return 5;");
tcleval("puts " + a);
/* résultat attendu : 42 5 */
La fonction "tcleval()"
donne accès à toutes les fonctionnalités de Ayam qui sont juste disponibles en tant que procédure Tcl.
Notez que les valeurs de retour sont correctement retransférées en JavaScript selon les règles de conversion des données comme documenté ci-dessous.
Toutefois, en raison d'une conversion intermédiaire en données de chaîne, le surcoût d'un tel appel est considérable et le transport de données en masse doit être organisé par d'autres moyens, voir ci-dessous.
tclvar():
En utilisant la fonction JavaScript "tclvar()"
un lien entre une variable Tcl et une variable correspondante dans le contexte JavaScript peut être établi.
La fonction "tclvar()"
crée essentiellement une trace d'écriture sur la variable Tcl, de sorte que les modifications du côté Tcl sont toujours automatiquement répercutées du côté JavaScript :
tclvar("a");
tcleval("set a 42");
tcleval("puts " + a);
/* résultat attendu : 42 */
Notez que la variable correspondante du côté JavaScript n' existe pas tant que la première opération d'écriture sur la variable Tcl se produise.
La variable Tcl, à son tour, n'a pas besoin d'exister, lorsque la fonction "tclvar()"
est appelée (c'est-à-dire que tout le travail est fait dans le rappel de trace).
Si le nom de la variable contient un spécificateur d'espace de noms, cet espace de noms doit exister, lorsque la fonction "tclvar()"
est appelée.
Bien qu'il semble parfaitement adapté, "tclvar()"
ne peut pas être utilisé pour gérer un tableau de données de propriétés (si le tableau contient des composants à enregistrer dans des fichiers de scènes Ayam).
En effet, à la lecture d'un fichier de scène contenant de tels éléments de tableau enregistrés, les éléments seront lus (et placés dans le contexte Tcl) avant que le script ne puisse établir la trace d'écriture à l'aide de "tclvar()"
et les données du fichier de scène n'arriveront jamais dans le contexte JavaScript.
Il n'y a pas de moyen facile de contourner ce problème.
Une suggestion pour gérer un tableau de données de propriété est présentée dans la section d'exemples complets ci-dessous.
tclset():
La troisième fonction JavaScript globale est "tclset()"
qui permet de définir efficacement les variables Tcl à partir du contexte JavaScript en évitant la conversion en données chaîne et inversement.
Par exemple :
var a = 3.3;
var b = new Array(1, 3, 5);
tclset("a", a);
tclset("b", b);
fixe la variable Tcl "a"
à la valeur en virgule flottante 3.3, et "b"
à une liste de valeurs entières { 1 3 5 }
.
tclset("SphereAttrData(Radius)", 1.2);
définit l'élément Radius
dans le tableau SphereAttrData
; ou contient des spécificateurs d'espace de noms, par exemple
tclset("::MyNameSpace::Radius", 1.2);
définit la variable Radius
dans l'espace de noms MyNameSpace
.
Lorsque les données sont transférées du côté Tcl vers le côté JavaScript (par exemple lors de la conversion des valeurs de retour de "tcleval()"
ou des valeurs de variables liées via "tclvar()"
),
les conversions suivantes sont en vigueur : Les types de données scalaires seront convertis en leurs équivalents directement correspondants, à l'exception des booléens, qui seront convertis en valeurs entières.
Les listes seront converties en objets Array (l'imbrication est autorisée et produira des tableaux imbriqués en conséquence).
Les tableaux associatifs seront convertis en objets ayant des propriétés nommées.
Les chaînes Unicode ne sont actuellement pas prises en charge.
Voir également le tableau ci-dessous.
Tcl | JavaScript |
Boolean (true, false) | Integer (1, 0) |
Integer (2) | Integer (2) |
Double (3.14) | Double (3.14) |
String ("mystr") | String ("mystr") |
List ({0 1 2}) | Array ((0, 1, 2)) |
Array (mya(mye) = 0.1) | Object (mya.mye = 0.1) |
JavaScript | Tcl |
Integer (2) | Integer (2) |
Double (3.14) | Double (3.14) |
String ("mystr") | String ("mystr") |
Array ((0, 1, 2)) | List ({0 1 2}) |
Le transport/la conversion des propriétés des objets (en éléments de tableaux associatifs, par exemple) peut être organisé manuellement de cette manière :
var a = new Object();
a.b = 3.14;
tclset("a(b)", a.b);
Cette section contient deux exemples complets d'objets Script écrits en JavaScript.
Pour le premier exemple, utilisez le type d'objet Script "Modify"
et mettez une sphère comme objet enfant de l'objet Script.
/* Ayam, use: JavaScript */ tclvar("SphereAttrData"); getProp(); if(SphereAttrData) { tclset("SphereAttrData(ZMin)", -SphereAttrData.Radius); tclset("SphereAttrData(ZMax)", SphereAttrData.Radius); setProp(); }
"SphereAttrData"
, de sorte que lorsque "getProp()"
(une commande Tcl Ayam convertie) est appelé, l'objet JavaScript "SphereAttrData"
est également rempli de données significatives.if
) est une mesure de sécurité qui empêche l'échec du script si l'objet enfant de l'objet Script n'est pas un objet Sphere."tclset()"
."setProp()"
.
L'exemple suivant montre comment gérer une interface graphique de propriété dans un script objet Script implémenté en JavaScript.
Utilisez le type d'objet Script "Create"
et ajoutez une balise "NP MyProp"
pour voir l'interface graphique de la propriété.
/* Ayam, use: JavaScript, save array: MyPropData */ var MyPropData = new Object(); if(!tcleval("info exists MyPropData;")) { /* initial script run (but not when loaded from scene file!) */ MyPropData.MyItem = tcleval("set MyPropData(MyItem) 1.0;"); tcleval("set MyPropData(SP) {MyItem};"); } else { /* all following script runs (and also when loaded from scene file!) */ MyPropData.MyItem = tcleval("set MyPropData(MyItem);"); } if(!tcleval("info exists MyPropGUI;")) { tcleval("set ::phw [addPropertyGUI MyProp \"\" \"\"];"); tcleval("addParam $::phw MyPropData MyItem;"); } crtOb("Sphere"); sL(); getProp(); tclset("SphereAttrData(Radius)", MyPropData.MyItem); tclset("SphereAttrData(ZMin)", -MyPropData.MyItem); tclset("SphereAttrData(ZMax)", MyPropData.MyItem); setProp();
"MyPropData"
.
Les données de propriété peuvent être enregistrées et lues dans les fichiers de scène Ayam à l'aide d'une variable de tableau miroir du côté Tcl (également appelée "MyPropData"
).
Pour que cela fonctionne correctement, l'initialisation de l'objet JavaScript doit être limitée à la première exécution du script : lorsque les données de propriété ont été lues à partir d'un fichier de scène, l'initialisation ne doit pas être exécutée, mais les données lues doivent être récupérées dans le contexte Tcl.
C'est l'objet de la première instruction "if"
, qui vérifie l'existence de la variable miroir du tableau Tcl, dans l'exemple ci-dessus.
En suivant ce schéma de duplication des structures de données du côté Tcl et JavaScript, on crée maintenant l'interface graphique de propriété, qui est également limitée à un seul script exécuté par une instruction "if"
similaire.
Après l'interface graphique, un objet Sphère est créé et paramétré en fonction des données de l'interface graphique de propriété, qui est utilisée comme rayon, zmin et valeur zmax.
Cette section contient la documentation de l'interface de scripting Lua qui est disponible après le chargement du plugin "luainterp"
.[∗]
Au chargement, le plugin "luainterp"
crée un contexte Lua qui existe (avec toutes les variables et objets qui y sont définis) jusqu'à la sortie de Ayam.
La fonctionnalité Lua est accessible depuis l'interface de script Tcl via la commande "luaEval"
.
La commande peut être utilisée soit pour exécuter directement le code Lua fourni via l'argument commands (code Tcl en gras) :
» luaEval {a = 0; a = a + 5.5; tclset("a", a);}
ou pour exécuter un code Lua à partir d'un fichier :
» luaEval -f scriptfile.lua
Notez que cette commande n'est pas disponible dans l'interprèteur sécurisé.
En outre, les scripts objets peuvent également être implémentés en Lua, à condition que la première ligne du script soit un commentaire qui indique à Ayam d'utiliser l'interpréteur Lua :
-- Ayam, use: Lua
a = 0
...
Notez que le contexte de script Lua hérite des limitations du contexte Tcl appelant.
Par exemple, lors de l'exécution d'un objet Script, le code suivant échoue :
tcleval("exit")
parce que la commande Tcl "exit"
n'est pas disponible dans l'interpréteur sécurisé.
La commande n'échouera pas, lorsque le contexte d'appel est l'interpréteur Tcl principal ; on peut par exemple taper dans la console Ayam :
» luaEval {tcleval("exit")}
and Ayam quits (Voir aussi la section:
Interpréteur sécurisé).
Cette sous-section informe sur les fonctions globales supplémentaires disponibles dans l'interprète Ayam Lua.
Il s'agit de commandes Tcl converties (par exemple : "crtOb()"
), "tcleval()"
, "tclvar()"
, et "tclset()"
.
Commandes converties :
La fonctionnalité de Ayam est accessible depuis Lua via un ensemble plus large de fonctions globales, appelées commandes Tcl correspondantes.
Par exemple, les objets Ayam peuvent être créés dans Lua en utilisant un appel de fonction comme celui-ci :
crtOb("NCircle")
or, with additional arguments:
crtOb("NCircle", "-radius", 3.0)
En général, toutes les commandes disponibles dans l'interpréteur sécurisé Ayam Tcl sont également disponibles sous forme de fonctions (voir la section
Procédures and Commandes pour une liste plus ou moins complète de ces commandes).
Notez que les procédures Tcl ne sont généralement pas disponibles en tant que fonction Lua globale, mais elles peuvent être appelées en utilisant "tcleval()"
comme indiqué dans le paragraphe suivant.
tcleval():
Cette fonction Lua permet d'évaluer des scripts Tcl quelconques, livrés sous forme de chaine comme argument :
a = 42
a = tcleval("puts " .. a .. "; return 5;")
tcleval("puts " .. a)
-- expected output: 42 5
La fonction "tcleval()"
donne accès à toutes les fonctionnalités de Ayam qui sont juste disponibles en tant que procédure Tcl.
Notez que les valeurs de retour sont correctement transférées à Lua selon les règles de conversion des données comme documenté ci-dessous.
Cependant, en raison d'une conversion intermédiaire en chaîne , le surcoût d'un tel appel est considérable et le transport de données en masse doit être organisé par d'autres moyens, voir ci-dessous.
tclvar():
La fonction Lua "tclvar()"
permet d'établir un lien entre une variable Tcl et une variable correspondante dans le contexte Lua.
La fonction "tclvar()"
crée une trace d'écriture sur la variable Tcl, de sorte que les changements du côté Tcl sont toujours automatiquement répercutés du côté Lua :
tclvar("a")
tcleval("set a 42")
tcleval("puts " .. a)
-- expected output: 42
Notez que la variable correspondante du côté Lua fait n'existe pas tant que la première opération d'écriture sur la variable Tcl ait lieu.
La variable Tcl, à son tour, n'a pas besoin d'exister, lorsque la fonction "tclvar()"
est appelée (c'est-à-dire que tout le travail est fait dans le rappel de trace).
Si le nom de la variable contient un spécificateur d'espace de noms, cet espace de noms doit exister, lorsque la fonction "tclvar()"
est appelée.
Bien qu'il semble parfaitement adapté, "tclvar()"
ne peut pas être utilisé pour gérer un tableau de données de propriétés (si le tableau contient des composants à enregistrer dans des fichiers de scènes Ayam).
En effet, à la lecture d'un fichier de scène contenant de tels éléments de tableau enregistrés, les éléments seront lus (et placés dans le contexte Tcl) avant que le script ne puisse établir la trace d'écriture à l'aide de "tclvar()"
et les données du fichier de scène n'arriveront jamais dans le contexte Lua.
Il n'y a pas de moyen facile de contourner ce problème. Une suggestion pour gérer un tableau de données de propriété est présentée dans la section d'exemples complets ci-dessous.
tclset():
La troisième fonction Lua globale est "tclset()"
qui permet de définir efficacement les variables Tcl à partir du contexte Lua en évitant la conversion en données chaîne et inversement.
Par exemple :
a = 3.3
b = {1, 3, 5}
tclset("a", a)
tclset("b", b)
fixe la variable Tcl "a"
à la valeur en virgule flottante 3.3, et "b"
à une liste de valeurs entières { 1 3 5 }
.
tclset("SphereAttrData(Radius)", 1.2)
définit l'élément Radius
dans le tableau SphereAttrData
; ou contient des spécificateurs d'espace de noms, par exemple
tclset("::MyNameSpace::Radius", 1.2)
définit la variable Radius
dans l'espace de noms MyNameSpace
.
Lorsque les données sont transférées du côté Tcl vers le côté Lua (par exemple, lors de la conversion des valeurs de retour de "tcleval()"
ou des valeurs de variables liées via "tclvar()"
), les conversions suivantes sont en vigueur :
Les types de données scalaires seront convertis en leurs équivalents directement correspondants.
Les listes seront converties en tableaux (l'imbrication est autorisée et produira des tableaux imbriqués en conséquence).
Les tableaux associatifs seront convertis en tableaux avec des clés correctement nommées.
Les chaînes Unicode ne sont actuellement pas prises en charge. Voir également le tableau ci-dessous.
Tcl | Lua |
Boolean (true, false) | Boolean (true, false) |
Integer (2) | Integer (2) |
Double (3.14) | Double (3.14) |
String ("mystr") | String ("mystr") |
List ({0 1 2}) | Array ({0, 1, 2}) |
Array (mya(mye) = 0.1) | Table (mya.mye = 0.1) |
Lua | Tcl |
Boolean (true, false) | Boolean (true, false) |
Integer (2) | Integer (2) |
Double (3.14) | Double (3.14) |
String ("mystr") | String ("mystr") |
Array ({0, 1, 2}) | List ({0 1 2}) |
Le transport/la conversion des entrées de tableau (en éléments de tableau associatif, par exemple) peut être organisé manuellement de cette manière :
a.b = 3.14
tclset("a(b)", a.b)
Cette section contient deux exemples complets d'objets Script écrits en Lua.
Pour le premier exemple, utilisez le type d'objet Script "Modify"
et mettez une sphère comme objet enfant de l'objet Script.
-- Ayam, use: Lua tclvar("SphereAttrData") getProp() if SphereAttrData then tclset("SphereAttrData(ZMin)", -SphereAttrData.Radius) tclset("SphereAttrData(ZMax)", SphereAttrData.Radius) setProp() end
"SphereAttrData"
, de sorte que lorsque "getProp()"
(une commande Tcl Ayam convertie) est appelé, l'objet Lua "SphereAttrData"
est également rempli de données significatives.if
) est une mesure de sécurité qui empêche l'échec du script si l'objet enfant de l'objet Script n'est pas un objet Sphere."tclset"
."setProp()"
.
L'exemple suivant montre comment gérer une interface graphique de propriété dans un script objet Script implémenté par Lua.
Utilisez le type d'objet Script "Create"
et ajoutez une balise "NP MyProp"
pour voir l'interface graphique des propriétés.
-- Ayam, use: Lua, save array: MyPropData if tcleval("info exists MyPropData;") == 0 then -- initial script run (but not when loaded from scene file!) MyPropData = {} MyPropData.MyItem = tcleval("set MyPropData(MyItem) 1.0;") tcleval("set MyPropData(SP) {MyItem};") else -- all following script runs (and also when loaded from scene file!) MyPropData = {} MyPropData.MyItem = tcleval("set MyPropData(MyItem);") end if tcleval("info exists MyPropGUI;") == 0 then -- create property GUI "MyProp" tcleval("set ::phw [addPropertyGUI MyProp \"\" \"\"];") tcleval("addParam $::phw MyPropData MyItem;") end crtOb("Sphere") sL() getProp() tclset("SphereAttrData(Radius)", MyPropData.MyItem) tclset("SphereAttrData(ZMin)", -MyPropData.MyItem) tclset("SphereAttrData(ZMax)", MyPropData.MyItem) setProp()
"MyPropData"
.
Les données de propriété peuvent être enregistrées et lues dans les fichiers de scène Ayam à l'aide d'une variable de tableau miroir du côté Tcl (également appelée "MyPropData"
).
Pour que cela fonctionne correctement, l'initialisation de l'objet Lua doit être limitée à la première exécution du script : lorsque les données de propriété ont été lues à partir d'un fichier de scène, l'initialisation ne doit pas être exécutée, mais les données lues doivent être récupérées dans le contexte Tcl.
C'est l'objet de la première instruction "if"
, qui vérifie l'existence de la variable miroir du tableau Tcl, dans l'exemple ci-dessus.
En suivant ce schéma de doubles structures de données en miroir des côtés Tcl et Lua, on crée maintenant l'interface graphique de propriété, qui est également limitée à un seul script exécuté par une instruction "if"
similaire.
Après l'interface graphique, un objet Sphère est créé et paramétré en fonction des données de l'interface graphique de propriété, qui est utilisée comme rayon, zmin et valeur zmax.