3D-Diablotine.com
Nous sommes actuellement le Sam 18 Nov 2017, 18:38




Publier un nouveau sujet Répondre au sujet  [ 45 messages ]  Aller à la page 1, 2, 3  Suivant
 DAZ Scripting 
Auteur Message
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 303
Localisation: Hauts de seine
Message DAZ Scripting
Faisant des recherches sur les scripts DAZ, j'ai pu constater qu'on ne trouvait pas beaucoup de sites qui en parlaient. Il y a bien sûr https://sites.google.com/site/mcasualsdazscripts/ (pensez à faire une donation si vous utilisez ses scripts) mais ceux-ci étant pour la majorité encryptés, ils ne peuvent donner une idée de ce qu'est la programmation d'un script. La documentation de DAZ est incomplète (on trouve beaucoup trop de todo dans l'explication des paramètres des objetss typiques de DAZ. Récemment, on trouve des cours en vidéo, par Winterbrose, sur DAZ,com. A l'heure où j'écris ces lignes, il existe 3 fichiers contenant des vidéos, à 35$ chaque, Ca me parait un peu cher pour des cours qui n'abordent dans ces 3 fichiers qu'aux bases du javascript que l'on trouve facilement gratuitement sur le net.

A supposer que ça intéresse quelqu'un, je vais donc aborder le scripting. Dans DAZ Studio, il existe un plugin (dans window/ Panes (Tabs)) qui s'appelle ScriptIDE. Lancez-le. Cliquez sur help qui vous redirigera vers la documentation de DAZ3D.com.

Dans Basics, cliquez sur DAZ Script Coding Standards . Vous trouverez dans ce paragraphe un certain nombre de renseignements sur la manière de programmer. Cela commence par un tableau reflétant les conventions pour nommer les variables.

Exemple: un booléen gagnerait à commencer par b. Supposons une variable pour détecter si on a cliqué sur un bouton, on aurait comme déclaration:

var bBouton1 = false;

var pour dire qu'on déclare une varaible, bBouton1 pour se rappeler que la variable concernera le Bouton1 précédé de b pour signifier qu'on a que 2 valeurs possibles (true ou false). Là, j'ai préattribué la valeur false (par le signe =), ce qui ne signifie pas qu'il soit obligatoire de fixer une valeur à un variable, mais c'est préférable car sinon elle peut contenir n'importe quoi. La ligne se termine par un ";". Toutes les lignes doivent se terminer par un ";" comme en C ou en C++. On est plus proche du C++ puisqu'il s'agit de programmation objet.

En cliquants sur Boolean vous pouvez constater que Boolean est plus compliqué qu'il n'y parait au départ. Un booléen peut contenir true ou false qui sont des constantes (donc dont la valeur ne varie pas) mais possède également des méthodes: toString() et valueOf()

La preuve, si vous copiez/coller les lignes ci-dessous dans l'éditeur de script (scriptIDE) (menu edit Paste from Clipboard)
var bBouton = false;
var sChaine = bBouton.toString();
print (sChaine);

et que vous cliquez sur le bouton execute, le script se déroule, affiche dans la partie du bas: false comme résultat. Explication de ces 3 premières lignes. On crée une variable boolénne à laquelle on attribue la valeur false. L'éditeur sait qu'il s'agit d'un booléen parce qu'on lui attribue une constante booléenne. On déclare ensuite une variable de type String en lui atribuant le contenu de la variable booléenne mais en appliquant la méthode de l'objet Boolean (on accède à la méthode d'un objet en ajoutant un point). Dernière ligne on affiche le résultat en passant en paramètre à la fonction print la variable sChaine qui est une String.
J'ai bien conscience que c'est un peu compliqué pour quelqu'un n'ayant aucune expérience de programmation. Si c'est le cas pour vous, je vous invite à faire une recherche sur internet pour apprendre la programmation en javascript pour en apprendre les bases. C'est soit ça gratuitement ou soit en dépensant 100$ chez DAZ.com.

_________________
mon blog sur iclone http://alinal.simplesite.com


Dernière édition par la_saucisse le Dim 22 Oct 2017, 12:14, édité 1 fois au total.

suppression d'un bloc de texte répété plusieurs fois



Ven 20 Oct 2017, 10:54
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 303
Localisation: Hauts de seine
Message Re: DAZ Scripting
Dans le répertoire DAZ Script Coding Standards on trouve également la manière de faire des boucles et de gérer des erreurs.
Sauf que le script tel quel contenait plusieurs erreurs
1/ la variable count (ligne 6) n'existe pas, la remplacer par la variable déclarée nCount
2/ catch (...) ça ne marche pas non plus, remplacer par catch (e)
3/ le print avec décalage sur une ligne ne marche pas parce qu'on insère un carriage return et que la fonction print ne l'accepte pas
J'ai mis la fonction sous forme de fonction anonyme pour qu'elle déroule le script

(function(){
var i, num = 10;
var nCount = 20, nRemainder = 0;
for( i = 0; i < num; i++ )
nCount--;
if( nCount > 0 ){
while( nCount > 0 ){
nRemainder++;
nCount--;
}
}
try {
while( nRemainder > 0 )
print( nRemainder-- );
}
catch(e){
print( "Unhandled exception!" );
}
print( "This is a very long string. Okay, it isn\'t that long, but its long enough that it must be continued on the next line." );
})();

Qu'est-ce qu'on peut déduire de ce script?

1/ qu'on peut déclarer plusieurs variables (de même type) à la suite: var i, num, éventuellement en leur affectant une valeur: var nCount=20, nRemainder=0. Il faut juste les séparer par des virgules
2/ Les boucles for sont de la même sorte que dans de nombreux langages: valeur de départ, condition de sortie de boucle, incrémentation d'une variable. On initialise i à et tant quei est inférieur à num, on déroule le contenu de la boucle et on incrémente i
Le contenu de la boucle est simple on décrémente nCount. Ncount-- est un raccourci qui correspond à nCount = nCount – 1, ++ est un raccourci qui incrémente de 1
3/if est un test de condition. Ici la condition est "si nCount est >0. Si la condition est remplie, les lignes entre accolades sont éxécutées. On notera que pour délimiter les boucles, les conditions, etc, on utilise des accolades (une fermante pour une ouverte) qui facilitent la lecture et qui délimitent le code à éxécuter.
4/while est équivalent à "tant que" donc tant que nCount est supérieur à 0, on exécute les instructions qui suivent entre accolades
5/try catch est un détecteur d'erreurs. On éxécute les instructions suceptibles de générer des erreurs dans le bloc (zone entre une accolade ouvrante et un fermante) et s'il y en a une ce sont les instructions contenues dans le bloc catch qui s'éxécutent. Le "e" que j'ai mis dans catch est un objet qui permet d'affiner (sous réserve sue l'on s'en serve) d'où vient l'erreur.

L'éditeur du scriptIDE de DAZ Studio indique des numéros de ligne. C'est utile quand à l'éxécution l'éditeur prévient à quelle ligne se situe une erreur. On voit aussi des petits triangles à certaines lignes. Si vous cliquez dessus vous faites disparaitre (ou apparaitre) le bloc qui commence à cette ligne. Ca permet de mieux lire le code et de voir si on a le même nombre d'accolades ouvrantes et fermantes. Evidemment, il faut éviter de mettre deux accolades ouvrantes ou fermantes sur la même ligne. Le scriptIDE est également pourvu d'un débugger qui permet de faire tourner son script pas à pas et de contrôler les valeurs de variables pour voir si tout se passe bien. On y reviendra sûrement.

J'ai donné des explications sommaires sur le code mais ça ne vous évitera pas un apprentissage plus sérieux du langage javascript.
Prenez l'habitude également de commenter votre code (on place des commentaire soit entre un couple /* et */ pour commenter sur plusieurs lignes, soit derrière // sur une seule ligne.
Si vous sauvegardez votre code, ne le sauvez pas qu'en encrypté, sinon vous ne pourrez plus le modifier.

A partir de là, on va commencer avec les classes de DAZ Studio

_________________
mon blog sur iclone http://alinal.simplesite.com


Ven 20 Oct 2017, 12:55
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 303
Localisation: Hauts de seine
Message Re: DAZ Scripting
Toujours dans la documentation de scripting DAZ (rappel cliquer dans help du scripIDE), cliquez sur Object index, Vous avez la liste des objets typiquement DAZ appelables dans vos futurs scripts, parce que jusqu'à maintenant les scripts déexemple tournaient sur eux-mêmes dans faire appel à DAZ Studio.

C'est assez difficile de faire comprendre la programmation objet. Un objet contient (éventuellement) des énumérations, des propriétés et/ou des méthodes.

- Une énumération est une suite de valeurs que l'on donne à une variable. C'est un peu comme un tableau à une dimension des valeurs possibles d'une variable.

- Les propriétés (properties) sont des variables de l'objet. En programmation bien faite, on ne devrait jamais y avoir accès autrement qu'à travers une méthode.

- Une méthode c'est une fonction d'un objet. On l'appelle en ajoutant un point au nom de l'objet et en lui passant éventuellement des paramètres (spécifiés dans la déclaration de la méthode) et éventuellement la méthode renvoie un résultat.

Dans mon premier message (voir plus haut), j'avais déclaré une variable de type Boolean bBouton1 qui n'a que 2 méthodes: toString() et valueOf(). Si vous cliquez dans Object index sur Boolean, vous verrez que toString() renvoie une String (une chaine de caractères) et valueOf() renvoie un Number (un nombre). Le fait qu'il n'y ait rien entre les parenthèses veut dire que la méthode n'a pas besoin de paramètres. Si une méthode renvoyait vois, ça veut dire qu'elle ne renverrait rien. Void veut dire vide.

Donc en déclarant:
var sChaine = bBouton.toString();
il faut savoir que le processus se déclenche de la droite vers la gauche. Bbouton1.toString() va tranformer le booléen en chaine de caractères (String). Cette chaine de caractères est donc parfaitement adaptée à sChaine. Dans certains langages on est obligé de préciser le type de la variable. Là c'est visiblement automatique.
un signal. Je suppose qu'il s'agit de la même chose que les événements en java. Un évenement sert de déclencheur pour dérouler un code totalement indépendant du reste. La programmation objet est difficile à suivre parce qu'elle n'est pas totalement linéaire.

Dans la description des objets, vous avez également une description détaillée des éléments (énumération, properties, methods, signal). Enfin pas toujours parce que quelquefois on voit un ToDo (à faire) sachant que ces objets datent pour la plupart de DAZ Studio 3.

Toujours dans l'aide du scriptIDE, vous avez des examples (samples). Je vais choisir comme exemple Simpl Input Dialog
// Define an anonymous function;
// serves as our main loop,
// limits the scope of variables
(function(){
// Get the current style
var oStyle = App.getStyle();
// Get the height for buttons
var nBtnHeight = oStyle.pixelMetric( "DZ_ButtonHeight" );
// Create a basic dialog
var wDlg = new DzBasicDialog();
// Get the wrapped widget for the dialog
var oDlgWgt = wDlg.getWidget();
// Set the title of the dialog
wDlg.caption = "My Simple Test";
// Strip the space for a settings key
var sKey = wDlg.caption.replace( / /g, "" ) + "Dlg";
// Set an [unique] object name on the wrapped dialog widget;
// this is used for recording position and size separately
// from all other [uniquely named] DzBasicDialog instances
oDlgWgt.objectName = sKey;
// Create a color widget
var wColorWgt = new DzColorWgt( wDlg );
wColorWgt.setFixedHeight( nBtnHeight );
// Add the widget to the dialog
wDlg.addWidget( wColorWgt );
// Get the minimum size of the dialog
var sizeHint = oDlgWgt.minimumSizeHint;
// Set the fixed size of the dialog
wDlg.setFixedSize( sizeHint.width, sizeHint.height );
// If the user accepts the dialog
if( wDlg.exec() ){
// Get the color from the widget
var clrAccepted = wColorWgt.value;
// Do... something
print( "R:", clrAccepted.red, "G:", clrAccepted.green, "B:", clrAccepted.blue );
// If the user rejects the dialog
} else {
// Do... something else
print( "User cancelled." );
}
// Finalize the function and invoke
})();
Il est possible que vous soyez obligé de la copier en 2 morceaux que vous mettrez à la suite, parce que le copier/coller est difficile en jouant en même temps sur l'ascenseur. Jouez avec Edit/ Paste from Clipboard pour coller les morceaux dans l'éditeur, Sinon récupérez-le dans ce message.

Suavegardez-le (save as SimpleInputDialog). Celui-là ne contient pas d'erreurs. Vous pouvez cliquer ensuite sur le bouton execute du scriptIDE. Vous allez faire apparaitre une boite de dialogue permettant de faire changer de couleur l'intérieur de la boite de dialogue (je sais. Aucun intérêt si ce n'est décortiquer le code). Décortiquer le code c'est ce que nous verrons une prochaine fois si ça intéresse quelqu'un.

_________________
mon blog sur iclone http://alinal.simplesite.com


Ven 20 Oct 2017, 13:44
Profil
Administrateur
Administrateur
Avatar de l’utilisateur

Inscrit le: Lun 26 Mai 2008, 16:38
Messages: 12703
Localisation: Isère - Jura
Message Re: DAZ Scripting
:shock: whoua, beau boulot !!! :clap:

_________________
Image     Image
Image  Image


Ven 20 Oct 2017, 20:02
Profil Site Internet
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 303
Localisation: Hauts de seine
Message Re: DAZ Scripting
A la Saucisse merci mais le boulot est loin d’être fini

_________________
mon blog sur iclone http://alinal.simplesite.com


Sam 21 Oct 2017, 08:00
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 303
Localisation: Hauts de seine
Message Re: DAZ Scripting
Alors côté debuggueur, on peut mettre des points d'arrêt (on fait dérouler le code qui s'arrête automatiquement au point d'arrêt (pratique quand le code est conséquent), on peut exécuter le code ligne par ligne avec F11, mais il semble qu'on ne puisse pas voir ce que contiennent les variables (sauf erreur de ma part). Il faudra donc revenir à une pratique ancienne qui consiste à faire des print pour voir ce que la console affiche sur la variable au fur et à mesure qu'on déroule le programme,

Revenons au code de l'exemple. Il est inclus dans une fonction anonyme ce qui semble avoir le double effet de le lancer quand on l'appelle et de faire en sorte que les varaibles globales ne génèrent pas d'erreur (je suppose au cas où le script aurait des variables globales de même nom qu'un autre programme dans DAZ Studio ou dans un autre script.

Vous pouvez observer les commentaires sur une seule ligne qui commence par //

On commence par déclarer une variable qui contiendra un objet appelé oStyle récupéré par la méthode getStyle() d'App. On ne voit pas la déclacaration de la variable App mais elle existe dans le code de DAZ Studio. Si vous allez voir dans Object index, vous trouverez la classe DzApp qui contient la méthode getStyle(). Le style n'est autre que ce que vous pouvez changer dans le menu window/ style. On pourra s'étonner que DAZ laisse autant de méthodes à disposition des programmeurs en fournissant en plus le nom de variable qu'il faut utiliser. En examinant de plus près les méthodes on voit qu'il y a beaucoup de get (permettant de connaitre des paramètres de DAZ Studio) mais que les méthodes set (celles qui permettraient de faire des modifications) sont peu nombreuses. Les méthodes qui permettent les modifications ne sont pas renseignées dans Object index. L'objet DzStyle qui est renvoyé et stocké dans oStyle contient lui aussi de nombreuses méthodes.

D'ailleurs la ligne suivante utilise déjà cet objet:
var nBtnHeight = oStyle.pixelMetric( "DZ_ButtonHeight" );

nBtnHeight contiendra la hauteur des boutons standards pour le style choisi, J'imagine que selon le style choisi, ceux-ci n'ont pas tous la même hauteur en pixels. La méthode pixelMetric prend en paramètre une String (chaine de caractères) et renvoie un nombre. La chaine de caractère DZ_ButtonHeight est définie quelque part, mais dans un fichier que je n'ai pas trouvé. On trouve d'ailleurs peu de renseignements sur Internet sur le scripting DAZ.

var wDlg = new DzBasicDialog();
On crée une nouvelle boite de dialogue standard. On notera que la création d'un nouvel objet se fait par new alors que lorsque l'objet est créé par une méthode et mis dans une variable, ce n'est pas le cas. A chaque fois, vous pouvez aller voir dans Object index les méthodes et propriétés des classes, ici DzBasicDialog.


var oDlgWgt = wDlg.getWidget();
Ajoute un widget à la boite de dialogue. Vu qu'il s'agit d'une méthode de DzBasicDialog et qu'aucun paramètre n'est passé dans les parenthèses, je pense qu'il s'agit de créer un pointeur dans une zone de mémoire pour réserver un emplacement, ce qui semble se confirmer dans les lignes en dessous.

wDlg.caption = "My Simple Test";
Met le titre "My Simple test" dans la barre de titre.

var sKey = wDlg.caption.replace( / /g, "" ) + "Dlg";
Je vous avais dit qu'on accédait à une méthode en ajoutant un point. On accède aussi aux propriétés par un point. En écrivant wDlg.caption on accède à la propriété caption non pas de la classe DzBasicDialog mais de la classe DzDialog dont la classe DzBasicDialog hérite. C'est un aspect particulier de la programmation objet. On peut créer un classe et lui faire hériter des propriétés et méthodes d'une autre classe et lui ajouter ensuite d'autres propriétés et méthodes. L'ensemble des classes dérive généralement d'une classe de base qui ne contient pas grand-chose. On voit ici qu'on a une méthode "replace" appelée par la propriété caption de la variable wDlg. Tout simplent parce que caption est un objet de la classe String (chaine de caractères) qui a ses propres méthodes et ses propres propriétés.

J'ai testé en mettant cette ligne en commentaire et la chaine de caratères ne change pas dans la barre de titre, Il semble qu'il s'agisse d'affecter à la variable sKey le contenu de la barre de titre en le modifiant sans que le contenu de la barre de titre soit modifié.

La suite plus tard

_________________
mon blog sur iclone http://alinal.simplesite.com


Sam 21 Oct 2017, 08:00
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 303
Localisation: Hauts de seine
Message Re: DAZ Scripting
Je me demandais à quoi correspondait le replace( / /g, "" ) + "Dlg" parce qu'il s'agit de séquences spéciales dans les chaines de caractères, comme /t correspond à tabulation. J'ai ajouté un print pour voir le résultat et donc sKey est égal à MySimpleTestDlg. La séquence (//g,"") consiste donc à retirer les espaces.

oDlgWgt.objectName = sKey;
Les commentaires en anglais traduit par Google donnent ceci:
Définir un nom d'objet [unique] sur le widget de boîte de dialogue enveloppé; ceci est utilisé pour enregistrer la position et la taille séparément de toutes les autres instances DzBasicDialog [nommées de façon unique]

Effectivement si on bouge la boite de dialogue et qu'on relance le script, elle ré-apparait à l'endroit où on l'a fermée la fois précédente.

var wColorWgt = new DzColorWgt( wDlg );
On crée une nouvelle boite de dialogue de choix des couleurs, considéré comme un widget, auquel on passe le nom de la boite de dialogue que l'on est en train de créer, pour les lier entre elles.

wColorWgt.setFixedHeight( nBtnHeight );
On passe au widget choix des couleurs, la taille des boutons correspondant au style

wDlg.addWidget( wColorWgt );
On ajoute le widget à la boite de dialogue. On notera que l'opération inverse avait eu lieu précédemment
var sizeHint = oDlgWgt.minimumSizeHint;
On met dans une variable la taille miimum de la boite de dialogue

wDlg.setFixedSize( sizeHint.width, sizeHint.height );
On fixe la largeur et la hauteur de la boite de dialogue

// If the user accepts the dialog
if( wDlg.exec() ){
// Get the color from the widget
var clrAccepted = wColorWgt.value;
// Do... something
print( "R:", clrAccepted.red, "G:", clrAccepted.green, "B:", clrAccepted.blue );
// If the user rejects the dialog
}

Là, les lignes de code correspondent à ce qui se passe quand on clique sur la touche Accept, c'est à dire récupérer les valeurs RGB sélectionnées soit directement avec les chiffres, soit en déplaçant le curseur dans le carré du widget des couleurs (ou une couleur présélectionnée).

else {
// Do... something else
print( "User cancelled." );
}

Donc si appui sur le bouton Cancel.
On notera que l'appel du widget couleur se produit quand on clique sur le triangle à coté des chiffres représentant les valeurs RGB ou directement dans la zone qui les contiennent. Les boites de dialogue se sont échangés leurs références et deux choses sont probables:

1/l'appel du widget couleur se produit quand l'utilisateur clique par un signal délivré par la boite de
dialogue. Le signal est surement applyClicked (voir Object index classe DzBasicDialog)
2/ wDlg.exec() fait apparaitre la boite de dialogue simple test. C'est le fait de cliquer sur le bouton Accept ou Cancel qui fait envoyer le booléen false ou true qui permet de dérouler le code dans le if ou dans le else. Un booléen n'est censé avoir que deux valeurs false ou true. Pourtant, la boite de dialogue continue de s'afficher, ce qui veut dire que la méthode exec() de DzDialog boucle quelque part avant d'arriver à son return, return qui renverra le booléen.

Voilà, c'est tout pour l'explication du code exemple pour cette boite de dialogue qui ne sert à rien puisque le choix de la couleur ne s'appliquera nulle part.

_________________
mon blog sur iclone http://alinal.simplesite.com


Sam 21 Oct 2017, 10:15
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 303
Localisation: Hauts de seine
Message Re: DAZ Scripting
On peut envisager des scripts moyennement utiles. Exemple une boite de dialogue avec des boutons radio qui permettent de choisir un style ou un autre. Comment on fait?

On regarde les métthodes de la classe DzApp dont on sait qu'une instance s'appelle App, On voit qu'il y a une méthode qui s'appelle setStyleDefintion (String name) et qui renvoie un booléen (pour dire si DAZ Studio a pu se mettre dans le style prévu)

Problème: il faut lui passer sous forme de String le nom du style dans lequel il faut se mettre. Or, on n'a pas cette liste (du moins une liste qui respecterait la casse) car elle est définie ailleurs et pas documentée par DAZ 3D (honnêtement, je n'ai pas vérifié). Comment fait-on?

var sStyle=App.getStyleDefinition();
print (sStyle);

et on exécute. Le résultat s'affiche "Higway"
Je change le style en Main Street, j'execute et le résultat affiche "Main Street". Donc il n'y a pas suppression des espaces. Si je fais ça avec tous les styles, j'obtiens (avec certitude la liste de tous les styles possibles) et je peux donc fabriquer un script boite de dialogue avec des cases à cocher qui utilisera la méthode setStyleDefinition pour changer le style par mon script.

Bien sûr, ça n'avantage pas beaucoup par rapport au fait de le faire par le menu, vu comme ça, Mais le bout de script peut faire partie d'un script beaucoup plus long, C'était juste pour démontrer que l'on peut récupérer des définitions du code principal de DAZ Studio auquel on n'a pas accès,

_________________
mon blog sur iclone http://alinal.simplesite.com


Sam 21 Oct 2017, 14:15
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 303
Localisation: Hauts de seine
Message Re: DAZ Scripting
Après une recherche plus approfondie, il semble que DAZ studio ait été écrit en langage Qt qui se rapproche du java puisqu'il introduit la notion de programmation événementielle. On voit dans certaines définitions de classes que certaines classes sont en mesure d'émettre des signaux.

Dans l'exemple précité, on voit bien qu'il se produit une interaction entre la boite de dialogue et le widget de couleur sans qu'il n'y ait une ligne de code du script qui y corresponde. Effectivement, les deux s'échangent des messages qui déroulent des lignes de code auquel on n'a pas accès et pour lesquels il semble n'y avoir pas beaucoup de documentation.

Je vais rechercher s'il n'y a pas un moyen d'intercepter ces messages.

_________________
mon blog sur iclone http://alinal.simplesite.com


Dim 22 Oct 2017, 07:08
Profil
Administrateur
Administrateur
Avatar de l’utilisateur

Inscrit le: Lun 26 Mai 2008, 16:38
Messages: 12703
Localisation: Isère - Jura
Message Re: DAZ Scripting
je viens de prendre le temps de lire (bien que je ne touche quasiment jamais DS), c'est bien du javascript.
si tu as des questions à ce sujet, je pourrai peut-être répondre, vu que je fais pas mal de web scripting ;-)

_________________
Image     Image
Image  Image


Dim 22 Oct 2017, 12:28
Profil Site Internet
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 303
Localisation: Hauts de seine
Message Re: DAZ Scripting
Merci pour ta proposition d'aide.

Le programme de DAZ Studio a été écrit en Qt, langage qui tient du C++. Le sdk a l'air d'être du C. Les scripts s'orientent plutôt javascript. Je suis désormais certain que les objets peuvent s'échanger des signaux entre eux mais d'une part il n'y a pas de documentation, d'autre part il est possible que les méthodes concernant les signaux soient private et donc inaccessibles par un utilisateur. Seul l'objet DzCallback a plusieurs méthodes connect disponibles (dérivé du connect en Qt) qui permettent de relier deux objets et d'envoyer sur une fonction de traitement.

Comme c'est les vacances scolaires, je ne vais pas pouvoir poursuivre mes investigations très longtemps.

_________________
mon blog sur iclone http://alinal.simplesite.com


Dim 22 Oct 2017, 13:33
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 303
Localisation: Hauts de seine
Message Re: DAZ Scripting
Exemple de script pour lire les paramètres du render settings:

(function(){
var oRenderMgr = App.getRenderMgr();
var oRenderOpts = oRenderMgr.getRenderOptions();
print("aspect: "+oRenderOpts.aspect);
print("largeur: "+oRenderOpts.aspectWidth);
print("hauteur:"+oRenderOpts.aspectHeight);
print("gain: "+oRenderOpts.gain);
print("gamma: "+oRenderOpts.gamma);
print("largeur image: "+oRenderOpts.imageSize.width);
print("hauteur image: "+oRenderOpts.imageSize.height);

})();

voir DzRenderManager pour plus de paramètres

Je constate que certains objets ne sont pas documentés et c'est probablement volontaire de la part de DAZ 3D.

Clairement, à partir de App qui est l'instance de DzApp pour DAZ Studio on peut accéder à presque tous les paramètres à travers les managers.

_________________
mon blog sur iclone http://alinal.simplesite.com


Dim 22 Oct 2017, 13:49
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 303
Localisation: Hauts de seine
Message Re: DAZ Scripting
Encore mieux, il est possible de dériver les prints vers le fichier log, avec la méthode warning.
exemple:
(function(){

var oRenderMgr = App.getRenderMgr();
var oRenderOpts = oRenderMgr.getRenderOptions();
print("aspect: "+oRenderOpts.aspect);
print("largeur: "+oRenderOpts.aspectWidth);
print("hauteur:"+oRenderOpts.aspectHeight);
print("gain: "+oRenderOpts.gain);
print("gamma: "+oRenderOpts.gamma);
print("largeur image: "+oRenderOpts.imageSize.width);

App.warning("c'est moi qui commande");
App.warning("largeur image: "+oRenderOpts.imageSize.width);
})();

_________________
mon blog sur iclone http://alinal.simplesite.com


Dim 22 Oct 2017, 14:43
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 303
Localisation: Hauts de seine
Message Re: DAZ Scripting
A examiner mon fichier de log, je me suis aperçu que lorsqu'on faisait tourner un script avec le scriptIDE, celui-ci enregistrait les print avec DEBUG en commentaires, Je me suis aperçu également que les informations étaient ajoutées les unes aux autres, ce qui fait que le fichier devient de plus en plus volumineux et qu'il faut penser à le vider de temps en temps.

Ci-dessous, une explication partielle des méthodes d'App, l'instance de DzApp définie par DAZ Studio:

Méthodes de DzApp:
addSessionFileLoad( String name ) : pas documenté, je ne vois pas à quoi ça sert
bitArchitecture() : Une représentation numérique de l'architecture de bits pour laquelle l'application a été compilée.Renvoie 64 sous forme de nombre, c'est donc pour dire que le programme a été compilé pour 64 bits.
bitArchitectureString() : Une représentation sous forme de chaîne conviviale de l'architecture de bits pour laquelle l'application a été compilée. Renvoie également 64 mais sous forme de chaine.
byteSizeToString( Number bytes ) : convertit le nombre passé en paramètre en unités d'octets (KB, MB, GB) exemple print( App.byteSizeToString( 1073741824 ) ); //1.0 GB
canShowSceneBuilder( Object definition=undefined ) :definition - Si vide, le fichier SceneBuilder.json par défaut (le cas échéant) dans getResourcesPath () sera vérifié. S'il s'agit d'une chaîne, le chemin complet d'un fichier de configuration Scene Builder à vérifier est attendu. Si un objet, une carte de données de configuration Scene Builder est attendue. (depuis 4.6.4.62). renvoie true si la boîte de dialogue Scene Builder est affichée, sinon false.
clearDelayedDeleteStack( Boolean doProgress ) ; Force la suppression de tous les objets en attente de suppression pour libérer plus de mémoire. Si vous l'utilisez pour effacer la mémoire, vous souhaiterez généralement effacer la pile d'annulation en premier. doProgress - Si la valeur est true, une boîte de dialogue de progression s'affiche pour l'utilisateur pendant l'opération. Fait effectivement apparaitre une boite de suppression d'assets. Garbage collection comme en java?
 createDigest( Array tokens ) : retourne une chaîne représentant un résumé de message. La chaîne est formatée en cinq champs hexadécimaux séparés par '-', c'est-à-dire xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx .J'ai utilisé le constructeur ByteArray (String). Visiblement, on peut mettre des chiffres ou des lettres dans la String, Ce format me rappelle les codes utilisés pour valider les plugins, mais j'ai vérifié ce n'est pas le même format, donc je ne vois pas l'utilité
createDigest( Array tokens ) : Pareil que ci-dessus mais on doit fournir un Array tokens
createUuid() : retourne une chaîne représentant un identificateur universel unique (UUID) généré de manière aléatoire. La chaîne est formatée en cinq champs hexadécimaux séparés par '-' et entourés d'accolades, c'est-à-dire "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" où 'x' est un chiffre hexadécimal.
debug( String msg ) : écrit un message de débugage dans le fichier log (c'est déjà le cas avec execute de scriptIDE). Peut-être utile avec un script enregistré.
delayedExit( Number exitCode=0 ) : Avec 0 revient à faire un file/exit. En fait, n'importe quel chiffre en paramètre ou pas de chiffre revient à faire un file/exit
enableMultiThreading( Boolean onOff ). On/off génère une erreur, alors que n'importe quel chiffre passe. Préférer true ou false qui marche également. Vérification que le multithreading fonctionne difficile à faire.
flushLogBuffer() : Écrit tous les messages de journal (fichier log) actuellement mis en mémoire tampon dans le fichier journal. Ceci est appelé automatiquement chaque fois que le tampon de journal contient plus de 512 caractères de données, mais peut être appelé à tout moment pour forcer l'écriture de tous les messages. Retourne un booléen pas documenté. Probablement si ça s'est bien passé.
getAbsoluteScriptPath( String scriptName ) : Recherche dans les emplacements par défaut pour un fichier script du nom donné.. Le chemin absolu du fichier de script trouvé (le cas échéant), sinon une chaîne vide.
getAppDataPath() : retourne le chemin absolu du répertoire de données d'application pour l'utilisateur actuel de la machine, la version majeure actuelle de l'application et le cycle de publication en cours de l'application. Sur mon ordi: C:/Users/alain/AppData/Roaming/DAZ 3D/Studio4. ATTENTION: Ce chemin est construit dynamiquement en utilisant des appels au système d'exploitation sous-jacent. Si l'appel au système d'exploitation échoue, getHomePath () est utilisé comme solution de secours.
getApplicationBaseName() : retourne le nom de base de l'application. Retourne "Studio". Méthode d'Intéret limité
getAppSettingsMgr() : méthode deprecated. On doit utiliser DzAppSettings à la place. Retourne le gestionnaire de paramètres persistant à l'échelle de l'application - utilisé pour définir et récupérer les paramètres de l'application.
getAssetIOMgr(): retourne un DzAssetIOMgr (le gestionnaire d'E / S d'actifs à l'échelle de l'application en charge des actifs au format natif.)
getAssetMgr() : retourne un DzAssetMgr (Le gestionnaire d'atouts à l'échelle de l'application.). Assets=atouts
getAuthenticationMgr() : renvoie un authenticationmgr_dz (Le gestionnaire d'authentification à l'échelle de l'application - responsable du suivi de l'authentification de l'utilisateur.). Non documenté et on comprend pourquoi
getCallBackMgr() : retourne un DzCallMgr (Le Gestionnaire de rappels à l'échelle de l'application - responsable du suivi des objets de rappel.)
getCommonUserDocumentPath() : retourne Le chemin absolu du dossier de documents utilisateur public / partagé. Sur mon ordi donne: C:/Users/Public/Documents. ATTENTION: Ce chemin est construit dynamiquement en utilisant des appels au système d'exploitation sous-jacent. Si l'appel au système d'exploitation échoue, getHomePath () est utilisé comme solution de secours.
getContentMgr() : retourne un DzContentManager (Le gestionnaire de contenu à l'échelle de l'application.)
getCurrentAuthor() : retourne un DzAuthor (L'auteur actuel (utilisateur qui exécute actuellement l'application)). Sur mon ordi renvoie une longue série de points d'interrogations et pourtant quand je clique sur My account dans DAZ Studio, ce dernier se connecte à DAZ 3D avec login
getDataFolderName() : retourne le nom du dossier de données sous le répertoire de contenu. Sur mon ordi donne data/4_0_2/
getDataFolderPath() : retourne le chemin complet de l'emplacement où les données sont stockées. Sur mon ordi renvoie C:/Users/Public/Documents/My DAZ 3D Library/data/4_0_2/ répertoire que je ne vois pas dans l'explorateur de fichiers, ni par la console donc n'existe pas.
getDAZDataPath() : retourne Le chemin absolu du répertoire de données pour DAZ 3D.ATTENTION Ce chemin est construit dynamiquement en utilisant des appels au système d'exploitation sous-jacent. Si l'appel au système d'exploitation échoue, getHomePath () est utilisé comme solution de secours. Sur mon ordi, génère une erreur un jour et le lendemain C:/Users/alain/AppData/Roaming/DAZ 3D
getDeviceMgr() : renvoie un DzDeviceMgr (le Gestionnaire de périphériques à l'échelle de l'application - responsable des périphériques pris en charge par l'application.)
getDialogParent() : renvoie un Qwidget (Le widget modal actif ou la fenêtre principale de l'application, s'il en existe une.). Le Qwidget est une classe écrite en Qt. Son examen montre que de nombreux slots existent (un slot est en Qt une méthode permettant de gérer les signaux que s'échangent les objets, méthodes qui n'apparaissent pas dans les définitions de classes DAZ). J'ai essayé de détourner le seul slot qui renvoyait quelque chose et le script m'a signalé une erreur parce qu'un slot n'est visiblement pas considéré comme une méthode, Les méthodes concernant les événements (events) sont protected donc inaccessibles au niveau de la programmation d'un script. Par contre, un examen poussé des classes Qt, particulièrement des signaux et des slots permet de voir quels genre précis de messages les objets s'échangent, sachant que les slots sont le fonctions côté récepteur.

Suite plus tard

_________________
mon blog sur iclone http://alinal.simplesite.com


Lun 23 Oct 2017, 07:34
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 303
Localisation: Hauts de seine
Message Re: DAZ Scripting
getInterface() : renvoie un DzMainWindow (le widget d'interface principale si l'application est en cours d'exécution avec une interface, sinon NULL.). En théorie, ça ne sert pas à grand-chose de savoir si l'application est en cours (on s'en doute puisqu'on se sert de scriptIDE, par contre les méthodes de getInterface peuvent donner de nombreux renseignements.
getLoadSavePath() : renvoie le dernier répertoire dans lequel les fichiers ont été chargés ou enregistrés depuis / vers.
getMultiMediaMgr() renvoie un DzMultiMediaMgr (Le gestionnaire vidéo et audio à l'échelle de l'application - responsable des E / S audio et vidéo.)
getPluginMgr() renvoie un DzPluginMgr (Le gestionnaire de plug-ins à l'échelle de l'application - responsable du suivi des plug-ins.). J'ai fait des essais qui m'ont permis d'afficher les différentes dll
getPluginsPath() retourne le chemin absolu du répertoire de base dans lequel les plug-ins sont chargés. Sur mon ordi C:/Program Files/DAZ 3D/DAZStudio4/plugins
getProgramDataPath() retourne le chemin absolu du répertoire de données de programme global de la machine pour l'organisation. ATTENTION: Ce chemin est construit dynamiquement en utilisant des appels au système d'exploitation sous-jacent. Si l'appel au système d'exploitation échoue, getHomePath () est utilisé comme solution de secours. Sur mon ordi: C:/ProgramData/DAZ 3D
getRenderMgr() renvoie un DzRenderMgr (le gestionnaire de rendu à l'échelle de l'application.)
getResourcesPath() renvoie le chemin absolu du répertoire dans lequel les fichiers de ressources d'application sont stockés. Sur mon ordi C:/Program Files/DAZ 3D/DAZStudio4/resources
getSaveFilterMgr() renvoie un DzSaveFilterMgr (le Gestionnaire de filtres Save à l'échelle de l'application, chargé de sauvegarder les filtres.)
getScriptsPath() renvoie Le chemin absolu du répertoire dans lequel les fichiers de script de support sont stockés. Sur mon ordi.C:/Program Files/DAZ 3D/DAZStudio4/scripts
getShadersPath() renvoie le chemin absolu du répertoire de base pour tous les shaders.Sur mon ordi C:/Program Files/DAZ 3D/DAZStudio4/shaders
getStyle() retourne un DzStyle (L'objet de style à l'échelle de l'application. Ce pointeur est susceptible de devenir invalide si le style de l'application change.)
getStyleDefinition() renvoie le nom de la définition de style actuellement utilisée.Sur mon ordi renvoie Main Street
getStyleDefinitionList() renvoie un tableau (Une liste des définitions de style disponibles.)
getTempFilename() renvoie le nom de fichier pour le stockage temporaire.Un nom de fichier unique (sans extension) dont le chemin sera dans le dossier de travail temporaire actuel. (Tous les fichiers de ce dossier seront supprimés lorsque shutdown () est appelé). Sur mon ordi C:/Users/alain/AppData/Roaming/DAZ 3D/Studio4/temp/d400
getTempPath() renvoie un nom de fichier unique (sans extension) dont le chemin sera dans le dossier de travail temporaire actuel. (Tous les fichiers de ce dossier seront supprimés lorsque shutdown () est appelé). Sur mon ordi C:/Users/alain/AppData/Roaming/DAZ 3D/Studio4/temp
getTempRenderFilename() renvoie un nom de fichier pour le stockage temporaire des images rendues (Un nom de fichier (sans extension) dont le chemin sera dans le dossier de travail temporaire actuel. (Tous les fichiers de ce dossier seront supprimés lorsque shutdown () est appelé)).Sur mon ordi C:/Users/alain/AppData/Roaming/DAZ 3D/Studio4/temp/render/r
getUtilitiesPath() retourne Le chemin absolu du répertoire de base pour tous les utilitaires binaires.Sur mon ordi C:/Program Files/DAZ 3D/DAZStudio4/bin
isClosing() retourne true si l'application est en cours de fermeture, sinon false.
isKeyDown( Number key ) retourne true si la touche est actuellement enfoncée, sinon false. key(touche) - La valeur de Qt :: Key pour la clé à vérifier. Pratique pour faire une boucle d'attente en attendant que l'utilisateur enfonce une touche précise, Par contre, il faut se procurer la liste des touches avec leur code numérique façon Qt ou procéder à des tests pour les décoder toutes
isKeySequenceDown( String sequence ) retourne true si la séquence est actuellement pressée, sinon false. Sequence: chaîne cohérente avec {QKeySequence, fromString}, au format PortableText. Je suppose (gratuitement) qu'on entend par séquence une combinaison de touches du genre CTRL + quelque chose.
isMultiThreadingEnabled() retourne true si l'utilisateur a choisi d'activer les fonctionnalités multithread, sinon false.
isRegistered() retourne true si un numéro de série valide a été fourni, sinon false. Vu que cette méthode ne concerne que App, donc DAZ Studio, elle n'a pour l'instant pas trop lieu d'être puisque DAZ Studio est fourni gratuitement, Ca n'a pas été le cas par le passé et ça pourrait aussi ne pas être vrai dans l'avenir
isSlave() retourne true si l'application s'exécute en tant qu'esclave dans une autre application, sinon false. Méthode dont on pourrait se demander à quoi elle sert. En général, on fait tourner un programme en esclave quand on veut faire du piratage.
isStarting() retourne true si l'application est en cours de démarrage, sinon false.
log( String buffer ) permet d'écrire un message dans le fichier log. Buffer: la chaîne à écrire dans le fichier log. Peut être très pratique pour débuguer un programme en dérivant des infos vers le fichier journal. Vider le fichier log avant pour pouvoir n'imprimer que la partie intéressante.
modifierKeyState() renvoie L'état actuel de modification de la touche- cette valeur est un bit ou des indicateurs Qt :: Modifier pour les clés (touches) actives, le cas échéant.SHIFT = 0x02000000
CTRL = 0x04000000
ALT = 0x08000000
META = 0x10000000
 
META + SHIFT = 0x12000000
META + CTRL = 0x14000000
META + ALT = 0x18000000
SHIFT + CTRL = 0x06000000
SHIFT + ALT = 0x0A000000
CTRL + ALT = 0x0C000000
exemple:
var shftKey = App.modifierKeyState() & 0x02000000;
var ctrlKey = App.modifierKeyState() & 0x04000000;
var altKey = App.modifierKeyState() & 0x08000000;
var metaKey = App.modifierKeyState() & 0x10000000;
 
if( shftKey ){
print( "Shift pressed." );
}
 
if( ctrlKey ){
print("Control pressed.");
}
 
if( altKey ){
print("Alt pressed.");
}
 
if( metaKey ){
print("Meta pressed.");
}
Note: vu qu'il n'y a pas de boucle d'attente le script s'exécute et finit avant qu'on ait le temps de taper sur une touche. Aucune indication sur ce qu'est la touche META (fn?, window? (pomme sur MAC))
operatingSystem() renvoie un nombre correspondant à l'operating system: The operating system.
Unknown - An unknown operating system.
WindowsUnknown - An unknown version of Windows.
Windows95 - The Windows 95 operating system.
Windows98 - The Windows 98 operating system.
WindowsMe - The Windows Me operating system.
Windows2000 - The Windows 2000 operating system.
WindowsXP - The Windows XP operating system.
Windows2003 - The Windows 2003 operating system.
WindowsVista - The Windows Vista operating system.
Windows7 - The Windows 7 operating system.
Windows8 - The Windows 8 operating system.
Windows8_1 - The Windows 8.1 operating system.
Windows10 - The Windows 10 operating system.
MacUnknown - An unknown version of the Macintosh operating system.
Mac10_0 - The OS X 10.0 (Cheetah) operating system.
Mac10_1 - The OS X 10.1 (Puma) operating system.
Mac10_2 - The OS X 10.2 (Jaguar) operating system.
Mac10_3 - The OS X 10.3 (Panther) operating system.
Mac10_4 - The OS X 10.4 (Tiger) operating system.
Mac10_5 - The OS X 10.5 (Leopard) operating system.
Mac10_6 - The OS X 10.6 (Snow Leopard) operating system.
Mac10_7 - The OS X 10.7 (Lion) operating system.
Mac10_8 - The OS X 10.8 (Mountain Lion) operating system.
Mac10_9 - The OS X 10.9 (Mavericks) operating system.
Mac10_10 - The OS X 10.10 (Yosemite) operating system.
Mac10_11 - The OSX 10.11 (El Capitan) operating system.
Mac10_12 - The OSX 10.12 (Sierra) operating system.
Note: Ce tableau ne donne pas la valeur retournée qui se trouve probablement dans une énumération dans le code

_________________
mon blog sur iclone http://alinal.simplesite.com


Mar 24 Oct 2017, 08:42
Profil
Afficher les messages depuis:  Trier par  
Publier un nouveau sujet Répondre au sujet  [ 45 messages ]  Aller à la page 1, 2, 3  Suivant


Qui est en ligne ?

Utilisateurs parcourant actuellement ce forum : Aucun utilisateur inscrit et 1 invité


Vous ne pouvez pas publier de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum

Rechercher pour:
Sauter vers:  
cron

3D-DIABLOTINE.COM © 2002 - 2015 | Reproduction totale ou partielle interdite



Powered by phpBB © phpBB Group | Translated by phpBB.fr © 2007, 2008 | Designed by Vjacheslav Trushkin