| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| |
 | Order Processing Summit 2025, eine Veranstaltung am 23.06.2025
|
Autor
|
Thema: API DragOperator / CollisionDetection (1789 mal gelesen)
|
Karlheinz E. Mitglied
 Beiträge: 8 Registriert: 10.08.2009
|
erstellt am: 10. Aug. 2009 12:25 <-- editieren / zitieren --> Unities abgeben:         
Hallo, nachdem meine Suche im Forum erfolglos blieb möchte ich kurz mein Problem schildern: Ich möchte einen einen Körper in einer Baugruppe drehen bis eine Kollision ensteht, dann sollte die Drehbewegung stoppen. Die Drehung lässt sich mittes Bsp. in der API-Hilfe super umsetzen (Rotate Assembly Component on Axis Example (VB)) Nur lässt mich die Kollisionsüberprüfung im stich. Ich habe folgende Adaptionen des Beispiels durchgeführt: yyy = swDragOp.CollisionDetection (swComp, False, True) swDragOp.CollisionDetectionEnabled = True Leider gibt yyy immer "true" aus, auch wenn es eine Kollision gibt. Wo liegt der Fehler? Danke für die Hilfe, mfg Karlheinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Karlheinz E. Mitglied
 Beiträge: 8 Registriert: 10.08.2009
|
erstellt am: 13. Aug. 2009 09:20 <-- editieren / zitieren --> Unities abgeben:         
|
Baumjäger Mitglied CAD/PDM Administrator
 
 Beiträge: 339 Registriert: 21.06.2006 SW2017 - S5.0 AutoCAD Mechanical 2018 Win10 Intel Xeon E3-1240 V2 3,4GHz 16GB RAM NVIDIA Quadro 4000
|
erstellt am: 13. Aug. 2009 15:22 <-- editieren / zitieren --> Unities abgeben:          Nur für Karlheinz E.
|
jens_oliver Mitglied Softwareentwickler
 
 Beiträge: 114 Registriert: 28.06.2005
|
erstellt am: 13. Aug. 2009 16:27 <-- editieren / zitieren --> Unities abgeben:          Nur für Karlheinz E.
hi, ich vermute, der rüchgabewert gibt nur an, ob sw die parameter gesetzt hat und nicht ob eine kollision vorliegt? DragOperator::CollisionDetection Description: This method sets the collision detection parameters. gruß oliver edit: vieleicht hilft dir ja diese methode. AssemblyDoc::ToolsCheckInterference2 ------------------ Software nach Maß für Ihr CAD-System www.ib-knepper.de [Diese Nachricht wurde von jens_oliver am 13. Aug. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Karlheinz E. Mitglied
 Beiträge: 8 Registriert: 10.08.2009
|
erstellt am: 17. Aug. 2009 07:36 <-- editieren / zitieren --> Unities abgeben:         
Danke für den Tip. Aber eigentlich sollte doch durch setzen des Atributes stopAt=True bei "result = DragOperator.CollisionDetection ( entityArray, partOnly, stopAt )"(TRUE stops the motion of the component when it touches any other entity, FALSE does not) eine Reaktion zu erwarten sein, oder sehe ich das falsch. @oliver: Danke, AssemblyDoc::ToolsCheckInterference2 kenne ich, da ich aber im nächsten Schritt dynamicClearance hinzunehmen möchte, würde ich gerne gleich beim DragOperator bleiben. Hier mal zur vervollständigung das Macro: Option Explicit Const PI As Double = 3.14159 Const RadPerDeg As Double = PI / 180# Dim yyy As Boolean Dim swApp As Object Dim Part As Object Dim SelMgr As Object Dim boolstatus As Boolean Dim longstatus As Long, longwarnings As Long Dim Feature As Object ' DragOperator::TransformType ' Translation 0 ' Transform is translation only ' ' Axial rotation 1 ' Transform is rotation only ' ' General 2 ' Transform can be translation or rotation or both ' DragOperator: ragMode ' Minimum Move 0 ' Move smallest number of geometries ' ' Maximum Move 1 ' Move geometries rigidly if possible ' ' Relaxation 2 ' Solve geometries using relaxation Sub main() 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 As SldWorks.Component2 Dim swZform As SldWorks.MathTransform Dim swMathUtil As SldWorks.MathUtility Dim swOriginPt As SldWorks.MathPoint Dim swZ_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 = swSelMgr.GetSelectedObjectsComponent2(1) Set swMathUtil = swApp.GetMathUtility nPts(0) = 0# nPts(1) = 0# nPts(2) = 0# vData = nPts Set swOriginPt = swMathUtil.CreatePoint(vData) nPts(0) = 0# nPts(1) = 0# nPts(2) = 1# vData = nPts Set swZ_Axis = swMathUtil.CreateVector(vData) ' This is an incremental rotation, ' so angle is always the same Set swZform = swMathUtil.CreateTransformRotateAxis(swOriginPt, swZ_Axis, 0.5 * RadPerDeg) bRet = swDragOp.AddComponent(swComp, False) Debug.Assert bRet 'swDragOp.DynamicClearanceEnabled = True ' Axial rotation swDragOp.TransformType = 1 ' Solve by relaxation swDragOp.DragMode = 1 bRet = swDragOp.BeginDrag Debug.Assert bRet For i = 0 To 90 ' Returns false if drag fails, for example, because of a collision yyy = swDragOp.CollisionDetection(swComp, False, True) swDragOp.CollisionDetectionEnabled = True swDragOp.DynamicClearanceEnabled = False bRet = swDragOp.Drag(swZform) ' Wait for 0.1 secs nNow = Timer While Timer < nNow + 0.1 ' Process event loop DoEvents Wend If bRet = False Then Exit Sub If yyy = False Then Exit Sub Next i bRet = swDragOp.EndDrag ' Debug.Assert bRet End Sub Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jens_oliver Mitglied Softwareentwickler
 
 Beiträge: 114 Registriert: 28.06.2005
|
erstellt am: 17. Aug. 2009 13:24 <-- editieren / zitieren --> Unities abgeben:          Nur für Karlheinz E.
hi, so sollte es funktionieren erst die parameter setzten... yyy = swDragOp.CollisionDetection(swComp, True, True) swDragOp.CollisionDetectionEnabled = True swDragOp.DynamicClearanceEnabled = False dann die schleife und den drag ausführen. die zeitlupe brauchst du nicht. swDragOp.BeginDrag For i = 0 To 90 bRet = swDragOp.Drag(swZform) If bRet = False Then swDragOp.EndDrag Exit Sub endif Next i swDragOp.EndDrag gruß oliver
------------------ Software nach Maß für Ihr CAD-System www.ib-knepper.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Karlheinz E. Mitglied
 Beiträge: 8 Registriert: 10.08.2009
|
erstellt am: 17. Aug. 2009 14:52 <-- editieren / zitieren --> Unities abgeben:         
Hi, danke für deinen Tip. Hast du das ev. in einer Testbaugruppe probiert, denn wenn ich mein Macro entsprechend anpasse, ändert sich leider noch immer nichts zum Besseren. yyy = swDragOp.CollisionDetection(swComp, False, True) -> FALSE check for collisions in all affected components, damit alle kollisionsverursachenden Teile in Betracht gezogen werden und nicht nur vorher Selektierte. Nochmals danke! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jens_oliver Mitglied Softwareentwickler
 
 Beiträge: 114 Registriert: 28.06.2005
|
erstellt am: 17. Aug. 2009 16:14 <-- editieren / zitieren --> Unities abgeben:          Nur für Karlheinz E.
ja habe es kurz ausprobiert und es lief. allerdings nur mit "CollisionDetection(components, true,true)" wenn du den schalter auf "false" stellst, musst du wahrscheinlich in dem array(components) alle bauteile, die untersucht werden sollen, angeben. mit "true" werden alle bauteile mit dem gedrehten(verschobenen) untersucht. was ja ausreicht wenn vorher keine kollision vorlag. wenn der schalter auf "true" steht sollte somit auch "CollisionDetection(nothing,true,true)" funktionieren. gruß oliver ------------------ Software nach Maß für Ihr CAD-System www.ib-knepper.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Karlheinz E. Mitglied
 Beiträge: 8 Registriert: 10.08.2009
|
erstellt am: 18. Aug. 2009 09:21 <-- editieren / zitieren --> Unities abgeben:         
Ich habe jetzt alle Varianten von "CollisionDetection(components,true,true)" bzw. "CollisionDetection(components,false,true)" durchprobiert und komme auf keine Ergebnis. Könntest du mir ev. deine Testbaugruppe mit dem zugehörigen Makro senden, denn ich wüsste jetzt nicht wo der Fehler noch liegen könnte. Dank und viele Grüße! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jens_oliver Mitglied Softwareentwickler
 
 Beiträge: 114 Registriert: 28.06.2005
|
erstellt am: 18. Aug. 2009 09:47 <-- editieren / zitieren --> Unities abgeben:          Nur für Karlheinz E.
moin moin, die baugruppe darf ich dir nicht schicken (ist nicht von mir). hier noch das leicht geänderte makro.
Code: Option Explicit Const PI As Double = 3.14159 Const RadPerDeg As Double = PI / 180#Dim yyy As Boolean Dim swApp As Object Dim Part As Object Dim SelMgr As Object Dim boolstatus As Boolean Dim longstatus As Long, longwarnings As Long Dim Feature As Object Sub main() 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 As SldWorks.Component2 Dim swZform As SldWorks.MathTransform Dim swMathUtil As SldWorks.MathUtility Dim swOriginPt As SldWorks.MathPoint Dim swZ_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 = Application.SldWorks Set swModel = swApp.ActiveDoc Set swAssy = swModel Set swDragOp = swAssy.GetDragOperator Set swSelMgr = swModel.SelectionManager Set swComp = swSelMgr.GetSelectedObjectsComponent2(1) If swComp Is Nothing Then MsgBox "nothing selected" Exit Sub End If Set swMathUtil = swApp.GetMathUtility nPts(0) = 0# nPts(1) = 0# nPts(2) = 0# vData = nPts Set swOriginPt = swMathUtil.CreatePoint(vData) nPts(0) = 0# nPts(1) = 0# nPts(2) = 1# vData = nPts Set swZ_Axis = swMathUtil.CreateVector(vData) ' This is an incremental rotation, ' so angle is always the same Set swZform = swMathUtil.CreateTransformRotateAxis(swOriginPt, swZ_Axis, 0.5 * RadPerDeg) bRet = swDragOp.AddComponent(swComp, False) ' Axial rotation swDragOp.TransformType = 1 ' Solve by relaxation swDragOp.DragMode = 1 swDragOp.CollisionDetectionEnabled = True swDragOp.DynamicClearanceEnabled = False swDragOp.CollisionDetection Nothing, True, True bRet = swDragOp.BeginDrag For i = 0 To 99 bRet = swDragOp.Drag(swZform) If bRet = False Then bRet = swDragOp.EndDrag MsgBox "kollision!" Exit Sub End If Next i bRet = swDragOp.EndDrag MsgBox "no kollision!" End Sub
------------------ Software nach Maß für Ihr CAD-System www.ib-knepper.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Karlheinz E. Mitglied
 Beiträge: 8 Registriert: 10.08.2009
|
erstellt am: 18. Aug. 2009 10:42 <-- editieren / zitieren --> Unities abgeben:         
hi oliver, danke für dein makro. leider sieht das ganze bei mir so aus, dass nur eine kollision erkannt wird, wenn die baugruppe schon am beginn d.h. bevor gedreht wird zusammenstößt. Während der drehung wird die kollision leider nicht erkannt und die drag-operation somit auch nicht abgebrochen. Ich habe jetzt mal meine baugruppe mitangehängt, vielleicht kannst du ja mal einen kuzen blick drauf werfen. Abermals ein großes Dankeschön. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
jens_oliver Mitglied Softwareentwickler
 
 Beiträge: 114 Registriert: 28.06.2005
|
erstellt am: 18. Aug. 2009 12:19 <-- editieren / zitieren --> Unities abgeben:          Nur für Karlheinz E.
wenn du deine verknüpfungen raus nimmst funktioniert alles. meine testbaugruppe hat halt keine. habe aber auch keine einstellung gefunden die mit verknüpfungen funktioniert, auch wenn du den richtigen drehpunkt angibst funktioniert es nicht. gruß oliver ------------------ Software nach Maß für Ihr CAD-System www.ib-knepper.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Manfred Kern Mitglied Softwareentwicklung CAD/CAM-Systembetreuung

 Beiträge: 86 Registriert: 25.05.2000 ** CSWP 06/2004 ** DELL Precision 7530 SW 2020 SP5 SW 2019 SP3 Visual Studio 2017 pro
|
erstellt am: 18. Aug. 2009 13:32 <-- editieren / zitieren --> Unities abgeben:          Nur für Karlheinz E.
Hallo zusammen. Wir bereits oben erwähnt ist genau das das Problem. Ich hatte eine Baugruppe mit 2 Konf. erzeugt. Die eine mit Verknüpfungen, die andere ohne. Darüber hab ich eine Macro mit "Stopatcollision" laufen lassen. Ohne aktive verknüpfungen o.k., mit Verknüpfungen keine Reaktion auf Kollision. Ich habe vor ca. 8 Wochen dieses Problem dem SW-Support zugeschickt. Mittlerweile habe ich dazu eine SPR, die jedoch nur offen ist und noch keine Bearbeitung hat. Gruß Manfred Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Karlheinz E. Mitglied
 Beiträge: 8 Registriert: 10.08.2009
|
erstellt am: 18. Aug. 2009 14:11 <-- editieren / zitieren --> Unities abgeben:         
"schön" dass auch noch andere mit diesem problem kämpfen. jedefalls funktioniert jetzt die kollisionsprüfung zumindest mal ohne verknüpfungen, das ist für mich ja schon ein anfang Eine andere frage: kann man mit dem dragoperator auch die funktion physikalische dynamik ansprechen, die ja in sw neben der kollisionsprüfung und dem dynamischen abstand auch unter komponente drehen/verschieben auswählbar ist? Grüße Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Karlheinz E. Mitglied
 Beiträge: 8 Registriert: 10.08.2009
|
erstellt am: 18. Aug. 2009 14:13 <-- editieren / zitieren --> Unities abgeben:         
"schön" dass auch noch andere mit diesem problem kämpfen. jedefalls funktioniert jetzt die kollisionsprüfung zumindest mal ohne verknüpfungen, das ist für mich ja schon ein anfang Eine andere frage: kann man mit dem dragoperator auch die funktion physikalische dynamik ansprechen, die ja in sw neben der kollisionsprüfung und dem dynamischen abstand auch unter komponente drehen/verschieben auswählbar ist? Grüße Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |