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.
Files changed (109) hide show
  1. package/README.md +33 -10
  2. package/dist/application/services/command-bus.d.ts +39 -0
  3. package/dist/application/services/command-bus.d.ts.map +1 -0
  4. package/dist/application/services/command-bus.js +88 -0
  5. package/dist/application/services/command-bus.js.map +1 -0
  6. package/dist/application/services/event-bus.d.ts +31 -0
  7. package/dist/application/services/event-bus.d.ts.map +1 -0
  8. package/dist/application/services/event-bus.js +83 -0
  9. package/dist/application/services/event-bus.js.map +1 -0
  10. package/dist/application/services/query-bus.d.ts +30 -0
  11. package/dist/application/services/query-bus.d.ts.map +1 -0
  12. package/dist/application/services/query-bus.js +59 -0
  13. package/dist/application/services/query-bus.js.map +1 -0
  14. package/dist/application/services/tool-registry.d.ts +53 -0
  15. package/dist/application/services/tool-registry.d.ts.map +1 -0
  16. package/dist/application/services/tool-registry.js +81 -0
  17. package/dist/application/services/tool-registry.js.map +1 -0
  18. package/dist/application/use-cases/analysis/index.d.ts +13 -0
  19. package/dist/application/use-cases/analysis/index.d.ts.map +1 -0
  20. package/dist/application/use-cases/analysis/index.js +17 -0
  21. package/dist/application/use-cases/analysis/index.js.map +1 -0
  22. package/dist/application/use-cases/drawing/index.d.ts +13 -0
  23. package/dist/application/use-cases/drawing/index.d.ts.map +1 -0
  24. package/dist/application/use-cases/drawing/index.js +17 -0
  25. package/dist/application/use-cases/drawing/index.js.map +1 -0
  26. package/dist/application/use-cases/export/index.d.ts +13 -0
  27. package/dist/application/use-cases/export/index.d.ts.map +1 -0
  28. package/dist/application/use-cases/export/index.js +17 -0
  29. package/dist/application/use-cases/export/index.js.map +1 -0
  30. package/dist/application/use-cases/macro/index.d.ts +13 -0
  31. package/dist/application/use-cases/macro/index.d.ts.map +1 -0
  32. package/dist/application/use-cases/macro/index.js +17 -0
  33. package/dist/application/use-cases/macro/index.js.map +1 -0
  34. package/dist/application/use-cases/modeling/index.d.ts +56 -0
  35. package/dist/application/use-cases/modeling/index.d.ts.map +1 -0
  36. package/dist/application/use-cases/modeling/index.js +385 -0
  37. package/dist/application/use-cases/modeling/index.js.map +1 -0
  38. package/dist/core/interfaces/core-abstractions.d.ts +289 -0
  39. package/dist/core/interfaces/core-abstractions.d.ts.map +1 -0
  40. package/dist/core/interfaces/core-abstractions.js +121 -0
  41. package/dist/core/interfaces/core-abstractions.js.map +1 -0
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +11 -4
  44. package/dist/index.js.map +1 -1
  45. package/dist/index.refactored.d.ts +7 -0
  46. package/dist/index.refactored.d.ts.map +1 -0
  47. package/dist/index.refactored.js +254 -0
  48. package/dist/index.refactored.js.map +1 -0
  49. package/dist/infrastructure/config/configuration-manager.d.ts +381 -0
  50. package/dist/infrastructure/config/configuration-manager.d.ts.map +1 -0
  51. package/dist/infrastructure/config/configuration-manager.js +566 -0
  52. package/dist/infrastructure/config/configuration-manager.js.map +1 -0
  53. package/dist/infrastructure/container/service-locator.d.ts +14 -0
  54. package/dist/infrastructure/container/service-locator.d.ts.map +1 -0
  55. package/dist/infrastructure/container/service-locator.js +38 -0
  56. package/dist/infrastructure/container/service-locator.js.map +1 -0
  57. package/dist/infrastructure/logging/logger.d.ts +24 -0
  58. package/dist/infrastructure/logging/logger.d.ts.map +1 -0
  59. package/dist/infrastructure/logging/logger.js +65 -0
  60. package/dist/infrastructure/logging/logger.js.map +1 -0
  61. package/dist/infrastructure/solidworks/solidworks-adapter.d.ts +43 -0
  62. package/dist/infrastructure/solidworks/solidworks-adapter.d.ts.map +1 -0
  63. package/dist/infrastructure/solidworks/solidworks-adapter.js +527 -0
  64. package/dist/infrastructure/solidworks/solidworks-adapter.js.map +1 -0
  65. package/dist/presentation/mcp/request-handler.d.ts +41 -0
  66. package/dist/presentation/mcp/request-handler.d.ts.map +1 -0
  67. package/dist/presentation/mcp/request-handler.js +100 -0
  68. package/dist/presentation/mcp/request-handler.js.map +1 -0
  69. package/dist/presentation/transformers/error-transformer.d.ts +16 -0
  70. package/dist/presentation/transformers/error-transformer.d.ts.map +1 -0
  71. package/dist/presentation/transformers/error-transformer.js +44 -0
  72. package/dist/presentation/transformers/error-transformer.js.map +1 -0
  73. package/dist/presentation/transformers/response-transformer.d.ts +24 -0
  74. package/dist/presentation/transformers/response-transformer.d.ts.map +1 -0
  75. package/dist/presentation/transformers/response-transformer.js +102 -0
  76. package/dist/presentation/transformers/response-transformer.js.map +1 -0
  77. package/dist/shared/constants/solidworks-constants.d.ts +302 -0
  78. package/dist/shared/constants/solidworks-constants.d.ts.map +1 -0
  79. package/dist/shared/constants/solidworks-constants.js +471 -0
  80. package/dist/shared/constants/solidworks-constants.js.map +1 -0
  81. package/dist/tools/diagnostics.d.ts +21 -0
  82. package/dist/tools/diagnostics.d.ts.map +1 -0
  83. package/dist/tools/diagnostics.js +120 -0
  84. package/dist/tools/diagnostics.js.map +1 -0
  85. package/dist/tools/drawing-analysis.d.ts +9 -0
  86. package/dist/tools/drawing-analysis.d.ts.map +1 -0
  87. package/dist/tools/drawing-analysis.js +239 -0
  88. package/dist/tools/drawing-analysis.js.map +1 -0
  89. package/dist/tools/enhanced-drawing.d.ts +51 -0
  90. package/dist/tools/enhanced-drawing.d.ts.map +1 -0
  91. package/dist/tools/enhanced-drawing.js +193 -0
  92. package/dist/tools/enhanced-drawing.js.map +1 -0
  93. package/dist/tools/macro-security.d.ts +9 -0
  94. package/dist/tools/macro-security.d.ts.map +1 -0
  95. package/dist/tools/macro-security.js +86 -0
  96. package/dist/tools/macro-security.js.map +1 -0
  97. package/dist/tools/native-macro.d.ts +149 -0
  98. package/dist/tools/native-macro.d.ts.map +1 -0
  99. package/dist/tools/native-macro.js +654 -0
  100. package/dist/tools/native-macro.js.map +1 -0
  101. package/dist/tools/sketch.d.ts +663 -0
  102. package/dist/tools/sketch.d.ts.map +1 -0
  103. package/dist/tools/sketch.js +815 -0
  104. package/dist/tools/sketch.js.map +1 -0
  105. package/dist/tools/template-manager.d.ts +231 -0
  106. package/dist/tools/template-manager.d.ts.map +1 -0
  107. package/dist/tools/template-manager.js +626 -0
  108. package/dist/tools/template-manager.js.map +1 -0
  109. 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