Bonjour,
Je me lance dans la réalisation d'une addin pour Solidworks.
Je me demande si l’implémentation par le biais d'ActiveQt est réalisable.
Beaucoup de documentation existe pour VB.net ou C#; mais très peu pour le C++.
Avec VB.net express, j'ai fait une DLL des plus simples qui fonctionne correctement.
Solidworks API
Voici le code:
Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 Option Explicit On Imports System Imports SolidWorks.Interop.sldworks Imports SolidWorks.Interop.swconst Imports SolidWorks.Interop.swpublished Public Class SwAddin Implements SolidWorks.Interop.swpublished.SwAddin Function ConnectToSW(ByVal ThisSW As Object, ByVal Cookie As Integer) As Boolean Implements SolidWorks.Interop.swpublished.SwAddin.ConnectToSW MsgBox("Hello!") ConnectToSW = True End Function Function DisconnectFromSW() As Boolean Implements SolidWorks.Interop.swpublished.SwAddin.DisconnectFromSW DisconnectFromSW = True End Function End Class
Et dans AssemblyInfo.vb
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Imports System.Reflection Imports System.Runtime.InteropServices <Assembly: AssemblyTitle("")> <Assembly: AssemblyDescription("")> <Assembly: AssemblyCompany("")> <Assembly: AssemblyProduct("")> <Assembly: AssemblyCopyright("")> <Assembly: AssemblyTrademark("")> <Assembly: AssemblyVersion("1.0.*")> <Assembly: ComVisibleAttribute(True)>
Par contre dans C++, c'est moins facile
J utilise les cpp/h generés avec dumpcpp depuis les .TLB. Et je fais ceci:
(+ le code des fonctions dans le cpp)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 #include "solidworks.h" #include "swpublished.h" #include "swconst.h" using namespace SolidWorks; using namespace SwPublished; using namespace SwConst; class Q_DECL_EXPORT swAddin : public ISwAddin { Q_OBJECT Q_CLASSINFO("Version", "1.0") Q_CLASSINFO("ClassID", "{7a4cffd8-cbcd-4ae9-ae7e-343e1e5710df}") Q_CLASSINFO("Insertable", "yes") public: boolean ConnectToSW(ISldWorks *swApp, int cookie); boolean DisconnectFromSW(); }
J'arrive à compiler ma DLL correctement mais lorsque je charge la DLL dans solidworks, celui ci me dit qu'il ne peut la charger. En debug, Solidworks indique "RPC Server is not available".
Je n ai pas laché l'affaire. Je me suis dit que j allais commencer simple.
Donc, j'ai tenté de d'abord faire une DLL simple avec VC2010 express sans qt sans activeqt.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #pragma once //Import the SolidWorks #import "sldworks.tlb" raw_interfaces_only, raw_native_types, no_namespace, named_guids #import "swpublished.tlb" raw_interfaces_only, raw_native_types, no_namespace, named_guids #import "swconst.tlb" raw_interfaces_only, raw_native_types, no_namespace, named_guids using namespace System; public class __declspec(dllexport) swAddin: public ISwAddin { public: swAddin(); // ISwAddin STDMETHOD(ConnectToSW)(IDispatch * ThisSW, LONG Identifier, VARIANT_BOOL * IsConnected); STDMETHOD(DisconnectFromSW)(VARIANT_BOOL * IsDisconnected); };
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 swAddin::swAddin() { } STDMETHODIMP swAddin::ConnectToSW(IDispatch * ThisSW, LONG Cookie, VARIANT_BOOL * IsConnected) { MessageBox(NULL, _T("Hello world!"), _T("ConnectToSW called"), MB_OK | MB_ICONERROR); return S_OK; } STDMETHODIMP swAddin::DisconnectFromSW(VARIANT_BOOL * IsDisconnected) { return S_OK; }
Et la, j arrive également à compiler mais dans Solidworks, en debug, c'est le même topo : "RPC Server is not available". (je suppose que c'est Remote Procedure Call ?).
Je crois que certains concepts m’échappent entre la simplicité du VB.net et C++... Si quelqu'un à quelques infos...
Merci d'avance pour votre lecture
Cordialement,
Partager