3D-Diablotine.com
Nous sommes actuellement le Sam 25 Nov 2017, 04:35




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

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 314
Localisation: Hauts de seine
Message Re: DAZ Scripting
operatingSystemString() retourne une la valeur d'une énumération de type platform (non documentée) associée à la plate-forme sous laquelle l'application s'exécute. L'application est conçue pour être aussi indépendante que possible de la plate-forme, mais il y a des cas où quelque chose doit être fait différemment sur une plate-forme ou une autre. Cette fonction fournit un moyen simple de vérifier sur quelle plate-forme l'application s'exécute. Exemple de code: var nPlatform = App.platform();
if( nPlatform == App.Windows ){
//doWinSomething();
} else if( nPlatform == App.MacOSX ){
//doMacSomething();
}
Note: Si on ajoute une ligne print(nPlatform); au script partiel ci-dessus, on affiche 0 donc attribué à Windows. On supposera que Mac est défini comme 1, faute de connaitre l'énumération en question.
releaseCycle() retourne un releaseCycle (non documenté), nombre d'une énumération associée au ReleaseCycle de l'application.
releaseCycleString() retourne une chaîne conviviale décrivant le cycle de publication de l'application. Sur mon ordi General Release
releaseEdition() retourne un nombre (la valeur énumérée associée à l'édition ReleaseEdition de l'application). Sur mon ordi: 3
releaseEditionString() retourne une chaîne conviviale décrivant l'édition de l'application. Sur mon ordi: Pro. Ce qui sous-entend que Pro a la valeur 3 dans l'énumération de releaseEdition


Note importante: on arrive dans les sets qui permettent la modification
restoreDefaultTempPath() Restaure le répertoire des fichiers temporaires à l'emplacement par défaut.
setLoadSavePath( String dir ) Définit le répertoire par défaut pour le chargement ou l'enregistrement des fichiers. Exemple de code App.setLoadSavePath( "c:/MyScenes" );
setStyleDefinition( String name ) Définit le style actuel pour l'application. name - Nom de la définition de style à utiliser. Retourne true si l'application est passée au style donné, sinon false.
setTempPath( String tempPath ) Définit le chemin du répertoire dans lequel les fichiers temporaires sont stockés. Le chemin fourni doit être un chemin absolu. Un répertoire sera créé au nouvel emplacement s'il n'existe pas déjà. tempPath - Le chemin du nouveau répertoire de fichiers temporaires. Retourne true si le chemin fourni est valide et que le chemin temporaire a été modifié. false si des erreurs se sont produites.

_________________
mon site sur iclone https://sites.google.com/site/iclonefr/home


Dernière édition par alinal le Mar 24 Oct 2017, 14:05, édité 1 fois au total.



Mar 24 Oct 2017, 12:30
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 314
Localisation: Hauts de seine
Message Re: DAZ Scripting
showInNativeBrowser( String absFilePath ) Une méthode pratique pour ouvrir un fichier / répertoire dans le navigateur de fichiers du système d'exploitation. absFilePath - Chemin absolu vers un fichier ou un dossier à afficher. Retourne true si le fichier existe et que le navigateur du fichier OS peut être lancé, sinon false.
showPrompts() retourne true si l'application doit inviter l'utilisateur à entrer, sinon false. Mon ordi retourne true
showSceneBuilder( Object definition=undefined, Boolean asEvent=false ) Affiche la boîte de dialogue Scene Builder.
definition - Si vide, le fichier SceneBuilder.json par défaut (le cas échéant) dans getResourcesPath () sera utilisé. 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)
asEvent - Si la valeur est false (par défaut), les données de configuration de Scene Builder sont traitées immédiatement. Si la valeur est false, les données de configuration de Scene Builder sont envoyées à un événement et traitées au fur et à mesure qu'elles sont rencontrées dans la pile d'événements. (depuis 4.6.4.62). Retourne Si asEvent est false, une liste des sélections effectuées par l'utilisateur dans la boîte de dialogue Scene Builder, sinon une liste vide. (depuis 4.6.4.62)
showURL( String url ) Une méthode pratique pour naviguer vers une URL donnée.
url - L'URL à ouvrir dans le navigateur par défaut du système. Assurez-vous de spécifier le schéma de l'URL (par exemple, 'http:' ou 'fichier:'). Le script suivant (function(){App.showURL( "http:/www.google.fr" );})(); lance le brower à la page de Google. J'ai déjà vu des vignettes d'auteurs qui faisaient se connecter à leur site personnel quand on cliquait dessus. Il s'agit sûrement de cette méthode
 statusLine( String msg, Boolean writeToLog=true ) Affiche un message dans la ligne d'état de DAZ Studio. msg - La chaîne à afficher (et enregistrée si la journalisation est activée)
writeToLog - Si la valeur est true, le message sera également écrit dans le fichier journal. Exemple de script App.statusLine( "Hello World!" );
usingInterface() retourne true si l'application utilise une interface utilisateur.Mon ordi répond true
warning( String msg ) Ecrit un message d'avertissement dans le fichier journal de l'application. msg - Le message à écrire dans le journal en guise d'avertissement.
writeConfigScript( String configScriptFilename=“” ) Enregistre un script de configuration utilisateur dans le nom de fichier donné. Si aucun nom de fichier n'est donné, le script est sauvegardé dans le même fichier lu depuis le démarrage (). La fonction run () l'appelle à la fin de chaque exécution. filename - Nom du fichier dans lequel enregistrer un script de configuration. Retourne true si le fichier a été écrit avec succès

Là s'arrêtent les méthodes de App. Le debuggueur de scriptIDE n'est pas très pratique, il n'accepte pas d'écrire directement les {}. J'ai été oblidé de faire du copier/coller. Autre défaut ne permet pas l'affichage des variables pour suivre leurs modifications au fur et à mesure que l'on déroule le code.

Je n'ai pas détaillé les signaux de DzApp puisque je ne vois pas de moyens de les utiliser. Comme on peut le lire dans les fichiers de DAZ 4.5 SDK (gratuit), DzApp dérive de QApplications.
C'est dans le même SDK que l'on trouve la déclaration des variables globales:

declare var Scene: DzScene;
declare var App: DzApp;
declare var MainWindow: DzMainWindow;
declare var System: DzSystem;
declare var FileDialog: DzFileDialog;
declare var Renderer: DzRenderer;
declare var Material: DzMaterial;
declare var Camera: DzCamera;
declare var RenderOptions: DzRenderOptions;

Il semble qu'on ne puisse pas "attaquerview port" toutes les variables globales puisqu'en faisant des essais avec Camera, le scriptIDE me répond qu'il ne la connait pas.
Ce que confirme l'éxecution du script suivant:
(function(){

var oVect = new DzVec3(500,500,500);
print(Scene.getNumCameras());

})();
où la réponse est 0.
Le même script, si je crée une caméra répond 1. Donc la caméra avec laquelle on joue au départ (et qui effectivement n’apparaît pas dans l'onglet scene) n'est pas accessible directement ou par la variable Scene.
En fait la camera du viewport appartient au viewport et non à la scène et c'est de ce côté qu'il faut chercher.

_________________
mon site sur iclone https://sites.google.com/site/iclonefr/home


Mar 24 Oct 2017, 14:04
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 314
Localisation: Hauts de seine
Message Re: DAZ Scripting
Voilà le bon script:
(function(){

var oVect = new DzVec3(15,15,15);
var oCamera=App.getInterface().getViewportMgr().getViewCamera(0);0
oCamera.aimAt(oVect);
})();

La caméra de base (avant qu'on en crée une spécialement) fait en fait partie du viewport (voir classe DzViewport). En remontant, on voit que c'est la classe DzViewportMgr qui gère la (ou les) caméras du (ou des) viewports. De proche en proche, et en regardant les variables de retour des méthodes, j'ai abouti à la ligne qui appelle App (on a détaillé les méthodes) qui appelle l'interface qui appelle le viewportMgr qui a une méthode getViewCamera qui renvoie un objet de type DzCamera correspondant à la caméra du viewport. Il faut fournir en paramètre l'indice de cette caméra. Il y avait de grandes chances pour qu'un seul viewport dans l'interface avec une seule caméra ait l'indice 0.
La méthode ainAt(DzVec3) positionne la caméra à x, y, z. J'ai fixé pour les trois dimensions 15.

Pour vérifier que ça marche enregistrez le script dans un répertoire visible par DAZ Studio. Chargez une scène dans DAZ Studio. Allez dans le répertoire où vous avez sauvegardé votre script et cliquez dessus. L'axe de la caméra a changé.

Comme c'est la seule caméra qui ne bénéficie pas de réglages X, Y, Z dans parameters il serait agréable de faire un script qui fasse apparaître des réglages X, Y et Z.

_________________
mon site sur iclone https://sites.google.com/site/iclonefr/home


Mar 24 Oct 2017, 17:21
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 314
Localisation: Hauts de seine
Message Re: DAZ Scripting
Faites un copier/coller de ce script dans l'éditeur de scriptIDE

var wDiag = new DzDialog;
var wPotar = new DzIntSlider (wDiag);
var wNomPotar = new DzLabel (wDiag);
var wBoutonOK = new DzPushButton (wDiag);
var wBoutonCancel = new DzPushButton (wDiag);

var sTitreDialogue = "Essai de déplacement de caméra";
wDiag.caption = sTitreDialogue;
wDiag.setFixedSize (380,160);
wPotar.setGeometry(80,40,300,20);
wPotar.min =0;
wPotar.max=10;
wPotar.clamped = true;
wNomPotar.text = "variation caméra en X";
wNomPotar.setGeometry(10,40,70,20);
wBoutonOK.text = "OK";
wBoutonOK.setGeometry(80,100,80,25);
wBoutonOK.autoDefault=true;
wBoutonCancel.text = "Cancel";
wBoutonCancel.setGeometry(200,100,80,25);

function CancelSet (){
print("je passe bien par la fonction CancelSet");
wDiag.close();
}
connect(wBoutonCancel, "clicked()", CancelSet);
wDiag.exec();

Ce sont les prémices du script qui déplacera la caméra principale avec déplacement en X, Y et Z.
J'ai récupéré une partie du code sur le forum DAZ 3D consacré aux scripts. Vu que le programme utilise des variables globales et n'est pas "enfermé" dans une fonction anonyme, j'ai utilisé des noms français pour éviter un éventuel problème avec d'autres variables globales.

Explication du script:

On créé une boite de dialogue (DzDialog) composée d'une glissière de réglage (DzSlider), d'un titre pour ce réglage (DzLabel), de deux boutons (DzPushButton) (OK et Cancel). En général, on peut sur une feuille de papier déterminer les éléments dont on a besoin et leur emplacement, quitte à ajuster les réglages.

Un fois les éléments définis, il faut s'occuper de leur propriétés. On commence par la taille. Méthode setFixedSize pour la boite de dialogue et méthode setGeometry pour les éléments la composant. On voit qu'il y a 4 paramètres nécessaires à remplir 2 qui correspondent à la position dans la boite et 2 pour la taille.

Paramètres supplémentaire pour le slider: les valeurs min et max du slider. La propriété clamped sert à dire si le slider peut aller au-delà de ses limites. Par défaut, cette propriété est fixée à false. Pour les boutons, on dit quel texte sera à l'intérieur. Explication de la propriété autoDefault: Si le bouton possède ou non la fonction par défaut automatique et répond à la touche Entrée lorsqu'il a le focus. true par défaut pour les boutons qui ont un parent Dialog, sinon false.

Reste la partie la plus importante, le détournement des signaux. Dans cet exemple, on détourne le traitement du signal clicked() par la fonction connect. Je suppose qu'il s'agit d'une surcharge de la méthode connect puisqu'on est en langage objet.

connect(wBoutonCancel, "clicked()", CancelSet); On lui passe en paramètre le nom de l'instance de DzPushButton qu'on a défini, le signal qu'on va détourner et le nom de la méthode (Qt appelle ça un slot quand la méthode s'applique à des signaux). Désormais, un click sur le bouton Cancel ne fera plus sortir de la boite de dialogue immédiatement, mais fera un traitement. J'ai ajouté un print pour le démontrer.

Note: On voit qu'il y a des améliorations à apporter:
le déplacement caméra nécessitera trois sliders avec des valeurs qui peuvent passer du positif au négatif
le label du slider gagnerait à être déplacé au-dessus
le bouton OK ne fait rien. Pour sortir, vous n'avez le choix qu'entre cliquer sur le bouton cancel ou cliquer sur la croix en haut à droite de la fenêtre.

Vu que je pars en vacances prochainement, il est fort probable que la suite aura lieu à mon retour. En tout cas, j'espère que la programmation des scripts vous intéresse. C'est une manière d'automatiser des tâches (par exemple, il est parfaitement possible de fixer une liste de rendus à faire en déplaçant la caméra, sans avoir à rester devant l'ordinateur pour modifier et relancer). C'est aussi un manière d'ajouter des fonctions inexistantes à DAZ Studio.

N'ayez pas peur, vous ne pouvez pas modifier le code de DAZ Studio avec vos scripts. Au pire, si vous faites des erreurs DAZ Studio peut se bloquer mais un vieux CTR + ALT +DEL résoudra le problème.

_________________
mon site sur iclone https://sites.google.com/site/iclonefr/home


Mer 25 Oct 2017, 09:35
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 314
Localisation: Hauts de seine
Message Re: DAZ Scripting
Encore un dernier détail. Si vous cherchez la méthode setGometry, elle n’apparaît pas dans les classes DzPushButton, DzLabel et DzIntSlider. Il faut donc chercher plus haut. Dans Object index, il y a un lien "Ineherits" qui indique de quelle classe "hérite" la classe qu'on examine. On remonte de proche en proche pour voir quelles sont les propriétés et méthodes du "parent". On peut parfois remonter loin. setGeometry est une méthode publique de la classe Qwidget.

_________________
mon site sur iclone https://sites.google.com/site/iclonefr/home


Mer 25 Oct 2017, 10:00
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 314
Localisation: Hauts de seine
Message Re: DAZ Scripting
On peut utiliser la technique dite "du doigt mouillé" pour certaines choses, comme régler l'emplacement du label du slider. Doigt mouillé = approximations successives jusqu'à ce qu'on soit satisfait.

Exemple wNomPotar.setGeometry(150,20,150,20); sera plus harmonieux

Par contre, il faut définir, autant que faire se peut, l'ensemble du script avant de commencer à coder.
Dans le script que l'on se propose de faire:
Le script devra ouvrir une boite de dialogue, où à l'aide des réglages de sliders on modifiera en temps presque réel la position de la caméra de base. Un appui sur Ok si on est content ou sur Cancel si on veut revenir à la position caméra initiale.

il faudra ajouter deux nouveaux sliders avec leur étiquette pour Y et pour Z, ce qui implique un agrandissement de la taille de la boite de dialogue
le traitement du bouton Cancel correspondra à un vrai bouton cancel, c'est à dire remettre les choses dans lesquelles on les a trouvé, ce qui implique 3 variables ou un DzVec3 qui contiendra les coordonnées X, Y, Z de la caméra.
Le traitement du bouton OK sera aussi redéfini pour ne rien faire, En effet, dans l'idéal il faut que le déplacement du curseur d'un slider provoque une mise à jour automatique de la position caméra.
Donc, il faudra aussi détourner le "slot" des sliders par la méthode connect pour faire ce qui est indiqué à la ligne d'avant.

_________________
mon site sur iclone https://sites.google.com/site/iclonefr/home


Mer 25 Oct 2017, 10:24
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 314
Localisation: Hauts de seine
Message Re: DAZ Scripting
Script fini:
Il n'y a que le point d'interrogation dans le titre dont j'ignore la provenance. J'ai testé au fur et à mesure que je rectififiai le code.
Charger le script dans scriptIDE et le sauver
Charger quelque chose dans la scene
Lancer le script
Regler à petites doses les x, y et z. La caméra suit les réglages et revient à son point d'origine si on clique sur Cancel

// DAZ Studio version 4.9.4.122 filetype DAZ Script

var vecInitial = new DzVec3();
var vecActuel = new DzVec3();
var wDiag = new DzDialog;
var wPotarX = new DzIntSlider (wDiag);
var wPotarY = new DzIntSlider (wDiag);
var wPotarZ = new DzIntSlider (wDiag);

var wNomPotarX = new DzLabel (wDiag);
var wNomPotarY = new DzLabel (wDiag);
var wNomPotarZ = new DzLabel (wDiag);

var wBoutonOK = new DzPushButton (wDiag);
var wBoutonCancel = new DzPushButton (wDiag);

var sTitreDialogue = "Essai de deplacement de camera";
wDiag.caption = sTitreDialogue;
wDiag.setFixedSize (380,250);

//recuperation de la camera principale
var oCamera=App.getInterface().getViewportMgr().getViewCamera(0);
//recuperation des coordonnees x,y,z initiales
vecInitial= oCamera.getFocalPoint();

wPotarX.setGeometry(80,40,250,20);
wPotarX.min =-1000;
wPotarX.max=1000;
wNomPotarX.text = "variation caméra en X";
wNomPotarX.setGeometry(150,20,150,20);

wPotarY.setGeometry(80,100,250,20);
wPotarY.min =-1000;
wPotarY.max=1000;
wNomPotarY.text = "variation caméra en Y";
wNomPotarY.setGeometry(150,80,150,20);

wPotarZ.setGeometry(80,160,250,20);
wPotarZ.min =-1000;
wPotarZ.max=1000;
wNomPotarZ.text = "variation caméra en Z";
wNomPotarZ.setGeometry(150,140,150,20);

wBoutonOK.text = "OK";
wBoutonOK.setGeometry(80,210,80,25);
wBoutonOK.autoDefault=true;
wBoutonCancel.text = "Cancel";
wBoutonCancel.setGeometry(210,210,80,25);

function CancelSet (){
//remet la camera comme au debut
oCamera.aimAt(vecInitial);
//et sort
wDiag.close();
}
function OKSet(){
//le rafraichissement devant avoir lieu en temps reel, on sort sans rien faire
wDiag.close();
}
function mySliderEditEndFunction(){
vecActuel.x = wPotarX.value;
vecActuel.y = wPotarY.value;
vecActuel.Z = wPotarZ.value;
oCamera.aimAt(vecActuel);
print(wPotarX.value);
print(wPotarY.value);
print(wPotarZ.value);
}
connect(wBoutonCancel, "clicked()", CancelSet);
connect(wBoutonOK, "clicked()", OKSet);
connect( wPotarX, "editEnd()", mySliderEditEndFunction );
connect( wPotarY, "editEnd()", mySliderEditEndFunction );
connect( wPotarZ, "editEnd()", mySliderEditEndFunction );
wDiag.exec();


Nota: au moment de la sauvegarde du script a modifié tous les caractères accentués, donc éviter de les utiliser dans les strings et les commentaires

_________________
mon site sur iclone https://sites.google.com/site/iclonefr/home


Mer 25 Oct 2017, 12:45
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 314
Localisation: Hauts de seine
Message Re: DAZ Scripting
Aujourd'hui, je vais parler d'un piège. Comme je l'ai dit sur un autre fil, j'ai créé une scène de plage avec du sable à l'avant, un promontoire avec des cabines de plage au centre, un parc de jeux et un restaurant sur de l'herbe à l'arrière plan (voir cyclorama).

Pour pouvoir me centrer sur une partie de cette scène qui est en fait relativement grande à l'échelle d'un personnage, j'ai mis tous les éléments de la scène dans un objet null, que j'ai renommé "scène". L'avantage est qu'en sélectionnant cet élément "scène" on peut accéder aux réglages x, y et Z et se déplacer facilement dans cette scène.

En testant les script suivant:

// DAZ Studio version 4.5.0.114 filetype DAZ Script
oNode = Scene.getPrimarySelection();
// il faut qu'au moins un objet soit déclaré dans la scene
if(oNode){
nNombreObjets = oNode.getNumNodeChildren();
print(nNombreObjets);
}

Je me suis aperçu de deux choses:
1/ il fallait ajouter la partie if car si on fait tourner le script et que la scène est vide, on aura une erreur (la première ligne renverra un null)
2/ Si je charge ma scène de plage, l'affichage va me dire 0, ce qui est trompeur. En effet, j'ai bien un objet scene (sinon je ne serai pas rentré dans le test if) mais celui-ci étant un objet null (voir ci-dessus), il n'est pas comptabilisé.

Pour aller chercher les objets un par un, sachant qu'il s'agit d'un arbre, il aurait fallut programmer des boucles récursives (qui s'appellent elles-mêmes). Tout ça fait penser au DOM. Je me demandais ce que des classes DOM (voir Object index) venaient faire dans un logiciel de 3D, maintenant je vois.

_________________
mon site sur iclone https://sites.google.com/site/iclonefr/home


Jeu 26 Oct 2017, 08:18
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 314
Localisation: Hauts de seine
Message Re: DAZ Scripting
Autre script (récupéré sur le forum DAZ et remanié):
(function(){
var itemToCheck = DzNode() ;

for ( var member in itemToCheck ) {
print ( member );
}
})();

Affiche les méthodes de la classe DzNode (donc on peut changer par n'imporque quelle autre classe. Rappel, en remplaçant print par debug, on peut orienter les résultats vers le fichier log. Ce code serait à améliorer puisqu'il n'indique ni les signaux ni les variables en retour des méthodes. Pour ceux qui souhaiterait continuer à programmer en vacances s'ils n'ont pas de connection internet, il vaut mieux aspirer la partie Object Index avec un aspirateur de site web.

_________________
mon site sur iclone https://sites.google.com/site/iclonefr/home


Jeu 26 Oct 2017, 08:57
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 314
Localisation: Hauts de seine
Message Re: DAZ Scripting
De retour parmi vous après une semaine de vacances sans internet, ce qui a été handicapant à certains points de vue. Voulant tester dForce, je me suis aperçu que le vêtement du fichier dForce Starter Essentials suivait les mouvements des poses sans qu'il y ait de fichier particulier concernant, dForce, J'ai compris quelque chose sur laquelle je n'avais pas tilté, c'est que pour q'un vêtement suive la pose que l'on donne à un personnage, il faut qu'il soit pourvu d'une ossature, et de préférence que celle-ci soit calquée sur celle du personnage.

J'ai donc essayé de faire un script qui fabrique automatiquement une version copiée de l'ossature du personnage pour l'attribuer au vêtement et c'est là que les choses se sont compliquées. Chaque élément du corps d'un personnage ou chaque partie de vêtement est un DzNode. Hip est un DzNode, head est un DzNode, etc..Tous sont reliés par ce que l'on appelle une liste chainée. Le premier élement est le nom de l'objet (id); le suivant hip et ensuite, la hiérarchie que l'on voit dans scene.

En voulant supprimer le hip existant du vêtement pour lui substituer un squelette reconstruit à ma façon, j'ai planté DAZ Studio. Ca m'a permis de découvrir dans le fichier log que DAZ préparait un fichier assez long avec les caractéristiques de l'ordinateur, ce qu'il charge et la chronologie du chargement, DAZ fait ça pour qu'on puisse envoyer le fichier au service "bug". En fait, dans scene si vous cliquez sur hip ou n'importe quelle autre partie et que vous choisissiez delete, vous constaterez que c'est l'objet total qu'on vous propose de supprimer et non la partie concernée. Quelque recherches supplémentaires m'ont permis de constater qu'il existait une classe spécialisée pour la destruction d'un os (bone) mais que celle-ci n'était pas documentée. Il me fallait donc attendre mon retour pour voir si je retrouvais trace sur internet des méthodes de cette classe. Au pire, l'ajout d'un os est facile dans joint editor et il suffit de copier les valeurs du même os que celui du personnage.

J'avais préparé ce message et depuis que je peux me reconnecter à Internet, il semblerait qu'il y ait une autre solution que je n'ai pas encore testée. A suivre......

_________________
mon site sur iclone https://sites.google.com/site/iclonefr/home


Ven 3 Nov 2017, 16:51
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 314
Localisation: Hauts de seine
Message Re: DAZ Scripting
Ceci est le script qui marche et qui supprime l'os (bone sélectionné)

var oActionMgr = MainWindow.getActionMgr();
var oAction = oActionMgr.findAction("DzJEDeleteBoneAction");
if( oAction ){
oAction.trigger();
}

On peut sélectionner l'os soit dans scene, soit directement dans joint editor. On notera que
"DzJEDeleteBoneAction" n'est pas documenté dans Doku.

_________________
mon site sur iclone https://sites.google.com/site/iclonefr/home


Ven 3 Nov 2017, 18:01
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 314
Localisation: Hauts de seine
Message Re: DAZ Scripting
Un complément sur les classes action puisque ce sont des classes. Il suffit de créer une instance par new Dz... pour s'apercevoir que le script s'exécute et ne proteste pas. Seul bémol, on ne connaîtra pas ni les propriétés ni les méthodes, quoi que j'ai trouvé un script qui renseigne en partie.

Un site qui donne une liste (non exhaustive) des actions avec ce qu'elles font: http://www.animavoid.net/blog/daz-script-dzaction-list/

J'ai vérifié depuis, on peut supprimer un os manuellement mais sous joint editor.

Quand je dis qu'on ne peut pas trouver de documentation, c'est partiellement inexact. On ne trouvera pas la définition de la classe avec ses propriétés et ses méthodes, mais on trouvera ce que fait l'action et son équivalent en manuel
exemple: http://docs.daz3d.com/doku.php/public/software/dazstudio/4/referenceguide/interface/action/index/dzjedeleteboneaction/start

Je pense que la liste du site asiatique n'est pas exhaustive car d'autres classes actions ont probablement été ajoutées depuis.

_________________
mon site sur iclone https://sites.google.com/site/iclonefr/home


Sam 4 Nov 2017, 07:32
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 314
Localisation: Hauts de seine
Message Re: DAZ Scripting
Bon, j'ai testé le script dans les exemples de doku et il n'a trouvé que 28 class action donc ce n'est pas le bon moyen.
Le script suivant
(function(){
var itemToCheck = DzJEDeleteBoneAction() ;

for ( var member in itemToCheck ) {
print ( member );
}
})();

permet d'avoir une vue des méthodes et des propriétés d'une classe (remplacer DzJEDeleteBoneAction par n'importe quel autre nom de classe).

On peut supposer que ces classes Action sont des DzActions. En comparant les résultats du script ci-dessus, on voit qu'effectivement une partie des méthodes est similaire. On voit surtout que les variables de retour des méthode qui sont détaillées dans Object Index concernant DzJEDeleteBoneAction ne sont pas révélées par le script alors qu'elles ont une importance capitale.
Peut-être que quelques actions ont des méthodes ou des constructeurs supplémentaires, mais les renseignements fournis par ObjectIndex sur DzAction permettent déjà de travailler dessus.

Le script ci-dessous vous permettra de voir les classes Action de DAZ 4.10 :
(function(){

// Get the action manager
var oActionMgr = MainWindow.getActionMgr();
// If we don't have an action manager
if( !oActionMgr ){
// We're done...
return "";
}


// Declare working variable
var oAction;
// Iterate over the actions
for( var i = 0, nActions = oActionMgr.getNumActions(); i < nActions; i += 1 ){
// Get the 'current' action
oAction = oActionMgr.getAction( i );
// If the label of the action does not match the one we're looking for

// Return the class name
debug(i+1+" nom de l'action: "+oAction.className());

}


// Finalize the function and invoke
})();

Nombre actuel 789 dont 8 pour dForce
Une recherche sur DOku montre que DzNewDForceWindNodeAction par exemple, n'est pas encore documentée.

_________________
mon site sur iclone https://sites.google.com/site/iclonefr/home


Sam 4 Nov 2017, 11:06
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 314
Localisation: Hauts de seine
Message Re: DAZ Scripting
J'ai récupéré un script qui permet de sélectionner un os d'un personnage dans une boite de dialogue et qui affiche l'os sélectionné. Le problème du script original est qu'il faut sélectionné manuellement le personnage dans scene sinon le Scene.getPrimarySelection() renvoie un null et le script se termine. C'est donc le cas pour celui qui suit. Ça explique comment récupérer un skeleton et les nodes qui vont avec. J'ai ajouté la partie qui sélectionne pour de vrai le bone à la fin (le programme original se contentait d'afficher que l'os était sélectionné sans vra.iment le faire). J'ai ajouté l'affichage d'un vecteur endpoint pour comparer avec ce que l'on affiche dans tools settings quand joint éditor est sélectionné.

La prochaine phase consistera à récréer un clone du squelette, ce qui passe par la suppression de la boite de dialogue et de l'instauration d'une boucle pour lire tous les os un par un pour recréer un squelette pour un vêtement. Dans l'idéal, il faut simultanément lire le squelette du vêtement pour corriger les valeurs et ajouter les os qui manque. A la fin, on sauvegarde le vêtement.

Je suis parti sur cette idée car quelques vêtements, faute d'avoir le squelette adéquat ne suivent pas correctement les poses du personnage.



//faute de savoir sélectionner automatiquement le personnage, le faire préalablement avant de lancer le script
// renvoie un DzNode de l'objet selectionne sinon null
var oNode = Scene.getPrimarySelection();
//test pour voir si non null
if( oNode ){
//DzBone herite de DzNode donc c'est peut-etre pour tester si le DzNode est un DzBone
if( oNode.inherits( "DzBone" ) ){
//get skeleton est cense renvoye un DzSkeleton qui herite aussi de DzNode
//le but du jeu est peut-etre de faire un cast et de récupérer le contenu
//des proprietes du DzNode
oNode = oNode.getSkeleton();
}
//on recupere tous les os dans un array
var aNodes = oNode.getAllBones();
//affiche le tableau qui contient effectivent des objets
debug (aNodes.toString());
//64 pour etre exact
debug(aNodes.length);
//unshift ajoute le squelette en tête du tableau
//le tableau passe donc a 65
print( aNodes.unshift( oNode ));
//ce qui est curieux, c'est que lenght ne genere pas de protestation
debug(aNodes.length);
//cree une boite de dialogue avec select a node comme titre
// avec tous les noeuds incorporant Victoria 4.2, none et bodyMorphs
var oDlg = new DzBasicDialog();
var sHelpTitle = qsTr("Select a Node");
var sHelpBody = qsTr("This is a basic dialog for requesting user input.");
oDlg.caption = sHelpTitle;
oDlg.toolTip = sHelpBody;
oDlg.whatsThis = String("<b>%1</b><br/><br/>%2").arg( sHelpTitle ).arg( sHelpBody );

var sEmpty = qsTr("None");

var oNodeCmbEdt = new DzComboEdit( oDlg );
oNodeCmbEdt.text = sEmpty;
oNodeCmbEdt.readOnly = true;
oNodeCmbEdt.addItems( [sEmpty, "-"] );
//incorpore tous les noeuds même un de trop pour V4.2
for( var i = 0; i < aNodes.length; i += 1 ){
oNodeCmbEdt.addItem( aNodes[i].getLabel() );
}
sHelpTitle = qsTr("Node Selector");
sHelpBody = qsTr("Click the arrow for options. Right click the field for additional options.");
oNodeCmbEdt.toolTip = sHelpBody;
oNodeCmbEdt.whatsThis = String("<b>%1</b><br/><br/>%2").arg( sHelpTitle ).arg( sHelpBody );
oDlg.addWidget( oNodeCmbEdt );

var oWidget = oDlg.getWidget();
oWidget.objectName = "DzComboEditExampleDlg";

var sizeHint = oWidget.minimumSizeHint;
var nHeight = sizeHint.height;

oDlg.setFixedHeight( nHeight );

if( oDlg.exec() ){
print( qsTr("Dialog accted.") );
if( oNodeCmbEdt.text == sEmpty ){
print( qsTr("None selected.") );
} else {
print( qsTr("Node selected:"), oNodeCmbEdt.text );
oNode.findBoneByLabel( oNodeCmbEdt.text ).select();
toto= oNode.findBoneByLabel( oNodeCmbEdt.text ).getEndPoint(true );
print("x"+toto.x);
print("y"+toto.y);
print("z"+toto.z);
}
} else {
print( qsTr("Dialog rejected.") );
}
}

_________________
mon site sur iclone https://sites.google.com/site/iclonefr/home


Sam 4 Nov 2017, 19:45
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 314
Localisation: Hauts de seine
Message Re: DAZ Scripting
debut d'ecriture du script


//L'idee de base vient de ce que je me suis aperçu que tous les vêtements
// ne suivaient pas correctement les poses d'un personnage
// Mes maigres recherches provisoires sur dForce m'ont fait m'apercevoir
// qu'il fallait que le vêtement devait disposer d'un squelette qui soit
// un clone de celui du personnage.
// De la l'idee de rectifier les squelettes de vêtements incomplets ou
// incorrects. Il est possible egalement ( je ne le saurai qu'une fois le
// script réalisé ) cela serve aussi à adapter des vetements d'une generation
// a une autre non prevue

// a partir de la, il faut reflechir a la maniere d'etablir le script
// sachant que j'ai deja realise des bribes permettant de selectionner
// un os particulier et d'acceder a ses donnees

// premiere chose a faire reussir a selectionner un personnage
// ou un vetement sans avoir a le faire manuellement

// un essai par telechargement de V4 m'affiche 207 nodes
// alors que la realite doit plutot etre 64//
// deduction: ce qui s'affiche dans scene ne correspond pas a
// la realite du nombre de nodes mais uniquement aux squelettes des
// objets et personnages. Dans le nombre de nodes s'ajoutent visiblement
// les morphs

//renseignement supplémentaire j'utilise Notepad++ pour ecrire les scripts
//L'editeur de script de DAZ Studio n'accepte pas certains signes et Notepad++
// permet en plus de vérifier à quel signe ouvrant correspond quel signe fermant

// Pour ne pas faillir aux bonnes habitudes je commence par crer une N
// anonyme [i]

(function(){
// je regarde les nodes dans la scene ce qui sous-entend que la scene doit se composer
// d'un personnage et d'un vetement
// Je choisis pour commencer K4 et Fairy dress. Fairy dress est un beau vêtement avec
// des os supplémentaires pour ajuster la robe. Très bien dans certains cas (donc il
// me faudra conserver cette version) mais si on donne à K4 une position assise, on
// voit tout de suite que ça ne va pas. Vu qu'il y a des os supplémentaires, cela
// veut dire qu'il me faudra également les supprimer

// Les deux personnages etant charges manuellement, il faut que le script puisse les
// selectionner automatiquement

var nNodes = Scene.getNumNodes();
// j'utilise debug plutot que print pour conserver un trace dans le fchier log si je plante DAZ
// Lorsque le script tournera il sera loisible de retirer les commentaires et les debugs
debug (nNodes);
//resultat 87
// on commence par récupérer le tableau des nodes
// plutot que d'utiliser Scene.getNumNodes(); pour obtenir le nombre de nodes
// on aurait pu egalement ecrire apres var listeNoeuds = Scene.getNodeList();
// var nNodes = listeNoeuds.length; ce qui revient au même
var listeNoeuds = Scene.getNodeList();

//un premier tour de boucle pour voir s'il y a autre chose que le personnage et le vêtement
for(var i=0;i<nNodes;i++){
if(listeNoeuds[i].getNodeParent() == null){
debug(listeNoeuds[i].assetId);
}
// Ca affiche blMilKid_k4b_68498 et SHKFG_Dress_17603
// donc on sait qu'on peut continuer le script sans problème. On doit aussi sauvegarder
// ces deux id pour plus tard et inclure un test pour s'il y avait d'autres elements
// en programmation il faut mieux tout prevoir l'avance
}
}
)();

_________________
mon site sur iclone https://sites.google.com/site/iclonefr/home


Dim 5 Nov 2017, 10:13
Profil
Afficher les messages depuis:  Trier par  
Publier un nouveau sujet Répondre au sujet  [ 45 messages ]  Aller à la page Précédent  1, 2, 3  Suivant


Qui est en ligne ?

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


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