Übergabe von Vektor zwischen Klassen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
monamunki
User
Beiträge: 3
Registriert: Mittwoch 5. April 2006, 15:09

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" />
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?
monamunki
User
Beiträge: 3
Registriert: Mittwoch 5. April 2006, 15:09

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.
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?
monamunki
User
Beiträge: 3
Registriert: Mittwoch 5. April 2006, 15:09

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()
Antworten