| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
Autor
|
Thema: Add-In API (838 mal gelesen)
|
naimo Mitglied Informatik-Student

 Beiträge: 24 Registriert: 26.12.2002 M2004PP 1,2 GHZ AMD 640 MB RAM ATI Radeon 9200
|
erstellt am: 09. Feb. 2006 14:58 <-- editieren / zitieren --> Unities abgeben:         
Hallo Leute, ich versuch mich seit ein paar Tagen in die API-Programmierung für SolidWorks mit Visual C++ .NET 2003 einzuarbeiten. So weit, so gut. Nur ich hab keine Ahnung, wie ich auf SolidWorks zugreifen soll, wenn in den Beispielen steht: Code: // Connect to SolidWorks application pSldWorks = TheApplication->GetSWApp(); ASSERT(pSldWorks); hr = pSldWorks->get_IActiveDoc2(&pModel); ASSERT(pModel);
Die Deklaration von pSldWorks ist mir noch klar, aber wie bekomm ich Zugriff auf TheApplication? Die Methode über iSwApp->get_IActiveDoc2 funktioniert bei mir z.B. auch ned immer. Ich hab mir ein Addin erstellen lassen, mit dem Wizzard, der mit dem SolidWorks SDK - Paket mitkommt. Aber z.B. in der PMPageHandler.cpp erhalte ich überhaupt keinen Zugriff auf iSwApp. Auch wenn ich alle Header richtig einfüge. Ich wär euch wahnsinnig dankbar, wenn ihr mir weiterhelfen könntet. Is sicher nur ein kleines Prob für euch, aber ich häng schon ein paar Tage dran.
Vielen Dank schon mal im Voruas MfG Benjamin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
VBSpawn Mitglied Programmierer
  
 Beiträge: 514 Registriert: 23.08.2005 Sorgfältige Planung ersetzt niemals pures Glück.
|
erstellt am: 09. Feb. 2006 15:43 <-- editieren / zitieren --> Unities abgeben:          Nur für naimo
Hi, Warum C++ ? wenne schon damit Anfangen willst und ein .NET Studio 2003 zur verfügung hast sollteste es mit VB.NET versuchen ... Gruß Micha ------------------ http://classicvb.org/petition/ 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 |
naimo Mitglied Informatik-Student

 Beiträge: 24 Registriert: 26.12.2002 M2004PP 1,2 GHZ AMD 640 MB RAM ATI Radeon 9200
|
erstellt am: 09. Feb. 2006 16:47 <-- editieren / zitieren --> Unities abgeben:         
Hi micha, danke für die schnelle Antwort, aber ich wills eben unbedingt mit C++ versuchen. Ich kann zwar auch VB, aber da ich im Studium mehr mit C++ zu tun hab, will ich nicht wieder mit VB anfangen, sondern gleich mit C++ veruschen! MfG Benjamin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Jan Boettcher Mitglied
 
 Beiträge: 184 Registriert: 22.06.2005
|
erstellt am: 09. Feb. 2006 21:28 <-- editieren / zitieren --> Unities abgeben:          Nur für naimo
Hallo Benjamin, So ganz verstehe ich Dein Problem jetzt nicht. Wenn Du den Wizzard benutzt, bekommst Du ja schon ein funktionierendes Add-In zusammengebaut. iSwApp ist im vom Wizzard erstellten Add-In Member von CSwAddin1 und Member von CUserPropertyManagerPage und steht damit dort für alles weitere zur Verfügung. Wenn Du es in CPMPageHandler brauchst, mußt Du selbst es dort mit C++ "Bordmitteln" hinschaffen. Das sollte aus dem Init bzw. CreatePropertyManagerPage von UserPropertyManagerPage heraus kein Problem sein. ISwApp wird im Einstiegspunkt ConnectToSW in CSwAddin1 gesetzt. Wenn Du denn Wizzard als Basis benutzt ist also alles da was Du brauchst. Das ganze ist dann sicher etwas kryptisch, aber es funktioniert. Gruß Jan
------------------ Ingenieurbüro Jan Böttcher jan.boettcher@ib-boettcher.de www.ib-boettcher.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
VBSpawn Mitglied Programmierer
  
 Beiträge: 514 Registriert: 23.08.2005 Sorgfältige Planung ersetzt niemals pures Glück.
|
erstellt am: 10. Feb. 2006 08:01 <-- editieren / zitieren --> Unities abgeben:          Nur für naimo
Zitat: Original erstellt von naimo: Hi micha,danke für die schnelle Antwort, aber ich wills eben unbedingt mit C++ versuchen. Ich kann zwar auch VB, aber da ich im Studium mehr mit C++ zu tun hab, will ich nicht wieder mit VB anfangen, sondern gleich mit C++ veruschen! MfG Benjamin
<grinz> jedem das seine allerdings reden wir hier ja über .NET und mal ganz unter uns ... egal ob C++ C# VB unter .NET spielt das keine Rolle..... achja unter VS2k5 gehts auch wieder mit dem debuggen + ändern kostet weniger nerven ... ansonsten siehe Jan... Gruß Micha ------------------ http://classicvb.org/petition/ 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 |
naimo Mitglied Informatik-Student

 Beiträge: 24 Registriert: 26.12.2002 M2004PP 1,2 GHZ AMD 640 MB RAM ATI Radeon 9200
|
erstellt am: 10. Feb. 2006 09:45 <-- editieren / zitieren --> Unities abgeben:         
Hallo Jan, so ähnlich hab ich mir das auch vorgestellt. Aber ich bekomm es einfach nicht hin Kannst du mir vielleicht eine kleine Hilfe geben, wie es funktionieren könnte. Ich bin echt am verzweifeln. Mein SldWorks stürzt ständig ab. Ich hab folgenden Code: Code: void CPMPageHandler::Passfeder() { HRESULT hr = S_OK; CComPtr <IModelDoc> pModel; CComPtr <ISldWorks> pSldWorks; CComQIPtr <IDrawingDoc> pDraw; CComPtr <IFeature> pFeat; CComPtr <IFeature> pMateFeat; CComPtr <IFeature> pSubFeat; CComPtr <IView> pView; CComPtr <IView> pFocusLockedView; CComPtr <ISheet> pSheet; CComPtr <IDispatch> ptr; CComBSTR FeatType ; VARIANT_BOOL boolstatus2; iSwApp->get_IActiveDoc(&pModel); /* hr = pModel->IFirstFeature(&pFeat); while (pFeat) { CComPtr <IFeature> pNextFeat; // get the feature type hr = pFeat->get_Name(&FeatType); if ((FeatType == CComBSTR("RefPlane")) | | (FeatType == CComBSTR("RefPlane2"))) { // got MateGroup so jump out pMateFeat = pFeat; hr = pMateFeat->Select2(VARIANT_TRUE,0,&boolstatus2); //break; } // get the next Feature in FMT hr = pFeat->IGetNextFeature(&pNextFeat); pFeat = pNextFeat; } */ }
Sogar der Code bringt SolidWorks zum Absturz, mit der Fehlermeldung: Code: Debug Asseration Failed! C:\vs2003\vc7\atlmfc\include\atlcomcli.h Line: 148Expression p!=0
Erst wenn ich die Zeile iSwApp->get_IActiveDoc(&pModel); auskommentiere, kommt der Fehler nicht mehr. k.A. warum
Danke schon mal für deine Hilfe @micha: was meinst du mit : "achja unter VS2k5 gehts auch wieder mit dem debuggen + ändern kostet weniger nerven ..." kann ich etwa auch eine DLL debuggen, während SldWorks läuft??? Oder hast du was anderes gemeint? MfG Benjamin ------------------ There are only 10 types of people in the world: Those who understand BINARY und those who don't. [Diese Nachricht wurde von naimo am 10. Feb. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Jan Boettcher Mitglied
 
 Beiträge: 184 Registriert: 22.06.2005
|
erstellt am: 10. Feb. 2006 10:09 <-- editieren / zitieren --> Unities abgeben:          Nur für naimo
|
VBSpawn Mitglied Programmierer
  
 Beiträge: 514 Registriert: 23.08.2005 Sorgfältige Planung ersetzt niemals pures Glück.
|
erstellt am: 10. Feb. 2006 10:42 <-- editieren / zitieren --> Unities abgeben:          Nur für naimo
|
naimo Mitglied Informatik-Student

 Beiträge: 24 Registriert: 26.12.2002 M2004PP 1,2 GHZ AMD 640 MB RAM ATI Radeon 9200
|
erstellt am: 10. Feb. 2006 12:22 <-- editieren / zitieren --> Unities abgeben:         
@jan: ich hab mir, so wie in der UserPropertyManagerPage.cpp und UserPropertyManagerPage.h eine Funktion Init und die Varibale iSwApp angelegt, aber die IswApp hat immer noch den Wert 0x00000000. Code: void CPMPageHandler::Init(CAddin *app) { userAddin = app; iSwApp = userAddin->GetSldWorksPtr(); }
Deklaration, usw. dürften stimmen. Oder ist die Methode etwa nicht die richtige? Hast du vielleicht ein Code-Stück, mit dem du es mir vielleicht verdeutlichen könntest? Wär echt super! @micha: danke für deinen Beitrag, hat mich echt weiter gebracht. Auf die Idee hät ich eigentlich auch kommen können  ------------------ 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 |
Jan Boettcher Mitglied
 
 Beiträge: 184 Registriert: 22.06.2005
|
erstellt am: 10. Feb. 2006 13:03 <-- editieren / zitieren --> Unities abgeben:          Nur für naimo
Hallo Benjamin, Wenn Du keinen Fehler gemacht hast, und Deine neue Init-Methode dann auch noch aufrufst (oder hast Du das schon gemacht?) dann sollte Dir jetzt auch in CPMHandler ein gültiges iSwApp zur Verfügungung stehen. Für den Aufruf bietet sich CUserPropertyManagerPage::CreatePropertyManagerPage() an, da hier ja auch der CPMHandler instanziiert wird. Das könnte dann so aussehen:
Code:
void CUserPropertyManagerPage::CreatePropertyManagerPage() { CComObject<CPMPageHandler>::CreateInstance(&handler); handler->Init(this->app); CComBSTR title; ...
Gruss Jan ------------------ Ingenieurbüro Jan Böttcher jan.boettcher@ib-boettcher.de www.ib-boettcher.de 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: 11. Feb. 2006 11:01 <-- editieren / zitieren --> Unities abgeben:         
Hallo Jan, so hab ich's auch gemacht, nur erhalte ich nun die Fehlermeldung "error C2039: 'app': Ist kein Element von 'CUserPropertyManagerPage'", eigentlich wär doch alles richtig, oder? Ich hab's auch schon mit "(CComObject<CAddin>*)this" versucht, auch nichts. Dann erhalt ich den Fehler: "Unbehandelte Ausnahme bei 0x0615e9bd (Addin.dll) in SLDWORKS.exe: 0xC0000005: Zugriffsverletzung-Leseposition 0xcdcdcdcd." in der atlcomcli.h. Zeile 121 Wär echt super, wenn du mir nochmal helfen könntest. Ich hoff, ich nerv dich nicht schon. Gruß Benjamin ------------------ There are only 10 types of people in the world: Those who understand BINARY und those who don't. [Diese Nachricht wurde von naimo am 11. Feb. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
VBSpawn Mitglied Programmierer
  
 Beiträge: 514 Registriert: 23.08.2005 Sorgfältige Planung ersetzt niemals pures Glück.
|
erstellt am: 11. Feb. 2006 15:52 <-- editieren / zitieren --> Unities abgeben:          Nur für naimo
Zitat: Original erstellt von naimo: eigentlich wär doch alles richtig, oder?
sorry aber da musste ich einwenig lachen .... bin jedenfalls gespannt wo das noch enden wird ... Ich für meinen Teil glaube (auch wenn es sich um ein SWX AddIn dreht) du solltest mal einen Blick in ein anderes Forum werfen ... oder noch einwenig Lesen z.b.: http://www.uow.edu.au/~nabg/ABC/ABC.html <KLARSTELLUNG> 1. Ist nicht bös gemeint. 2. Auch wenn es das beste Forum ist sind nicht alle Spezis.. 3. Das mit dem BINARY ...... </KLARSTELLUNG> Gruß Micha ------------------ http://classicvb.org/petition/ 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 |
naimo Mitglied Informatik-Student

 Beiträge: 24 Registriert: 26.12.2002 M2004PP 1,2 GHZ AMD 640 MB RAM ATI Radeon 9200
|
erstellt am: 11. Feb. 2006 16:07 <-- editieren / zitieren --> Unities abgeben:         
Hi Micha, is schon klar, dass ned böse gmeint is. Aber kannst du mir erklären, was falsch ist? Also... Außerdem, wo gibt's sonst ein SWX -Forum bei dem man dir mit API-Programmierung weiterhelfen kann? Ich bin hald noch nicht soweit bei C++ vorangeschritten, dass ich alles könnte. Das mit dem Smiley bei BINARY, is das ernsthaft oder ironisch gmeint? [EDIT am 12.02.] Hab's nun endlich selber rausgefunden. Hab ein wenig in meinen C-Büchern gewühlt.  Ich übergeb der "void CUserPropertyManagerPage::CreatePropertyManagerPage(CAddin *app)" einfach als Parameter die app und ruf dann die INit der CPMPageHandler mit app auf. [handler->Init(app);] Trotzdem nochmal Danke an euch beide. Gruß Benjamin ------------------ There are only 10 types of people in the world: Those who understand BINARY und those who don't. [Diese Nachricht wurde von naimo am 12. Feb. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Jan Boettcher Mitglied
 
 Beiträge: 184 Registriert: 22.06.2005
|
erstellt am: 12. Feb. 2006 11:23 <-- editieren / zitieren --> Unities abgeben:          Nur für naimo
|
naimo Mitglied Informatik-Student

 Beiträge: 24 Registriert: 26.12.2002 M2004PP 1,2 GHZ AMD 640 MB RAM ATI Radeon 9200
|
erstellt am: 12. Feb. 2006 12:55 <-- editieren / zitieren --> Unities abgeben:         
Zitat: Original erstellt von Jan Boettcher: Wie Du siehst zahlt es sich aus, erst C++ zu beherrschen und dann ein SW AddIn damit zu erstellen.
Da hast du recht. tut mir auch leid, dass ich dich damit "belästigt" hab. Ich kann C++ erst seit einem halben Jahr. Nur ich hab mir gedacht, dass ich das Problem gleich in C++ anpack, um Erfahrung damit zu sammeln. In VB wärs für mich auch einfacher gwesen. Ich dank dir aber auf jeden Fall für deine Geduld mit mir. Bis denn. 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 |