3D-Diablotine.com
Nous sommes actuellement le Dim 19 Nov 2017, 15:11




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

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 306
Localisation: Hauts de seine
Message Re: DAZ Scripting
// A ce stade du script, je m'apercoit que le traitement d'un eventuel troisieme (voire plus)
// objets dans la scene doit generer un traitement particulier. Il va falloir que je demande a
// l'utilisateur de bien vouloir choisir dans une boite de dialogue un element a supprimer
// jusqu'à ce que je sois sur qu'il n'en reste plus que deux. Ca va nécessiter de creer une fonction
// qui sera appelee jusqu'à ce qu'il n'y ait plus que deux elements. J
(function(){

var nNodes = Scene.getNumNodes();
debug ("nombre de noeuds dans la scene "+nNodes);
var listeNoeuds = Scene.getNodeList();
var listeElements = new Array();

supprimeElement();
// il faut aussi penser au cas où l'utilisateur serait en dessous soit 0 ou 1
// ce qui implique de le signaler au script
if (listeNoeuds.length<2){
//TODO message box indiquant qu'il n'y a pas assez d'elements
debug("il doit y avoir un personnage et un vetement");
return;
}

function supprimeElement(){
var nElements =0

while(nElements !=2){
for(var i=0;i<nNodes;i++){
if(listeNoeuds[i].getNodeParent() == null){
listeElements.push(listeNoeuds[i].assetId);
debug("element de base: "+listeNoeuds[i].assetId);
// Ca affiche blMilKid_k4b_68498 et SHKFG_Dress_17603
nElements ++;
}
}/* fin du for */
//s'il y a plus de 2 elements
if (listeElements >2){
// TODO ici ecriture de la boite de dialogue qui permettra la suppression d'un element
// la boucle continuant tant que le nombre n'est pas deux
// il faudra aussi prevoir de vider le tableau puisqu'on recommencera a le remplir
// dans la boucle for
for(var j=0;j<listeElements.lenght;j++){
listElements[j].pop();
nElements = 0;
}
debug("vidage du tableau d'elements pour elements >2");
debug("longueur du tableau "+listeElements.length);
} /* fin du if element >2 */
// il faut aussi penser au cas où l'utilisateur serait en dessous soit 0 ou 1
// ce qui implique de le signaler au script
if (listeElements.length<2){
return;
} /*fin du if elements <2 */
}/* fin du while */

}/* fin fonction supprime elements */

// donc on sait qu'on peut continuer le script sans problème. On doit aussi sauvegarderr
// 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 blog sur iclone http://alinal.simplesite.com


Dim 5 Nov 2017, 18:59
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 306
Localisation: Hauts de seine
Message Re: DAZ Scripting
1/ j'ai rectifié une erreur de détection de moins de 2 objets dans la scène. Désormais la détection est correcte
2/ Je suis obligé de mettre plein de debugs pour comprendre le fonctionnement de certaines méthodes. C'est ainsi que cette partie de mon script:

oVetement.select(true);
oPersonnage.select(false);
debug("nombre d'elements de generation 4: "+listeOsGeneration4.length);
debug("tableauVetement0 : "+tableauVetement[0].assetId);
for(var i =0;i<listeOsGeneration4.length;i++){
if(tableauVetement[0].findNodeChild(listeOsGeneration4[i], true) != null){
debug (i+ ": "+listeOsGeneration4[i] );
}
else{//donc si null
debug("mal orthographié: "+listeOsGeneration4[i] );
}
}

m'a permis de comprendre que la méthode find de DzNode était récursive, donc balayait tout le squelette, que l'ajout de tableauVetement.unshift(oVetement); était indispensable sinon hip n'était pas vu. Enfin, cette boucle a l'utilité de vérifier l'orthographe des os puisqu'il y a deux solutions pour vérifier l'intégralité du squelette, sachant qu'en plus il est différent pour chaque génération: un tableau de String avec le nom des os ou justement la méthode findNodeChild. On peut tout à fait envisager dans le futur une boite de dialogue qui permette le choix entre les différentes générations

Ce script, comme les précédents est capable de tourner dans le plugin ScriptIDE. Avant de le faire tourner, il faut charger "the kid 4" sans morphs et un vêtement prévu pour K4.

// A ce stade du script, je m'apercoit que le traitement d'un eventuel troisieme (voire plus)
// objets dans la scene doit generer un traitement particulier. Il va falloir que je demande a
// l'utilisateur de bien vouloir choisir dans une boite de dialogue un element a supprimer
// jusqu'à ce que je sois sur qu'il n'en reste plus que deux. Ca va nécessiter de creer une fonction
// qui sera appelee jusqu'à ce qu'il n'y ait plus que deux elements. J
(function(){

var nNodes = Scene.getNumNodes();
debug ("nombre de noeuds dans la scene "+nNodes);
var listeNoeuds = Scene.getNodeList();
var listeElements = new Array();
var listeOsGeneration4 =["hip","abdomen","chest","neck","head","eyeBrow","rEye","lEye","upperJaw","lowerJaw",
"tongueBase","tongue01","tongue02","tongue03","tongue04","tongue05","tongueTip",
"rCollar","rShldr","rForeArm","rHand","rThumb1","rThumb2","rThumb3","rIndex1",
"rIndex2","rIndex3","rMid1","rMid2","rMid3","rRing1","rRing2","rRing3","rPinky1",
"rPinky2","rPinky3","lCollar","lShldr","lForeArm","lHand","lThumb1","lThumb2","lThumb3",
"lIndex1","lIndex2","lIndex3","lMid1","lMid2","lMid3","lRing1","lRing2","lRing3","lPinky1",
"lPinky2","lPinky3","rThigh","rShin","rFoot","rToe","lThigh","lShin","lFoot","lToe"];
var nElements =0;

supprimeElement();
// il faut aussi penser au cas où l'utilisateur serait en dessous soit 0 ou 1
// ce qui implique de le signaler au script
debug("nombre de noeuds après supprimeElement"+listeNoeuds.length);
if (nElements<2){
//TODO message box indiquant qu'il n'y a pas assez d'elements
debug("il doit y avoir un personnage et un vetement");
return;
}
// ici on doit avoir le tableau listeElements qui doit être rempli avec les noms de base du personnage
// et du vetement
// on ne sait pas si le vetement est en premier ou en second
// TODO gestion des personnages ou demander a l'utilisateur de charger imperativement
// le personnage en premier
var oVetement =listeElements.pop();
var oPersonnage =listeElements.pop();
debug("vetement: "+oVetement.assetId);
debug ("personnage: "+oPersonnage.assetId);

// On doit commencer par supprimer les os du vetement qui ne servent a rien
// pour cela il faut recuperer les squelettes
oPersonnage.select(true);
if( oPersonnage){
if( oPersonnage.inherits( "DzBone" ) ){
oPersonnage = oPersonnage.getSkeleton();
}
}
oVetement.select(true);
if( oVetement ){
if( oVetement.inherits( "DzBone" ) ){
oVetement = oVetement.getSkeleton();
}
}
//on recupere tous les os dans un array
//les os du personnage et du vetement sont donc separes, mais en plus on est certain que ce sont des DzBone
var tableauVetement = oVetement.getAllBones();
var tableauPersonnage = oPersonnage.getAllBones();
debug("tableauVetement: "+tableauVetement.length);
debug("tableauPersonnage: "+tableauPersonnage.length);
tableauVetement.unshift(oVetement);
tableauPersonnage.unshift(oPersonnage);
//balayage du tableau des os du vetement pour verifier correspondance avec personnage
for(var i=0; i<tableauVetement.length;i++){
// on voit que l'id est le nom du bone genre hip, head, etc
debug(tableauVetement[i].assetId);
//on recupere cet id
// inutile de faire un pop qui obligerait a faire un traitement complique
// autant refaire un getAllBones apres destruction des os inutiles
// comme je ne suis pas sur des fonctions de recherches dans la hiérarchie
// puisque le vetement et le personnage ont une hierarchie similaire
// et qu'il n'est pas question de selectionner/deselectionner sans arret
}
//TODO Juste pour vérifier
oVetement.select(false);
oPersonnage.select(true);
debug("nombre d'elements de generation 4: "+listeOsGeneration4.length);
for(var i =0;i<listeOsGeneration4.length;i++){
if(tableauPersonnage[0].findNodeChild(listeOsGeneration4[i], true) != null){
debug (i+ ": "+listeOsGeneration4[i] );
}
else{//donc si null
debug("mal orthographié: "+listeOsGeneration4[i] );
}
}
oVetement.select(true);
oPersonnage.select(false);
debug("nombre d'elements de generation 4: "+listeOsGeneration4.length);
debug("tableauVetement0 : "+tableauVetement[0].assetId);
for(var i =0;i<listeOsGeneration4.length;i++){
if(tableauVetement[0].findNodeChild(listeOsGeneration4[i], true) != null){
debug (i+ ": "+listeOsGeneration4[i] );
}
else{//donc si null
debug("mal orthographié: "+listeOsGeneration4[i] );
}
}

function supprimeElement(){

while(nElements !=2){
for(var i=0;i<nNodes;i++){
if(listeNoeuds[i].getNodeParent() == null){
listeElements.push(listeNoeuds[i]);
debug("element de base: "+listeNoeuds[i].assetId);
// Ca affiche blMilKid_k4b_68498 et SHKFG_Dress_17603
nElements ++;
}
}/* fin du for */
//s'il y a plus de 2 elements
if (nElements>2){
// TODO ici ecriture de la boite de dialogue qui permettra la suppression d'un element
// la boucle continuant tant que le nombre n'est pas deux
// il faudra aussi prevoir de vider le tableau puisqu'on recommencera a le remplir
// dans la boucle
for(var j=0;j<listeElements.lenght;j++){
listElements[j].pop();
nElements = 0;
}
debug("vidage du tableau d'elements pour elements >2");
debug("longueur du tableau "+listeElements.length);
} /* fin du if element >2 */
// il faut aussi penser au cas où l'utilisateur serait en dessous soit 0 ou 1
// ce qui implique de le signaler au script
if (nElements<2){
return;
} /*fin du if elements <2 */
}/* fin du while */

}/* fin fonction supprime elements */

// donc on sait qu'on peut continuer le script sans problème. On doit aussi sauvegarderr
// 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 blog sur iclone http://alinal.simplesite.com


Lun 6 Nov 2017, 11:43
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 306
Localisation: Hauts de seine
Message Re: DAZ Scripting
Quoi de neuf aujourd'hui?
- La suppression des os inutiles (différents de ceux du personnage) fonctionne
- J'arrive à récupérer les valeurs (que j'ai comparées en manuel bien sûr) d'un os (donc ça devrait marcher pour les autres dans une boucle). Par contre, ne trouvant pas de méthode pour récupérer les valeurs x,y,z de la
rotation (j'ai essayé la totalité des méthodes disponibles), je suis passé par une méthode indirecte qui consiste à interroger la valeur des sliders concernant l'orinetation
Le but du jeu est de récupérer les valeurs de l'os de personnage et de les appliquer à l'os équivalent du vêtement (qu'on recréera si nécessaire).


(function(){

var nNodes = Scene.getNumNodes();
debug ("nombre de noeuds dans la scene "+nNodes);
var listeNoeuds = Scene.getNodeList();
var listeElements = new Array();
var listeOsGeneration4 =["hip","abdomen","chest","neck","head","eyeBrow","rEye","lEye","upperJaw","lowerJaw",
"tongueBase","tongue01","tongue02","tongue03","tongue04","tongue05","tongueTip",
"rCollar","rShldr","rForeArm","rHand","rThumb1","rThumb2","rThumb3","rIndex1",
"rIndex2","rIndex3","rMid1","rMid2","rMid3","rRing1","rRing2","rRing3","rPinky1","rPinky2",
"rPinky3","lCollar","lShldr","lForeArm","lHand","lThumb1","lThumb2","lThumb3","lIndex1",
"lIndex2","lIndex3","lMid1","lMid2","lMid3","lRing1","lRing2","lRing3","lPinky1","lPinky2",
"lPinky3","rThigh","rShin","rFoot","rToe","lThigh","lShin","lFoot","lToe"];
var nElements =0;
var osEnCours="";//type string
var oActionMgr = MainWindow.getActionMgr();
var oAction = oActionMgr.findAction("DzJEDeleteBoneAction");
// fonction pour detecter si les elements sont inferieurs ou superieurs à 2 et faire le necessaire
supprimeElement();
// il faut aussi penser au cas où l'utilisateur serait en dessous soit 0 ou 1
// ce qui implique de le signaler au script
debug("nombre de noeuds après supprimeElement"+listeNoeuds.length);
if (nElements<2){
//TODO message box indiquant qu'il n'y a pas assez d'elements et qu'on sort
debug("il doit y avoir un personnage et un vetement");
return;
}
// ici on doit avoir le tableau listeElements qui doit être rempli avec les noms de base du personnage
// et du vetement
// on ne sait pas si le vetement est en premier ou en second
// TODO gestion des personnages ou demander a l'utilisateur de charger imperativement
// le personnage en premier

//récupération des noms du personnage et du vetement
var oVetement =listeElements.pop();
var oPersonnage =listeElements.pop();
debug("vetement: "+oVetement.assetId);
debug ("personnage: "+oPersonnage.assetId);

// On doit commencer par supprimer les os du vetement qui ne servent a rien
// pour cela il faut recuperer les squelettes
oPersonnage.select(true);
oVetement.select(false);
if( oPersonnage){
if( oPersonnage.inherits( "DzBone" ) ){
oPersonnage = oPersonnage.getSkeleton();
}
}
oVetement.select(true);
oPersonnage.select(false);
if( oVetement ){
if( oVetement.inherits( "DzBone" ) ){
oVetement = oVetement.getSkeleton();
}
}
//on recupere tous les os dans un array
//les os du personnage et du vetement sont donc separes, mais en plus on est certain que ce sont des DzBone
var tableauVetement = oVetement.getAllBones();
var tableauPersonnage = oPersonnage.getAllBones();
//on ajoute le nom du squelette aux os
tableauVetement.unshift(oVetement);
tableauPersonnage.unshift(oPersonnage);
debug("tableauVetement: "+tableauVetement.length);
debug("tableauPersonnage: "+tableauPersonnage.length);

//la partie en commentaires sert a verifier que le tableau des os est bien orthographie
//oVetement.select(false);
//oPersonnage.select(true);
//debug("nombre d'elements de generation 4: "+listeOsGeneration4.length);
//for(var i =0;i<listeOsGeneration4.length;i++){
//if(tableauPersonnage[0].findNodeChild(listeOsGeneration4[i], true) != null){
//debug (i+ ": "+listeOsGeneration4[i] );
//}
//else{//donc si null
//debug("mal orthographié: "+listeOsGeneration4[i] );
//}
//}
//oVetement.select(true);
//oPersonnage.select(false);
//debug("nombre d'elements de generation 4: "+listeOsGeneration4.length);
//debug("tableauVetement0 : "+tableauVetement[0].assetId);
//for(var i =0;i<listeOsGeneration4.length;i++){
//if(tableauVetement[0].findNodeChild(listeOsGeneration4[i], true) != null){
//debug (i+ ": "+listeOsGeneration4[i] );
//}
//else{//donc si null
//debug("mal orthographié: "+listeOsGeneration4[i] );
//}
// on commence a l'indice 1 puisque l'indice 0 est le nom du squelette
for(var i =1;i<tableauVetement.length;i++){
osEnCours = tableauVetement[i].assetId;
//debug ("os en cours: "+osEnCours);
if(tableauPersonnage[0].findNodeChild(osEnCours, true) != null){
debug ("os connu: "+osEnCours);
}
else{//donc si null
debug("os a detruire: "+osEnCours);
tableauVetement[i].select(true);
if( oAction ){
oAction.trigger();
}//fin du if oAction

}//fin du else
}//fin du for
//a ce stade, les os en plus sont supprimés, il faut donc refabriquer le tableauVetement
oVetement.select(true);
oPersonnage.select(false);
if( oVetement ){
if( oVetement.inherits( "DzBone" ) ){
oVetement = oVetement.getSkeleton();
}
}
tableauVetement = oVetement.getAllBones();
tableauVetement.unshift(oVetement);
//debug("tableauVetement: "+tableauVetement.length);
//for(var i=0;i<tableauVetement.length;i++){
// debug(tableauVetement[i].assetId);
// }
// a ce stade, il faut refabriquer un squelette
osEnCours = listeOsGeneration4[0];
debug("osEnCours "+osEnCours);

//pour comparer avec le manuel, il faut commencer par recupérer le rotation order
var rotationOrder = tableauPersonnage[i].getRotationOrder();

debug("rotationOrder "+ rotationOrder);
//if(tableauPersonnage[0].findNodeChild(osEnCours, true) != null){
//debug ("os connu: "+osEnCours);
//}
//else{//donc si null
//debug("probleme");
//}
//tableauPersonnage[1].select(true);


// for mis en commentaire provisoirement
//for(var i=1;i<listeOsGeneration4.length;i++){
debug (" os en cours: "+listeOsGeneration4[i]);
//la il va falloir debugguer a fond
vec3OriginPoint= tableauPersonnage[1].getOrigin(true);
debug("vec3OriginPoint.x "+ vec3OriginPoint.x);
debug("vec3OriginPoint.y "+ vec3OriginPoint.y);
debug("vec3OriginPoint.z "+ vec3OriginPoint.z);


vec3EndPoint = tableauPersonnage[1].getEndPoint(true);
debug("vec3EndPoint.x: " +vec3EndPoint.x);
debug("vec3EndPoint.y: " +vec3EndPoint.y);
debug("vec3EndPoint.z: " +vec3EndPoint.z);


debug("X rotation : "+tableauPersonnage[1].getOrientXControl().getDefaultValue());
debug("Y rotation : "+tableauPersonnage[1].getOrientYControl().getDefaultValue());
debug("Z rotation : "+tableauPersonnage[1].getOrientZControl().getDefaultValue());
//}//fin du for

function supprimeElement(){

while(nElements !=2){
for(var i=0;i<nNodes;i++){
if(listeNoeuds[i].getNodeParent() == null){
listeElements.push(listeNoeuds[i]);
debug("element de base: "+listeNoeuds[i].assetId);
// Ca affiche blMilKid_k4b_68498 et SHKFG_Dress_17603
nElements ++;
}//fin du if
}// fin du for
//s'il y a plus de 2 elements
if (nElements>2){
// TODO ici ecriture de la boite de dialogue qui permettra la suppression d'un element
// la boucle continuant tant que le nombre n'est pas deux
// il faudra aussi prevoir de vider le tableau puisqu'on recommencera a le remplir
// dans la boucle
for(var j=0;j<listeElements.lenght;j++){
listElements[j].pop();
nElements = 0;
}
debug("vidage du tableau d'elements pour elements >2");
debug("longueur du tableau "+listeElements.length);
} // fin du if element >2
// il faut aussi penser au cas où l'utilisateur serait en dessous soit 0 ou 1
// ce qui implique de le signaler au script
if (nElements<2){
return;
} //fin du if elements <2
}// fin du while

}// fin fonction supprime elements

// donc on sait qu'on peut continuer le script sans problème. On doit aussi sauvegarderr
// 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 blog sur iclone http://alinal.simplesite.com


Dernière édition par la_saucisse le Mar 7 Nov 2017, 18:52, édité 2 fois au total.

ajout de saut de lignes dans le code



Mar 7 Nov 2017, 10:58
Profil
Administrateur
Administrateur
Avatar de l’utilisateur

Inscrit le: Lun 26 Mai 2008, 16:38
Messages: 12706
Localisation: Isère - Jura
Message Re: DAZ Scripting
c'est plutôt indigeste à lire... pas sur le fond, mais sur la forme !!! :-?

alinal, si tu veux inciter les gens à lire et essayer ce que tu proposes, tu devrais essayer la balise CODE : ça te permettrait d'alterner les commentaires et le code lui-même, et d'afficher tout ça de façon beaucoup plus lisible !

ce qui donne, en reprenant un extrait de ton message précédent :

Code:
var nElements =0;
var osEnCours="";//type string
var oActionMgr = MainWindow.getActionMgr();
var oAction = oActionMgr.findAction("DzJEDeleteBoneAction");


fonction pour detecter si les elements sont inferieurs ou superieurs à 2 et faire le necessaire
Code:
supprimeElement();


il faut aussi penser au cas où l'utilisateur serait en dessous soit 0 ou 1
ce qui implique de le signaler au script
Code:
debug("nombre de noeuds après supprimeElement"+listeNoeuds.length);
if (nElements<2){
//TODO message box indiquant qu'il n'y a pas assez d'elements et qu'on sort
debug("il doit y avoir un personnage et un vetement");
return;
}


;-)

_________________
Image     Image
Image  Image


Mar 7 Nov 2017, 18:46
Profil Site Internet
Administrateur
Administrateur
Avatar de l’utilisateur

Inscrit le: Lun 26 Mai 2008, 16:38
Messages: 12706
Localisation: Isère - Jura
Message Re: DAZ Scripting
j'ai édité tes 2 messages précédents : les chaînes de caractères trop longues sans le moindre espace (la variable listeOsGeneration4 par exemple) rendent la lecture du forum pénible, avec une largeur de page beaucoup trop grande.

diagnostic : à partir du moment où le message affiché génère un ascenseur horizontal dans la fenêtre du navigateur, c'est que c'est trop large !

solution : il faut insérer des sauts de ligne manuels à chaque fin de ligne dans la fenêtre de saisie (et tant pis pour le code)

:arrow: en plus de la balise code, merci de faire attention à ça et d'insérer des espaces et/ou des sauts de ligne pour faciliter la lecture

par avance merci ;-)

_________________
Image     Image
Image  Image


Mar 7 Nov 2017, 18:51
Profil Site Internet
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 306
Localisation: Hauts de seine
Message Re: DAZ Scripting
Au stade où on en est,et vu que c'est effectivement un peu aride, je pense que je vais peut-être continuer le script et ne le proposer que si et quand il sera fini. Je crois que le scripting n'intéresse pas grand monde et en plus DAZ n'a pas fait beaucoup d'efforts pour documenter ses classes. Je perds beaucoup de temps à les tester pour obtenir ce que je veux.

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


Mar 7 Nov 2017, 20:27
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 306
Localisation: Hauts de seine
Message Re: DAZ Scripting
Vu que le format d'écriture des scripts (tableaux trop longs, etc) ne correspond pas à l'affichage du forum et que le sujet est peut-être un peu aride pour attirer grand-monde, je propose à ceux qui seraient intéressés de me contacter par MP pour la suite du script.

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


Mer 8 Nov 2017, 08:38
Profil
Administrateur
Administrateur
Avatar de l’utilisateur

Inscrit le: Lun 26 Mai 2008, 16:38
Messages: 12706
Localisation: Isère - Jura
Message Re: DAZ Scripting
comme tu veux, mais si tu veux continuer ici, pas de problème ;-)

pour la mise en page, pour éviter de "pourrir" l'affichage, puisque le scripting DAZ semble être basé sur du Javascript, sache qu'il autorise les sauts de ligne dans le code source.

il suffit pour cela ajouter un espace suivi d'un symbole +
ensuite, tu peux faire le saut de ligne dans ton éditeur.

ce qui donne par exemple :

Code:
// exemple 1
alert("123" +
      "456" +
      "789");
   
// exemple 2
$tableau = ["1","2","3","4","5", +
            "6","7","6","9","10"];
alert($tableau.length);   

l'exemple 1 étale la chaîne de caractère sur 3 lignes, mais affichera bien "123456789".

l'exemple 2 définit un tableau de 10 éléments sur 2 lignes ; pour vérifier la validité du tableau, l'alerte qui suit affichera bien "10" (le nombre d'éléments)

c'est une petite habitude à prendre, qui permet d'avoir un code plus lisible, et surtout maintient le code fonctionnel ! (alors que le saut de ligne comme je l'ai fait risque de planter le script en cas de copier/coller)

_________________
Image     Image
Image  Image


Jeu 9 Nov 2017, 22:50
Profil Site Internet
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 306
Localisation: Hauts de seine
Message Re: DAZ Scripting
Je vais essayer. Je ne suis pas là ce matin et le week-end arrive, donc je ne sais pas quand je m'occuperais de remanier le code. J'ignorais cette particularité du javascript. Le concept de classes et de programmation objet n'est pas un problème. J'ai travaillé en C++ et en Java. Par contre, les subtilités consistant à mettre des caractères spéciaux pour formater une chaine, c'est autre chose.

J'ai réussi à créer le squelette complet, et aussi, dans un autre script totalement différent, les deux os qui m'intéressaient rThigh et lThigh mais il y a encore un truc qui m'échappe, c'est l'action sur le vêtement. J'ai découvert pas mal de choses mais je suis obligé de tester de nombreuses méthodes pour savoir ce qu'elles font. Il y a aussi des découvertes que j'ai fait par hasard, on en reparlera.

Deux handicaps: classes mal ou pas documentées, et tout en anglais y compris les forums de DAZ.

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


Ven 10 Nov 2017, 07:48
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 306
Localisation: Hauts de seine
Message Re: DAZ Scripting
J'ai réalisé une autre version mais celle-ci m'a permis de comprendre quelques méthodes de DzNode.
Code:
(function(){

var nNodes = Scene.getNumNodes();
debug ("ligne 4 nombre de noeuds dans la scene "+nNodes);
var listeNoeuds = Scene.getNodeList();
var listeElements = new Array();
var listeOsGeneration4 =["hip","abdomen","chest","neck","head","eyeBrow","rEye",+
"lEye","upperJaw","lowerJaw","tongueBase","tongue01","tongue02","tongue03",+
"tongue04","tongue05","tongueTip","rCollar","rShldr","rForeArm","rHand","rThumb1",+
"rThumb2","rThumb3","rIndex1","rIndex2","rIndex3","rMid1","rMid2","rMid3","rRing1",+
"rRing2","rRing3","rPinky1","rPinky2","rPinky3","lCollar","lShldr","lForeArm","lHand",+
"lThumb1","lThumb2","lThumb3","lIndex1","lIndex2","lIndex3","lMid1","lMid2","lMid3",+
"lRing1","lRing2","lRing3","lPinky1","lPinky2","lPinky3","rThigh","rShin","rFoot",+
"rToe","lThigh","lShin","lFoot","lToe"];
var nElements =0;
var osEnCours="";
var rotationX = new Number();

var rotationY = new Number();
var rotationZ = new Number();
var osVetement = new DzBone();
var osVetementPrecedent;
var rotationOrder = new DzRotationOrder();
var osPersonnage = new DzNode();
var pere = new DzNode()
var vec3Rotation = new DzVec3();
var oActionMgr = MainWindow.getActionMgr();
var objet = new DzObject();
var oAction=oActionMgr.findAction("DzJECreateBoneAction");


Vu que j'ai recopié des parties entières du code du premier script, il est possible que certaines déclarations de variable ne servent à rien.
Le script est englobé dans une fonction anonyme, ce qui devrait l'empêcher de perturber le reste. En fait, vu que je ne respecte pas les conventions d'écriture pour les variables et qu'il y a fort peut de chance pour que mes variables françaises entrent en conflit avec les variables américaines, j'ai aussi une autre explication. Il est possible qu'en dehors d'une fonction anonymes celles-ci continuent à occuper de la mémoire une fois le script terminé.
Code:
for(var i=0;i<nNodes;i++){
   debug("ligne 32 noeud: "+listeNoeuds[i].assetId+" "+i);
}


Rappel debug écrit en bas du scriptIDE et dans le fichier log (ça peut être utile quand on teste sans savoir qu'on va provoquer l'arrêt de DAZ Studio
Le code ci-dessus permet de lire tous les noeuds de ce que la scène contient. Avec K4 on a une hiérarchie invisible de quelques noeuds. Pour V4, c'est encore pire
ListeNoeud ne s'est pas rempli par hasard. J'avais fait suivre sa déclaration directement par la fonction qui remplit le tableau.
A Noter parce que c'est important: j'ai parenté la robe à K4 parce que cela refusait de le faire dans le script totalement automatique (celui-ci est semi-automatique). Je suppose que c'est du au fait que j'ai ajouté une série d'os qui sont indépendants dans la mesure où ceux-ci ne suivent pas les mouvements d'une pose qu'on leur impose.

La suite plus tard

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


Ven 10 Nov 2017, 17:06
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 306
Localisation: Hauts de seine
Message Re: DAZ Scripting
Code:
for(var i=0;i<nNodes;i++){
   if(listeNoeuds[i].getNodeParent() == null){
   listeElements.push(listeNoeuds[i]);                                                                                                                               
        debug("ligne 27 element de base: "+listeNoeuds[i].assetId);
   nElements ++;
   }
}


Les noeuds qui n'ont pas de parent sont les noeuds de base: le personnage et la robe l'aurait été si je ne l'avais pas parentée avec le personnage, autre: bodyMorphs que je laisse car les morphs sont un plus. De même, je n'ai pas, dans ce script, supprimé les os supplémentaires de la robe qui correspondent aussi à des morphs.

la suite plus tard

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


Ven 10 Nov 2017, 17:50
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 306
Localisation: Hauts de seine
Message Re: DAZ Scripting
Code:
oAction=oActionMgr.findAction("DzJointEditorToolAction");
oAction.trigger();
listeNoeuds[70].select(true);
oAction=oActionMgr.findAction("DzJECreateBoneAction");
oAction.trigger();
listeNoeuds[70].select(true);
oAction.trigger();
nNodes = Scene.getNumNodes();
debug("ligne 41 nouveau nombre de noeuds: "+nNodes);


Au lieu de passer par addNodeChild comme dans l'autre script que nous verrons plus tard, je suis passé par les classes Action dont j'ai déjà parlé. Ces classes sont en fait celles qui gèrent DAZ Studio.
Pourquoi j'ai ajouté DzJointEditorToolAction? Simplement parce que j'ai constaté que si on était dans un autre mode le script ne marchait plus
Vu que c'est un script de test, je sais que le "hip" de la robe se situe à l'indice 70. J'ai constaté que lorsqu'on créé un nouvel os, celui-ci se met en fin de liste. L'action DzJECreateBoneAction fait apparaitre une boite de dialogue demandant le nom à donner à l'os, son Label et l'ordre de rotation. Puisque je veux un os semblable à celui du personnage, j'ai relevé quel était le sien pour le rThigh que je veux créer pour la robe.
C'est pour cela que je qualifie ce script de semi-automatique.
Dans le script, il faut re-sélectionner le hip de la robe. Après la création d'un os, celui-ci est automatiquement sélectionné. Donc si je ne re-sélectionne pas le hip de la robe, la seconde action DzJECreateBoneActionconsidérera que je veux créer un fils à l'os rThigh que je viens de créer.

Code:
//refaire la liste de nodes
listeNoeuds = Scene.getNodeList();
for(var i=0;i<nNodes;i++){
   if(listeNoeuds[i].getNodeParent() == null){
   listeElements.push(listeNoeuds[i]);                                                                                                                               {}
   debug("ligne 27 element de base: "+listeNoeuds[i].assetId);
   }
}

Forcèment, il faut remettre la liste de noeuds à jour. Les deux nouveaux os ne sont pas dans le tableau.
Code:
for(var i=0;i<nNodes;i++){
   debug("ligne 32 noeud: "+listeNoeuds[i].assetId+" "+i);
   
}

réaffichage de la liste des noeuds
Code:
vec3OriginPoint= listeNoeuds[56].getOrigin(true);
debug("ligne 117 vec3OriginPoint.x "+ vec3OriginPoint.x);
debug("ligne 118 vec3OriginPoint.y "+ vec3OriginPoint.y);
debug("ligne 119 vec3OriginPoint.z "+ vec3OriginPoint.z);


vec3EndPoint = listeNoeuds[56].getEndPoint(true);
debug("ligne 123 vec3EndPoint.x: " +vec3EndPoint.x);
debug("ligne 124 vec3EndPoint.y: " +vec3EndPoint.y);
debug("ligne 125 vec3EndPoint.z: " +vec3EndPoint.z);

rotationX = listeNoeuds[56].getOrientXControl().getDefaultValue();
rotationY = listeNoeuds[56].getOrientYControl().getDefaultValue();
rotationZ = listeNoeuds[56].getOrientZControl().getDefaultValue();

debug("ligne 131 X rotation : "+rotationX);
debug("ligne 132 Y rotation : "+rotationY);
debug("ligne 133 Z rotation : "+rotationZ);

vec3Rotation.x=rotationX;
vec3Rotation.y=rotationY;
vec3Rotation.z=rotationZ;
listeNoeuds[87].setEndPoint(vec3EndPoint,true);
listeNoeuds[87].setOrigin(vec3OriginPoint,true);
listeNoeuds[87].setInheritScale(true);
listeNoeuds[87].setOrientationAngles(vec3Rotation,true);

vec3OriginPoint= listeNoeuds[60].getOrigin(true);
debug("ligne 117 vec3OriginPoint.x "+ vec3OriginPoint.x);
debug("ligne 118 vec3OriginPoint.y "+ vec3OriginPoint.y);
debug("ligne 119 vec3OriginPoint.z "+ vec3OriginPoint.z);


vec3EndPoint = listeNoeuds[60].getEndPoint(true);
debug("ligne 123 vec3EndPoint.x: " +vec3EndPoint.x);
debug("ligne 124 vec3EndPoint.y: " +vec3EndPoint.y);
debug("ligne 125 vec3EndPoint.z: " +vec3EndPoint.z);

rotationX = listeNoeuds[60].getOrientXControl().getDefaultValue();
rotationY = listeNoeuds[60].getOrientYControl().getDefaultValue();
rotationZ = listeNoeuds[60].getOrientZControl().getDefaultValue();

debug("ligne 131 X rotation : "+rotationX);
debug("ligne 132 Y rotation : "+rotationY);
debug("ligne 133 Z rotation : "+rotationZ);

vec3Rotation.x=rotationX;
vec3Rotation.y=rotationY;
vec3Rotation.z=rotationZ;
listeNoeuds[88].setEndPoint(vec3EndPoint,true);
listeNoeuds[88].setOrigin(vec3OriginPoint,true);
listeNoeuds[88].setInheritScale(true);
listeNoeuds[88].setOrientationAngles(vec3Rotation,true);


})();

et copie des valeurs relevées pour l'os équivalent du personnage pour rThigh et lThigh.
Fin du script pour l'instant. Les nouveaux os sont bien manipulables dans parameters mais ils ne suivent pas les autres lorsqu'on assigne une pose à l'ensemble personnage + robe. Il faut donc que je teste la presqu'intégralité des méthodes de la classe DzNode pour voir où se situe la différence. Mais, ce n'est pas pour tout de suite.

Là, j'ai utilisé les indices parce qu'il y a deux hips dans la hiérarchie du personnage: celui du personnage lui-même et celui de la robe. La robe étant parentée, il n'y a plus qu'un seul skeleton. A noter que getSkeleton remonte toute la hiérarchie pour retrouver le skeleton, donc on peut faire la demande sur n'importe quel noeud. S'il y a plusieurs personnages ou objets non parentés, ça complique un peu. Pour retrouver facilement le hip de la robe, la bonne solution était de le renommer.

Dans l'autre script, c'est plus automatisé et on n'a pas besoin de rentrer manuellement le nom et le label du nouvel os, ni l'ordre de rotation. Le problème de forcer en mode joint editor doit également se poser. Je le laisse de côté tant que je n'ai pas résolu le problème de conformité avec une pose.

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


Ven 10 Nov 2017, 18:36
Profil
Administrateur
Administrateur
Avatar de l’utilisateur

Inscrit le: Lun 26 Mai 2008, 16:38
Messages: 12706
Localisation: Isère - Jura
Message Re: DAZ Scripting
c'est carrément plus agréable à lire comme ça, merci de tes efforts ;-)

_________________
Image     Image
Image  Image


Sam 11 Nov 2017, 13:22
Profil Site Internet
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 306
Localisation: Hauts de seine
Message Re: DAZ Scripting
Mais je crois que je ne pourrai pas aller plus loin. J'ai découvert une classe DzBoneBinding non documenté ni dans les classes Action, ni dans le sdk, ni le Object Index.

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


Sam 11 Nov 2017, 14:01
Profil
Moyen Diablotin(ine)
Moyen Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 306
Localisation: Hauts de seine
Message Re: DAZ Scripting
J'ai quand même fait des recherches sur le forum DAZ. J'ai trouvé ceci:
Citer:
Vraisemblablement, DzWeightMap.setWeight (int, short) est privé ou protégé dans l'environnement DazScript. Sans pouvoir définir les valeurs dans un DzWeightMap, je n'ai pas pu voir comment lier les os à la géométrie. Il me semble que c'était un oubli et devrait probablement
être adressé dans une prochaine version. Sans cela, les gens ne seront pas capables de créer des personnages désossés / skinnés à partir de DazScript à moins de faire la solution de contournement de mon plugin.


Outre ses procédés commerciaux tordus et ses plugins rachetés à des particuliers et truffés de bugs, DAZ ne joue pas vraiment la transparence pour aider à la programmation. Certaines pages d'aide n'existent plus ou répondent "permission denied". Il est peut-être possible d'aller plus loin en jetant un oeil sur la documentation de DAZ3
http://docs.daz3d.com/lib/exe/fetch.php/public/software/dazstudio/3/ds3_daz_script_development_kit_3.0.1.144_docs.zip où j'ai trouvé des traces de la classe DzBoneBinding. Je testerai plus tard s'il est possible d'utiliser les exemples relevés dans le forum DAZ dans un script. Je soupçonne également qu'une autre solution soit de passer par les classes "action".

Pour l'heure, je souhaite me pencher sur le nouveau plugin dForce. Iclone sait faire ce genre de choses depuis la version 6, mais iClone a aussi des défauts. Exemple: l'import de personnages DAZ se fait avec une telle réduction de polygones que l'on voit un défaut au niveau des jointures.

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


Dim 12 Nov 2017, 09:30
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


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:  

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