Frame-basierte Positionierung

Es gibt zwei Möglichkeiten, um Modellelemente, die für physische parts oder Baugruppen: durch Abhängigkeiten oder durch Koordinate 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.

Die grundlegende Begriff der Frame-basierten Positionierung ist die Koordinate "frame" ist eine erstklassige Datentyp in Intent. Ein Frame ist eine Matrix umwandeln, die die Position und Ausrichtung eines dreidimensionalen Koordinatensystem relativ zu den Weltkoordinaten der X -, Y - und Z-Koordinaten. Der WorldFrame ist die Identitätsumwandlung. Point mit den Koordinaten X, Y und Z im worldFrame ist tatsächlich der point Mit diesen Koordinaten. Intern werden alle ( points und Vectors ) werden in Weltkoordinaten gespeichert. Diese Koordinaten werden manchmal in bestimmten Ausgaben sichtbar, wie z. B. bei der Darstellung von point Werte im Fenster Sofort oder die Gruppe "Eigenschaften".

Grundlegendes zu Intent die Handhabung der Positionierung und Ausrichtung der FrameMixin Design stellt alle Parameter und andere rules zu frames . Eine Komponente, deren Design an FrameMixin beteiligt ist, unterstützt die Frame-basierte Positionierung. Das Schlüsselattribut von FrameMixin ist localFrame. Dies ist von den Frame Typ und enthält die Umwandeln des Koordinatensystems der lokalen Komponente relativ zur Welt an. Um eine Komponente zu positionieren, gibt es mehrere alternative Methoden, die letztendlich alle zur Festlegung von localFrame führen.

Die meisten Intent Designs bereits in FrameMixin. Nur die Objekte, die keine physischen Körper darstellen (z. B. Berichte, Stücklisten usw.) sind nicht enthalten. Es ist in BasePart, ein grundlegendes Design mit Intent.

Wenn Sie points oder vectors werden erstellt, indem die Point() oder Vector() Funktionen, erstellen diese Funktionen Automatisch points oder vectors 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 points :

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 identisch mit der Point() Funktion, mit der Ausnahme, dass der Frame an, in dem die Koordinaten interpretiert werden müssen, ausdrücklich erforderlich ist. Es wird eine ähnliche Funktion für Vectors Vector _ ().

Der myRoot-Aufruf der Funktion Point() verwendet die localFrame des Stamms, dies ist immer der worldFrame. Die point P1 Weltkoordinaten sind genau wie eingegeben; localFrame ist die Identität umwandeln. Die C1 child befindet sich an diesem point . Dadurch wird sein localFrame so verschoben, dass sich sein Ursprung in p<1,2,3> befindet.

child Aufruf der Funktion Point() verwendet den localFrame von c1 und wird an den angegebenen Koordinaten umwandeln. Die point <10,0,0 > relativ zu c1 ist die point P<11,2,3 > in der Welt.

Der Benutzer muss die von Intent verwendeten Koordinaten nicht kennen. Die Design myRoot funktioniert auf die gleiche Weise, selbst wenn es nicht das Stammobjekt ist. und die C1 child werden in genau derselben Position relativ zu seinem übergeordneten Objekt, unabhängig davon, wo ihre übergeordneten ist. Alle resultierenden Koordinaten ändern sich, aber die rules nicht. 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 parts mit frame Die Positionierung ist, verwenden Sie die geometrischen Algebrafunktionen in der Sprache Intent. Da das System die Datentypen kennt, wird die algebraische Berechnung mit diesen Typen korrekt ausgeführt. Beispiel: Das System erkennt, dass eine Point + Vector erzeugt eine Point . Eine Vector mit einem Skalar (numerisch) Menge zu einer Vector in die gleiche Richtung, aber eine andere Länge aufweist. Eine Point mit einem Skalar führt zu einem Fehler. Eine Point hinzugefügt Point ist ein Fehler aufgetreten.

Bei diesen Funktionen kann der rule Writer ist kostenlos zum Ignorieren der zugrunde liegenden Koordinaten und die Frames , die sie enthalten. 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 grounded? ist auch Inventor-spezifisch.

Der Ursprung, xDirection und yDirection, unitX, unitY und unitZ rules werden von FrameMixin bereitgestellt.

child befindet sich die Kugel auf der XY-Ebene der Baugruppe, indem Sie die child's Ursprung Parameter:
   origin = Me.origin + unitY * child.radius

Ausgehend von der Baugruppe des Ursprungs (ME .origin) addieren Sie das Produkt von der Y-Achse vector (unitY ist eine Einheit vector ausgerichtet mit der Y-Achse) und den 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 andeutet, ist xDirection ein Vector Parameter aus und legt die Richtung der x-Achse von localFrame. 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.