| | |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| | |
 | DraftSight - Die smarte Wahl für die 2D Konstruktion und IT., ein Webinar am 26.11.2025
|
|
Autor
|
Thema: SetTransformAndSolve (1584 mal gelesen)
|
anki Mitglied

 Beiträge: 25 Registriert: 26.01.2007
|
erstellt am: 31. Jan. 2007 16:41 <-- editieren / zitieren --> Unities abgeben:         
Hallo, kennt sich jemand von euch mit der Funktion SetTransformAndSolve aus? Ich habe mein Makro mal angehängt. Was ich will ist, dass ich im Translationsteil der Bewegungsmatrix selbst Einträge machen kann (also z.B. 0.01 Einheiten in X-Richtung). Mein Problem ist, dass das ganz gut funktioniert für Bauteile, die sich nur auf einer Geraden bewegen können (laut Constraints). Habe ich aber zum Beispiel ein Schwungrad eines Motors muss die Translationsbewegung ja in eine Rotation des Rades resultieren. Leider funktioniert das nicht immer. Im SoWo selbst funktioniert das ja. Ich wähle eine Fläche auf dem Schwungrad, bewege meine Maus und das Rad dreht sich! Was mache ich also falsch ? Habe ich evtl. die falsche Funktion? Für jede Hilfe bin ich super dankbar!!! Viele Grüße Anne Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lutz Federbusch Ehrenmitglied V.I.P. h.c. Dipl.-Ing. Maschinenbau

 Beiträge: 3094 Registriert: 03.12.2001 alle SW seit 97+ AutoCAD2016-2022 ERP ProAlpha + CA-Link Intel Core i7-7820K 32GB Win10x64 Quadro K5000 SpacePilot
|
erstellt am: 31. Jan. 2007 17:17 <-- editieren / zitieren --> Unities abgeben:          Nur für anki
|
anki Mitglied

 Beiträge: 25 Registriert: 26.01.2007
|
erstellt am: 31. Jan. 2007 17:44 <-- editieren / zitieren --> Unities abgeben:         
Vielen Dank für deine Hilfe. Aber was heißt denn "klassisch verknüpfen"? Ich habe mir auch dein Beispiel angesehen. Ich möchte aber nicht das Maß auswählen, sondern die Bauteile selbst und diese dann bewegen. Vielleicht stehe ich auch auf dem Schlauch, ich bin noch nicht so gut in API-Programmierung. Wäre super, wenn du mir das noch etwas genauer erklären könntest! Viele Grüße Anne Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jchSDA Mitglied Dipl.Ing Maschinenbau

 Beiträge: 11 Registriert: 10.10.2006 Dell Precision M20 2 GHz; 2 GB RAM ATI Mobility FireGL V3100 MS Win XP Prof SP2 SolidWorks 2005 SP5.0 SolidWorks 2006 SP5.0 SolidWorks 2007 SP1.0 MS Office Prof 2003 Visual Basic 6 Visual Studio 2005 Express
|
erstellt am: 02. Feb. 2007 13:38 <-- editieren / zitieren --> Unities abgeben:          Nur für anki
Hallo Anne! Das mit dem SetTransormAndSolve hat in deinem Makro zwei Probleme. Das eine ist die Aktualisierung des Bildschirms – das funktioniert besser über swModel.GraphicsRedraw2 oder swModel.EditRebuild3 (siehe hierzu Kommentar im Makro). Das andere ist das Bewegen. Hier muss man zwischen Translation (Verschieben) und Rotation (Drehen um eine Achse) unterscheiden: Translation: wie schon im Makro richtig dargestellt geht das durch Veränderung der Elemente 9 bis 11 als X, Y und Z der Matrix. In diesem Beispiel durch Addition eines Wertes zum Vorhandenen. Diese kann man übrigens direkt wieder zurück übergeben weil die Matrix ja schon eine passende 4x4 ist. Rotation: hierfür sind die Werte 0 bis 8 zuständig, die die Rotations-Submatrix für ein kartesisches, orthogonales Koordinatensystem darstellen. Der einfachste Weg diese Matrix zu befüllen ist dies mittels des MathUtility von SW zu erledigen. Man definiert hierfür die Lage einer Drehachse im Raum als Einheitsvektor. D.h. der Vektor beginnt im Ursprung und geht zu den angegebenen Zielkoordinaten. Z.B. 1/1/1 steht schräg im Raum unter 45° zu den Ebenen X/Z, X/Y und Y/Z. Die zweite Angabe ist ein Ausgangspunkt, in den der Vektor verschoben wird um seine Wahre Lage als Drehachse einzunehmen. Diese beiden SafeArray’s lässt man sich vom MathUtility in Sw-Punkt- bzw. Sw-Achsdefinitionen umformen und stopft diese dann zusammen mit dem Verdrehwinkel [rad] in die Funktion swMathUtil.CreateTransformRotateAxis. Aber bitte beachten: dies ist eine absolute Winkelangabe. Die entstehende Transformationsmatrix kann man dann entweder direkt in SetTransormAndSolve stopfen oder noch mit einer Translation wie oben beschrieben überlagern. Diese Vorgehensweise ist für einfache Positionsänderungen dann in Ordnung und ist vor allem sehr präzise. Sie scheitert aber wenn eine leidlich kontinuierliche Bewegung erwünscht wird. In diesem Fall dauert die Kommunikation in Summe mit den Ereignisabfragen von SW so lange, dass das Ganze erheblich ruckelt. Für eine kontinuierliche programmgetriebene Bewegung benutzt man dann den DragOperator in automatisierter Form. Das geht mit den Matrizen so wie oben beschrieben nur mit dem Unterschied, dass die übergebene Transformationsmatrix inkrementell interpretiert und angewendet wird. Diese wird erst an den DragOperator übergeben und dann mit DragAsUI ausgeführt. Das geht schneller und lässt die Bewegung fließend erscheinen (wenn’s der Rechner packt)
------------------ Mfg Christoph Effektive Produktivitätswerkzeuge in der Konstruktion und Zeichnungserstellung. Automatisieren kompletter Baugruppen, Teile und Zeichnungen nach Kundenvorgaben.
SolidWorks API Programmierung; Tools und Addin's für SolidWorks | kontakt@schuler-da.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
anki Mitglied

 Beiträge: 25 Registriert: 26.01.2007
|
erstellt am: 05. Feb. 2007 11:13 <-- editieren / zitieren --> Unities abgeben:         
Hallo Christoph, vielen vielen Dank für deine Antwort. Sie hat mir schon viel geholfen. Jetzt verstehe ich auch besser, wo der Unterschied zwischen SetTransformAndSolve und dem DragOperator ist. Aber jetzt scheint es mir leider auch, dass beide Funktionen nicht wirklich für mein Problem geeignet sind. Mit meinem Makro möchte ich eigentlich die gleiche Funktionalität erreichen, wie auf der Benutzeroberfläche von SoWo: Ich selektiere ein Bauteil. Wähle die Funktion "Move Component" und bewege meine Maus (was ja eigentlich immer eine Translation ist) und das Bauteile (und alle die damit zusammen hängen) wird unter Auswertung der Constraints bewegt. Das einzige, was bei mir anderes ist: die Bewegung der Maus wird als Matrix von einem anderen Rechner übergeben. Die Funktion TranslateComponent erlaubt aber keine Übergabe einer Matrix, also bin ich auf SetTransformAndSolve ausgewichen. Da ist es aber leider so, dass eine Translation immer eine Translation bleibt und nicht wie bei TranslateComponent, wo die Translation der Maus in ein Rotation des Bauteils (vorausgesetzt es handelt sich um ein Bauteil, dass nur rotiert) überführt wird. Hättest du eine Idee, welche Funktionen der SoWo-API hier geeignet sind? Viele Grüße und nochmal vielen Dank Anne Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jchSDA Mitglied Dipl.Ing Maschinenbau

 Beiträge: 11 Registriert: 10.10.2006 Dell Precision M20 2 GHz; 2 GB RAM ATI Mobility FireGL V3100 MS Win XP Prof SP2 SolidWorks 2005 SP5.0 SolidWorks 2006 SP5.0 SolidWorks 2007 SP1.0 MS Office Prof 2003 Visual Basic 6 Visual Studio 2005 Express
|
erstellt am: 05. Feb. 2007 15:47 <-- editieren / zitieren --> Unities abgeben:          Nur für anki
Hallo Anne! Es dürfte wohl ein automatisierter DragOperator sein den du brauchst - DragOperator.IsDragByRay = (True) Property: (VARIANT_BOOL) value TRUE uses drag-by-ray, FALSE uses drag-by-transform wobei dies NUR die Einstellung für die interaktive BEDIENUNG (Move Component command) setzt (also genau das, was du mit der Maus beschrieben hast). Direkt über Programm angesprochen bleibt dir wohl nichts andere übrig als manuell eine Auswertung zu schreiben, die die Matrix der Maus zu den festgestellten Constraints bewertet. Das macht zumindest 6 Fälle für die verschiedenen Freiheitsgerade der Translation und Rotation, die dann über die Constraints einer nach dem anderen eliminiert oder zugelassen werden. Die Mausbewegung müsste dir hierzu einen Strahl (bestehend aus Punkt und Richtung) liefern die dann in Komponenten zerlegt zur Drehachse (falls vorhanden) bewertet wird. Das Ergebnis hieraus wäre dann entweder eine Rotation, Translation oder Kombination der beiden. Die Einstellung des DragOperators wäre dann so zu setzen: DragOperator.TransformType = (2) Property: (short) Type = General 2 Transform can be translation or rotation or both Das scheint ein komplexes Stück Arbeit - willst du dir das wirklich antun?! Eine bessere Idee habe ich leider auch nicht. ------------------ Mfg Christoph Effektive Produktivitätswerkzeuge in der Konstruktion und Zeichnungserstellung. Automatisieren kompletter Baugruppen, Teile und Zeichnungen nach Kundenvorgaben.
SolidWorks API Programmierung; Tools und Addin's für SolidWorks | kontakt@schuler-da.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
anki Mitglied

 Beiträge: 25 Registriert: 26.01.2007
|
erstellt am: 05. Feb. 2007 16:04 <-- editieren / zitieren --> Unities abgeben:         
Hallo Christoph, vielen Dank für deine Antwort. Ich werde mal sehen, ob ich das überhaupt hinkriege. Leider muss ich das machen, weil es ein Teil meiner Diplomarbeit ist, also super wichtig. Viele Grüße Anne Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
anki Mitglied

 Beiträge: 25 Registriert: 26.01.2007
|
erstellt am: 05. Feb. 2007 17:43 <-- editieren / zitieren --> Unities abgeben:         
Hallo Christoph, ich habe da noch eine Idee wie man das ganze lösen könnte, aber ich weiß leider nicht, ob das so umsetzbar ist. Vielleicht kannst du mir weiter helfen? Wäre es möglich die Funktion TranslateComponent aufzurufen und anschließend zu sagen, die Maus bewegt sich in Richtung XYZ? Also Ähnlich wie SendKeys bei Tastatureingaben (die werden ja vom Makrorekorder auch nicht aufgezeichnet). Was meinst du dazu? Viele Grüße Anne Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jchSDA Mitglied Dipl.Ing Maschinenbau

 Beiträge: 11 Registriert: 10.10.2006 Dell Precision M20 2 GHz; 2 GB RAM ATI Mobility FireGL V3100 MS Win XP Prof SP2 SolidWorks 2005 SP5.0 SolidWorks 2006 SP5.0 SolidWorks 2007 SP1.0 MS Office Prof 2003 Visual Basic 6 Visual Studio 2005 Express
|
erstellt am: 06. Feb. 2007 10:01 <-- editieren / zitieren --> Unities abgeben:          Nur für anki
|
VBSpawn Mitglied Programmierer
  
 Beiträge: 514 Registriert: 23.08.2005 Sorgfältige Planung ersetzt niemals pures Glück.
|
erstellt am: 06. Feb. 2007 13:47 <-- editieren / zitieren --> Unities abgeben:          Nur für anki
Zitat: Original erstellt von anki: [i] Wäre es möglich die Funktion TranslateComponent aufzurufen und anschließend zu sagen, die Maus bewegt sich in Richtung XYZ? Also Ähnlich wie SendKeys bei Tastatureingaben (die werden ja vom Makrorekorder auch nicht aufgezeichnet). /i]
Geht nicht gibts nicht.... denk nur daran das es auch von deiner Auflösung abhängt wenn du es an einem anderen Rechner vorführst .. siehe: http://www.activevb.de/tipps/vb6tipps/tipp0156.html Gruß Micha ------------------ Stell dir vor, es geht, und keiner kriegts hin. Zitat: Interpunktion und Orthographie des Postings sind frei erfunden. Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
anki Mitglied

 Beiträge: 25 Registriert: 26.01.2007
|
erstellt am: 06. Feb. 2007 18:22 <-- editieren / zitieren --> Unities abgeben:         
|
VBSpawn Mitglied Programmierer
  
 Beiträge: 514 Registriert: 23.08.2005 Sorgfältige Planung ersetzt niemals pures Glück.
|
erstellt am: 06. Feb. 2007 19:05 <-- editieren / zitieren --> Unities abgeben:          Nur für anki
Hi, und ich bin gespannt ob es klappt :-) Gruß Micha ------------------ Stell dir vor, es geht, und keiner kriegts hin. Zitat: Interpunktion und Orthographie des Postings sind frei erfunden. Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
anki Mitglied

 Beiträge: 25 Registriert: 26.01.2007
|
erstellt am: 07. Feb. 2007 17:32 <-- editieren / zitieren --> Unities abgeben:         
|