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:

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();
}
(+ le code des fonctions dans le cpp)

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,