Barzing - Copy Paste Morphs Deltas



  • @TomsGX

    Hi TomsGX,

    It's not a standard S4 morph, so i supposed it's a custom one.

    Is "UpperCheeks_ReducePuffiness_3 " is the internal Name of the morph ?

    To find the internal Name you can go in property panel of the HEAD of your source figure
    Left-click the little triangle next to the dial morph, select 'setting' the Internal Name will appear here



  • Hi yes, the puffiness are both my own custom morphs.. they both do a similar reduction of puffiness in the cheeks and I was a bit lazy in naming them :)

    I'll check to see if the internal name of the _3 is something very different from the _1 version...



  • @barnardino

    Hi Barzing,

    I selected "setting" and what I see is that the internal names for:
    UpperCheeks_ReducePuffiness_1
    UpperCheeks_ReducePuffiness_3

    are an exact match for what I see on the dial name. So I am not sure why the script only finds "UpperCheeks_ReducePuffiness_1" but does not list "UpperCheeks_ReducePuffiness_3".

    BTW, when I am in the setting of the dial, I rename it to a new name that is shorter e.g. from "UpperCheeks_ReducePuffiness_3" to "reducepuffiness3" and just as a test I click on Z3. List Head Morphs, but it still shows the original longer name of the dial instead of the renamed dial. I even save the project, exit Poser, then run Poser again and reload the project, but List Head Morphs still lists it under its original longer name not as "reducepuffiness3", not sure why. Even though I changed the internal name, the Z3. List doesn't seem to be aware that it has changed...?



  • @TomsGX Hi

    Just to be sure :

    • what is your poser version ?
    • can you confirm that you changed the 'Internal Name' on settings like it appears here in this example ?
      alt text

    Z3 list all internal names of existing dials on the current selected figure's head, it's not based on any saved information.

    Can you check this pls, before i investing further.

    Ty.



  • Ok I'll check tomorrow (Poser 10/2014 is installed on my PC at work). I don't think the dialog box that I saw looked like the one in your screenshot though... I don't remember seeing the "internal name" label, I think it just said "name" on mine. Maybe my work computer doesn't have the latest update/patch?



  • @TomsGX ok if you have PP2014 it's the reason you can't find the internal name, i realize that i need to do a button to list Dials Name vs Internal Names.



  • Ah okay, I'll just wait for an update before I proceed any further then. Is there any plans to also have the script be able to transfer over textures and materials to the target figure? I'm not sure otherwise how else to completely port a character over from V4/S4 to Sasha (I believe in P11 you could make a mat pose INJ? But I don't have access to P11 at home or at work, not sure how else to do it).



  • @TomsGX Hi TomsGX, i updated the tool, with a Z4 button that allow you to list actor vs Internal Name vs Dial names. You have to redownload it from sharecg.

    Thanks for your feedback.



  • @TomsGX said in Barzing - Copy Paste Morphs Deltas:

    Ah okay, I'll just wait for an update before I proceed any further then. Is there any plans to also have the script be able to transfer over textures and materials to the target figure? I'm not sure otherwise how else to completely port a character over from V4/S4 to Sasha (I believe in P11 you could make a mat pose INJ? But I don't have access to P11 at home or at work, not sure how else to do it).

    You can just save your materials as collection in material library and reload it on your final character.



  • Hello, thank you for that tip about material collections, that was VERY useful! :)

    I tried the updated tool. Using Z4 to generate a list of the names. So for example, my custom morphs on the S4 character have these two:
    head:V42_HeadMT_raise_upper_eye_tip_(V42_HeadMT_raise_upper_eye_tip_)
    head:V42_HeadMT_raise_upper_eye_tip(V42_HeadMT_raise_upper_eye_tip)

    Now I then paste these two into the parms2copy.txt, correct? But when I then click to copy the deltas, it gave the error message:

    head:V42_HeadMT_raise_upper_eye_tip_(V42_HeadMT_raise_upper_eye_tip_) doesn't not exist on this figure !

    I will try this again at work tomorrow, but I am sure I had the source figure selected (well the Body, not sure if I am supposed to select the Head).



  • @TomsGX at the top of list you have the format :

    #All Parameters in selected figure by Actors - format is actor:Parameter_Internal_Name_(Dial_Name)

    What you want in parms2copy.txt is actor:Parameter_Internal_Name

    So you don't have to copy all of what listed by Z4, Z' is just to help you to find Dial Name vs Internal Name.
    Here you just have to copy head:V42_HeadMT_raise_upper_eye_tip_ in parms2copy.txt if you want to copy this dial.

    Remember Z4 is just here to help you to find your internal Name vs Dial Name
    fro example : in this list you can look for the dial name : "UpperCheeks_ReducePuffiness_3" (it should appears between paranthesis) and you'll find the internal name, so what you need to copy in parms2copy.txt in the format actor:Internal Name



  • Ah thank you! That makes much more sense! I left out the (Dial_Name) and was able to copy over my custom face morphs to Sasha now! It works!!!

    I have a request, is it possible to have one more script e.g. "z5", which can show the same thing as z4, but it only lists those dials which have a non-zero value? I noticed that even though I did copy-paste on my S4 character's Body to Sasha's Body, the chest (breasts) still look different.

    I am not sure what is missing to recreate the chest look completely. There must be some other morphs that are not on Sasha (probably these are third-party morphs that I injected into my S4) which I need to copy over but I don't know which ones they are unless I exhaustively go through all the dials looking for non-zero settings on them. It might be faster if a script could just list which ones are non-zero (or maybe even indicate if there are non-zero dial morphs that exist only on the source figure but not on the target figure? Or is that too complicated for a script?)

    Thank you for your help!



  • UPDATE: actually instead of basing a Z5 on Z4, it would be better to generate a list without the dial names (i.e. base it on the Z1) since otherwise it would mean having to manually erase a lot of (Dial_Name) entries...

    What I tried this afternoon is to take the Z2 Body morphs listing and simply paste the entire thing in the parms2copy.txt file. If your script will not copy over any morphs that already exist on Sasha, then my plan was that simply copying over all the Body morphs will include the extra 3rd party morphs on my S4 character, and this will give Sasha the missing chest morphs needed to recreate the S4 character's chest. However I saw this error:

    Traceback (most recent call last):
    File "D:\Local\Runtime\Libraries!Barzing\PasteMorphsDeltas.py", line 357, in <module>
    File "D:\Local\Runtime\Libraries!Barzing\PasteMorphsDeltas.py", line 296, in Main
    AttributeError: 'NoneType' object has no attribute 'AddValueOperation'



  • @TomsGX just downloaded the script and looked into the hierarchy of the zip file, as it struck me that the paths in the Traceback message of both of your posts looked suspicious. The zip file confirms that the hierarchy of folders is Runtime, Libraries, !Barzing, so there should actually be a backslash before the !Barzsing in both of those reported paths in the traceback.

    Is it possible you have a typo in the config that omits the backslash, i.e. "Runtime\Libraries!Barzing\PasteMorphsDeltas.py" should be "Runtime\Libraries!Barzin\PasteMorphsDeltas.py"?

    Though, now that I think about it further, if you did actually have a folder called "Libraries!Barzing", in which the PasteMorphsDeltas.py resided, that might still work.

    ...

    Oops, phurphy detected. It looks like the forum formatting software is mucking with us. I see my own post is missing the backslash before the exclamation mark. Carry on. As you were. [Backs from thread kowtowing profusely]



  • @anomalaus What's actually strange is that you made me check my work computer's file hierarchy and I realized that the traceback error message refers to d:\ but in actuality my Barzing folder is located here:

    E:\Program Files\Smith Micro\Poser Pro 2014\Runtime\Libraries\!Barzing

    It's on E: so I don't know why the traceback refers to a different hard drive...

    Another update: I started to erase many of the entries in my Parms2copy.txt to see if I could identify which ones were causing the error. I eventually got down to about 35 entries left and the error is now:

    Traceback (most recent call last):
    File "D:\Local\Runtime\Libraries\!Barzing\PasteMorphsDeltas.py", line 357, in <module>
    File "D:\Local\Runtime\Libraries\!Barzing\PasteMorphsDeltas.py", line 241, in Main
    poser.error: Figure has no actor by that name

    I assume this is because the internal name and dial name are not the same. It occurs to me that now I have to look at each of the 35 entries to see which one is the dialname that I need to find the true internal name for (by using the new Z4). Whew, this is a lot of work...



  • @barnardino looks like you may have an occurrence in the PasteMorphsDeltas.py script where the parameter is not tested for being None, prior to calling the parm.AddValueOperation() method.



  • @TomsGX ah, yes, Poser's Python API lets you get away with calling the actor.Parameter('non-existent-parameter-name') method, whereupon it just returns None, but will barf up an error unless a call to actor = figure.Actor('non-existent-actor-name') is enclosed in a try: except: block.

    You'll need to actually check the actor names are correct, not just the parameter names.



  • Yes I'll check the actor names on Monday once I'm at work.

    I think I see another issue, but this is a Poser-related one. When I do use Ctrl-C and Ctrl-V to copy/paste the body values from the S4 character to Sasha, the values pasted are not always going to be pasted correctly.

    For example, on S4, the BreastsNatural is set to 1.26, but on Sasha, after my paste it is set to 1.0 because, I guess, the maximum value setting allowed on the BreastsNatural is 1.0 and so 1.26 would not be allowed. That means one must manually go through all the dials to look for any values which are over 1.0 or under the -1.0 minimum, and have to change it manually on the target figure...



  • @TomsGX sounds like the premise for another script. SaveCurrentLimits.py to create a library pose file with the currently set limits for the selected figure. Shouldn't be too hard to do. I certainly have quite a few manually created limits poses in my library. Usually they just contain the

        forceLimits 1
        min -1
        max 1.5
    

    lines within the parameter's channel block.



  • @TomsGX said in Barzing - Copy Paste Morphs Deltas:

    Traceback (most recent call last):
    File "D:\Local\Runtime\Libraries!Barzing\PasteMorphsDeltas.py", line 357, in <module>
    File "D:\Local\Runtime\Libraries!Barzing\PasteMorphsDeltas.py", line 241, in Main
    poser.error: Figure has no actor by that name

    @TomsGX , don't pay attention to the path linked to python errors, because once compiled, python script keep the information of the original path of the source program (ie: here on my machine). I already saw this happen on other python program. So, there is no link with a file on your machine.

    Yes, there is probably a link with the fact that you give a Dial Name instead of an Internal Name.
    Because, there is a basic check on the parameter to verify its existence, but actor.parameter("Parameter") authorize Internal Name and/or Dial Name to be called so if it can work in a first stance, it could fail later on some other operations when i try to call this parameter. (i'll check if i can reinforce this check)

    But for me what you're doing by copying all the Z2 list in the config file looks more like a stress test that a normal use ! :)
    Normally you don't need to copy morphs that already exist on SASHA-16. Since, all currently known V4/S4 morphs exist on SASHA-16, you normally just need to copy the custom morphs. And the tool is more intended to be used this way.

    The script will not copy over any morphs that already exist, but by copying them all in the first step, you generate a big tmp file that will include all the morphs. And the existence of the parameter will be check only once you will paste them on destination figure .

    Anyway, this should work, and i can probably debug this, but i need you publish your Parms2copy.txt to test it (even if some of your morphs don't exist for my figure, i can handle them for a test purpose)

    @anomalaus said :

    @barnardino looks like you may have an occurrence in the PasteMorphsDeltas.py script where the parameter is not tested for being None, prior to calling the parm.AddValueOperation() method.

    Yes probably, this shouldn't happen, i have to understand why this happen to process this case properly.

    Ty for your feedback ! :)