Barzing - Copy Paste Morphs Deltas

  • I decided to open a full topic for this, because i do'nt want to polluate other projects. :)

    Here the tool :
    Copy Paste Morphs Deltas

    Here the description :

    Copy Paste Deltas

    More than 10 years of using POSER, i never found a tool of this kind (at least not so simple and handy), when a lot of character creators dreamed of it.
    So here it is !

    -Why this tool ?

    The aim is to give the possibility to transfer morphs of your preferred character to a new figure with the same geometry.
    You spent hours to create a superb V4 with custom morphs using your morph tool or with specific morphs only available on a cr2 (ex : Morphia and its CDI Morphs, POSEIDONTECH dolls, PrettyBaseIV, ThornsWorks Teens, Alfaseed Alices, ...). And now you cry because you see this nice Weigth Mapped V4 from Karina and you don't know how to transfer your existing characters on SASHA-16.
    But now you will be able to do it. You will be able to combine any figures with the same geometry and transfer your custom morphs easily.

    What these scripts do ?

    You will be able to copy deltas morphs from 1 figure to another in the same scene.
    Prerequisites : These figures will have to share the same geometry (same obj file)
    (script will warn you if different, but will not stop, this will permit to use it if you know what you do)

    • What can you copy/paste ?

    It's fully (consider this as the fact you can pick several combination of morph type) configurable via an text file.

    - You can copy a morph with its deltas on a body part
    - You can copy a list of morphs on a body part
    - You can copy a list of morphs on several body parts
    - You can copy FBMs/FHMs (and any other parameters that have dependencies)
    Script will copy the FBM/FHM, all morphs with deltas on body parts and recreate dependencies (all valuekeys)
    The dependent morphs/parameters will be automatically added to a maximum of 2 levels.
    Example :
    	if you want to copy Naillength morphs from V4 BODY from figure 1 to figure 2
    	Script will copy to figure 2: 
    		+ Nailength morph (parameter) on BODY and recreate linked dependencies with hands
    		+ Nailength morph (parameter) on rHand and lHand and recreate linked dependencies with fingers
    		+ All Nailength(s) morphs with deltas on each tip fingers on rHand and lHand.
    - Script will copy re-scales and transformations (rotations, translations) if they are included in a dependency and will copy any parameter (in opposition to morph)  with or without dependencies
    - Script will not recreate morphs/parameters and dependencies if the morphs already exist on the target figure. Existing morphs/parameters will be left untouched.
    - It will not copy values ! that means it will not copy the value of the morph/parameter you want to copy, you will have to set it yourself.
    	Example : if you copy the FBM "Heavy" from BODY from figure 1 to figure 2, if the FBM Heavy value is triggered to 1 or any other value on Figure 1, it will be at 0 on Figure 2.
    - if a source dependency do not exist, it will be created as an empty channel (ie Internal Name as expected and Name starting with -EMPTY- followed by the Internal Name and will be hidden).
    	This will stay that way until a future copy during the process overwrite this EMPTY parameter with the full correct informations t could stay this way if the connection has been made through the config file with the covering parameter. 
    	This is intended to manage the cross connections between dependencies and parameters.
    	For example : FB(Body)M are often connected to FH(Head)M, and if FBMs are copied but not FHM : dependency will be broken but empty channel will be created to keep it up until an expected future copy
    - You can choose the destination group either an existing one either a new one !
    - You can only create/'select' ONE group

    What datas will be copied ?

    - Parameter Internal Name / Name
    - dependencies (ValueOps)
    - deltas
    - Hidden state
    - Init Value
    - Min Value
    - Max Value
    - Sensitivity
    - Force Limits state

    You have 6 buttons !

    For user, its simple, i tried to keep it the more intuitive way and very near to a sequence : "Click a button to COPY, click a button to PASTE"

    Action starting with "DO" means you have to DO the action yourself (ie. select figure)

    Action 0. "Edit Config" (to list morphs deltas you want to copy)
    The button will simply launch you preferred text editor with the config file in it to be modified.
    Line starting with '#' will give the name of the group where the morphs will be copied to.
    Only one group is creatable/selectable (ex: #My morphs will create the group 'My Morphs')
    If '#' is forgotten you will have a default group created and named '>>> Your COPY'.
    Concerning morphs to copy, format is simple : BODYPART:MORPH (case sensitive -> keep original case), one by line
    This way, things are simples, you can manage your config files your way, creating your custom files at will, store them, share them
    The only pre-requisite is to have this config file filled will the morphs you want to copy.

    Action 2. "Copy Morphs Deltas"
    Will COPY all the morphs specified in the config file from the selected source figure as described above

    Action 4. "Paste Morphs Deltas"
    Will PASTE all the morphs you copied from the source figure to the selected destination figure as described above

    Action Z1. "List All Morphs"
    Will generate a simple pre-formatted ('actor':MORPH) of all morpsh on all body parts from the selected figure to be copied to your config file if desired

    Action Z2. "List Body Morphs"
    Will generate a simple pre-formatted (BODY:MORPH) from the selected figure to be copied to your config file if desired

    Action Z3. "List Head Morphs"
    Will generate a simple pre-formatted (head:MORPH) from the selected figure to be copied to your config file if desired

    Compatibility concerns :

    Should work on P10/P11 (tested) on PC platform.
    Not tested on Mac, and as is, shouldn't work.

    Future evolution :

    • Transfer morph values through a config file option switch
    • Add Mac platform
    • Test and adapt for P9 if possible
    • check all type of valueparms correctly (to remove some doubts through all poser versions including P9)
    • List pre-formatted morphs on selected figure for a choosed body part.
    • As it is now, you can only PASTE once, each paste will delete the data to be copied; if needed, it will be switched on/off via an option in the config file
    • Add possibility to create Dials group at will

    Barzing. @2018

    All feedbacks are welcome ! i said "All" ! :)

  • @barnardino I just D/L the script and have not tried it yet. My feedback would be thanks for making scripts! I really appreciate people making new scripts for Poser. When I get a chance to use the script, I will give my feedback on how it goes.

  • Wow, thank you Barzing... I can't wait to give this a try!

  • Here is some feedback. I try to use the script to port my S4 character to SASHA-16...

    1. I think there is a python script that is missing. When I click on step0 which should launch the text editor and I assume create the temp file Parms2Copy.txt, I instead get an error message.
      NULL (or empty) script name passed to PEPythonEngine::DoScript()
      I check the pz2 and saw that it is trying to run the script called "" but no such file exists.

    2. I create the parms2copy.txt manually, it is blank initially. I click on the "Z1 - List all figure morphs" and it generates a big list in a window. I use "Select All" to copy all of the text, and paste it into the parms2copy.txt file, and save it.

    Now I am ready to do step2, I click to copy the morph deltas. I then get an error saying:
    hip:V4LHipGluteFwd-Bkwd:1 doesn't not exist on this figure !
    So I edit the parms2copy to delete this line. But then I continue to get more errors e.g.
    chest:V4RCllrBreast:1 doesn't not exist on this figure !
    which I also erase... then another error:
    rCollar:V4RShldrDeltUp:1 doesn't not exist on this figure !

    Eventually I delete 8 or 9 more lines from the parms2copy.txt in order for the script to proceed. After a long wait, I get one more error:

    Traceback (most recent call last):
    File "D:\Local\Runtime\Libraries!Barzing\", line 266, in <module>
    File "D:\Local\Runtime\Libraries!Barzing\", line 134, in Main
    NameError: global name 'Rem_Dup' is not defined

    At this point, I do not know if there is anything I can edit to continue... so I stopped here :(

  • @TomsGX Thanks for your feedback,

    i'm going to check the Edit config pb. It's probably because i didn't initialize the file in the package.
    It's not a temp file, it's the config file, and will always exist.

    For the list of morphs, the aim is not to copy all the morphs listed by "Z1 - List all figure morphs". in the list appear some dials that probably shouldn't appear (ie all hidden dials are listed and some that shouldn't be treated). V4RShldrDeltUp:1 is probably a magnet and shouldn't appear in the list (i'm going to check it).

    Copying all the list of morphs in the config file you ask the tool to copy further times the same morphs. In fact when you ask for example to copy BODY:FBMHeavy, the script will copy all the dependent morphs on each body parts to the destination figure. And as you ask to copy the hip:FBMHeavy, chest:FBMHeavy, ... they will be copied 2 times and it's not necessary

    the Lists Z1 -> Z3 are just here to help you to pick up the morphs you want to copy.

    But seeing your need : copy S4 morphs on SASHA-16, it's not this tool you need, because the morphs you want to copy already exist on SASHA-16. What you want is probably to copy the values. So a CTRL-C / CTRL-V on body and heads should be enough.

    For Rem_Dup, i'm going to check and correct.

  • Tool corrected and re-uploaded.

    Config file Edit is corrected and should work.
    V4RShldrDeltUp:1 is a Magnet dial and shouldn't at anytime be copied.
    if i can remove it from the list morphs, i'll do it in a next version.

    Again, thanks for your feedback.

  • I added a quick start in the readme :

    Quick start

    1- In Poser, load the figure from which you want to copy the morphs
    2- load the destination figure on which the morphs you want to copy do not exist
    3- Go in "Pose\Barzing\Morphs Tools Set\Copy-Paste Morphs\Figures\Copy Paste Deltas"
    4- Click "0. Edit Config", your preferred text editor will open the config file
    5- there is a pre-existing example, remove it
    6- create your copy group in first line : "#My group"
    7- on next lines add the morphs you want to copy, for example "BODY:FBMGoblin"
    PBMGoblin is the Internal Name of the morph Goblin
    To find the internal Name you can go in property panel of the BODY of your source figure
    Left-click the little triangle next to the dial morph, select 'setting' the Internal Name will appear here
    8- Save the config file
    9- Select the source figure in the scene
    10- Click "2. Copy Morphs Deltas" (wait)
    11- Select the destination figure in the scene
    12- Click "3. Paste Morphs Deltas" (wait)
    13- find your morphs on the destination figure in the group "#My group" in this example case on BODY.

  • Hi Barzing, thank you for the update and clarification. The quick start also helps a lot.

    I think I found another possible issue when I was testing the updated script. In my S4 figure I have these two dials under Morphs for the head:

    When I click to list all of the head morphs, it only displays
    and seems to miss the second one. This also happens for another pair of morphs under the Body too. Obviously the names of the dials are almost the same except for the end where I put _1 and _3 to separate them.

  • @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:

    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.


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

    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\", line 357, in <module>
    File "D:\Local\Runtime\Libraries!Barzing\", line 296, in Main
    AttributeError: 'NoneType' object has no attribute 'AddValueOperation'