| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS | | | | Dassault Systèmes auf der Hannover Messe 2024 (kostenlose Tickets verfügbar) |
Autor
|
Thema: Problem mit dem Dragoperator (810 mal gelesen)
|
UncleJ Mitglied Werksstudent
Beiträge: 9 Registriert: 16.12.2007 Ich verwende die Solidworks Student Edition 2007 auf einem P4-System mit 3GHz und 2GB RAM, OS Vista Business
|
erstellt am: 14. Okt. 2008 11:16 <-- editieren / zitieren --> Unities abgeben:
Hallo, Ich habe ein kleines Problem bei der Verschiebung mittels des Dragoperators und weiß nicht wirklich woran es liegt. Irgendwie wird der übergebene Winkel total ignoriert. Ich verwende in Anlehnung an die API-Hilfe folgende C++-Funktion: Code: void SolidWorks::rotateThePartInRad(ISldWorks *pSldWorks, IComponent2 *pComponent, double dPoint[], double dVector[], double dAngle) { IMathPoint* pMathPoint = NULL; IMathUtility* pMathUtility = NULL; IMathVector* pMathVector = NULL; IMathTransform* pXform = NULL; VARIANT_BOOL retval = FALSE; HRESULT hr = S_OK; IDragOperator* pDragOperator = NULL; IMathTransform* pPosition = NULL; IMathTransform* pResult = NULL; if( pComponent != NULL ){ hr = SolidWorks::getDragOperator(pSldWorks, &pDragOperator); if(hr == S_OK){ hr = pSldWorks->IGetMathUtility(&pMathUtility); if(hr == S_OK){ hr = pMathUtility->ICreatePoint(dPoint, &pMathPoint); // Origin Point if(hr == S_OK){ hr = pMathUtility->ICreateVector(dVector, &pMathVector); // Normal Vector if(hr == S_OK){ hr = pMathUtility->ICreateTransformRotateAxis( pMathPoint, pMathVector, dAngle, &pXform ); if(hr == S_OK){ hr = pComponent->GetTotalTransform(FALSE, &pPosition); // Position des Bauteils auslesen if(hr == S_OK){ hr = pPosition->IMultiply(pXform, &pResult); if(hr == S_OK){ hr = pDragOperator->AddComponent(pComponent, FALSE, &retval); if(hr == S_OK){ hr = pDragOperator->put_CollisionDetectionEnabled(TRUE); if(hr == S_OK){ hr = pDragOperator->put_DynamicClearanceEnabled(TRUE); if(hr == S_OK){ // 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 hr = pDragOperator->put_TransformType(2); //General fransformation if(hr == S_OK){ // DragOperator: ragMode // Minimum Move 0 => Move smallest number of geometries // Maximum Move 1 => Move geometries rigidly if possible // Relaxation 2 => Solve geometries using relaxation */ hr = pDragOperator->put_DragMode(2); //Solve by relaxation if(hr == S_OK){ hr = pDragOperator->put_UseAbsoluteTransform(FALSE); if(hr == S_OK){ hr = pDragOperator->BeginDrag(&retval); if(hr == S_OK){ hr = pDragOperator->Drag(pResult, &retval); // Returns false if drag fails hr = pDragOperator->EndDrag(&retval); } // hr = pDragOperator->BeginDrag(&retval); } // hr = pDragOperator->put_UseAbsoluteTransform(FALSE); } // hr = pDragOperator->put_DragMode(2); } // hr = pDragOperator->put_TransformType(2); } // hr = pDragOperator->put_DynamicClearanceEnabled(FALSE); } // hr = pDragOperator->put_CollisionDetectionEnabled(FALSE); } // hr = pDragOperator->AddComponent(pXYcomponent, FALSE, &retval); pResult->Release(); } // hr = pXYform->IMultiply(pPosition, &pResult); pPosition->Release(); } // hr = pXYcomponent->get_Transform2(&pPosition); pXform->Release(); } // hr = pMathUtility->ICreateTransformRotateAxis(pMathPoint, pMathVector, dXYAngle, &pXYform); pMathVector->Release(); } // hr = pMathUtility->ICreateVector(dXYVector, &pMathVector); pMathPoint->Release(); } // hr = pMathUtility->ICreatePoint(dXYPoint, &pMathPoint); pMathUtility->Release(); } // hr = pSldWorks->IGetMathUtility(&pMathUtility); pDragOperator->Release(); } // hr = pAssemblyDoc->IGetDragOperator(&pDragOperator); } return; }
Die Funktion SolidWorks::getDragOperator ermittelt den aktuellen Dragoperator der Assembly. Die Funktion rufe ich dann mit dVector = (0.0, 0.0, 1.0), dPoint = (1.25, 5.25, 0.25), dAngle = 0.75 und der Komponente "Drehgestell" (siehe Modell im Anhang) auf. Würde mich sehr freuen, wenn jemand vielleicht eine Idee hätte wo der Fehler ist. Mit freundlichen Grüßen Jörg Eichhorn 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: 14. Okt. 2008 11:51 <-- editieren / zitieren --> Unities abgeben: Nur für UncleJ
Hallo Jörg, ich hab von C++ und auch der Verschiebung per Dragoperator zwar keine Ahnung, aber ich argwöhne bei deinen Angaben (dVector = (0.0, 0.0, 1.0), dPoint = (1.25, 5.25, 0.25), dAngle = 0.75) das du die falschen Einheiten nutzt: alle Längengaben erfolgen in der API per Meter (dPojnt sieht nach Millimeter aus) und Winkel in RAD (dAngle sieht nach Grad aus). Vielleicht probierst du das mal mit den entsprechend angepassten Einheiten, ob es dann ungefähr so aussieht, wie du es erwarten würdest. Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Stefans SolidWorks Blog Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
UncleJ Mitglied Werksstudent
Beiträge: 9 Registriert: 16.12.2007 Ich verwende die Solidworks Student Edition 2007 auf einem P4-System mit 3GHz und 2GB RAM, OS Vista Business
|
erstellt am: 14. Okt. 2008 14:25 <-- editieren / zitieren --> Unities abgeben:
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|