WorldViz User Forum

WorldViz User Forum (https://forum.worldviz.com/index.php)
-   Vizard (https://forum.worldviz.com/forumdisplay.php?f=17)
-   -   Identify a class via its mesh (https://forum.worldviz.com/showthread.php?t=4137)

EnvisMJ 02-14-2012 01:53 PM

Identify a class via its mesh
 
So I've been having a problem for a while, I need to identify a class object via the 3D mesh that represents it in the environment.

Example code:

Code:

import viz
import vizact

#Sample Environment
ground = viz.add('tut_ground.wrl')
ground.tag = "You missed clicking on a box."

class exampleObject(object):        #Example class containing a mesh
        def __init__(self,classTag,geometryTag,x,y,z,color):
                self.tag = classTag
                self.model = viz.add('box.wrl')
                self.model.tag = geometryTag
                self.model.setPosition(x,y,z)
                self.model.color(color)
                self.model.setScale(.333,.333,.333)

#Creating some objects
A = exampleObject("classA","geometryA",-.5,1.6,2,viz.RED)
B = exampleObject("classB","geometryB",0,1.6,2,viz.BLUE)
C = exampleObject("classC","geometryC",.5,1.6,2,viz.GREEN)

def clickPick():        #Pick an object
        mesh = viz.pick()
        classObject = mesh  ###This line should be modified###
        print classObject.tag

vizact.onmousedown(viz.MOUSEBUTTON_LEFT, clickPick)        #Pick an object on Left-click

viz.go()


#The problem, how do I go from the mesh to the class object...

#As in what (function) do I need to apply to the [mesh] to return the [class object]
#Example:

def classPick():        #Pick an object, print it's class' tag
        mesh = viz.pick()
        classObject = mesh.(function)()
        print classObject.tag
       
#Should print "classA" rather than "geometryA"
#Should print "classB" rather than "geometryB"
#Should print "classC" rather than "geometryC"

How do I get it to return the class object rather than the geometry?

farshizzo 02-15-2012 08:43 AM

If you have your exampleObject class inherit from the Vizard node class, then your class instance will be returned from the pick command. I modified your example to show this:
Code:

import viz
import vizact

#Sample Environment
ground = viz.add('tut_ground.wrl')
ground.tag = "You missed clicking on a box."

class exampleObject(viz.VizNode):        #Example class containing a mesh
        def __init__(self,classTag,geometryTag,x,y,z,color):

                model = viz.add('box.wrl')
                viz.VizNode.__init__(self,model.id)

                self.class_tag = classTag
                self.geometry_tag = geometryTag
                self.setPosition(x,y,z)
                self.color(color)
                self.setScale(.333,.333,.333)

        def printTag(self):
                print self.class_tag,self.geometry_tag

#Creating some objects
A = exampleObject("classA","geometryA",-.5,1.6,2,viz.RED)
B = exampleObject("classB","geometryB",0,1.6,2,viz.BLUE)
C = exampleObject("classC","geometryC",.5,1.6,2,viz.GREEN)

def clickPick():        #Pick an object
        mesh = viz.pick()
        if isinstance(mesh,exampleObject):
                mesh.printTag()

vizact.onmousedown(viz.MOUSEBUTTON_LEFT, clickPick)        #Pick an object on Left-click

viz.go()



All times are GMT -7. The time now is 09:25 PM.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Copyright 2002-2023 WorldViz LLC