-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path3d_print_kompas3d.cpp
230 lines (182 loc) · 5.81 KB
/
3d_print_kompas3d.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
#include "stdafx.h"
#include <afxdllx.h>
#include <string>
#include "3d_print_kompas3d.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//-------------------------------------------------------------------------------
// Ñïåöèàëüíàÿ ñòðóêòóðà èñïîëüçóåìàÿ â òå÷åíèè èíèöèàëèçàöèè DLL
// ---
static AFX_EXTENSION_MODULE Kompas3DExtension = { NULL, NULL };
HINSTANCE g_hInstance = NULL;
ksAPI7::IApplicationPtr newKompasAPI( NULL );
void OnProcessDetach(); // Îòêëþ÷åíèå áèáëèîòåêè
// Ãëîáàëüíûå ïåðåìåííûå
int oType = o3d_edge; // Òèï îáúåêòîâ äëÿ ôóíêöèè ôèëüòðàöèè
//-------------------------------------------------------------------------------
// Ñòàíäàðòíàÿ òî÷êà âõîäà
// Èíèöèàëèçàöèÿ è çàâåðøåíèå DLL
// ---
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
g_hInstance = hInstance;
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("STEP2_API7_3D.AWX Initializing!\n");
AfxInitExtensionModule(Kompas3DExtension, hInstance);
new CDynLinkLibrary(Kompas3DExtension);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("STEP2_API7_3D.AWX Terminating!\n");
OnProcessDetach();
AfxTermExtensionModule(Kompas3DExtension);
}
return 1; // ok
}
//-------------------------------------------------------------------------------
// Ïîëó÷èòü äîñòóï ê íîâîìó API
// ---
void GetNewKompasAPI()
{
if ( !( ksAPI7::IApplication * )newKompasAPI )
{
CString filename;
if( ::GetModuleFileName(NULL, filename.GetBuffer(255), 255) )
{
filename.ReleaseBuffer( 255 );
CString libname;
libname = LoadStr( IDR_API7 ); // kAPI7.dll
filename.Replace( filename.Right(filename.GetLength() - (filename.ReverseFind('\\') + 1)),
libname );
HINSTANCE hAppAuto = LoadLibrary( filename ); // èäåíòèôèêàòîð kAPI7.dll
if( hAppAuto )
{
// Óêàçàòåëü íà ôóíêöèþ âîçâðàùàþùóþ èíòåðôåéñ KompasApplication
typedef LPDISPATCH ( WINAPI * FCreateKompasApplication )();
FCreateKompasApplication pCreateKompasApplication =
(FCreateKompasApplication)GetProcAddress( hAppAuto, "CreateKompasApplication" );
if ( pCreateKompasApplication )
newKompasAPI = IDispatchPtr ( pCreateKompasApplication(), false /*AddRef*/); // Ïîëó÷àåì èíòåðôåéñ Application
FreeLibrary( hAppAuto );
}
}
}
}
//-------------------------------------------------------------------------------
// Çàäàòü èäåíòèôèêàòîð ðåñóðñîâ
// ---
unsigned int WINAPI LIBRARYID()
{
return IDR_LIBID;
}
//-------------------------------------------------------------------------------
// Ïîëó÷èòü òåêóùèé äîêóìåíò
// ---
ksAPI7::IKompasDocument3DPtr GetCurrentDocument()
{
ksAPI7::IKompasDocument3DPtr doc = NULL;
// Åñëè íå ïîëó÷åí èíòåðôåéñ ïðèëîæåíèÿ IApplication â ÑÎÌ
if ( !(bool)newKompasAPI )
// Ïîëó÷èòü èíòåðôåéñ ïðèëîæåíèÿ
GetNewKompasAPI();
// Åñëè ïîëó÷åí èíòåðôåéñ ïðèëîæåíèÿ IApplication â ÑÎÌ
if ( newKompasAPI )
// Ïîëó÷èòü àêòèâíûé äîêóìåíò
doc = newKompasAPI->GetActiveDocument();
return doc;
}
//-------------------------------------------------------------------------------
// Îïèñàíèÿ èñïîëüçóåìûõ ôóíêöèé
// ---
void OpenInSlic3r( ksAPI7::IKompasDocument3DPtr & doc );
void PrintInSlic3r( ksAPI7::IKompasDocument3DPtr & doc );
//-------------------------------------------------------------------------------
// Ãîëîâíàÿ ôóíêöèÿ áèáëèîòåêè
// ---
void WINAPI LIBRARYENTRY( unsigned int comm )
{
// Ïîëó÷èòü òåêóùèé äîêóìåíò
ksAPI7::IKompasDocument3DPtr doc( GetCurrentDocument() );
if ( doc )
{
switch ( comm )
{
case 1:
OpenInSlic3r( doc );
break;
}
}
else
MessageT( (LPTSTR)(LPCTSTR)LoadStr(IDS_NODOC) );
}
//-----------------------------------------------------------------------------
// Ôóíêöèÿ ôèëüòðàöèè
// ---
BOOL __stdcall UserFilterProc( IEntity * e)
{
if( e && (!oType || e->GetType() == oType) )
return TRUE;
else
return FALSE;
}
LPWSTR convertWStringToLPWSTR(std::wstring base) {
LPWSTR result = new wchar_t[base.size() + 1];
std::copy(base.begin(), base.end(), result);
result[base.size()] = 0;
return result;
}
std::wstring getTempSTLFileLocation(std::wstring fileName) {
WCHAR bTmpPath[MAX_PATH] = {};
if (GetTempPathW(MAX_PATH, bTmpPath)) {
return bTmpPath + fileName;
}
return false;
}
std::wstring replaceExtensionOnFileName(std::wstring fileName, std::wstring extension) {
std::wstring cSFileName = fileName;
size_t dotPosition = cSFileName.find('.');
if (dotPosition == std::string::npos) {
return false;
}
return cSFileName.substr(0, dotPosition) + extension;
}
void OpenInSlic3r( ksAPI7::IKompasDocument3DPtr & doc )
{
LPWSTR documentName = doc->GetName();
std::wstring tmpFilePath = getTempSTLFileLocation(replaceExtensionOnFileName(documentName, L".stl"));
BSTR bTmpFilePath = SysAllocStringLen(tmpFilePath.data(), tmpFilePath.size());
if (doc->SaveAs(bTmpFilePath) == S_OK) {
std::wstring slic3rCMD = L"Slic3r-console.exe --gui " + tmpFilePath;
_wsystem(convertWStringToLPWSTR(slic3rCMD));
}
else {
MessageT((LPTSTR)(LPCTSTR)LoadStr(IDS_FAILED_TO_STORE_TMP_FILE));
}
}
//-------------------------------------------------------------------------------
// Íàâèãàöèÿ ïî êîëëåêöèè ëèíåéíûõ ðàçìåðîâ 3D
// ---
void PrintInSlic3r( ksAPI7::IKompasDocument3DPtr & doc )
{
MessageT(L"Test function 2");
}
//-------------------------------------------------------------------------------
// Çàâåðøåíèå ïðèëîæåíèÿ
// ---
void OnProcessDetach()
{
newKompasAPI = NULL;
}
//------------------------------------------------------------------------------
// Çàãðóçèòü ñòðîêó èç ðåñóðñà
// ---
CString LoadStr( int strID )
{
TCHAR temp[_MAX_PATH];
LoadString( Kompas3DExtension.hModule, strID, temp, _MAX_PATH );
return temp;
}