EcoRotate

This script for Vue Infinite and xStream allows all the objects / instances in an EcoSystem to point in a direction. It also allows a a bit of variation to be included in the rotation.

[codesyntax lang=”python”]

#***********************************************************************
# Set all instances in an EcoSystem to point in a given direction
# - EcoRotate.py
# -
# - By Mark Caldwell
# - Version 0.2
# - 25th August 2007
# - Checked with Vue 6.5 Infinite
#
# How to use in 4 easy steps
# 1. Select an object with a populated EcoSystem
#
# 2. Run this script
#
# 3. Enter the values requested by the script
#
# 4. Wait for the script to work
#
#***********************************************************************

#----------------------------------------------------
# Get Input and Test Value for value 0-360 for Angles
#----------------------------------------------------

def TestValAngle (messagetxt,titletxt,default):
    hit=-2
    val=-1

    while hit<0:
        try:
            if int(val) in range (0,360):
                hit=1;
            elif hit==-2:
                val=Prompt (messagetxt,default,true,titletxt)
                hit=-1
            else:
                val=Prompt ("Error: Value must be an integer between 0 and 360\n\n"+messagetxt,val,true,titletxt)
        except:
            hit=-1
            val=Prompt ("Error: Value must be an integer between 0 and 360\n\n"+messagetxt,val,true,titletxt)

    return float(val)

#--------------------------------------------
# Get Input and Test Value for valuse 0 or 1
#--------------------------------------------

def TestValZO (messagetxt,titletxt,default):
    hit=-2
    val=-1

    while hit<0:
        try:
            if int(val) in range (0,2):
                hit=1;
            elif hit==-2:
                val=Prompt (messagetxt,default,true,titletxt)
                hit=-1
            else:
                val=Prompt ("Error: Value must be either 0 or 1\n\n"+messagetxt,val,true,titletxt)
        except:
            hit=-1
            val=-3

    return val

#--------------------------------------------
# Start of Main Code
#--------------------------------------------

import random

#--------------------------------------------------------------------------
# Test the user has a scene loaded
#--------------------------------------------------------------------------

if TestLoaded():

#--------------------------------------------------------------------------
# Test the user has 1 object selected with an Eco System on it
#--------------------------------------------------------------------------

    numselected=CountSelectedObjects()

    if numselected>1:
        message="Please select only one object."
    elif numselected<1:
        message="Please select an object."
    else:

        #--------------------------------------------------------------------------
        # Get User values for rotation required, which to rotate and randomness
        #--------------------------------------------------------------------------

        xon=TestValZO ('Rotate on X axis? (Enter 0 for yes and 1 for no)','Rotate on X?','0')

        if xon=="1":
            rx=TestValAngle ('Rotate to X (0 to 360 degrees)','X Rotation','0')
            rxv=TestValAngle ('Variation of Rotation to X (0 to 360 degrees)','X Rotation Variation','0')

        yon=TestValZO ('Rotate on Y axis? (Enter 0 for yes and 1 for no)','Rotate on Y?','0') # Rotate y (set to 1 to change 0 to leave alone)

        if yon=="1":
            ry=TestValAngle ('Rotate to Y (0 to 360 degrees)','Y Rotation','0')
            ryv=TestValAngle ('Variation of Rotation to Y (0 to 360 degrees)','Y Rotation Variation','0')

        zon=TestValZO ('Rotate on Z axis? (Enter 0 for yes and 1 for no)','Rotate on Z?','0') # Rotate z (set to 1 to change 0 to leave alone)

        if zon=="1":
            rz=TestValAngle ('Rotate to Z (0 to 360 degrees)','Z Rotation','0')
            rzv=TestValAngle ('Variation of Rotation to Z (0 to 360 degrees)','Z Rotation Variation','0')

#--------------------------------------------------------------------------
#Set Up a Few Variables
#--------------------------------------------------------------------------

        bObject=GetSelectedObjectByIndex(0)     # Get first selected object
        Eco = GetEcosystemOnObject(bObject)     # Get EcoSystem on first selected

        objlist=[bObject]

        if Eco==None:
            message="Please select an object with an EcoSystem material applied to it."
        elif bObject.IsLocked():                # Check object isn't locked
            message="Please select an object that isn't locked."
        else:
            ecocount=Eco.GetInstanceCount ()    # Count number of instances in EcoSystem

            if ecocount==0:
                message="Please select an EcoSystem that has been populated."
            else:

#--------------------------------------------------------------------------
# Rotate EcoObjects
#--------------------------------------------------------------------------

                for i in range(0,ecocount):
                   currentrotation=Eco.GetInstanceRotation  (i)

                   if xon!="1":
                       rix=currentrotation[0]
                   else:
                       rix=rx+random.uniform(-rxv,rxv)

                   if yon!="1":
                       riy=currentrotation[1]
                   else:
                       riy=ry+random.uniform(-ryv,ryv)

                   if zon!="1":
                       riz=currentrotation[2]
                   else:
                       riz=rz+random.uniform(-rzv,rzv)

                   Eco.SetInstanceRotation(i,rix,riy,riz)

                message="Eco Rotation Success"
else:
    message="No Scene Loaded"

Message(message)    # Display message

#--------------------------------------------------------------------------
# End of Script
#------------------------------------------------------------------------

[/codesyntax]

impworks © Copyright Mark Caldwell 1996 - 2024