Seite 1 von 1

Übergabe von Vektor zwischen Klassen

Verfasst: Mittwoch 5. April 2006, 15:21
von monamunki
Hallo!

Hab noch nie python gebraucht, aber bei unserem neuesten Projekt ist es sicher die beste Lösung. Wir wollen den PhantomOmni in eine 3D Umgebung einpflegen, was ja soweit auch funktioniert, nur habe ich ein Problem bei der Übergabe von WErten zwischen zwei Klassen. Vielleicht kann mir jemand von euch helfen?

Code: Alles auswählen

class bewegen2( AutoUpdate (SFVec3f) ):

def update(self, event):
    pos = event.getValue()
    return Vec3f(pos)

bewegen2 = bewegen2()     

class bewegen( TypedField( SFVec3f, SFBool) ):
    def update(self, event):
        if( event.getValue() ):
             pos2=bewegen2()
             return Vec3f(pos2.x, pos2.y, pos2.z)

bewegen = bewegen()     
ROUTING im x3d-File:

<PythonScript DEF="PS" url="button.py">
</PythonScript>

<ROUTE fromNode="HDEV" fromField="secondaryButton"
toNode="PS" toField="bewegen" />

<ROUTE fromNode="HDEV" fromField="trackerPosition"
toNode="PS" toField="bewegen2" />

<ROUTE fromNode="PS" fromField="bewegen"
toNode="TRANSI" toField="translation" />

Re: Übergabe von Vektor zwischen Klassen

Verfasst: Mittwoch 5. April 2006, 21:54
von BlackJack
monamunki hat geschrieben:Wir wollen den PhantomOmni in eine 3D Umgebung einpflegen, was ja soweit auch funktioniert, nur habe ich ein Problem bei der Übergabe von WErten zwischen zwei Klassen. Vielleicht kann mir jemand von euch helfen?
Was ist bitte der `PhantomOmni`!?

Code: Alles auswählen

class bewegen2( AutoUpdate (SFVec3f) ):

def update(self, event):
    pos = event.getValue()
    return Vec3f(pos)

bewegen2 = bewegen2()     

class bewegen( TypedField( SFVec3f, SFBool) ):
    def update(self, event):
        if( event.getValue() ):
             pos2=bewegen2()
             return Vec3f(pos2.x, pos2.y, pos2.z)

bewegen = bewegen()     
Das ist kein gültiger Python Quelltext. Die erste Klasse hat ein Problem mit der Einrückung (oder es fehlt ein ``pass``) und ich weiss nicht ob Du Klassen in Python wirklich verstanden hast. In den Klammern bei der Klassendefinition kommt der Obertyp. Bei Dir steht da jeweils ein Funktionsaufruf. Die Funktionsnamen und deren Argumente werden aber nirgendwo definiert. Und nach jeder Klassendefinition bindest Du den Namen der Klasse an eine Instanz dieser Klasse. Das sieht alles sehr eigenartig aus.

Wenn Du konkrete Fragen hast, dann zeig uns bitte möglichst minimalen, lauffähigen Quelltext und sag was Du für Probleme damit hast. Wenn die Frage eher allgemein ist, dann solltest Du sie nochmal anders formulieren. Was genau willst Du machen?

Verfasst: Donnerstag 6. April 2006, 08:56
von monamunki
Also der Phantom Omni ist ein haptisches Gerät mit Force-Feedback. Der sieht aus wie ein Stift auf einem Hebelarm und hat zwei Knöpfe. Wenn der erste Knopf gedrückt wird wechselt ein Objekt in der x3d Umgebung die Farbe. Das funktioniert mit folgender class in Python:

Code: Alles auswählen

class ButtonClick( TypedField( SFColor, SFBool) ):
  def update(self, event ):

  	if( event.getValue() ):
  		return RGB ( 0, 0, 1)
  	else:
  		return RGB ( 1, 0, 0)

ButtonClick = ButtonClick()
Mit dem zweiten Knopf will ich das Objekt nehmen können und die Position verändern. Der Code der in meiner ersten Frage ist, ist nur mein ausgangscode. Ich habe schon alles versucht mit call und init Funktionen, aber alles nur Fehlermeldungen.

Verfasst: Donnerstag 6. April 2006, 22:12
von BlackJack
Das mit dem Phantom Omni hätte man vielleicht noch durch eine Suchmaschine herausbekommen. Aber welche X3D Umgebung Du benutzt, verrät meine Kristallkugel leider nicht.

Sie hat auf jeden Fall eine ziemlich komische Programmierschnittstelle.

Woher weiss die Umgebung denn zum Beispiel das `ButtonClick` der Name des Objekts ist, das auf einen Mausklick reagiert?

x3d Umgebung

Verfasst: Freitag 7. April 2006, 10:58
von monamunki
Mit spezieller Freeware der H3d Gruppe ist es möglich mit diesem Haptischen Stift zu kommunizieren, aber das kann ich nicht näher ausführen, da dies ziemlich mächtig ist. Wichtig ist, dass wir mit PythonScripts die für uns benötigten Funktiontn individuell anpassen.

Außerdem habe ich dass mit der Übergabe zwischen den Klassen schon geschafft. Ein weiteres Problem ist aber noch, dass wenn ich den Knopf drücke zwar einmalig die Aktion geschieht und durch eine normale while-Schleife nicht während der ganzen Zeit passiert. Ich werde da noch drüber tüffteln und wenn ich an meine Grenzen gestoßen bin, würde ich mich freuen, wenn einer von euch mir helfen könnte.

Für die, die es interessiert, so klappt es:

Code: Alles auswählen

class bewegen2( AutoUpdate (SFVec3f) ):

  def route (bewegen):
    pass
  def update(self, event):
    self.pos = event.getValue()
    pos=self.pos
    return Vec3f(pos.x, pos.y, pos.z)
 

bewegen2 = bewegen2()             



class bewegen( TypedField( SFVec3f, SFBool) ):
  def update(self, event):

    if( event.getValue() ):

      pos2=bewegen2.pos
      return Vec3f(pos2.x, pos2.y, pos2.z)

bewegen = bewegen()