コード例 #1
0
 def _create_particle(self,value,*argv):
     global n_particle_create
     pmel.emitter( r=value,dx=1, dy=0, dz=0, sp=0, nsp=0, n='myRandomEmitter' ,type='surface')
     n_particle_create = pmel.nParticle( n='emittedParticles' )
     n_particle_create[1].maxCount.set(value)
     nucleus = pmel.listConnections(n_particle_create,t='nucleus')
     nucleus[0].gravity.set(0)
     pmel.connectDynamic( 'emittedParticles', em='myRandomEmitter')
     self.list_emitter_delete.append('myRandomEmitter')
     self.list_emitter_delete.append(n_particle_create)
     self.list_emitter_delete.append(nucleus)
コード例 #2
0
ファイル: aw_scatterParticle.py プロジェクト: AndresMWeber/aw
	def _initialize(self,args):
		#Initialize
		partTarget = self.inputBar.getText()
		partNameBase = self.inputName.getText()
		if partTarget=='' or partNameBase=='':
			pm.error("Must input both fields to continue...")
		partName = partNameBase + '_NPARTICLE'
		partNucleus = partNameBase + '_NUCLEUS'
		partEmitter = partNameBase + '_EMITTER'
		#First thing we will do is Emit from Surface with an Emiter
		self.emitter = pm.emitter(partTarget, type='surface',name=partEmitter,r=5000,sro=0,nuv=0,cye='none',cyi=1,spd=0,srn=0,nsp=0,tsp=0,mxd=0,mnd=0,dx=1,dy=0,dz=0,sp=0)

		emitter=self.emitter
		self.nparticle = pm.nParticle(n=partName)
		npart=self.nparticle
		if '2012' in str(pm.versions.current()):
			import maya.cmds as cmds
			self.nucleus = cmds.listConnections(self.nparticle[1].name(), type='nucleus')[0]
			cmds.setAttr((self.nucleus+'.gravity'), 0)
			cmds.setAttr((self.nucleus+'.startFrame'), pm.playbackOptions(q=True,ast=True))
			cmds.rename(self.nucleus, partNucleus)
			self.nucleus=partNucleus
		elif '2015' in str(pm.versions.current()) or '2014' in str(pm.versions.current()):
			self.nucleus=pm.PyNode(set(npart[1].listConnections(type='nucleus')).pop())
			nucleus=self.nucleus
			nucleus.rename(partNucleus)
			nucleus.gravity.set(0)
			nucleus.startFrame.set(pm.playbackOptions(q=True,ast=True))
		else:
			pm.error("This maya version is unsupported by this script")
		#Set the Nucleus to no gravity + start time to first frame
		pm.currentTime( pm.playbackOptions(q=True,ast=True), e=True )
		pm.connectDynamic(npart, em=emitter)
		#Set up the nParticle:
		#add per particle attributes
		vattrs = ['posPP', 'rotPP', 'scalePP']
		for vattr in vattrs:
			npart[1].addAttr(vattr, k=1, dt='vectorArray')
			npart[1].addAttr(vattr+'0', dt='vectorArray')
		fattrs = ['indexPP']
		for fattr in fattrs:
			npart[1].addAttr(fattr, k=1, dt='doubleArray')
			npart[1].addAttr(fattr+'0', k=1, dt='doubleArray')
		#add dynamic expressions ala Vicky Osborne
		self._dynExpr()
		#Change shading type to points
		npart[1].particleRenderType.set(3)
コード例 #3
0
    def createParticleEmitter(self, meshEmitter, collider):

        # Force nParticle balls at creation
        pm.optionVar(sv=("NParticleStyle", "Balls"))

        self.particle, self.partShape = pm.nParticle(n=str(meshEmitter) + "_particle")
        # Add attribute in particleShape
        pm.addAttr(self.partShape, ln="indexPP", dt="doubleArray")
        pm.addAttr(self.partShape, ln="rotatePP", dt="vectorArray")
        pm.addAttr(self.partShape, ln="scalePP", dt="vectorArray")
        pm.addAttr(self.partShape, ln="rgbPP", dt="vectorArray")
        pm.addAttr(self.partShape, ln="fixPosPP", dt="vectorArray")
        pm.addAttr(self.partShape, ln="opacityPP", dt="doubleArray")

        pm.addAttr(self.partShape, ln="typePP", dt="doubleArray")

        self.nameEmitter = str(meshEmitter) + "_emitter"
        pm.emitter(meshEmitter, type="surface", name=self.nameEmitter, r=float(self.ui.simulationEmit_le.text()))
        pm.connectDynamic(self.partShape, em=self.nameEmitter)

        # Used maya command because pymel crash when find nucleus node
        self.nucleusName = mel.eval('listConnections -type "nucleus" ' + self.partShape + ";")[0]

        pm.parent(self.partShape, self.worldParent)
        pm.parent(self.nameEmitter, self.worldParent)
        pm.parent(self.nucleusName, self.worldParent)

        self.setParamaters(self.partShape, self.particleParameter)
        self.setParamaters(self.nameEmitter, self.emitterParameter)
        self.setParamaters(self.nucleusName, self.nucleusParameter)
        pm.addAttr(self.partShape, ln="radiusPP", dt="doubleArray")

        # Create Rigid
        pm.select(collider, r=1)
        pm.runtime.nClothMakeCollide(collider)
        self.nrigid = pm.listConnections(collider.listRelatives(s=1, c=1)[0], type="nRigid")[0]
        self.setParamaters(self.nrigid.listRelatives(s=1, c=1)[0], self.rigidParameter)
        pm.parent(self.nrigid, self.worldParent)
        self.nrigid.setAttr("v", 0)

        # Create instancer
        self.instancer = pm.particleInstancer(
            self.partShape,
            a=True,
            object=self.listInstance,
            n=str(meshEmitter) + "_instancer",
            cycle="sequential",
            age="indexPP",
            rotation="rotatePP",
            scale="scalePP",
            visibility="opacityPP",
        )
        pm.parent(self.instancer, self.worldParent)

        # Create proc Colision
        expression = """
global proc forestGeneratorEvent(string $particleObject,int $particleId, string  $geometryObject) 
{

    vector $rgb = `nParticle -attribute rgbPP -id $particleId -q $particleObject`;

    if ($rgb != << 1,1,1 >>)
    {
        nParticle -e -attribute rgbPP -id $particleId -vv 0 1 0 $particleObject;
    }
    
    vector $pos = `nParticle -attribute position -id $particleId -q $particleObject`;
    
    vector $lastPos = `nParticle -attribute lastPosition -id $particleId -q $particleObject`;
    
    
    
    nParticle -e -attribute opacityPP -id $particleId -fv 1 $particleObject;

    if (mag($pos - $lastPos) >= 10 && $rgb != << 1,1,1 >>){
    
        nParticle -e -attribute lifespanPP -id $particleId -fv 0 $particleObject;
    }
}"""
        pm.expression(s=expression, n="forestGenerator_exp")
        # Create  Colision event

        pm.event(self.partShape, die=0, count=0, proc="forestGeneratorEvent")
コード例 #4
0
ファイル: forestGenerator.py プロジェクト: DeanB93/test
    def createParticleEmitter(self, meshEmitter, collider):

        # Force nParticle balls at creation
        pm.optionVar(sv=("NParticleStyle", "Balls"))

        self.particle, self.partShape = pm.nParticle(n=str(meshEmitter) +
                                                     "_particle")
        #Add attribute in particleShape
        pm.addAttr(self.partShape, ln="indexPP", dt="doubleArray")
        pm.addAttr(self.partShape, ln="rotatePP", dt="vectorArray")
        pm.addAttr(self.partShape, ln="scalePP", dt="vectorArray")
        pm.addAttr(self.partShape, ln="rgbPP", dt="vectorArray")
        pm.addAttr(self.partShape, ln="fixPosPP", dt="vectorArray")
        pm.addAttr(self.partShape, ln="opacityPP", dt="doubleArray")

        pm.addAttr(self.partShape, ln="typePP", dt="doubleArray")

        self.nameEmitter = str(meshEmitter) + "_emitter"
        pm.emitter(meshEmitter,
                   type="surface",
                   name=self.nameEmitter,
                   r=float(self.ui.simulationEmit_le.text()))
        pm.connectDynamic(self.partShape, em=self.nameEmitter)

        #Used maya command because pymel crash when find nucleus node
        self.nucleusName = mel.eval("listConnections -type \"nucleus\" " +
                                    self.partShape + ";")[0]

        pm.parent(self.partShape, self.worldParent)
        pm.parent(self.nameEmitter, self.worldParent)
        pm.parent(self.nucleusName, self.worldParent)

        self.setParamaters(self.partShape, self.particleParameter)
        self.setParamaters(self.nameEmitter, self.emitterParameter)
        self.setParamaters(self.nucleusName, self.nucleusParameter)
        pm.addAttr(self.partShape, ln="radiusPP", dt="doubleArray")

        #Create Rigid
        pm.select(collider, r=1)
        pm.runtime.nClothMakeCollide(collider)
        self.nrigid = pm.listConnections(collider.listRelatives(s=1, c=1)[0],
                                         type='nRigid')[0]
        self.setParamaters(
            self.nrigid.listRelatives(s=1, c=1)[0], self.rigidParameter)
        pm.parent(self.nrigid, self.worldParent)
        self.nrigid.setAttr("v", 0)

        #Create instancer
        self.instancer = pm.particleInstancer(self.partShape,
                                              a=True,
                                              object=self.listInstance,
                                              n=str(meshEmitter) +
                                              "_instancer",
                                              cycle="sequential",
                                              age="indexPP",
                                              rotation="rotatePP",
                                              scale="scalePP",
                                              visibility="opacityPP")
        pm.parent(self.instancer, self.worldParent)

        #Create proc Colision
        expression = """
global proc forestGeneratorEvent(string $particleObject,int $particleId, string  $geometryObject) 
{

    vector $rgb = `nParticle -attribute rgbPP -id $particleId -q $particleObject`;

    if ($rgb != << 1,1,1 >>)
    {
        nParticle -e -attribute rgbPP -id $particleId -vv 0 1 0 $particleObject;
    }
    
    vector $pos = `nParticle -attribute position -id $particleId -q $particleObject`;
    
    vector $lastPos = `nParticle -attribute lastPosition -id $particleId -q $particleObject`;
    
    
    
    nParticle -e -attribute opacityPP -id $particleId -fv 1 $particleObject;

    if (mag($pos - $lastPos) >= 10 && $rgb != << 1,1,1 >>){
    
        nParticle -e -attribute lifespanPP -id $particleId -fv 0 $particleObject;
    }
}"""
        pm.expression(s=expression, n="forestGenerator_exp")
        #Create  Colision event

        pm.event(self.partShape, die=0, count=0, proc="forestGeneratorEvent")
コード例 #5
0
def run(sliderSize, sliderDensity, sliderHeight, textSequence, ckboxTexture, ckboxSequence, ckboxCover, directionX, directionY, directionZ, snowPieceBrowser):
    '''
    This function is the main function to generate the snowy scene.
    
    Args:
        avgSize from sliderSize: The average size of all snow piece
        density from sliderDensity: The density of the snow
        maxDistance from sliderHeight: The highest distance the user want the snow to fall
        snowTexture from ckboxTexture: Whether using the texture for snowflakes
        snowSequence from textSequence: The length of the sequence of images as texture
        directionX: directionX of gravity field
        directionY: directionX of gravity field
        directionZ: directionX of gravity field
        
        coverFlag(coverObj) from ckboxCover: Decide whether the snow will cover the models and which models to cover
        windFlag(windDirection, windStrength): Decide whether there are winds and the directions and strength
        
    GLobal variables used:
        startArea: The surface area the user want the snow fall from
        snowPath: The file path of the snowflake texture
        coverObj: The objects the particles will make collision with
        
    Result: 
        a generated snowy scene animation
        
    Return: 
        none
    
    '''
    ## check whether the user has selected the start Area    
    if isset('startArea') == 0:        
        logger.error('Please choose a plane to start snow!')
        pm.PopupError('Please choose a plane to start snow!')
        return
    ## check whether the user has selected the objects to make collision with
    if ckboxCover.getValue():
        if isset('coverObj') == 0:
            logger.error('Please select the objects to make collision with!')
            pm.PopupError('Please select the objects to make collision with!')
            return
    ## check whether the user has selected files for textures
    snowPath = snowPieceBrowser.getText()
    if ckboxTexture.getValue():
        if snowPath == '':            
            logger.error('Please select the images for textures!')
            pm.PopupError('Please select the images for textures!')
            return            
        
    logger.info('Start generating the snowy scene')

    snowSize = sliderSize.getValue()
    snowDensity = sliderDensity.getValue()
    snowHeight = sliderHeight.getValue()
    
    snowTexture = ckboxTexture.getValue()
    snowSequenceTmp = textSequence.getText()
    snowSequence = int(snowSequenceTmp)
    gdXs = directionX.getText()
    gdYs = directionY.getText()
    gdZs = directionZ.getText()
    
    gdX = float(gdXs)
    gdY = float(gdYs)
    gdZ = float(gdZs)

    pm.playbackOptions(ps = 0.4)
    
    offsetSize = snowSize * 0.3
    minSize = snowSize - offsetSize
    maxSize = snowSize + offsetSize
    
    
    startFace = startArea
    emitter1 = pm.emitter(startFace, sro = True, type = 'surface', rate = snowDensity, minDistance = 0.5, mxd = 1)
    particle_snow2 = pm.particle()
    pm.connectDynamic(particle_snow2, em = emitter1)
    
    ## using image textures for particles
    if ckboxTexture.getValue():
        logger.info(' particle render type: sprite ')
        pm.setAttr('%s.particleRenderType'%particle_snow2[0], 5)
        pm.addAttr(particle_snow2[1], internalSet = True, longName = 'spriteTwist', attributeType = 'float', minValue = -180, maxValue = 180, defaultValue = 0.0)
        pm.addAttr(particle_snow2[1], internalSet = True, ln = 'spriteScaleX', dv = 0.2)
        pm.addAttr(particle_snow2[1], internalSet = True, ln = 'spriteScaleY', dv = 0.2)
        pm.addAttr(particle_snow2[1], internalSet = True, ln = 'spriteNum', at = 'long', dv = 1)
        pm.addAttr(particle_snow2[1], internalSet = True, ln = 'useLighting', at = 'bool',dv = False)
    
        shader2 = pm.shadingNode('lambert', asShader = True)
        file_node2 = pm.shadingNode('file', asTexture = True)
        pm.setAttr('%s.fileTextureName'%file_node2, snowPath, type = 'string')
        shading_group2 = pm.sets(renderable = True, noSurfaceShader = True, empty = True)
        pm.setAttr('%s.ambientColor'%shader2, 1.0, 1.0, 1.0, type = 'double3')
        pm.connectAttr('%s.outColor'%shader2, '%s.surfaceShader'%shading_group2, force = True)
        pm.connectAttr('%s.outColor'%file_node2, '%s.color'%shader2, force = True)
        pm.connectAttr('%s.outTransparency'%shader2, '%s.surfaceShader'%shading_group2, force = True)
        pm.connectAttr('%s.outTransparency'%file_node2, '%s.transparency'%shader2, force = True)
        pm.sets(shading_group2, e = True, forceElement = '%s'%particle_snow2[0])
        
        if ckboxSequence.getValue():
            pm.setAttr('%s.useFrameExtension'%file_node2, 1)
            pm.setAttr('%s.useHardwareTextureCycling'%file_node2, 1)
            pm.setAttr('%s.endCycleExtension'%file_node2, snowSequence)
         
        pm.addAttr(particle_snow2[1], dataType = 'doubleArray', ln = 'spriteScaleXPP')
        pm.addAttr(particle_snow2[1], dataType = 'doubleArray', ln = 'spriteScaleXPP0')
        pm.addAttr(particle_snow2[1], dataType = 'doubleArray', ln = 'spriteScaleYPP')
        pm.addAttr(particle_snow2[1], dataType = 'doubleArray', ln = 'spriteScaleYPP0')
        pm.addAttr(particle_snow2[1], dataType = 'doubleArray', ln = 'spriteTwistPP')
        pm.addAttr(particle_snow2[1], dataType = 'doubleArray', ln = 'spriteTwistPP0') 
        pm.dynExpression(particle_snow2[1], s = 'spriteScaleXPP = rand(%f,%f);\nspriteScaleYPP = spriteScaleXPP;\nspriteTwistPP = rand(0,30);'%(minSize, maxSize), c = True)
        
        if ckboxSequence.getValue():
            pm.addAttr(particle_snow2[1], dataType = 'doubleArray', ln = 'spriteNumPP')
            pm.addAttr(particle_snow2[1], dataType = 'doubleArray', ln = 'spriteNumPP0')
            pm.dynExpression(particle_snow2[1], s = 'spriteScaleXPP = rand(%f,%f);\nspriteScaleYPP = spriteScaleXPP;\nspriteTwistPP = rand(0,30);\nspriteNumPP = rand(0,%f);\nspriteNumPP = (spriteNumPP+1)%%%f;'%(minSize, maxSize, snowSequence, snowSequence+1), c = True) 
    ## don't using textures
    else:
        logger.info(' particle render type: cloud ')
        pm.setAttr('%s.particleRenderType'%particle_snow2[0], 8)
        pm.addAttr(particle_snow2[1], dataType = 'doubleArray', ln = 'radiusPP')
        pm.addAttr(particle_snow2[1], dataType = 'doubleArray', ln = 'radiusPP0')
        pm.addAttr(particle_snow2[1], dataType = 'vectorArray', ln = 'rgbPP')
        pm.addAttr(particle_snow2[1], dataType = 'vectorArray', ln = 'rgbPP0')        
        pm.dynExpression(particle_snow2[1], s = 'radiusPP = rand(%f,%f);\nrgbPP = <<1,1,1>>;'%(minSize, maxSize), c = True)
    
    ## if make collision
    if ckboxCover.getValue():
        for j in range(len(coverObj)):
            pm.collision(coverObj[j], particle_snow2[1], r = 0, f = 1)
    
    ## add gravity
    snowGravity = pm.gravity('%s'%particle_snow2[0], dx = gdX, dy = gdY, dz = gdZ, magnitude = 1.0)
    pm.connectDynamic('%s'%particle_snow2[0], f = snowGravity)    
    
    
    logger.info('Scene generation finished!')
    return
コード例 #6
0
    def makeWord(self, in_word):
        """ create particle word"""

        #    in_word='maya'
        #    font = 'Arial'
        #    font = self.fontChoose.currentFont()
        #    print self.font[-1]
        tCrvs = pm.textCurves(t=in_word, f=self.font, ch=0)
        tCrvs = pm.PyNode(tCrvs[0])

        letterNum = tCrvs.numChildren()
        letter = []
        grpWord = pm.group(em=True)
        for n in range(0, letterNum):
            letterShape = pm.listRelatives(tCrvs.getChildren()[n],
                                           type='nurbsCurve',
                                           ad=True,
                                           path=True)
            letter.append(
                pm.planarSrf(letterShape, ch=1, tol=0.01, o=1, po=1)[0])
        pm.parent(letter, grpWord)

        # pm.select(grpWord)
        wordshape = pm.polyUnite(ch=1, muv=1)[0]
        mc.DeleteHistory()
        wordshape = pm.PyNode(wordshape)
        self.word.append(wordshape)
        # see(wordshape)

        pm.setAttr(tCrvs + ".visibility", 0)
        wordshape.centerPivots()
        # pm.move(-8,0,0)
        pm.makeIdentity(apply=True, t=1, r=1, s=1, n=0, pn=1)
        wordshape.makeLive()

        wordshape.select()
        pm.emitter(type='surface', r=1000, spd=0)
        wordEmitter = wordshape.getChildren()[1]
        wordEmitter = pm.PyNode(wordEmitter)
        wordEmitter.cycleEmission.set(1)
        wordEmitter.maxDistance.set(5)
        # see(wordEmitter)
        # wordEmitter.select()
        wordParticle = pm.particle()[0]
        wordParticle = pm.PyNode(wordParticle)
        wordPaShape = wordParticle.getShape()
        self.wordPar.append(wordPaShape)
        pm.connectDynamic(wordParticle, em=wordEmitter)
        mc.setKeyframe([wordEmitter + ".rate"], v=200, t=100)
        mc.setKeyframe([wordEmitter + ".rate"], v=0, t=101)

        wordPaShape.lifespanMode.set(2)
        wordPaShape.attr("lifespan").set(5)
        wordPaShape.lifespanRandom.set(3)

        wordPaShape.particleRenderType.set(0)
        wordPaShape.addAttr('colorAccum',
                            dv=True,
                            at='bool',
                            internalSet=True,
                            keyable=True)
        wordPaShape.addAttr('useLighting',
                            dv=False,
                            at='bool',
                            internalSet=True)
        wordPaShape.addAttr('multiCount',
                            at='long',
                            min=1,
                            max=60,
                            dv=2,
                            internalSet=True)
        wordPaShape.addAttr('multiRadius',
                            at='float',
                            min=1,
                            max=60,
                            dv=0.3,
                            internalSet=True)
        wordPaShape.addAttr('normalDir',
                            min=1,
                            max=3,
                            at='long',
                            internalSet=True,
                            dv=2)
        wordPaShape.addAttr('pointSize',
                            min=1,
                            max=60,
                            at='long',
                            internalSet=True,
                            dv=2)
        wordPaShape.colorAccum.set(1)
        wordPaShape.multiCount.set(7)
        wordPaShape.pointSize.set(1)

        wordPaShape.addAttr('goalU', dt='doubleArray', keyable=True)
        wordPaShape.addAttr('goalV', dt='doubleArray', keyable=True)
        pm.dynExpression(wordPaShape,
                         s='goalU=rand(0,1);\ngoalV=rand(0,1);',
                         c=1)
        wordPaShape.addAttr('rgbPP', dt='vectorArray', keyable=True)
        pm.dynExpression(wordPaShape, s='rgbPP=position;', rbd=1)

        pm.goal(wordParticle, g=wordshape, w=1, utr=0)
        pm.setKeyframe(wordParticle, attribute='goalWeight[0]', v=1, t=90)
        pm.setKeyframe(wordParticle, attribute='goalWeight[0]', v=0, t=100)
        pm.setAttr(wordshape + ".visibility", 0)

        field = pm.turbulence(pos=(0, 0, 2), m=10)
        pm.connectDynamic(wordParticle, f=field)
        pm.setKeyframe(field, attribute='tx', v=12, t=100)
        pm.setKeyframe(field, attribute='tx', v=0, t=110)
        pm.parent(field, wordshape)

        lambert = pm.shadingNode('lambert', asShader=1)
        lambertSG = pm.sets(renderable=True,
                            empty=1,
                            noSurfaceShader=True,
                            name=lambert + "SG")
        pm.connectAttr(lambert + ".outColor",
                       lambert + "SG.surfaceShader",
                       f=1)
        # pm.sets(wordParticle,forceElement='lambert6SG',e=True)
        wordParticle.select()
        pm.hyperShade(a=lambertSG)
        self.wordTexture.append(lambert)
        pm.setAttr(lambert + ".transparency", 0.7, 0.7, 0.7, type='double3')
        pm.setAttr(lambert + ".incandescence", 0.6, 0.6, 0.6, type='double3')
        pm.setAttr(lambert + ".incandescence", 0.5, 0.5, 0.5, type='double3')
        pm.setAttr(lambert + ".glowIntensity", 0.6)

        wordshape.select()
コード例 #7
0
def ph_mainCode(extraHeight, particleRate, getInitialInfo, minSlope,
                minSlopeVariance, setBoundingBox, maxTilt, objectScale,
                objectScaleVariance, objectHeightVariance):

    displayWindow = True
    windowError = py.window(title="Notice", mxb=False, s=False)
    errorLayout = py.rowColumnLayout(numberOfColumns=3, parent=windowError)

    #initialise varibables
    originalTime = py.currentTime(query=True)
    deleteCount = 0
    decimalPoints = 2

    #file validation
    storeSelection = py.ls(selection=True)

    try:
        validFile = True
        myfile = open('storedobjects.txt')
        objectList = myfile.readlines()
        myfile.close()
        py.select(clear=True)
        for i in range(len(objectList)):
            py.select(objectList[i], add=True)
        1 / len(objectList)

    except:
        validFile = False

    #get original selection
    py.select(clear=True)
    for i in range(len(storeSelection)):
        py.select(storeSelection[i], add=True)

        #deselect non polygons
        if type(storeSelection[i]) != py.nodetypes.Transform:
            py.select(storeSelection[i], deselect=True)

        #deselect objects in the text file
        if getInitialInfo == False:
            for j in range(len(objectList)):
                selectionEdit = storeSelection[i] + objectList[j][
                    -2] + objectList[j][-1]
                if objectList[j] == selectionEdit:
                    py.select(storeSelection[i], deselect=True)

    storeSelection = py.ls(selection=True)

    startTime = time()
    listOfPoints = []
    totalNum = 0

    if len(storeSelection) == 0:
        displayMessage = "Nothing is selected. Please select an object and try again."
        ph_displayWindow(displayWindow, displayMessage)

    elif getInitialInfo == True:

        #write to file
        selection = py.ls(selection=True)
        myfile = open('storedobjects.txt', 'w')
        for i in range(len(selection)):
            myfile.write("" + selection[i] + "\r\n")
        myfile.close()
        if len(selection) > 0:
            print str(len(selection)) + " object(s) successfully stored."
            if displayWindow == True:
                py.text(label="  ")
                py.text(label="  ")
                py.text(label="  ")
                py.text(label="  ")
                py.text(label=str(len(selection)) +
                        " object(s) successfully stored.",
                        align="center")
                py.text(label="  ")
                py.text(label="  ")
                py.text(label="  ")
                py.text(label="  ")
                py.showWindow()

        else:
            displayMessage = "Please select the objects you wish to store."
            ph_displayWindow(displayWindow, displayMessage)

        for i in range(len(storeSelection)):
            py.select(storeSelection[i], add=True)

    elif validFile == False:
        displayMessage = "Error with stored list. Please choose new object(s) to duplicate."
        ph_displayWindow(displayWindow, displayMessage)

    elif len(objectList) == 0:
        displayMessage = "No objects stored. Please choose new object(s) to duplicate."
        ph_displayWindow(displayWindow, displayMessage)

    else:
        for loops in range(len(storeSelection)):

            particleID = []
            particleLoc = []
            particleVelocity = []

            #get information about selected object
            py.select(storeSelection[loops], r=True)
            originalObj = py.ls(selection=True)
            originalObjLoc = originalObj[0].getTranslation()
            originalObjX = originalObjLoc.x
            originalObjY = originalObjLoc.y
            originalObjZ = originalObjLoc.z

            #duplicate object to work on
            tempObj = py.instance(originalObj)

            #make emitter
            particleEmitter = py.emitter(n='tempEmitter',
                                         type='surface',
                                         r=particleRate * 24,
                                         sro=0,
                                         speed=0.0001)
            particles = py.particle(n='emittedParticles')
            py.connectDynamic('emittedParticles', em='tempEmitter')
            py.setAttr(particles[1] + '.seed[0]', rd.randint(0, sys.maxint))

            #get list from file
            myfile = open('storedobjects.txt')
            objectList = myfile.readlines()
            objectListCopy = []
            myfile.close()

            for i in range(len(objectList)):
                copyObj = py.duplicate(objectList[i])
                objectListCopy.append(copyObj)

            #fixes the seed always being 0
            py.currentTime(originalTime + 1, edit=True, update=True)
            py.currentTime(originalTime, edit=True, update=True)
            py.currentTime(originalTime + 1, edit=True, update=True)
            numOfParticles = particles[1].num()

            for i in range(numOfParticles):

                #get particle info
                particleInfo = particles[1].Point('emittedParticles', i)
                particleID.append(particleInfo)
                particleLoc.append(particleInfo.position)
                particleVelocity.append(particleInfo.velocity)

            for i in range(len(particleID)):

                #place objects
                randomNum = rd.randint(0, len(objectListCopy) - 1)
                instanceObj = objectListCopy[randomNum]
                dupObj = py.instance(instanceObj)
                yDir = particleVelocity[i][1] * 10000

                #get height of object
                py.select(instanceObj, r=True)
                py.scale(1, 1, 1)
                height = py.ls(selection=True)[0].getBoundingBox().height()

                #reselect instance
                py.select(dupObj[0], r=True)
                py.move(dupObj[0], particleLoc[i][0],
                        particleLoc[i][1] + extraHeight, particleLoc[i][2])
                py.rotate(dupObj[0],
                          rd.uniform(-maxTilt, maxTilt),
                          rd.randint(0, 360),
                          rd.uniform(-maxTilt, maxTilt),
                          os=True)
                scaleX = rd.uniform(objectScale - objectScaleVariance,
                                    objectScale + objectScaleVariance)
                scaleY = rd.uniform(objectScale - (objectHeightVariance / 2),
                                    objectScale + objectHeightVariance)
                scaleZ = rd.uniform(objectScale - objectScaleVariance,
                                    objectScale + objectScaleVariance)
                py.scale(dupObj[0], scaleX, scaleY, scaleZ)

                if yDir <= rd.uniform(minSlope - minSlopeVariance,
                                      minSlope + minSlopeVariance):
                    py.delete(dupObj)
                    deleteCount = deleteCount + 1
                else:
                    listOfPoints.append(dupObj)

                #display percent completed
                maxValue = int(pow(len(particleID), 0.5))
                if float(i / maxValue) == float(i) / maxValue:
                    print str(
                        int((float(i) * 100 / len(particleID)) * 100.0) /
                        100.0) + "% completed"

            totalNum = totalNum + numOfParticles

            #delete temp objects
            py.select(tempObj, 'tempEmitter', 'emittedParticles')
            py.delete()
            py.currentTime(originalTime, edit=True, update=True)
            for i in range(len(objectListCopy)):
                py.delete(objectListCopy[i][0])

    #place objects in display layer
    py.select(clear=True)
    if len(listOfPoints) > 0:
        if setBoundingBox == True:
            displayLayerName = 'duplicatedObjectsBB'
        else:
            displayLayerName = 'duplicatedObjectsMesh'

        #add to display layer
        try:
            for i in range(len(listOfPoints)):
                py.editDisplayLayerMembers(displayLayerName, listOfPoints[i])

        #create display layer first
        except:
            py.createDisplayLayer(noRecurse=True, name=displayLayerName)
            for i in range(len(listOfPoints)):
                py.editDisplayLayerMembers(displayLayerName, listOfPoints[i])

            #display objects as bounding box
            if setBoundingBox == True:
                py.setAttr(displayLayerName + '.levelOfDetail', 1)
            py.setAttr(displayLayerName + '.color', 17)

        #add to group
        for i in range(len(listOfPoints)):
            py.select(listOfPoints[i][0], add=True)
        py.group(n='duplicatedObjectsGroup')

        #output time taken
        endTime = time()
        ph_timeOutput(startTime, endTime, decimalPoints)
        secondsDecimal, sec = ph_timeOutput(startTime, endTime, decimalPoints)
        displayMessage = str(totalNum -
                             deleteCount) + " objects created in " + str(
                                 secondsDecimal) + str(sec)
        ph_displayWindow(displayWindow, displayMessage)

    #select original selection
    py.select(clear=True)
    for i in range(len(storeSelection)):
        py.select(storeSelection[i], add=True)