Barzing - Copy Paste Morphs Deltas



  • 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 ! :)



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

    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...

    In fact if you copy a morph that does not exist on target figure : Max Value, Min Value, Force limit, ... are set as they were known on source figure.

    Your source figure seems so deeply modified, that it will be hard to process it to SASHA-16, with only this tool.

    I have another tool, that i stopped some month ago to work on, but that is 90% done and tested to work in P11 for now.
    The tool concatenate all dialed morphs deltas (geometry modification datas) in only 1 dial. This tool handle dials values, scales and you can manage a list of morphs you don't want to include in the final dial. the tool will generate a pz2 file (pose file) that you'll be able to re-use as will to re-inject on any figure.
    It still need some days of devs to be finish, but will be finish for sure.



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

    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.

    Oh I know, the real problem is that I made many, many tweaks to all of my V4/S4 characters over the years, usually because I found or bought a new V4 morph pack and wanted to inject it to the figure to see if there are morphs that will make her more realistic or get a certain look.

    I ended up with a lot of unused morph dials (i.e. value = 0) and it would take a looooong time to search through all the entries to see which are non-zero (being used for the character) and which are not used. That's why it's faster just to copy everything over to Sasha just to see how much of the S4 character I can quickly recreate. And it is a good stress test you must agree :D

    I like your idea of the other tool which concatenate all the dialed morphs into one dial! That sounds super-useful too, and probably much quicker to transfer over a complete character to Sasha. Hopefully you can make it for Poser2012 (which is what I use at home) but even 2014 I can use that at work to transfer a character too...

    I can post a simpler parms2copy once I am at work again on Monday. I want to also spend more time to see if I can narrow down the cause of the error myself too.



  • @TomsGX

    We have a Dials to single Morph command. It's been in Wardrobe Wizard ever since WW was added to Poser.

    WW - Utilities - Morphs - Dials to single morph.

    I use it will all of my figures

    Current workflow:
    Base Figure (with every single morph I own installed)

    Fiddle about with morphs until I have what I want.

    Use Dials to Single Morph to create a single FBM (Alt-<Foo> name FBM).

    Copy the FBM (Using the Copy Morphs From command) into a Final Figure.

    Rename Final Figure <Foo>.

    Save figure into library.

    When dressing figure, use the Copy Morphs From command to load the FBM into the clothing.



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

    We have a Dials to single Morph command. It's been in Wardrobe Wizard ever since WW was added to Poser.

    Wow, first I learn about material collections and now this, I think my productivity just jumped 100% this week alone :)

    I tried out the command you mentioned in PP2014, and was really pleased that it works quite well. I noticed though that the eyeballs did have a problem as they seemed to be bulging outward and a bit off. However all I did was set a few of the eye morph dials to zero so that these would not get merged into the single dial... that seemed to stop the bulging eyeballs from happening when I turned the single dial to 1.0 and then in the final figure I manually set those missing eye morph dials to the values of the V4 character.

    I also noticed that the single morph didn't seem to capture the fact that I had set the LegsLength to -1.0 (to make her shorter, less fashion model-like) but again, I just manually set this value myself in Sasha and that worked out.

    @Barzing: I tested out my Parms2Copy today, basically I just kept removing entries until the error went away, then I slowly put back a few entries until the error came back. It seems like the one responsible for the error is this entry:
    BODY:Young(Young)

    And yes I did remove the dial name when I was putting it into the Parms2Copy... I hope that will help debug the script.



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

    @TomsGX

    We have a Dials to single Morph command. It's been in Wardrobe Wizard ever since WW was added to Poser.

    WW - Utilities - Morphs - Dials to single morph.

    I use it will all of my figures

    Current workflow:
    Base Figure (with every single morph I own installed)

    Fiddle about with morphs until I have what I want.

    Use Dials to Single Morph to create a single FBM (Alt-<Foo> name FBM).

    Copy the FBM (Using the Copy Morphs From command) into a Final Figure.

    Rename Final Figure <Foo>.

    Save figure into library.

    When dressing figure, use the Copy Morphs From command to load the FBM into the clothing.

    WW - Utilities - Morphs - Dials to single morph :

    • Do not include scales
    • Includes JCMs badly (when it shouldn't)
    • do not report Value parameters correctly
    • ...
    • do not work with SASHA-16, V4 with perfect legs, V4 with pretty legs, ...

    Copy Morphs From ... won't copy the exact same morph deltas datas between 2 absolutely identical figures. (ie : V4 to V4), you can't see it, but still ... It's probably linked on how works the algorithm, that is more adapted to copy morphs between 2 figures with different topology (ie Character to clothes)



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

    @ssgbryan said in Barzing - Copy Paste Morphs Deltas:

    We have a Dials to single Morph command. It's been in Wardrobe Wizard ever since WW was added to Poser.

    Wow, first I learn about material collections and now this, I think my productivity just jumped 100% this week alone :)

    I tried out the command you mentioned in PP2014, and was really pleased that it works quite well. I noticed though that the eyeballs did have a problem as they seemed to be bulging outward and a bit off. However all I did was set a few of the eye morph dials to zero so that these would not get merged into the single dial... that seemed to stop the bulging eyeballs from happening when I turned the single dial to 1.0 and then in the final figure I manually set those missing eye morph dials to the values of the V4 character.

    I also noticed that the single morph didn't seem to capture the fact that I had set the LegsLength to -1.0 (to make her shorter, less fashion model-like) but again, I just manually set this value myself in Sasha and that worked out.

    @Barzing: I tested out my Parms2Copy today, basically I just kept removing entries until the error went away, then I slowly put back a few entries until the error came back. It seems like the one responsible for the error is this entry:
    BODY:Young(Young)

    And yes I did remove the dial name when I was putting it into the Parms2Copy... I hope that will help debug the script.

    Internal Name for Young as V4 Morphs++ is FBMYoung, so you should have BODY:FBMYoung in Parms2Copy.txt :)



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

    Internal Name for Young as V4 Morphs++ is FBMYoung, so you should have BODY:FBMYoung in Parms2Copy.txt :)

    Oh wait, me confused... I used Z4 to generate the list, but I am certain it showed me BODY:Young(Young) so it should've shown me BODY:FBMYoung(Young)? I will try again tomorrow when I am in the office...



  • @ barnardino and
    @TomsGX
    are right!

    The DAZ Morphs++ all follow a strict naming scheme, always starting with "FBM" for the control parameters and with "PBM" for the individual morphs.
    So it should be either "FBMYoung" or "PBMYoung", and none of these names should contain an attached "(Young)" under any circumstances.
    Poser is rather unforgiving if morph names don't match 1:1 exactly.
    So whatever the fault is, you must eliminate the mismatching morph name from the script (or the morph lists)

    NOTICE:

    • This only applies to the INTERNAL morph names!
    • The EXTERNAL names (== the one the user sees) are not relevant and shouldn't be used under any circumstances because they can be changed by a user anytime, rendering any script referencing those useless!

    K



  • Update: I was wrong. I tested it again today and using Z4, and it did not generate BODY:Young, no such entry was there in the list. So I must've made an error during my stress testing. Apologies! The FBMYoung pasted fine without any problems.

    Also I previously mentioned that when I used Barzing's tool to copy and paste over morphs to Sasha-16, the chest didn't seem to replicate what I had in V4. I discovered why today... I forgot that on my V4/S4 character, I had also added some magnets to the breasts to tweak their shape a bit further... so it was because Sasha did not have these magnets which is what was missing from recreating the breast shape. Once I created a set of magnets and pasted the values I had used on V4/S4 to the Sasha-chest magnets, it seems to recreate it identically or at least very close.