3D-Diablotine.com
Nous sommes actuellement le Mar 25 Sep 2018, 04:23




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

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 504
Localisation: Hauts de seine
Message Re: DAZ Scripting
Le script ci-dessous mériterait d'être remanié, D'abord parce qu'il ne fait pas de vérification, Ensuite parce que forcément getSelectedNodeList renvoie des nodes et pas des bones. Vous pouvez vous baser sur le précédent pour ajouter des garde-fous.

Qu'est-ce que fait ce script? Il verrouille les valeurs de Translate et de Rotate XYZ, ce qui évite de les modifier par erreur. Pour tout verrouiller d'un coup: aller dans scene, cliquez sur le premier node de votre scene et faire expand all. Sélectionner tout les nodes avec select/select all (bouton droit de la souris). Lancez le script, tous les réglages sont verrouillés.
Un autre script pour tout déverouiller d'un coup est de remplacer les lock (true) par des lock (false)
Code:
// DAZ Studio version 4.10.0.123 filetype DAZ Script

(function(){

var bones = Scene.getSelectedNodeList();
for ( var n = 0 ; n < bones.length ; n++ ) {
if ( bones[ n ].getXPosControl() ) {
bones[ n ].getXPosControl().lock( true );
}
if ( bones[ n ].getYPosControl() ) {
bones[ n ].getYPosControl().lock( true );
}
if ( bones[ n ].getZPosControl() ) {
bones[ n ].getZPosControl().lock( true );
}
if ( bones[ n ].getXRotControl() ) {
bones[ n ].getXRotControl().lock( true );
}
if ( bones[ n ].getYRotControl() ) {
bones[ n ].getYRotControl().lock( true );
}
if ( bones[ n ].getZRotControl() ) {
bones[ n ].getZRotControl().lock( true );
}
}
})();


Ven 14 Sep 2018, 17:05
Profil
Super Diablotin(ine)
Super Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 504
Localisation: Hauts de seine
Message Re: DAZ Scripting
La méthode lock provient de la classe DzNumericProperty qui la transmet par héritage à la classe DzFloatProperty qui est retournée à l'appel de la méthode getXPosControl de la classe DzNode.


Ven 14 Sep 2018, 21:49
Profil
Super Diablotin(ine)
Super Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 504
Localisation: Hauts de seine
Message Re: DAZ Scripting
On fait de plus en plus fort. Je me suis rappelé que les "actions", gérées par l'actionMGR et dont j'ai déjà parlé correspondent en fait ce que l'utilisateur peut faire manuellement. Pas de bol, ce n'est pas documenté par DAZ, sauf à être WIP (ce qui n'est pas mon cas).
Donc puisque cela correspond à ce que peut faire l'utilisateur manuellement, il est inutile de lui demander de faire une action avant de lancer le script et d'ajouter des lignes de code pour vérifier qu'il l'a fait. Reste à trouver l'action codée qui correspond à l'action manuelle. Après quelques essais, j'ai trouvé que select all dans l'onglet scene correspondait à DzHPSelectAllAction

Le script suivant permet donc de verrouiller les translate et rotate XYZ sans que l'utilisateur ait besoin de faire quoi que ce soit sauf lancer le script:
Code:
// DAZ Studio version 4.10.0.123 filetype DAZ Script

(function(){

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

}
var nodes = Scene.getSelectedNodeList();
for ( var n = 0 ; n < nodes.length ; n++ ) {
if ( nodes[ n ].getXPosControl() ) {
nodes[ n ].getXPosControl().lock( true );
}
if ( nodes[ n ].getYPosControl() ) {
nodes[ n ].getYPosControl().lock( true );
}
if ( nodes[ n ].getZPosControl() ) {
nodes[ n ].getZPosControl().lock( true );
}
if ( nodes[ n ].getXRotControl() ) {
nodes[ n ].getXRotControl().lock( true );
}
if ( nodes[ n ].getYRotControl() ) {
nodes[ n ].getYRotControl().lock( true );
}
if ( nodes[ n ].getZRotControl() ) {
nodes[ n ].getZRotControl().lock( true );
}
}
})();


Il suffit de remplacer les valeurs true par false pour débloquer tout d'un coup


Sam 15 Sep 2018, 13:33
Profil
Super Diablotin(ine)
Super Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 504
Localisation: Hauts de seine
Message Re: DAZ Scripting
Le but de tout verrouiller était de ne déverrouiller par la suite que les réglages nécessaires. Daz a la fâcheuse habitude de changer l'objet sélectionné sans prévenir. J'ai constaté un autre bug. Après avoir déverrouillé une lumière distante, j'ai constaté que même déverrouillé, les réglages ne réagissait plus.

Comme il était dans mon idée de créer un script permettant d'accéder à tous les objets de la scène pour modifier la totalité des frames d'une animation, la base pourra aussi servir à déverrouiller un objet en espérant que par script les réglages réagiront pour de bon.

Pourquoi changer toutes les frames? Parce que les animations sont en général conçues pour un personnage particulier. Si vous choisissez un personnage plus gros ou plus petit, l'animation devient incohérente. On peut bien sûr faire manuellement frame par frame les modifications (bon courage!). Un script sert justement à automatiser une action.


Lun 17 Sep 2018, 09:24
Profil
Super Diablotin(ine)
Super Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 504
Localisation: Hauts de seine
Message Re: DAZ Scripting
En attendant le script dont j'ai parlé précédemment, voilà un bout de script qui permet d'obtenir des renseignements sur une animation chargée.

Code:
(function(){
var otimeRange;
otimeRange =Scene.getAnimRange();
print("debut :",otimeRange.start);
print("fin :", otimeRange.end);
var oTimeStep = Scene.getTimeStep();
var nTimeStep = oTimeStep.valueOf();
print( nTimeStep );
print("nombre de frames: ", ((otimeRange.end-otimeRange.start)/nTimeStep)+1);
})();


204 frames de la 0 à la 203 à 30fps

Le +1 c'est parce que c'est comme les poteaux et les intervalles. La première frame démarre à 0. Si DAZ a fait en sorte que l'on puisse connaitre la frame de début et celle de fin, c'est parce qu'il n'est pas obligatoire que l'animation vidéo démarre à 0. Elle peut, par exemple, être précédée d'une séquence audio.

30 fps, c'est ce que l'on déduit du nombre de ticks horloge par frame (voir un message précédent)


Mar 18 Sep 2018, 06:52
Profil
Super Diablotin(ine)
Super Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 504
Localisation: Hauts de seine
Message Re: DAZ Scripting
J'avais parlé d'un script permettant de modifier automatiquement une animation. Rappel: il arrive que le personnage soit plus petit ou plus gros que celui utilisé dans une animation, Le rectifier à la main, à chaque frame, peut nécessiter beaucoup de patience. Je pars du principe, mais peut-être que je me trompe, qu'il est possible de réaliser un script dont le déroulement serait le suivant:
charger une scène et une animation
choisir dans la scène le personnage que l'on va modifier
stocker les valeurs de translate, de rotate, de bend, de side-side, de twist de tous les os du personnage à la première frame
Modifier manuellement la position du personnage
relever de nouveau les valeurs de tous les os
Appliquer la différence entre les premières valeurs et les secondes au personnage sur toutes les frame
vérifier l'animation pour voir s'il n'y a pas de frames à rectifier manuellement
J'ai donc commencé le début du script. Je ne vous cache pas que je tatonne vu que la doc est en anglais, incomplète et même parfois fausse (je vous en citerai un exemple).
Je n'ai pas forcément respecté les règles de notation des variables qui est une convention
On commence par la sélection de tous les nodes, qu'on a déjà vu plus haut, avec l'actionMGR
On balaie la liste de tous les nodes et on refait une liste avec les personnages de types Genesis (je n'ai pas ajouté la génération 4, 3, etc,, mais cela serait possible. Déjà, il se pose un problème avec Genesis 8 dont les Genesis 8 eyelashes sont un fils de Genesis 8. Il apparaissent donc dans la liste, je ferai en sorte de les éjecter plus tard.

S'il n'y a pas de personnage Genesis dans la scène on sort du script.
On fabrique une boite de dialogue avec une combobox qui affichera les personnages Genesis contenus dans la scène. Au départ, j'avais pensé qu'on pouvait déclencher une action par un signal dès que l'utilisateur faisait un choix. J'en aurai profité pour modifier la boite de dialogue en ajoutant autre chose. Visiblement, ça ne marche pas et c'est logique puisque l'utilisateur peut faire plusieurs choix successifs et faire aussi des choix dans d'autres widgets de la boite de dialogue (quand il y en a).

On en arrive à if( wDlg.exec() ) qui ne fonctionne pas comme je le pensais. Un clic sur OK fait aller dans la partie if, un clic sur cancel fait aller dans le else.

Deux erreurs par rapport à la documentation sur internet:
NULL génère une erreur alors que c'est censé être retourné en cas d'erreur dans une fonction.
Autre erreur, print(wComboBox.currentitem); Dans la doc, currentitem est totalement en minuscule dans les propriétés, alors que Item doit démarrer par une majuscule pour que cela fonctionne.

On récupère le squelette. Curieusement, il n'y a pas de constructeur DzSkeleton parce le constructeur est DzNode. DzSkeleton est en quelque sorte un complément des propriétés et des méthodes de DzNode.
Récupérer un skeleton permet de ne pas avoir à rechercher les fils des nodes, les fils des fils et d'être obligé de chercher à obtenir une récursivité. Avec skeleton, on récupère les os et il suffit d'incrémenter l'indice du tableau pour accéder à tous les os simplement.
Seul la base du personnage et le hip ont des réglages translate XYZ et rotate XYZ, les autres os ont des réglages bend, side-side et twist. Des recherches sur le forum de DAZ laissaient entendre qu'il suffisait de récupérer les valeurs des rotate XYZ. Effectivement, mes essais ont montré que deux des valeurs (de bend, side-side et twist) sont bien reportés dans les rotates mais pas la troisième. J'ai donc testé plusieurs méthodes jusqu'à trouver celles qu'il fallait utiliser.

J'en suis là pour l'instant

Code:
// DAZ Studio version 4.10.0.123 filetype DAZ Script

(function(){

/* la premiere chose a faire est de selectionner tous les objets de la scene */
/* cela selectionne aussi tous les fils des objets principaux */
var oActionMgr = MainWindow.getActionMgr();
var oAction = oActionMgr.findAction("DzHPSelectAllAction");
if( oAction ){
oAction.trigger();
}
/* trier uniquement les personnages */
var nodes = Scene.getSelectedNodeList();
var nodesTries = new Array;
var i=1; /* parce qu'il faut que le premier item du combobox ne corresponde pas */
/* a un personnage pour forcer l'utilisateur a une selection */
for ( var n = 0 ; n < nodes.length ; n++ ) {

/* on stocke les nodes correspondants aux personnages dans nodesTries */
if((nodes[n].assetId).search("Genesis")!=-1){
nodesTries[i] = nodes[n];
i++;
}/* fin du if */
}/* fin du for node.length */
if (i==1){
MessageBox.critical ("Aucun personnage dans la scene","rate","OK");
return;
}
// 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 = "Modificateur d'animation";
// 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;

var wComboBox = new DzComboBox (wDlg);
wComboBox.insertItem ("selectionner personnage");
for ( var n = 1 ; n < nodesTries.length ; n++ ) {
wComboBox.insertItem (nodesTries[n].getLabel());
}
wDlg.addWidget(wComboBox);

wComboBox.setFixedHeight( nBtnHeight );
// Add the widget to the dialog
wDlg.addWidget( wComboBox);
wComboBox.currentItem = 0;

// 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() ){
/* recuperation de l'item choisi */
print("passage par OK");
/* erreur dans la doc qui propose un currentitem */
/* sans majuscule, resultat renvoyait undefined */
print(wComboBox.currentItem);
/* il faut gérer le cas ou l'utilisateur n'a rien choisi */
if(wComboBox.currentItem >0){
}
else {/* l'utilisateur n'a rien choisi */
MessageBox.critical ("Vous n'avez rien choisi","Tant pis pour vous!","OK");
return;    
} /* fin du else OK */   
print(nodesTries[wComboBox.currentItem].assetId);
/*deuxieme erreur de la doc ne reconnait pas NULL */
/* pas de constructeur pour DzSkeleton */
var oSquelette = nodesTries[wComboBox.currentItem];

if( oSquelette.getSkeleton()!= -1){
print("squelette present!");   
var tableauOs = oSquelette.getAllBones();
print (tableauOs[2].assetId);
/* seuls le personnage de base et le hip ont des translate XYZ et des rotate XYZ */
/* les autres ont des bend, twist et side-side */
print(tableauOs[2].getToolXRotControl().getValue());/*bend*/
print(tableauOs[2].getToolYRotControl().getValue());/*twist*/
print(tableauOs[2].getToolZRotControl().getValue());/*side-side*/
/* a partir de la il faut positionner l'animation sur la première frame automatiquement ou manuellement */
/* ensuite proceder aux modifications nécessaires sur le personnages */
/* relever les nouvelles valeurs et calculer la diffréence entre avant et apres */
/* appliquer les diferences a toutes les frames */
}
else/* node sans squelette? */
MessageBox.critical ("Pas de squelette","Erreur","OK");
return;    

} /* fin traitement passage par OK */
else {
// Do... something else
print( "User cancelled." );
print("passage par cancel");
}
// Finalize the function and invoke
})();




Mer 19 Sep 2018, 08:05
Profil
Super Diablotin(ine)
Super Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 504
Localisation: Hauts de seine
Message Re: DAZ Scripting
J'ai voulu tester cette histoire de NULL qui ne marchait pas, J'ai donc ajouté quelques lignes au départ du script
Code:
var b=aNodes[1].getSkeleton();
print("b: ", b);

ce qui affiche b: null (en minuscule) alors que la doc indique NULL en majuscule!
donc je modifie les lignes plus bas:
Code:
if(oSquelette.getSkeleton()!=null){

print("squelette present!");
var tableauOs = oSquelette.getAllBones();


Tel que j'ai décrit le processus, il faut que l'animation soit sur la frame 1 avant de stocker les valeurs de positionnement des os et bien sûr que l'animation ait été appliquée au personnage.
Ca donne le bout de code suivant sur lequel j'ai passé beaucoup de temps à débugguer. Parce que j'avais écrit lenght au lieu de length, le débuggueur ne signale aucune erreur. A noter tout de même que quand on écrit la bonne appelation lenght s'écrit en bleu dans le script IDE, Puis une autre erreur que je n'ai pas réussi à trouver tout de suite parce que le lignes que j'ai remplacées étaient strictement similaires à celles qui étaient là au depart (??)

Code:
if( wDlg.exec() ){
/* recuperation de l'item choisi */
print("passage par OK");
/* on commence par positionner l'animation sur la premiere frame */

var oTimeRange = oTimeRange =Scene.getAnimRange();/* temps total (en ticks) de l'animation */
var oTimeRangeStart = oTimeRange.start;/*temps (en ticks) du début de l'animation */
var oTimeRangeEnd = oTimeRange.end;/*temps (en ticks) du début de l'animation */
var oTimeStep = Scene.getTimeStep();
var nTimeStep = oTimeStep.valueOf();/* temps (en ticks) entre deux frames consecutives */

print("nombre de frames: ", ((oTimeRangeEnd-oTimeRangeStart)/nTimeStep)+1);
var nFirstFrame = Scene.getAnimRange().start / nTimeStep; // to determine the first frame : a value of 0 is awaited
print ("premiere frame: ", nFirstFrame);
/* positionnementsur premiere frame */
Scene.setFrame(oTimeRangeStart);
/* il faut gerer le cas ou l'utilisateur n'a rien choisi */
/* il y a toujours un item courant */
/* en l'occurence j'impose "selectionner personnage" qui est l'item 0 */
if(wComboBox.currentItem >0){
}
else {/* l'utilisateur n'a rien choisi */
MessageBox.critical ("Vous n'avez rien choisi","Tant pis pour vous!","OK");
return;
} /* fin du else OK */
print(aNodesTries[wComboBox.currentItem].assetId);

var oSquelette = aNodesTries[wComboBox.currentItem];
print("currentItem",wComboBox.currentItem);

if(oSquelette.getSkeleton()!=null){

print("squelette present!");
var aTableauOs = oSquelette.getAllBones();
print(aTableauOs[1]);
print("nombre os",aTableauOs.length);
var aValeursOsDepart = new Array(aTableauOs.length);
for(var i=0; i<aTableauOs.length;i++){
aValeursOsDepart[i]= new Array(6);
}


for ( var n = 0 ; n < aTableauOs.length ; n++ ){
if (n == 0){
aValeursOsDepart[n][0]=aTableauOs[n].getXPosControl().getValue();
aValeursOsDepart[n][1]=aTableauOs[n].getYPosControl().getValue();
aValeursOsDepart[n][2]=aTableauOs[n].getZPosControl().getValue();
aValeursOsDepart[n][3]=aTableauOs[n].getXRotControl().getValue();
aValeursOsDepart[n][4]=aTableauOs[n].getYRotControl().getValue();
aValeursOsDepart[n][5]=aTableauOs[n].getZRotControl().getValue();
}/*fin du if*/
else{
aValeursOsDepart[n][0]=0;
aValeursOsDepart[n][1]=0;
aValeursOsDepart[n][2]=0;
aValeursOsDepart[n][3]=aTableauOs[n].getToolXRotControl().getValue();/* bend */
aValeursOsDepart[n][4]=aTableauOs[n].getToolXRotControl().getValue();/* twist */
aValeursOsDepart[n][5]=aTableauOs[n].getToolXRotControl().getValue();/* side-side */
}/*fin du else */

}/* fin du for */
print ("n", n);
print ("Tableau au hasard ",aValeursOsDepart[2][5]);
//print (tableauOs[2].assetId);
/* seuls le personnage de base et le hip ont des translate XYZ et des rotate XYZ */
/* les autres ont des bend, twist et side-side */


/* a partir de la il faut positionner l'animation sur la première frame automatiquement ou manuellement */
/* ensuite proceder aux modifications nécessaires sur le personnages */
/* relever les nouvelles valeurs et calculer la diffréence entre avant et apres */
/* appliquer les diferences a toutes les frames */
}



Donc, le boulot supplémentaire, c'est qu'on se positionne sur la première frame et que les valeurs du personnages sont stockées quel que soit le type de Genesis.

Reste deux modifications à faire:
Le premier os du tableau devient "hip" donc il faudra ajouter un bout de code et du stockage supplémentaire pour Genesis, au cas où il faudrait modifier ses réglages en plus (ou à la place) des os.
En ce qui concerne eyelashes, je l'ai laissé dans la combobox parce que ce n'est pas inclus dans le squelette de Genesis et que s'il faut le rectifier, ce sera à faire séparément.
Ce qui fait 2 modifications à prendre en compte avec l'éjection de eyeslash (pour Genesis 8) qui apparaît dans la combobox.

On commence à voir la fin du script puisque le stockage des modifications n'est que la création d'un autre tableau de même dimension que celui recueillant les valeurs de départ. Quant à la modification des frames, le sujet a été abordé lors d'un script précédent.


Mer 19 Sep 2018, 15:35
Profil
Super Diablotin(ine)
Super Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 504
Localisation: Hauts de seine
Message Re: DAZ Scripting
Je croyais que j'avais résolu toutes les difficultés pour ce script, et bien non! Le problème est que le script doit laisser la main à l'utilisateur, le temps qu'il fasse des modifications manuelles, et reprenne la main pour calculer la différence entre les valeurs des positions de départ et celles modifiées par l'utilisateur.

Or, il n'est pas possible d'attendre l'appui sur une touche (visiblement pas prévu dans les signaux) ou d'attendre l'appui sur une touche (la boite de dialogue bloque DAZ). Pour l’instant, je vais utiliser le timer qui permet de libérer le travail de DAZ Studio. Fixer un temps raisonnable (je verrai à l'usage) et une fois le temps écoulé, le script continue. Éventuellement, il est possible de permettre à l'utilisateur de choisir son temps avant déclenchement du timer. Peut-être que je trouverai une solution plus élégante plus tard mais le but est de finir ce script.


Jeu 20 Sep 2018, 06:49
Profil
Super Diablotin(ine)
Super Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 504
Localisation: Hauts de seine
Message Re: DAZ Scripting
Exemple type du code qui devrait marcher mais bloque le script. L'appui sur la touche CTRL ne déclenche pas la suite du script. On reste bloqué dans la boucle.
Code:
while(!ctrlPressed()){
processEvents();
}


J'ai quand même trouvé une solution de remplacement qui marche dans les exemples DAZ: http://docs.daz3d.com/doku.php/public/software/dazstudio/4/referenceguide/scripting/api_reference/samples/general_ui/background_progress/start

Là, on peut modifier les paramètres du personnage et revenir automatiquement à la suite du script. Cela arrive sous deux conditions:
1/ par décrémentation d'un temps (non égal à chaque fois puisque non basé sur le timer mais sur un chiffre que l'on décrémente, donc le temps dépend de ce que votre ordinateur fait à côté)
2/ par l'appui sur la touche ESC (escape) donc ce que je cherchais à faire. Je suppose que l'on peut changer la touche, mais ce n'est pas le problème actuel.

Donc qu'est-ce qu'il faut programmer?
- un message indiquant à l'utilisateur qu'il peut aller modifier les réglages (le plus simple, une critical box)
- le code du script background progress avec un temps suffisamment long pour que l'utilisateur puisse faire ses réglages (l'infini n'existant pas) de façon à ce que seul l'appui sur la touche escape devienne la porte de sortie convenable.
- la suite du script à savoir la récupération des nouvelles données, le calcul des différences et leur application à toutes les frames.

Avantage du script exemple de DAZ on voit dans la barre de progression (à côté de Select a lesson" où on en est.
De même, on notera la possibilité d'afficher des messages pour l'utilisateur avec la ligne
Code:
App.statusLine( text( "User cancelled simple background progress test." ) );

inconvénient sous windows, si DAZ Studio est lancé en plein écran, la barre des tâches masque la barre de statut (et donc la progression aussi). Penser à approcher la souris ou à positionner la barre des tâches ailleurs.


Jeu 20 Sep 2018, 08:19
Profil
Super Diablotin(ine)
Super Diablotin(ine)

Inscrit le: Lun 7 Déc 2015, 16:53
Messages: 504
Localisation: Hauts de seine
Message Re: DAZ Scripting
partie du code intégrant la possibilité à l'utilisateur de modifier les réglages et de revenir à la suite du script soit automatiquement au bout d'un certain temps, soit par l'appui sur la touche escape.

Code:
/* les valeurs de depart etant stockees, il faut que l'utilisateur fasse les modifications */
/* et previenne quand il a fini */
MessageBox.critical ("Cliquez sur OK quand vous etes pret pour les modifs     ","Sortie anticipee en appuyant ssur la touche escape","OK");
liberation();
print("toto");
/* la boite ci-dessus bloquant le deroulement de la suite du script */
/* il faut proceder avec un connect sur une touche de fonction */
//print (tableauOs[2].assetId);
/* seuls le personnage de base et le hip ont des translate XYZ et des rotate XYZ */
/* les autres ont des bend, twist et side-side */

Bon, à partir de là, il n'y a plus de difficultés. Relever les valeurs c'est une copie de ce qui a été fait au départ. Appliquer les différences, il suffit de changer getValue par setValue. Fabriquer des frames pour refaire une animation, cela a déjà été fait pour les morphs (voir messages précédents)

/* a partir de la il faut positionner l'animation sur la premiere frame automatiquement ou manuellement */
/* ensuite proceder aux modifications necessaires sur le personnages */
/* relever les nouvelles valeurs et calculer la difference entre avant et apres */
/* appliquer les diferences a toutes les frames */
}
else/* node sans squelette? */
MessageBox.critical ("Pas de squelette","Erreur","OK");
return;    

} /* fin traitement passage par OK */
else {
// Do... something else
print( "User cancelled." );
print("passage par cancel");
}
// Finalize the function and invoke
})();
function liberation(){
    /* avec nCycles a 100000 et nFrequency a 1 la duree est approximativement 28 S */
    /* on peut legitimement supposer que c'est a peu pres lineaire et que multiplie par 10 */
    /* on aura 200 secondes soit 4mn 40 secondes */
   /*********************************************************************/
   // Declare the total number of cycles
   var nCycles = 1000000;
   // Declare how frequently you want to update the progress
   var nFrequency = 1;

   // Define whether or not the user can cancel
   var bCancellable = true;

   // Start the progress
   startBackgroundProgress( text( "This is a simple background progress test." ), nCycles/nFrequency, bCancellable );

   // Iterate over the cycles
   for( var i = 0; i < nCycles; i += 1 ){
      // If the current iteration is divisible by the frequency with no remainder
      if( i % nFrequency == 0 ){
         // Step the progress by 1
         stepBackgroundProgress( 1 );

         // Force any pending events to be processed
         // i.e. updating the status bar progress indicator
         processEvents();
      }

      // If the user is allowed to cancel
      if( bCancellable ){
         // Process events so that we can check user interaction
         processEvents();

         // If the user cancelled
         if( App.isKeySequenceDown( "Esc" ) ){
            // Post a status update
            App.statusLine( text( "User cancelled simple background progress test." ) );
            // We are done...
            break;
         }
      }
   }

   // Finish the progress
   finishBackgroundProgress();

};
   /*********************************************************************/
   // String : A function for retrieving a translation if one exists
   function text( sText )
   {
      // If the version of the application supports qsTr()
      if( typeof( qsTr ) != "undefined" ){
         // Return the translated (if any) text
         return qsTr( sText );
      }

      // Return the original text
      return sText;
   };


Une adresse intéressante: https://openweb.eu.org/articles/introduction_ecmascript/
puisque les script DAZ sont écrits en ecmascript


Jeu 20 Sep 2018, 10:41
Profil
Afficher les messages depuis:  Trier par  
Publier un nouveau sujet Répondre au sujet  [ 70 messages ]  Aller à la page Précédent  1, 2, 3, 4, 5


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 - 2018 | Reproduction totale ou partielle interdite



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