Frame-basierte Positionierung

Es gibt zwei Möglichkeiten, um Modellelemente, die physische Bauteile oder Baugruppen darstellen, zu positionieren: durch Abhängigkeiten oder durch Koordinaten-Frames. Abhängigkeiten sind nur in Hosts wie Inventor, die abhängigkeitsbasierte Positionen unterstützen, verfügbar. Die Frame-basierte Positionierung ist auf allen Hosts verfügbar. In diesem Abschnitt werden die Konzepte der Frame-basierten Positionierung und einige in der Sprache Intent verfügbaren Werkzeuge skizziert, die die Komponentenplatzierung erleichtern.

Der grundlegende Begriff der Frame-basierten Positionierung ist der Koordinaten-Frame. In Intent ist er ein Datentyp erster Klasse. Ein Frame ist praktisch eine umgewandelte Matrix, die die Position und Ausrichtung eines dreidimensionalen Koordinatensystems relativ zu den Weltkoordinaten der x, y und z darstellt. Der WorldFrame ist die Identitätsumwandlung. Ein Punkt mit den Koordinaten x, y und z im worldFrame ist tatsächlich der Punkt mit diesen Koordinaten. Intern werden alle Punkte (und Vektoren) in Weltkoordinaten gespeichert. Diese Koordinaten sind manchmal in bestimmten Ausgaben sichtbar, wie z. B. bei der Darstellung von Punktwerten im Fenster Sofort oder im Eigenschaftenfenster.

Für die Handhabung der Positionierung und Ausrichtung durch Intent ist das Design FrameMixin wesentlich. Sie stellt alle Parameter und sonstigen Regeln zu Frames bereit. Alle Komponenten, deren Design an FrameMixin beteiligt ist, unterstützen die Frame-basierte Positionierung. Das Schlüsselattribut von FrameMixin ist localFrame. Es ist vom Typ Frame und enthält die Umwandlung des Koordinatensystems der lokalen Komponente relativ zur Welt. Um eine Komponente zu positionieren, gibt es mehrere alternative Methoden, die letztendlich alle zur Festlegung von localFrame führen.

In FrameMixin sind bereits die meisten Intent-Designs enthalten. Nur die Objekte, die keine physischen Körper darstellen (z. B. Berichte, Stücklisten usw.) sind nicht enthalten. Es ist in BasePart enthalten, einem grundlegenden Design von Intent.

Wenn Punkte oder Vektoren mit den Funktionen Point() oder Vector() erstellt werden, erstellen diese Funktionen automatisch Punkte oder Vektoren relativ zum localFrame. Ein einfaches Beispiel zeigt dies.

Design myRoot : BasePart
   Rule p1 As Point = Point(1,2,3)
	
   Child c1 As :myChild
      Origin = p1
   End Child

End Design

Design myChild : BasePart

   Rule p2 As Point = Point(10,0,0)
	
End Design

Prüfen Sie jetzt die Werte der Punkte:

Intent >Root.p1
--> Point_(1.0, 2.0, 3.0, WorldFrame())
Intent >Root.c1.p2
--> Point_(11.0, 2.0, 3.0, WorldFrame())

Beachten Sie, dass die Ausgabe dieser Referenzen aus Aufrufen der Funktion Point_() besteht. Diese Funktion ist mit der Funktion Point() identisch, mit der Ausnahme, dass der Frame, dessen Koordinaten interpretiert werden müssen, ausdrücklich erforderlich ist. Es gibt eine ähnliche Funktion für Vektoren, Vector_().

Der myRoot-Aufruf der Funktion Point() verwendet den localFrame des Stamms. Dies ist immer der worldFrame. Daher stimmen die Weltkoordinaten von Punkt p1 genau mit der Eingabe überein. Der localFrame ist die Identitätsumwandlung. An diesem Punkt wird das untergeordnete Element c1 positioniert. Dadurch wird sein localFrame so verschoben, dass sich sein Ursprung in p<1,2,3> befindet.

Der untergeordnete Aufruf der Funktion Point() verwendet den localFrame von c1 und wandelt folglich die ihm übergebenen Koordinaten um. Damit ist der zu c1 relative Punkt<10,0,0> der Punkt p<11,2,3> in der Welt.

Der Benutzer muss die von Intent verwendeten Koordinaten nicht kennen. Das Design myRoot funktioniert selbst dann in gleicher Weise, wenn es nicht das Stammobjekt ist. Und das untergeordnete Element c1 befindet sich relativ zu seinem übergeordneten Element an genau derselben Position, unabhängig davon, wo sich das übergeordnete Element befindet. Alle resultierenden Koordinaten ändern sich, nicht aber die Regeln. Darüber hinaus ist jede Referenzierung von c1.p2 korrekt, und der Aufrufer muss sich nicht um die Position von c1 kümmern.

Außerdem verwaltet Intent alle Frames in einem Modell. Genau wie im Beispiel muss der Ersteller nur Regeln in lokalen Koordinaten schreiben. Das Baugruppenmodellierungsverhalten von Intent gewährleistet immer korrekte Auswertungen. Wenn eine übergeordnete Baugruppe neu positioniert wird, werden alle Unterbaugruppen automatisch aktualisiert.

Positionierung mit koordinatenfreier geometrischer Algebra

Eine gängige Methode zum Positionieren von Bauteilen mit Frame-basierter Positionierung nutzt die in die Sprache Intent integrierten geometrischen Algebrafunktionen. Da das System die Datentypen kennt, wird die algebraische Berechnung mit diesen Typen korrekt ausgeführt. Beispiel: Das System weiß, dass die Operation Punkt + Vektor einen Punkt ergibt. Ein mit einer skalaren (numerischen) Menge multiplizierter Vektor ergibt einen Vektor mit gleicher Richtung, aber anderer Länge. Ein mit einem Skalar multiplizierter Punkt ergibt einen Fehler. Ein zu einem Punkt addierter Punkt führt auch zu einem Fehler.

Bei diesen Funktionen kann der Regelschreiber die zugrunde liegenden Koordinaten und die Frames, die sie enthalten, ignorieren. Intent kümmert sich um die Details. Dies wird als koordinatenfreie Geometrie bezeichnet.

Im folgenden Inventor-Beispiel werden drei Kugeln erstellt und zu einem einfachen Schneemann angeordnet.

Design Snowman : Office IvAssemblyDocument
   Parameter Rule baseSize As Number = 50
   Child base As :IvSphere
      radius = baseSize
      ' you can specify an offset of a point by
      ' adding a scaled vector to a point 
      origin = Me.origin + unitY * child.radius	
      ' align the X axis of this sphere with the assembly X axis
      xDirection = unitX			
      ' align the Y axis with the negative Z axis of the assembly
      yDirection = -unitZ			
      color = "White"
      ignorePosition? = False	
      grounded? = True	' position the part and ground it
   End Child
	
   Child body As :IvSphere
      radius = baseSize * 0.75
      origin = base.origin + base.unitZ * (child.radius + base.radius)
      xDirection = base.unitX
      yDirection = base.unitY
      color = "White"
      ignorePosition? = False
      grounded? = True
   End Child
	
   Child head As :IvSphere
      radius = baseSize * 0.50
      origin = body.origin + body.unitZ * (child.radius + body.radius)
      xDirection = body.unitX
      yDirection = body.unitY
      color = "White"
      ignorePosition? = False
      grounded? = True
   End Child
End Design

Anmerkungen:

Der Parameter ignorePosition? wird in Inventor nur benötigt, weil Inventor vorgabemäßig die abhängigkeitsbasierte Positionierung verwendet. Der Parameter grounded? ist auch Inventor-spezifisch.

Die Regeln origin, xDirection, yDirection, unitX, unitY und unitZ werden von FrameMixin bereitgestellt.

Das untergeordnete Element der Basiskugel wird so positioniert, dass es auf der xy-Ebene der Baugruppe aufliegt. Dies erfolgt durch Festlegen des Parameters origin für das untergeordnete Element:
   origin = Me.origin + unitY * child.radius

Ausgehend vom Ursprung der Baugruppe (ME .origin) addieren Sie das Produkt eines y-Achsen-Vektors (unitY ist ein an der Y-Achse ausgerichteter Vektor von einer Einheit) zum Radius der Basis.

Um die Körperkugel oben auf der Basiskugel zu positionieren, beginnen Sie mit dem Ursprung der Basis und wandeln den Punkt in z-Richtung der Basis um den Radius der Basis plus den Radius des Körpers um:
   origin = base.origin + base.unitZ * (child.radius + base.radius)

Die Positionierung des Kopfs auf dem Körper erfolgt ähnlich wie die Positionierung des Körpers auf der Basis.

Ausrichtung

Bisher wurde nur der Parameter origin von FrameMixin erläutert. Wenn origin allein verwendet wird, ergeben sich nur Konvertierungen. Wenn andere Parameter bereitgestellt werden, kann eine vollständig allgemeine Ausrichtung definiert werden. Die einfachste Möglichkeit zum Durchführen einer allgemeinen Ausrichtung bieten die Parameter xDirection und yDirection. Wie der Name schon sagt, ist xDirection ein Vektorparameter, der die Richtung der x-Achse von localFrame angibt. Anders als der Name vermuten lässt, gibt yDirection jedoch nicht die y-Achse an. Da die Achsen orthogonal sein müssen, gibt es keine Beschränkung für unabhängige Parameter. Das System verwendet den Wert yDirection lediglich zum Bestimmen der Ebene und allgemeinen Richtung der y-Achse. Daher hat xDirection Priorität.

Mit diesen drei Parametern ist es möglich, jede Position und Ausrichtung einer Komponente vollständig anzugeben. Auch dies veranschaulicht das obige Schneemannbeispiel durch Festlegung von xDirection und yDirection. Zwar ist es schwierig, Änderungen der Ausrichtung einer Kugel zu erkennen, doch wenn Sie etwas anderes relativ zu ihr platzieren, ist es wichtig, dass Sie die Ausrichtung kennen.