| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| |
| Cloud-basierte Elektrokonstruktion |
Autor
|
Thema: Komponente verschieben mit dem DragOperator (2129 mal gelesen)
|
Ralph Stelzer Mitglied HSL
Beiträge: 4 Registriert: 16.02.2005
|
erstellt am: 16. Feb. 2005 11:43 <-- editieren / zitieren --> Unities abgeben:
Ich möchte eine Assembly animieren, d.h. ein Teil bewegen, wobei in Abhängigkeit der Bewegung und definierter Abhängigkeiten zu anderen Teilen, sich diese Teile gleichfalls bewegen müssen. Dies entspricht quasi der Dialogfunktion "Komponente verschieben". Der dragoperator scheint dafür sinnvoll zu sein, allerdings ist seine Anwendung ohne Erläuterung bzw. Beispiel die reine Zauberei. Hat dazu jemand Erfahrungen, Tipps oder ggf. auch ein kurzes Beispiel? Gruß Ralph Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Oldie Mitglied Senior design engineer
Beiträge: 750 Registriert: 22.01.2001 Catia V5 R16 - R19
|
erstellt am: 16. Feb. 2005 11:53 <-- editieren / zitieren --> Unities abgeben: Nur für Ralph Stelzer
|
Ralph Stelzer Mitglied HSL
Beiträge: 4 Registriert: 16.02.2005
|
erstellt am: 16. Feb. 2005 12:29 <-- editieren / zitieren --> Unities abgeben:
Danke für den Hinweis. Allerdings ist das Tool bekannt und nutzt leider nichts. Es geht nicht um die simple Bewegung an und für sich (im Sinne einer hübschen Präsentation), sondern um eine programmgesteuerte Analyse der Bewegungszustände. Und da muss ich schon selbst Zugriff auf die Komponenten bekommen. U.a. auch deshalb, weil die resultierenden Koordinaten und Rotationsmatrizen der Komponenten benötigt werden. Trotzdem vielen Dank! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Oldie Mitglied Senior design engineer
Beiträge: 750 Registriert: 22.01.2001 Catia V5 R16 - R19
|
erstellt am: 16. Feb. 2005 12:45 <-- editieren / zitieren --> Unities abgeben: Nur für Ralph Stelzer
Sorry Ralph, Hab dich wohl zu unrecht mit einigen anderen Studenten, die in letzter Zeit unser Forum entdeckt haben, in einen Topf geworfen. Gruß Oldie
------------------ Der direkte Weg ist nicht immer der schnellste. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)
Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 16. Feb. 2005 13:00 <-- editieren / zitieren --> Unities abgeben: Nur für Ralph Stelzer
Hallo Ralph, und herzlich willkommen im SolidWorks Brett auf CAD.de Wenn ich deine Aufgabe nach deinem zweiten Posting richtig verstehe läuft das ganze mehr auf eine Dynamische Simulation hinaus ... das wird mit SolidWorks Bordmittel etwas schwierig (um nicht zu sagen: ich hab keine Ahnung, wie das nur mit SolidWork sgehen sollte ). Dafür gibt es aber spezialisierte Tools wie COSMOS/Motion , die genau das können; allerdings sind die nicht ganz preiswert. Wenn ich mich aber nicht irre gibt es für eine Studentenversion auch eine COSMOS Variante ( http://www.solidworksacademic.de/content.php?si=282 ), dass sollte die 50 EUR mehr wert sein ... wenn du berechtigt bist eine Studentenversion zu nutzen, sonst wird es deutlich teurer Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ralph Stelzer Mitglied HSL
Beiträge: 4 Registriert: 16.02.2005
|
erstellt am: 16. Feb. 2005 16:04 <-- editieren / zitieren --> Unities abgeben:
Danke für die Empfehlung. Aber eines Zusatztools bedarf es wirklich nicht. SolidWorks íst ohne weiteres in der Lage die geforderte Funktion zu erfüllen. Das kann ja jeder mittels des Standarddialogfunktion "Komponente verschieben" sehen. Ein Verschieben von Teilen (allerdings eben ohne die Constraints zu beachten) geht mit der API-Funktion ".Transform2 " je auch ohne Schwierigkeit. (Da kann ich ggf. gern weiterhelfen.) Für die von mir gewünschte Fuktionalität wurde die API des DragOperators zur Verfügung gestellt: ---------- The preferred way to change the position of an assembly component is to use the DragOperator object. This object allows access to the settings for the Move Component command in the SolidWorks user interface. Components moved with this API honor all assembly mate and in-context relationships. When done moving a component (DragOperator::EndDrag), you might have to call ModelDoc2::EditRebuild3 to update any model geometry. -------------- Allerdings in "bewährter" Manier, d.h. ohne Beispiel und ohne Erläuterung. Na mal sehen, ob sie nicht doch mal jemand schon benutzt hat. Nochmal vielen Dank für all die Hinweise!! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ralph Stelzer Mitglied HSL
Beiträge: 4 Registriert: 16.02.2005
|
erstellt am: 26. Feb. 2005 10:16 <-- editieren / zitieren --> Unities abgeben:
Nur der Vollständigkeit halber: Die Lösung ist gefunden. Im neuesten Hilfefile von SW gibt es nun auch dafür ein Beispiel. Zur Information das Gerüst nachfolgend: Public Sub UseDragOperator() Const PI As Double = 3.14159 Const RadPerDeg As Double = PI / 180# Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swAssy As SldWorks.AssemblyDoc Dim swDragOp As SldWorks.DragOperator Dim swSelMgr As SldWorks.SelectionMgr Dim swComp(1) As SldWorks.Component2 Dim vComp As Variant Dim swXform As SldWorks.MathTransform Dim swMathUtil As SldWorks.MathUtility Dim swOriginPt As SldWorks.MathPoint Dim swX_Axis As SldWorks.MathVector Dim nPts(2) As Double Dim vData As Variant Dim nNow As Single Dim i As Long Dim bRet As Boolean Set swApp = CreateObject("SldWorks.Application") Set swModel = swApp.ActiveDoc Set swAssy = swModel Set swDragOp = swAssy.GetDragOperator Set swSelMgr = swModel.SelectionManager Set swComp(0) = swSelMgr.GetSelectedObjectsComponent(1) Set swComp(1) = swSelMgr.GetSelectedObjectsComponent(2) Set swMathUtil = swApp.GetMathUtility vComp = swComp nPts(0) = 0# nPts(1) = 0# nPts(2) = 0# vData = nPts Set swOriginPt = swMathUtil.CreatePoint(vData) nPts(0) = 1# nPts(1) = 0# nPts(2) = 0# vData = nPts Set swX_Axis = swMathUtil.CreateVector(vData) ' This is an incremental rotation, ' so angle is always the same. Set swXform = swMathUtil.CreateTransformRotateAxis(swOriginPt, swX_Axis, 1# * RadPerDeg) bRet = swDragOp.AddComponent(swComp(0), False) Debug.Assert bRet swDragOp.DynamicClearanceEnabled = False ' Axial rotation swDragOp.TransformType = 1 ' Solve by relaxation swDragOp.DragMode = 2 bRet = swDragOp.BeginDrag Debug.Assert bRet For i = 0 To 500 bRet = swDragOp.DragAsUI(swXform) Next i bRet = swDragOp.EndDrag Debug.Assert bRet End Sub MfG Ralph Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
krisztian Mitglied
Beiträge: 4 Registriert: 06.08.2009
|
erstellt am: 06. Aug. 2009 16:35 <-- editieren / zitieren --> Unities abgeben: Nur für Ralph Stelzer
Hallo, wie schon besagt finden sich ja zwei Beispiel zum Thema bewegen von Teilen in Assemblys in der API Hilfe. Einmal das oben bereits erwähnte Beispiel mit DragAsUi und dann noch eins mit Drag. Hab mal beide in VB.Net umgeschrieben und IMHO auch keine groben Schnitzer gemacht. Code für DragAsUI sieht jetzt so aus:
Code: Friend Function Spin() As SldWorks.ModelDoc2 Const PI As Double = 3.14159 Const RadPerDeg As Double = PI / 180.0# Dim oRobot As SldWorks.ModelDoc2 Dim swAssy As SldWorks.AssemblyDoc Dim swDragOp As SldWorks.DragOperator Dim oComp As Object Dim swComp(1) As SldWorks.Component2 Dim swSelMgr As SldWorks.SelectionMgr Dim swMathUtil As SldWorks.MathUtility Dim swTrans As SldWorks.MathTransform Dim swOriginPt As SldWorks.MathPoint Dim swZ_Axis As SldWorks.MathVector Dim nPts(2) As Double Dim oData As Object Dim i As Long Dim bret As Boolean oRobot = CType(oSwApp.ActiveDoc, SldWorks.ModelDoc2) swAssy = CType(oRobot, SldWorks.AssemblyDoc) swDragOp = CType(swAssy.GetDragOperator, SldWorks.DragOperator) swSelMgr = CType(oRobot.SelectionManager, SldWorks.SelectionMgr) swComp(0) = CType(swSelMgr.GetSelectedObjectsComponent(1), SldWorks.Component2) swComp(1) = CType(swSelMgr.GetSelectedObjectsComponent(2), SldWorks.Component2) swMathUtil = CType(oSwApp.GetMathUtility, SldWorks.MathUtility) oComp = swComp nPts(0) = 0 nPts(1) = 0 nPts(2) = 0 oData = nPts swOriginPt = CType(swMathUtil.CreatePoint(oData), SldWorks.MathPoint) nPts(0) = 0 nPts(1) = 0 nPts(2) = 1 oData = nPts swZ_Axis = CType(swMathUtil.CreateVector(oData), SldWorks.MathVector) swTrans = CType(swMathUtil.CreateTransformRotateAxis(swOriginPt, swZ_Axis, 1.0# * RadPerDeg), SldWorks.MathTransform) bret = swDragOp.AddComponent(swComp(0), False) Debug.Assert(bret) swDragOp.DynamicClearanceEnabled = False swDragOp.TransformType = 1 swDragOp.DragMode = 0 bret = swDragOp.BeginDrag Debug.Assert(bret) For i = 0 To 180 bret = swDragOp.DragAsUI(swTrans) Next i bret = swDragOp.EndDrag Debug.Assert(bret) End Function
Nun funktioniert die Rotation um eine Achse (in meinem Fall Z) wunderbar allerdings bekomme ich dem Durchlauf der For-Schleife in der Zeile swDragOp.EndDrag einen Fehler. Oder um genauer zu sein:swDragOp.EndDrag gibt False zurück und damit wird mir in der nächsten Zeile der Fehler angezeigt. Dies passiert so in beiden Varianten und ich weiß nicht wirklich warum das so ist. Die Debug Meldung führt auf auch nicht unbedingt dazu, dass ich daraus schlau werd. Vielleicht kennt hier ja jemand den Fehler oder sieht auf den ersten Blick, dass ich Fehler im Code habe. Würde mich auf alle Fälle freuen.
Grüße krisztian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |