solidworks-mcp-server 2.2.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -10
- package/dist/application/services/command-bus.d.ts +39 -0
- package/dist/application/services/command-bus.d.ts.map +1 -0
- package/dist/application/services/command-bus.js +88 -0
- package/dist/application/services/command-bus.js.map +1 -0
- package/dist/application/services/event-bus.d.ts +31 -0
- package/dist/application/services/event-bus.d.ts.map +1 -0
- package/dist/application/services/event-bus.js +83 -0
- package/dist/application/services/event-bus.js.map +1 -0
- package/dist/application/services/query-bus.d.ts +30 -0
- package/dist/application/services/query-bus.d.ts.map +1 -0
- package/dist/application/services/query-bus.js +59 -0
- package/dist/application/services/query-bus.js.map +1 -0
- package/dist/application/services/tool-registry.d.ts +53 -0
- package/dist/application/services/tool-registry.d.ts.map +1 -0
- package/dist/application/services/tool-registry.js +81 -0
- package/dist/application/services/tool-registry.js.map +1 -0
- package/dist/application/use-cases/analysis/index.d.ts +13 -0
- package/dist/application/use-cases/analysis/index.d.ts.map +1 -0
- package/dist/application/use-cases/analysis/index.js +17 -0
- package/dist/application/use-cases/analysis/index.js.map +1 -0
- package/dist/application/use-cases/drawing/index.d.ts +13 -0
- package/dist/application/use-cases/drawing/index.d.ts.map +1 -0
- package/dist/application/use-cases/drawing/index.js +17 -0
- package/dist/application/use-cases/drawing/index.js.map +1 -0
- package/dist/application/use-cases/export/index.d.ts +13 -0
- package/dist/application/use-cases/export/index.d.ts.map +1 -0
- package/dist/application/use-cases/export/index.js +17 -0
- package/dist/application/use-cases/export/index.js.map +1 -0
- package/dist/application/use-cases/macro/index.d.ts +13 -0
- package/dist/application/use-cases/macro/index.d.ts.map +1 -0
- package/dist/application/use-cases/macro/index.js +17 -0
- package/dist/application/use-cases/macro/index.js.map +1 -0
- package/dist/application/use-cases/modeling/index.d.ts +56 -0
- package/dist/application/use-cases/modeling/index.d.ts.map +1 -0
- package/dist/application/use-cases/modeling/index.js +385 -0
- package/dist/application/use-cases/modeling/index.js.map +1 -0
- package/dist/core/interfaces/core-abstractions.d.ts +289 -0
- package/dist/core/interfaces/core-abstractions.d.ts.map +1 -0
- package/dist/core/interfaces/core-abstractions.js +121 -0
- package/dist/core/interfaces/core-abstractions.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -4
- package/dist/index.js.map +1 -1
- package/dist/index.refactored.d.ts +7 -0
- package/dist/index.refactored.d.ts.map +1 -0
- package/dist/index.refactored.js +254 -0
- package/dist/index.refactored.js.map +1 -0
- package/dist/infrastructure/config/configuration-manager.d.ts +381 -0
- package/dist/infrastructure/config/configuration-manager.d.ts.map +1 -0
- package/dist/infrastructure/config/configuration-manager.js +566 -0
- package/dist/infrastructure/config/configuration-manager.js.map +1 -0
- package/dist/infrastructure/container/service-locator.d.ts +14 -0
- package/dist/infrastructure/container/service-locator.d.ts.map +1 -0
- package/dist/infrastructure/container/service-locator.js +38 -0
- package/dist/infrastructure/container/service-locator.js.map +1 -0
- package/dist/infrastructure/logging/logger.d.ts +24 -0
- package/dist/infrastructure/logging/logger.d.ts.map +1 -0
- package/dist/infrastructure/logging/logger.js +65 -0
- package/dist/infrastructure/logging/logger.js.map +1 -0
- package/dist/infrastructure/solidworks/solidworks-adapter.d.ts +43 -0
- package/dist/infrastructure/solidworks/solidworks-adapter.d.ts.map +1 -0
- package/dist/infrastructure/solidworks/solidworks-adapter.js +527 -0
- package/dist/infrastructure/solidworks/solidworks-adapter.js.map +1 -0
- package/dist/presentation/mcp/request-handler.d.ts +41 -0
- package/dist/presentation/mcp/request-handler.d.ts.map +1 -0
- package/dist/presentation/mcp/request-handler.js +100 -0
- package/dist/presentation/mcp/request-handler.js.map +1 -0
- package/dist/presentation/transformers/error-transformer.d.ts +16 -0
- package/dist/presentation/transformers/error-transformer.d.ts.map +1 -0
- package/dist/presentation/transformers/error-transformer.js +44 -0
- package/dist/presentation/transformers/error-transformer.js.map +1 -0
- package/dist/presentation/transformers/response-transformer.d.ts +24 -0
- package/dist/presentation/transformers/response-transformer.d.ts.map +1 -0
- package/dist/presentation/transformers/response-transformer.js +102 -0
- package/dist/presentation/transformers/response-transformer.js.map +1 -0
- package/dist/shared/constants/solidworks-constants.d.ts +302 -0
- package/dist/shared/constants/solidworks-constants.d.ts.map +1 -0
- package/dist/shared/constants/solidworks-constants.js +471 -0
- package/dist/shared/constants/solidworks-constants.js.map +1 -0
- package/dist/tools/diagnostics.d.ts +21 -0
- package/dist/tools/diagnostics.d.ts.map +1 -0
- package/dist/tools/diagnostics.js +120 -0
- package/dist/tools/diagnostics.js.map +1 -0
- package/dist/tools/drawing-analysis.d.ts +9 -0
- package/dist/tools/drawing-analysis.d.ts.map +1 -0
- package/dist/tools/drawing-analysis.js +239 -0
- package/dist/tools/drawing-analysis.js.map +1 -0
- package/dist/tools/enhanced-drawing.d.ts +51 -0
- package/dist/tools/enhanced-drawing.d.ts.map +1 -0
- package/dist/tools/enhanced-drawing.js +193 -0
- package/dist/tools/enhanced-drawing.js.map +1 -0
- package/dist/tools/macro-security.d.ts +9 -0
- package/dist/tools/macro-security.d.ts.map +1 -0
- package/dist/tools/macro-security.js +86 -0
- package/dist/tools/macro-security.js.map +1 -0
- package/dist/tools/native-macro.d.ts +149 -0
- package/dist/tools/native-macro.d.ts.map +1 -0
- package/dist/tools/native-macro.js +654 -0
- package/dist/tools/native-macro.js.map +1 -0
- package/dist/tools/sketch.d.ts +663 -0
- package/dist/tools/sketch.d.ts.map +1 -0
- package/dist/tools/sketch.js +815 -0
- package/dist/tools/sketch.js.map +1 -0
- package/dist/tools/template-manager.d.ts +231 -0
- package/dist/tools/template-manager.d.ts.map +1 -0
- package/dist/tools/template-manager.js +626 -0
- package/dist/tools/template-manager.js.map +1 -0
- package/package.json +12 -7
|
@@ -0,0 +1,654 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native Macro Recording for SolidWorks
|
|
3
|
+
* Uses SolidWorks' built-in macro recording API for proper VBA initialization
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
/**
|
|
7
|
+
* Native macro recording tools that use SolidWorks' internal VBA engine
|
|
8
|
+
*/
|
|
9
|
+
export const nativeMacroTools = [
|
|
10
|
+
// ============================================
|
|
11
|
+
// NATIVE MACRO RECORDING
|
|
12
|
+
// ============================================
|
|
13
|
+
{
|
|
14
|
+
name: 'start_native_macro_recording',
|
|
15
|
+
description: 'Start recording a macro using SolidWorks native VBA recorder',
|
|
16
|
+
inputSchema: z.object({
|
|
17
|
+
macroPath: z.string().describe('Full path where the macro will be saved (e.g., C:\\Macros\\MyMacro.swp)'),
|
|
18
|
+
pauseRecording: z.boolean().default(false).describe('Start in paused state'),
|
|
19
|
+
recordViewCommands: z.boolean().default(false).describe('Record view manipulation commands'),
|
|
20
|
+
recordFeatureManager: z.boolean().default(true).describe('Record feature manager commands'),
|
|
21
|
+
recordSelections: z.boolean().default(true).describe('Record selection commands')
|
|
22
|
+
}),
|
|
23
|
+
handler: (args, swApi) => {
|
|
24
|
+
try {
|
|
25
|
+
const swApp = swApi.getApp();
|
|
26
|
+
if (!swApp)
|
|
27
|
+
throw new Error('SolidWorks application not connected');
|
|
28
|
+
// Ensure macro path has correct extension
|
|
29
|
+
let macroPath = args.macroPath;
|
|
30
|
+
if (!macroPath.toLowerCase().endsWith('.swp')) {
|
|
31
|
+
macroPath = macroPath.replace(/\.[^.]*$/, '') + '.swp';
|
|
32
|
+
}
|
|
33
|
+
// Ensure directory exists
|
|
34
|
+
const path = require('path');
|
|
35
|
+
const fs = require('fs');
|
|
36
|
+
const dir = path.dirname(macroPath);
|
|
37
|
+
if (!fs.existsSync(dir)) {
|
|
38
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
39
|
+
}
|
|
40
|
+
// Set recording options
|
|
41
|
+
swApp.SetUserPreferenceToggle(197, args.recordViewCommands); // swUserPreferenceToggle_e.swMacroRecordViewManipulation
|
|
42
|
+
swApp.SetUserPreferenceToggle(198, args.recordFeatureManager); // swUserPreferenceToggle_e.swMacroRecordFeatureManager
|
|
43
|
+
swApp.SetUserPreferenceToggle(199, args.recordSelections); // swUserPreferenceToggle_e.swMacroRecordSelections
|
|
44
|
+
// Start recording using native SolidWorks API
|
|
45
|
+
// This creates a proper VBA project with all necessary references
|
|
46
|
+
const success = swApp.RecordMacro(macroPath);
|
|
47
|
+
if (!success) {
|
|
48
|
+
throw new Error('Failed to start macro recording');
|
|
49
|
+
}
|
|
50
|
+
// Pause if requested
|
|
51
|
+
if (args.pauseRecording) {
|
|
52
|
+
swApp.PauseMacroRecording();
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
success: true,
|
|
56
|
+
message: 'Native macro recording started',
|
|
57
|
+
macroPath,
|
|
58
|
+
status: args.pauseRecording ? 'paused' : 'recording',
|
|
59
|
+
options: {
|
|
60
|
+
recordViewCommands: args.recordViewCommands,
|
|
61
|
+
recordFeatureManager: args.recordFeatureManager,
|
|
62
|
+
recordSelections: args.recordSelections
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
return `Failed to start native macro recording: ${error}`;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: 'stop_native_macro_recording',
|
|
73
|
+
description: 'Stop the current native macro recording and save',
|
|
74
|
+
inputSchema: z.object({
|
|
75
|
+
openInEditor: z.boolean().default(false).describe('Open macro in VBA editor after saving'),
|
|
76
|
+
runMacro: z.boolean().default(false).describe('Run the macro immediately after saving')
|
|
77
|
+
}),
|
|
78
|
+
handler: (args, swApi) => {
|
|
79
|
+
try {
|
|
80
|
+
const swApp = swApi.getApp();
|
|
81
|
+
if (!swApp)
|
|
82
|
+
throw new Error('SolidWorks application not connected');
|
|
83
|
+
// Stop recording - this properly saves the macro with all VBA initialization
|
|
84
|
+
swApp.StopMacroRecording();
|
|
85
|
+
// Get the last recorded macro path
|
|
86
|
+
const lastMacroPath = swApp.GetUserPreferenceStringValue(69); // swUserPreferenceStringValue_e.swFileLocationsMacros
|
|
87
|
+
// Open in editor if requested
|
|
88
|
+
if (args.openInEditor) {
|
|
89
|
+
swApp.EditMacro(lastMacroPath);
|
|
90
|
+
}
|
|
91
|
+
// Run macro if requested
|
|
92
|
+
if (args.runMacro) {
|
|
93
|
+
swApp.RunMacro2(lastMacroPath, "main", // Default module name
|
|
94
|
+
"main", // Default procedure name
|
|
95
|
+
1 // swRunMacroOption_e.swRunMacroUnloadAfterRun
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
success: true,
|
|
100
|
+
message: 'Native macro recording stopped and saved',
|
|
101
|
+
macroPath: lastMacroPath,
|
|
102
|
+
openedInEditor: args.openInEditor,
|
|
103
|
+
executed: args.runMacro
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
return `Failed to stop native macro recording: ${error}`;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: 'pause_resume_macro_recording',
|
|
113
|
+
description: 'Pause or resume the current macro recording',
|
|
114
|
+
inputSchema: z.object({
|
|
115
|
+
action: z.enum(['pause', 'resume']).describe('Action to perform')
|
|
116
|
+
}),
|
|
117
|
+
handler: (args, swApi) => {
|
|
118
|
+
try {
|
|
119
|
+
const swApp = swApi.getApp();
|
|
120
|
+
if (!swApp)
|
|
121
|
+
throw new Error('SolidWorks application not connected');
|
|
122
|
+
if (args.action === 'pause') {
|
|
123
|
+
swApp.PauseMacroRecording();
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
swApp.ResumeMacroRecording();
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
success: true,
|
|
130
|
+
message: `Macro recording ${args.action}d`,
|
|
131
|
+
status: args.action === 'pause' ? 'paused' : 'recording'
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
return `Failed to ${args.action} macro recording: ${error}`;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
// ============================================
|
|
140
|
+
// MACRO EXECUTION & MANAGEMENT
|
|
141
|
+
// ============================================
|
|
142
|
+
{
|
|
143
|
+
name: 'run_macro',
|
|
144
|
+
description: 'Run a SolidWorks macro file',
|
|
145
|
+
inputSchema: z.object({
|
|
146
|
+
macroPath: z.string().describe('Full path to the macro file (.swp or .swb)'),
|
|
147
|
+
moduleName: z.string().default('main').describe('Module name containing the macro'),
|
|
148
|
+
procedureName: z.string().default('main').describe('Procedure/subroutine name to run'),
|
|
149
|
+
arguments: z.array(z.any()).optional().describe('Arguments to pass to the macro'),
|
|
150
|
+
unloadAfterRun: z.boolean().default(true).describe('Unload macro from memory after execution')
|
|
151
|
+
}),
|
|
152
|
+
handler: (args, swApi) => {
|
|
153
|
+
try {
|
|
154
|
+
const swApp = swApi.getApp();
|
|
155
|
+
if (!swApp)
|
|
156
|
+
throw new Error('SolidWorks application not connected');
|
|
157
|
+
// Check if macro file exists
|
|
158
|
+
const fs = require('fs');
|
|
159
|
+
if (!fs.existsSync(args.macroPath)) {
|
|
160
|
+
throw new Error(`Macro file not found: ${args.macroPath}`);
|
|
161
|
+
}
|
|
162
|
+
// Determine run option
|
|
163
|
+
const runOption = args.unloadAfterRun ? 1 : 0; // swRunMacroOption_e
|
|
164
|
+
// Run the macro
|
|
165
|
+
let success;
|
|
166
|
+
if (args.arguments && args.arguments.length > 0) {
|
|
167
|
+
// Run with arguments (requires special handling)
|
|
168
|
+
const vbaApp = swApp.GetAddInObject("SldWorks.MacroRunner");
|
|
169
|
+
success = vbaApp.RunMacroWithArguments(args.macroPath, args.moduleName, args.procedureName, args.arguments);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
// Run without arguments
|
|
173
|
+
success = swApp.RunMacro2(args.macroPath, args.moduleName, args.procedureName, runOption);
|
|
174
|
+
}
|
|
175
|
+
if (!success) {
|
|
176
|
+
throw new Error('Macro execution failed');
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
success: true,
|
|
180
|
+
message: 'Macro executed successfully',
|
|
181
|
+
macroPath: args.macroPath,
|
|
182
|
+
module: args.moduleName,
|
|
183
|
+
procedure: args.procedureName,
|
|
184
|
+
hadArguments: args.arguments ? args.arguments.length : 0
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
return `Failed to run macro: ${error}`;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
name: 'edit_macro',
|
|
194
|
+
description: 'Open a macro in the SolidWorks VBA editor',
|
|
195
|
+
inputSchema: z.object({
|
|
196
|
+
macroPath: z.string().describe('Full path to the macro file')
|
|
197
|
+
}),
|
|
198
|
+
handler: (args, swApi) => {
|
|
199
|
+
try {
|
|
200
|
+
const swApp = swApi.getApp();
|
|
201
|
+
if (!swApp)
|
|
202
|
+
throw new Error('SolidWorks application not connected');
|
|
203
|
+
// Check if macro file exists
|
|
204
|
+
const fs = require('fs');
|
|
205
|
+
if (!fs.existsSync(args.macroPath)) {
|
|
206
|
+
throw new Error(`Macro file not found: ${args.macroPath}`);
|
|
207
|
+
}
|
|
208
|
+
// Open in VBA editor
|
|
209
|
+
const success = swApp.EditMacro(args.macroPath);
|
|
210
|
+
if (!success) {
|
|
211
|
+
throw new Error('Failed to open macro in editor');
|
|
212
|
+
}
|
|
213
|
+
return {
|
|
214
|
+
success: true,
|
|
215
|
+
message: 'Macro opened in VBA editor',
|
|
216
|
+
macroPath: args.macroPath
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
return `Failed to edit macro: ${error}`;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
},
|
|
224
|
+
// ============================================
|
|
225
|
+
// MACRO INITIALIZATION & CONVERSION
|
|
226
|
+
// ============================================
|
|
227
|
+
{
|
|
228
|
+
name: 'create_initialized_macro',
|
|
229
|
+
description: 'Create a new macro with proper SolidWorks VBA initialization',
|
|
230
|
+
inputSchema: z.object({
|
|
231
|
+
macroPath: z.string().describe('Path where the macro will be saved'),
|
|
232
|
+
macroName: z.string().describe('Name of the macro'),
|
|
233
|
+
description: z.string().optional().describe('Macro description'),
|
|
234
|
+
includeErrorHandling: z.boolean().default(true).describe('Include error handling code'),
|
|
235
|
+
includeComments: z.boolean().default(true).describe('Include helpful comments'),
|
|
236
|
+
template: z.enum(['basic', 'part', 'assembly', 'drawing']).default('basic').describe('Macro template type')
|
|
237
|
+
}),
|
|
238
|
+
handler: (args, swApi) => {
|
|
239
|
+
try {
|
|
240
|
+
const swApp = swApi.getApp();
|
|
241
|
+
if (!swApp)
|
|
242
|
+
throw new Error('SolidWorks application not connected');
|
|
243
|
+
// Ensure macro path has correct extension
|
|
244
|
+
let macroPath = args.macroPath;
|
|
245
|
+
if (!macroPath.toLowerCase().endsWith('.swp')) {
|
|
246
|
+
macroPath = macroPath.replace(/\.[^.]*$/, '') + '.swp';
|
|
247
|
+
}
|
|
248
|
+
// Create directory if needed
|
|
249
|
+
const path = require('path');
|
|
250
|
+
const fs = require('fs');
|
|
251
|
+
const dir = path.dirname(macroPath);
|
|
252
|
+
if (!fs.existsSync(dir)) {
|
|
253
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
254
|
+
}
|
|
255
|
+
// Start recording to create proper VBA project
|
|
256
|
+
swApp.RecordMacro(macroPath);
|
|
257
|
+
// Immediately stop to get the initialized project
|
|
258
|
+
swApp.StopMacroRecording();
|
|
259
|
+
// Now edit the macro to add our template code
|
|
260
|
+
swApp.EditMacro(macroPath);
|
|
261
|
+
// Get VBA environment
|
|
262
|
+
const vbaEditor = swApp.GetAddInObject("VBA.Editor");
|
|
263
|
+
const vbaProject = vbaEditor.ActiveVBProject;
|
|
264
|
+
const codeModule = vbaProject.VBComponents("Module1").CodeModule;
|
|
265
|
+
// Clear existing code
|
|
266
|
+
if (codeModule.CountOfLines > 0) {
|
|
267
|
+
codeModule.DeleteLines(1, codeModule.CountOfLines);
|
|
268
|
+
}
|
|
269
|
+
// Build template code based on type
|
|
270
|
+
let templateCode = generateMacroTemplate(args);
|
|
271
|
+
// Insert the template code
|
|
272
|
+
codeModule.InsertLines(1, templateCode);
|
|
273
|
+
// Save the macro
|
|
274
|
+
vbaProject.Save();
|
|
275
|
+
return {
|
|
276
|
+
success: true,
|
|
277
|
+
message: 'Initialized macro created successfully',
|
|
278
|
+
macroPath,
|
|
279
|
+
macroName: args.macroName,
|
|
280
|
+
template: args.template,
|
|
281
|
+
linesOfCode: templateCode.split('\n').length
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
catch (error) {
|
|
285
|
+
return `Failed to create initialized macro: ${error}`;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
name: 'convert_text_to_native_macro',
|
|
291
|
+
description: 'Convert plain text VBA code to a properly initialized SolidWorks macro',
|
|
292
|
+
inputSchema: z.object({
|
|
293
|
+
vbaCode: z.string().describe('Plain text VBA code to convert'),
|
|
294
|
+
outputPath: z.string().describe('Path where the converted macro will be saved'),
|
|
295
|
+
macroName: z.string().describe('Name for the macro'),
|
|
296
|
+
addInitialization: z.boolean().default(true).describe('Add SolidWorks initialization code'),
|
|
297
|
+
addReferences: z.boolean().default(true).describe('Add required type library references')
|
|
298
|
+
}),
|
|
299
|
+
handler: (args, swApi) => {
|
|
300
|
+
try {
|
|
301
|
+
const swApp = swApi.getApp();
|
|
302
|
+
if (!swApp)
|
|
303
|
+
throw new Error('SolidWorks application not connected');
|
|
304
|
+
// Ensure output path has correct extension
|
|
305
|
+
let outputPath = args.outputPath;
|
|
306
|
+
if (!outputPath.toLowerCase().endsWith('.swp')) {
|
|
307
|
+
outputPath = outputPath.replace(/\.[^.]*$/, '') + '.swp';
|
|
308
|
+
}
|
|
309
|
+
// Create an initialized macro first
|
|
310
|
+
swApp.RecordMacro(outputPath);
|
|
311
|
+
swApp.StopMacroRecording();
|
|
312
|
+
// Open in editor
|
|
313
|
+
swApp.EditMacro(outputPath);
|
|
314
|
+
// Get VBA environment
|
|
315
|
+
const vbaEditor = swApp.GetAddInObject("VBA.Editor");
|
|
316
|
+
const vbaProject = vbaEditor.ActiveVBProject;
|
|
317
|
+
// Add required references if needed
|
|
318
|
+
if (args.addReferences) {
|
|
319
|
+
const references = vbaProject.References;
|
|
320
|
+
// Add SolidWorks type libraries if not present
|
|
321
|
+
const requiredRefs = [
|
|
322
|
+
"SldWorks 2024 Type Library",
|
|
323
|
+
"SldWorks 2024 Constant type library",
|
|
324
|
+
"SldWorks 2024 Commands type library"
|
|
325
|
+
];
|
|
326
|
+
for (const refName of requiredRefs) {
|
|
327
|
+
try {
|
|
328
|
+
references.AddFromGuid(getSolidWorksTypeLibGuid(refName), 0, 0);
|
|
329
|
+
}
|
|
330
|
+
catch {
|
|
331
|
+
// Reference might already exist
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
// Get the code module
|
|
336
|
+
const codeModule = vbaProject.VBComponents("Module1").CodeModule;
|
|
337
|
+
// Clear existing code
|
|
338
|
+
if (codeModule.CountOfLines > 0) {
|
|
339
|
+
codeModule.DeleteLines(1, codeModule.CountOfLines);
|
|
340
|
+
}
|
|
341
|
+
// Process the VBA code
|
|
342
|
+
let processedCode = args.vbaCode;
|
|
343
|
+
// Add initialization if needed
|
|
344
|
+
if (args.addInitialization && !processedCode.includes('Dim swApp')) {
|
|
345
|
+
const initCode = `
|
|
346
|
+
' ${args.macroName}
|
|
347
|
+
' Converted from text VBA by SolidWorks MCP Server
|
|
348
|
+
' Date: ${new Date().toISOString()}
|
|
349
|
+
|
|
350
|
+
Option Explicit
|
|
351
|
+
|
|
352
|
+
' SolidWorks Variables
|
|
353
|
+
Dim swApp As SldWorks.SldWorks
|
|
354
|
+
Dim swModel As SldWorks.ModelDoc2
|
|
355
|
+
Dim swPart As SldWorks.PartDoc
|
|
356
|
+
Dim swAssembly As SldWorks.AssemblyDoc
|
|
357
|
+
Dim swDrawing As SldWorks.DrawingDoc
|
|
358
|
+
Dim boolStatus As Boolean
|
|
359
|
+
Dim longStatus As Long, longWarnings As Long
|
|
360
|
+
|
|
361
|
+
`;
|
|
362
|
+
processedCode = initCode + processedCode;
|
|
363
|
+
}
|
|
364
|
+
// Ensure main subroutine exists
|
|
365
|
+
if (!processedCode.includes('Sub main')) {
|
|
366
|
+
processedCode = processedCode + `
|
|
367
|
+
|
|
368
|
+
Sub main()
|
|
369
|
+
Set swApp = Application.SldWorks
|
|
370
|
+
Set swModel = swApp.ActiveDoc
|
|
371
|
+
|
|
372
|
+
If swModel Is Nothing Then
|
|
373
|
+
MsgBox "Please open a document first."
|
|
374
|
+
Exit Sub
|
|
375
|
+
End If
|
|
376
|
+
|
|
377
|
+
' Call your main procedure here
|
|
378
|
+
${args.macroName}
|
|
379
|
+
End Sub`;
|
|
380
|
+
}
|
|
381
|
+
// Insert the processed code
|
|
382
|
+
codeModule.InsertLines(1, processedCode);
|
|
383
|
+
// Save the macro
|
|
384
|
+
vbaProject.Save();
|
|
385
|
+
return {
|
|
386
|
+
success: true,
|
|
387
|
+
message: 'VBA code converted to native macro successfully',
|
|
388
|
+
outputPath,
|
|
389
|
+
macroName: args.macroName,
|
|
390
|
+
linesOfCode: processedCode.split('\n').length,
|
|
391
|
+
referencesAdded: args.addReferences,
|
|
392
|
+
initializationAdded: args.addInitialization
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
catch (error) {
|
|
396
|
+
return `Failed to convert text to native macro: ${error}`;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
},
|
|
400
|
+
// ============================================
|
|
401
|
+
// MACRO BATCH OPERATIONS
|
|
402
|
+
// ============================================
|
|
403
|
+
{
|
|
404
|
+
name: 'batch_run_macros',
|
|
405
|
+
description: 'Run multiple macros in sequence',
|
|
406
|
+
inputSchema: z.object({
|
|
407
|
+
macros: z.array(z.object({
|
|
408
|
+
path: z.string().describe('Macro file path'),
|
|
409
|
+
module: z.string().default('main').describe('Module name'),
|
|
410
|
+
procedure: z.string().default('main').describe('Procedure name'),
|
|
411
|
+
arguments: z.array(z.any()).optional().describe('Arguments'),
|
|
412
|
+
continueOnError: z.boolean().default(true).describe('Continue if this macro fails')
|
|
413
|
+
})).describe('Array of macros to run'),
|
|
414
|
+
delayBetween: z.number().default(1000).describe('Delay between macros in milliseconds'),
|
|
415
|
+
stopOnError: z.boolean().default(false).describe('Stop batch if any macro fails')
|
|
416
|
+
}),
|
|
417
|
+
handler: async (args, swApi) => {
|
|
418
|
+
try {
|
|
419
|
+
const swApp = swApi.getApp();
|
|
420
|
+
if (!swApp)
|
|
421
|
+
throw new Error('SolidWorks application not connected');
|
|
422
|
+
const results = {
|
|
423
|
+
total: args.macros.length,
|
|
424
|
+
successful: 0,
|
|
425
|
+
failed: 0,
|
|
426
|
+
skipped: 0,
|
|
427
|
+
details: []
|
|
428
|
+
};
|
|
429
|
+
for (let i = 0; i < args.macros.length; i++) {
|
|
430
|
+
const macro = args.macros[i];
|
|
431
|
+
const result = {
|
|
432
|
+
index: i,
|
|
433
|
+
path: macro.path,
|
|
434
|
+
status: 'pending',
|
|
435
|
+
message: '',
|
|
436
|
+
startTime: new Date().toISOString()
|
|
437
|
+
};
|
|
438
|
+
try {
|
|
439
|
+
// Check if file exists
|
|
440
|
+
const fs = require('fs');
|
|
441
|
+
if (!fs.existsSync(macro.path)) {
|
|
442
|
+
throw new Error('Macro file not found');
|
|
443
|
+
}
|
|
444
|
+
// Run the macro
|
|
445
|
+
const success = swApp.RunMacro2(macro.path, macro.module, macro.procedure, 1 // Unload after run
|
|
446
|
+
);
|
|
447
|
+
if (!success) {
|
|
448
|
+
throw new Error('Macro execution failed');
|
|
449
|
+
}
|
|
450
|
+
result.status = 'success';
|
|
451
|
+
result.message = 'Macro executed successfully';
|
|
452
|
+
results.successful++;
|
|
453
|
+
}
|
|
454
|
+
catch (error) {
|
|
455
|
+
result.status = 'failed';
|
|
456
|
+
result.message = String(error);
|
|
457
|
+
results.failed++;
|
|
458
|
+
if (args.stopOnError && !macro.continueOnError) {
|
|
459
|
+
results.skipped = args.macros.length - i - 1;
|
|
460
|
+
results.details.push(result);
|
|
461
|
+
break;
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
result.endTime = new Date().toISOString();
|
|
465
|
+
results.details.push(result);
|
|
466
|
+
// Delay between macros
|
|
467
|
+
if (i < args.macros.length - 1) {
|
|
468
|
+
await new Promise(resolve => setTimeout(resolve, args.delayBetween));
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
return {
|
|
472
|
+
success: results.failed === 0,
|
|
473
|
+
message: `Batch execution completed: ${results.successful}/${results.total} successful`,
|
|
474
|
+
results
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
catch (error) {
|
|
478
|
+
return `Failed to run batch macros: ${error}`;
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
];
|
|
483
|
+
// Helper function to generate macro templates
|
|
484
|
+
function generateMacroTemplate(args) {
|
|
485
|
+
const templates = {
|
|
486
|
+
basic: `
|
|
487
|
+
' Macro: ${args.macroName}
|
|
488
|
+
' Description: ${args.description || 'Basic SolidWorks macro'}
|
|
489
|
+
' Created: ${new Date().toISOString()}
|
|
490
|
+
' Generated by SolidWorks MCP Server
|
|
491
|
+
|
|
492
|
+
Option Explicit
|
|
493
|
+
|
|
494
|
+
' SolidWorks Variables
|
|
495
|
+
Dim swApp As SldWorks.SldWorks
|
|
496
|
+
Dim swModel As SldWorks.ModelDoc2
|
|
497
|
+
Dim boolStatus As Boolean
|
|
498
|
+
Dim longStatus As Long, longWarnings As Long
|
|
499
|
+
|
|
500
|
+
Sub main()
|
|
501
|
+
${args.includeErrorHandling ? ' On Error GoTo ErrorHandler' : ''}
|
|
502
|
+
|
|
503
|
+
' Get SolidWorks application
|
|
504
|
+
Set swApp = Application.SldWorks
|
|
505
|
+
|
|
506
|
+
' Get active document
|
|
507
|
+
Set swModel = swApp.ActiveDoc
|
|
508
|
+
|
|
509
|
+
' Check if document is open
|
|
510
|
+
If swModel Is Nothing Then
|
|
511
|
+
MsgBox "Please open a document first."
|
|
512
|
+
Exit Sub
|
|
513
|
+
End If
|
|
514
|
+
|
|
515
|
+
${args.includeComments ? "' Your code here" : ''}
|
|
516
|
+
|
|
517
|
+
MsgBox "Macro completed successfully!"
|
|
518
|
+
|
|
519
|
+
${args.includeErrorHandling ? `ErrorHandler:
|
|
520
|
+
If Err.Number <> 0 Then
|
|
521
|
+
MsgBox "Error " & Err.Number & ": " & Err.Description
|
|
522
|
+
End If` : ''}
|
|
523
|
+
End Sub`,
|
|
524
|
+
part: `
|
|
525
|
+
' Macro: ${args.macroName}
|
|
526
|
+
' Description: ${args.description || 'Part-specific SolidWorks macro'}
|
|
527
|
+
' Created: ${new Date().toISOString()}
|
|
528
|
+
|
|
529
|
+
Option Explicit
|
|
530
|
+
|
|
531
|
+
Dim swApp As SldWorks.SldWorks
|
|
532
|
+
Dim swModel As SldWorks.ModelDoc2
|
|
533
|
+
Dim swPart As SldWorks.PartDoc
|
|
534
|
+
Dim swFeature As SldWorks.Feature
|
|
535
|
+
Dim swFeatMgr As SldWorks.FeatureManager
|
|
536
|
+
|
|
537
|
+
Sub main()
|
|
538
|
+
${args.includeErrorHandling ? ' On Error GoTo ErrorHandler' : ''}
|
|
539
|
+
|
|
540
|
+
Set swApp = Application.SldWorks
|
|
541
|
+
Set swModel = swApp.ActiveDoc
|
|
542
|
+
|
|
543
|
+
' Verify this is a part document
|
|
544
|
+
If swModel Is Nothing Then
|
|
545
|
+
MsgBox "Please open a part document."
|
|
546
|
+
Exit Sub
|
|
547
|
+
End If
|
|
548
|
+
|
|
549
|
+
If swModel.GetType <> swDocPART Then
|
|
550
|
+
MsgBox "This macro only works with part documents."
|
|
551
|
+
Exit Sub
|
|
552
|
+
End If
|
|
553
|
+
|
|
554
|
+
Set swPart = swModel
|
|
555
|
+
Set swFeatMgr = swModel.FeatureManager
|
|
556
|
+
|
|
557
|
+
${args.includeComments ? "' Part-specific operations here" : ''}
|
|
558
|
+
|
|
559
|
+
${args.includeErrorHandling ? `ErrorHandler:
|
|
560
|
+
If Err.Number <> 0 Then
|
|
561
|
+
MsgBox "Error " & Err.Number & ": " & Err.Description
|
|
562
|
+
End If` : ''}
|
|
563
|
+
End Sub`,
|
|
564
|
+
assembly: `
|
|
565
|
+
' Macro: ${args.macroName}
|
|
566
|
+
' Description: ${args.description || 'Assembly-specific SolidWorks macro'}
|
|
567
|
+
' Created: ${new Date().toISOString()}
|
|
568
|
+
|
|
569
|
+
Option Explicit
|
|
570
|
+
|
|
571
|
+
Dim swApp As SldWorks.SldWorks
|
|
572
|
+
Dim swModel As SldWorks.ModelDoc2
|
|
573
|
+
Dim swAssembly As SldWorks.AssemblyDoc
|
|
574
|
+
Dim swComp As SldWorks.Component2
|
|
575
|
+
|
|
576
|
+
Sub main()
|
|
577
|
+
${args.includeErrorHandling ? ' On Error GoTo ErrorHandler' : ''}
|
|
578
|
+
|
|
579
|
+
Set swApp = Application.SldWorks
|
|
580
|
+
Set swModel = swApp.ActiveDoc
|
|
581
|
+
|
|
582
|
+
' Verify this is an assembly document
|
|
583
|
+
If swModel Is Nothing Then
|
|
584
|
+
MsgBox "Please open an assembly document."
|
|
585
|
+
Exit Sub
|
|
586
|
+
End If
|
|
587
|
+
|
|
588
|
+
If swModel.GetType <> swDocASSEMBLY Then
|
|
589
|
+
MsgBox "This macro only works with assembly documents."
|
|
590
|
+
Exit Sub
|
|
591
|
+
End If
|
|
592
|
+
|
|
593
|
+
Set swAssembly = swModel
|
|
594
|
+
|
|
595
|
+
${args.includeComments ? "' Assembly-specific operations here" : ''}
|
|
596
|
+
|
|
597
|
+
${args.includeErrorHandling ? `ErrorHandler:
|
|
598
|
+
If Err.Number <> 0 Then
|
|
599
|
+
MsgBox "Error " & Err.Number & ": " & Err.Description
|
|
600
|
+
End If` : ''}
|
|
601
|
+
End Sub`,
|
|
602
|
+
drawing: `
|
|
603
|
+
' Macro: ${args.macroName}
|
|
604
|
+
' Description: ${args.description || 'Drawing-specific SolidWorks macro'}
|
|
605
|
+
' Created: ${new Date().toISOString()}
|
|
606
|
+
|
|
607
|
+
Option Explicit
|
|
608
|
+
|
|
609
|
+
Dim swApp As SldWorks.SldWorks
|
|
610
|
+
Dim swModel As SldWorks.ModelDoc2
|
|
611
|
+
Dim swDrawing As SldWorks.DrawingDoc
|
|
612
|
+
Dim swSheet As SldWorks.Sheet
|
|
613
|
+
Dim swView As SldWorks.View
|
|
614
|
+
|
|
615
|
+
Sub main()
|
|
616
|
+
${args.includeErrorHandling ? ' On Error GoTo ErrorHandler' : ''}
|
|
617
|
+
|
|
618
|
+
Set swApp = Application.SldWorks
|
|
619
|
+
Set swModel = swApp.ActiveDoc
|
|
620
|
+
|
|
621
|
+
' Verify this is a drawing document
|
|
622
|
+
If swModel Is Nothing Then
|
|
623
|
+
MsgBox "Please open a drawing document."
|
|
624
|
+
Exit Sub
|
|
625
|
+
End If
|
|
626
|
+
|
|
627
|
+
If swModel.GetType <> swDocDRAWING Then
|
|
628
|
+
MsgBox "This macro only works with drawing documents."
|
|
629
|
+
Exit Sub
|
|
630
|
+
End If
|
|
631
|
+
|
|
632
|
+
Set swDrawing = swModel
|
|
633
|
+
Set swSheet = swDrawing.GetCurrentSheet
|
|
634
|
+
|
|
635
|
+
${args.includeComments ? "' Drawing-specific operations here" : ''}
|
|
636
|
+
|
|
637
|
+
${args.includeErrorHandling ? `ErrorHandler:
|
|
638
|
+
If Err.Number <> 0 Then
|
|
639
|
+
MsgBox "Error " & Err.Number & ": " & Err.Description
|
|
640
|
+
End If` : ''}
|
|
641
|
+
End Sub`
|
|
642
|
+
};
|
|
643
|
+
return templates[args.template] || templates.basic;
|
|
644
|
+
}
|
|
645
|
+
// Helper function to get SolidWorks type library GUIDs
|
|
646
|
+
function getSolidWorksTypeLibGuid(libName) {
|
|
647
|
+
const guids = {
|
|
648
|
+
"SldWorks 2024 Type Library": "{83A33D31-27C5-11CE-BFD4-00400513BB57}",
|
|
649
|
+
"SldWorks 2024 Constant type library": "{4687F359-55D0-4CD3-B6CF-2EB42C11F989}",
|
|
650
|
+
"SldWorks 2024 Commands type library": "{0AC0837E-7365-48E8-9651-A141AAB75963}"
|
|
651
|
+
};
|
|
652
|
+
return guids[libName] || "";
|
|
653
|
+
}
|
|
654
|
+
//# sourceMappingURL=native-macro.js.map
|