| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS | | | | Tierisch mobil: Der autonome Inspektionsroboter ANYmal | SOLIDWORKS |
Autor
|
Thema: API - Fehler bei Create3PointArc (277 mal gelesen)
|
KBN Mitglied
Beiträge: 11 Registriert: 13.02.2006 SolidWorks 2004 Visual C++ .NET Athlon X2 3800+ 1024 MB RAM Geforce 6600
|
erstellt am: 16. Feb. 2006 11:18 <-- editieren / zitieren --> Unities abgeben:
Hi Leute, so langsam bringt mich diese SWX-API zu verzweifeln. Nix funktioniert so wie ich will. Ich hab's mittlerweile soweit geschafft, dass ich das problem aus http://ww3.cad.de/foren/ubb/Forum2/HTML/009648.shtml gelöst hab. Wenn ich nun aber in meinem Code die Zeilen Code: hr = pModel->Create3PointArc(dRefParams[0][0]+vCylinder[6], dRefParams[0][1], dRefParams[0][2], dRefParams[0][0]+vCylinder[6], dRefParams[0][1], dRefParams[0][2]+0.05, dRefParams[0][0]+vCylinder[6], dRefParams[0][1]+0.1, dRefParams[0][2]+0.025, &boolstatus2);
oder Code: pModel->ClearSelection2(True);
einfüge, erhalte ich immer einen Fehler, der folgendermaßen lautet: "SolidWorks wurde aufgrund eines Fehlers beendet. Bitte wenden Sie sich ..." Was is da falsch an meinem Code? Die beiden Linien vorher zeichnet SWX ja noch. Beim Kreisbogen sieht man zwar die Eigenschaftsleiste am linken Rand, aber SWX hängt sich dann auf und bringt dann den oben beschriebenen Fehler. Weiß jemand von euch, was da falsch gelaufen sein könnte? Danke für eure Hilfe schon mal im Voraus. MfG Harry Code:
...CComPtr <IFace> pFace; CComPtr <ISurface> pSurf; CComPtr <ISketchPoint> pP1,pP2,pP3; CComPtr <ISketch> pSketch; CComPtr <ISketchSegment> pSketchSeg; CComBSTR FeatType ; VARIANT_BOOL boolstatus2; long type; double vCylinder[7],dP1[3],dP2[3],dP3[3],dRefParams[3][3]; iSwApp->get_IActiveDoc2(&pModel); hr = pModel->get_ISelectionManager(&pSelMgr); hr = pSelMgr->GetSelectedObjectType2(1,&type); if (type == swSelFACES) //Wenn Fläche { hr = pSelMgr->IGetSelectedObject4(1,&pUn); hr = pUn->QueryInterface(IID_IFace,(LPVOID *)&pFace); hr = pFace->IGetSurface(&pSurf); hr = pSurf->IsCylinder(&boolstatus2); if (boolstatus2 == TRUE) //Wenn Zylinder { hr = pSurf->get_ICylinderParams(vCylinder); dP1[0]=vCylinder[0]; dP1[1]=vCylinder[1]; dP1[2]=vCylinder[2]; dP2[0]=vCylinder[0]; dP2[1]=vCylinder[1]+vCylinder[6]; dP2[2]=vCylinder[2]; dP3[0]=vCylinder[0]; dP3[1]=vCylinder[1]+vCylinder[6]; dP3[2]=vCylinder[2]+vCylinder[6]; hr = pModel->ICreatePlaneFixed2(dP1,dP2,dP3,TRUE,&pPlane); hr = pModel->SetUserPreferenceToggle(swDisplayPlanes,TRUE,&boolstatus2); hr = pModel->ICreatePlaneAtOffset3(vCylinder[6],FALSE,FALSE,&pPlane2); hr = pModel->SetUserPreferenceToggle(swDisplayPlanes,TRUE,&boolstatus2); hr = pModel->IGetActiveSketch2(&pSketch); hr = pPlane2->IGetRefPlaneParams((double *)dRefParams); hr = pModel->SelectByID(_T(""),_T("PLANE"),dRefParams[0][0]+vCylinder[6],dRefParams[0][1],dRefParams[0][2],&boolstatus2); hr = pModel->Insert3DSketch(); hr = pModel->ICreateLine2(dRefParams[0][0]+vCylinder[6],dRefParams[0][1],dRefParams[0][2],dRefParams[0][0]+vCylinder[6],0.1,dRefParams[0][2],&pSketchSeg); pSketchSeg=NULL; hr = pModel->ICreateLine2(dRefParams[0][0]+vCylinder[6],dRefParams[0][1],dRefParams[0][2]+0.05,dRefParams[0][0]+vCylinder[6],0.1,dRefParams[0][2]+0.05,&pSketchSeg); pSketchSeg=NULL; hr = pModel->Create3PointArc(dRefParams[0][0]+vCylinder[6], dRefParams[0][1], dRefParams[0][2], dRefParams[0][0]+vCylinder[6], dRefParams[0][1], dRefParams[0][2]+0.05, dRefParams[0][0]+vCylinder[6], dRefParams[0][1]+0.1, dRefParams[0][2]+0.025, &boolstatus2); //pModel->ClearSelection2(True);
pModel->UnBlankRefGeom(); } }
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mkkk Mitglied
Beiträge: 105 Registriert: 04.03.2005
|
erstellt am: 16. Feb. 2006 13:33 <-- editieren / zitieren --> Unities abgeben: Nur für KBN
Hi KBN, zunächst würde ich Dir empfehlen Dein Kernprogramm als SW-VBA-Makro zu schreiben und die grundsätzlichen Machbarkeit mal eben schnell zu überprüfen. Das ist viel einfacher. Die Portierung nach C++ ist dann das kleinere Übel. Ich weiß zwar nicht direkt, warum SW bei Dir nicht so will, aber zwei Fehler habe ich schon gefunden: ICreateLine2() kommt mit einem Sketch-Objekt zurück. Dieser Objekt-Zeiger darf nicht im nächsten Schritt einfach mit NULL initialisiert werden. Du mußt es unbedingt vorher wieder freigeben, sonst Datenmüll oder auch andere Effekte. Also: if (pSketchSeg) { pSketchSeg->Release(); pSketchSeg=NULL; } 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: 16. Feb. 2006 14:48 <-- editieren / zitieren --> Unities abgeben: Nur für KBN
|
KBN Mitglied
Beiträge: 11 Registriert: 13.02.2006 SolidWorks 2004 Visual C++ .NET Athlon X2 3800+ 1024 MB RAM Geforce 6600
|
erstellt am: 16. Feb. 2006 16:18 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich hab versucht auf die Release-Funktion von SketchSeg zuzugreifen, aber da erahlte ich die Meldung, dass auf eine private Elemente der Klasse keinen Zugriff hab. ATL::_NoAddRefReleaseOnCComPtr<SldWorks::ISketchSegment>::Release Den Tipp mit VBA hab ich probiert, da funktioniert alles einwandfrei. Das is ja das komische. SetAddToDB is auf True. Eine Umstellung auf FALSE bringt aber keinen Unterschied Trotzdem danke für die tips MfG Harry [Diese Nachricht wurde von KBN am 16. Feb. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
PASCAM Mitglied Diplom Informatiker
Beiträge: 67 Registriert: 25.11.2002
|
erstellt am: 16. Feb. 2006 18:14 <-- editieren / zitieren --> Unities abgeben: Nur für KBN
Hallo KBN, Welchen Compiler verwendest Du denn? Schalte mal Deinen Compiler so um, dass alle Exception nicht an das Programm weitergeleitet werden, sondern der Compiler anhält. Dann bekommst Du evtl. einen tieferen Einblick, wo sich SWX verabschiedet. Das mit dem Release brauchst Du nicht, da Du mit ATL arbeitest, der die COM-Pointer wie VB/VBA automatisch freigibt. Ich wuerde tippen, dass SWX ein Event in Deinem Programm aufruft, das den Fehler verursacht. Welche AddIns hast Du noch am laufen. Wenn es geht, alles abschalten. Kannst Du ein Beispielprojekt Online stellen? Gruss, Ralph ------------------ PASCAM Ralph Müller Softwareentwicklung Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KBN Mitglied
Beiträge: 11 Registriert: 13.02.2006 SolidWorks 2004 Visual C++ .NET Athlon X2 3800+ 1024 MB RAM Geforce 6600
|
erstellt am: 16. Feb. 2006 19:33 <-- editieren / zitieren --> Unities abgeben:
Hallo Ralph, als Compiler nehm ich VC .NET 2003. Meinst du mit "an den Compiler weiterleiten", ne normale try-catch-Anweisung, oder kann man da im Compiler selbst was umstellen? Sonstige Add-Ins hab ich keine laufen. Mein Projekt kommt als Anhang mit. Ich bis jetzt noch nichts großes. Bisher is eigentlich nur die PMPageHandler.cpp verändert. Wär echt super, wenn du mir weiterhelfen könntest Gruß Harry Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
naimo Mitglied Informatik-Student
Beiträge: 24 Registriert: 26.12.2002 M2004PP 1,2 GHZ AMD 640 MB RAM ATI Radeon 9200
|
erstellt am: 16. Feb. 2006 19:44 <-- editieren / zitieren --> Unities abgeben: Nur für KBN
Hallo Harry, genau das selbe Problem hab ich auch. Bei mir hängt sich SolidWorks auch immer auf, wenn ich einen Bogen durch drei Punkte machen will, oder wenn ich ClearSelection mach. k.A. warum. Gruß Benjamin ------------------ There are only 10 types of people in the world: Those who understand BINARY und those who don't. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
PASCAM Mitglied Diplom Informatiker
Beiträge: 67 Registriert: 25.11.2002
|
erstellt am: 17. Feb. 2006 08:01 <-- editieren / zitieren --> Unities abgeben: Nur für KBN
Hallo Harry, Also, Dein Problem ist, dass Du Deine Passfeder zum falschen Zeitpunkt erzeugen willst. Wenn Du denn PM benutzt, ist das OnClose-Ereignis dazu da, Dir zu sagen, dass jetzt der PM geschlossen wird und Du Dir Deine Daten sichern musst, z.B. die selektierten Elemente. Du darfst aber keine neue Elemente erzeugen. Hierfuer ist dann das AfterClose-Ereignis da. Da darfst Du dann anfangen und Deine Skizze erzeugen. Hintergrund: Bei OnClose ist der PM noch offen. Erzeugst Du nun etwas, wird ein PM benoetigt, was aber nicht geht, da ja Deiner noch offen ist. Deadlock! Daher auch der Crash. Ralph ------------------ PASCAM Ralph Müller Softwareentwicklung Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KBN Mitglied
Beiträge: 11 Registriert: 13.02.2006 SolidWorks 2004 Visual C++ .NET Athlon X2 3800+ 1024 MB RAM Geforce 6600
|
erstellt am: 17. Feb. 2006 08:34 <-- editieren / zitieren --> Unities abgeben:
Hallo Ralph, genau das ist die Lösung für das Problem. Auf den Ansatz wär ich nie im Leben gekommen. Ein fettes Dankeschön von mir für deine Mühe. Jetzt dürften auch meine anderen Probleme gelöst sein. Danke. Gruß Harry Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|