Forum: Poser Python Scripting


Subject: Snap-To Script Update

Uncanny_Film opened this issue on Apr 24, 2023 · 3 posts


Uncanny_Film posted Mon, 24 April 2023 at 9:47 AM

Can someone Update this script to work with Poser 12?

Thanks.




#-----------------------------------------------------------------------------

# Snap-to

# Jan 9,06

# Copyright (c) 2006 by David G. Drumright (ockham)

# Select the 'mover' before hitting the script.

# Hit the script, then select the 'destination'.

# The 'mover' will go to the dest.

#-----------------------------------------------------------------------------


import poser

import string

scene=poser.Scene()


Mover=scene.CurrentActor()

if not Mover.IsProp() and not Mover.ItsFigure(): exit


from Tkinter import *


#-----------------------------------------------------------------------------

# Next section is TK

#------------------------------------------------------------


class App:

    def __init__(self, master, textMessage):

        self.master = master

        master.title("Snap-to")


        self.StatusEntry = Entry(self.master,width=60)

        self.StatusEntry.grid(row=0,column=0)


        self.master.protocol('WM_DELETE_WINDOW', self.HandleCancel)



    # - - - - - - - - - - - - - - - - - -

    def ShowStatus(self,S): # Just saving repetition

        self.StatusEntry.delete(0,END)

        self.StatusEntry.insert(0,S)

        self.StatusEntry.update_idletasks()


    # - - - - - - - - - - - - - - - - - -


    def Update(self):


        if scene: scene.ProcessSomeEvents(1)


        self.ShowStatus("%s is mover.  Waiting to select destination..." % Mover.Name())


        Dest=scene.CurrentActor()

        # Two ways to be a different object.  Either the Name is

        # different, or the part is on a different figure.

        Diff = 0

        DF=Dest.ItsFigure()

        MF=Mover.ItsFigure()

        if string.upper(Dest.Name())=='BODY':  Diff = 0

            # Somewhat tricky.

            # It appears that the BODY gets quietly selected very briefly before you

            # select a part, so we can't act on the BODY.


        elif Dest.Name() != Mover.Name(): Diff = 1


        elif DF and MF and (DF.Name() != MF.Name()): Diff = 1


        if Diff:

            if string.upper(Dest.Name())=='BODY':

                DestX=Dest.ParameterByCode(poser.kParmCodeXTRAN).Value()

                DestY=Dest.ParameterByCode(poser.kParmCodeYTRAN).Value()

                DestZ=Dest.ParameterByCode(poser.kParmCodeZTRAN).Value()


            else:

                scene.DrawAll()

                # Locate actual center of dest.

                Geom=Dest.Geometry()

                MinX= 10000.0

                MinY= 10000.0

                MinZ= 10000.0

                MaxX=-10000.0

                MaxY=-10000.0

                MaxZ=-10000.0

                for v in range(Geom.NumVertices()):

                    WV=Geom.WorldVertex(v)

                    if   WV.X() > MaxX: MaxX=WV.X()

                    elif WV.X() < MinX: MinX=WV.X()

                    if   WV.Y() > MaxY: MaxY=WV.Y()

                    elif WV.Y() < MinY: MinY=WV.Y()

                    if   WV.Z() > MaxZ: MaxZ=WV.Z()

                    elif WV.Z() < MinZ: MinZ=WV.Z()

                DestX=(MaxX+MinX)/2.0

                DestY=(MaxY+MinY)/2.0

                DestZ=(MaxZ+MinZ)/2.0

            Mover.ParameterByCode(poser.kParmCodeXTRAN).SetValue(DestX)

            Mover.ParameterByCode(poser.kParmCodeYTRAN).SetValue(DestY)

            Mover.ParameterByCode(poser.kParmCodeZTRAN).SetValue(DestZ)

            scene.SelectActor(Mover) # return to the item we're trying to move

            scene.DrawAll()


            self.master.destroy() # Done.


        else: # Keep watching

            root.lift()

            root.after(100, self.Update)



    # - - - - - - - - - - - - - - - - - -


    def HandleCancel(self):

        self.master.destroy()


#------------------------------------------------------------

# Activate the loop

#------------------------------------------------------------


root = Tk()

app = App(root, '')

app.Update()

root.mainloop()


#------------------------------------------------------------

# End TK loop.

#-----------------------------------------------------------------------------








Win10 - AMD 2nd Gen Ryzen Threadripper 2950X, 16-Core, 32 Thread 4.4 GHz - 128GB Ram - X2 GeForce RTX 3060 Ti - 3D-connexion  

Poser 12 | Octane Render |  Real-Flow | 3DCoat | Speed Tree | Adobe Premiere  |  Adobe After Effects |  Adobe Audition |  Adobe Photoshop