solidworks-mcp-server 3.0.8 → 3.1.3
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/CHANGELOG.md +175 -98
- package/LICENSE +20 -20
- package/README.md +195 -423
- package/dist/adapters/circuit-breaker.d.ts +84 -0
- package/dist/adapters/circuit-breaker.d.ts.map +1 -0
- package/dist/adapters/circuit-breaker.js +228 -0
- package/dist/adapters/circuit-breaker.js.map +1 -0
- package/dist/adapters/connection-pool.d.ts +83 -0
- package/dist/adapters/connection-pool.d.ts.map +1 -0
- package/dist/adapters/connection-pool.js +282 -0
- package/dist/adapters/connection-pool.js.map +1 -0
- package/dist/adapters/edge-adapter.d.ts +43 -0
- package/dist/adapters/edge-adapter.d.ts.map +1 -0
- package/dist/adapters/edge-adapter.js +417 -0
- package/dist/adapters/edge-adapter.js.map +1 -0
- package/dist/adapters/factory.d.ts +60 -0
- package/dist/adapters/factory.d.ts.map +1 -0
- package/dist/adapters/factory.js +212 -0
- package/dist/adapters/factory.js.map +1 -0
- package/dist/adapters/feature-complexity-analyzer.d.ts +102 -0
- package/dist/adapters/feature-complexity-analyzer.d.ts.map +1 -0
- package/dist/adapters/feature-complexity-analyzer.js +322 -0
- package/dist/adapters/feature-complexity-analyzer.js.map +1 -0
- package/dist/adapters/macro-generator.d.ts +30 -0
- package/dist/adapters/macro-generator.d.ts.map +1 -0
- package/dist/adapters/macro-generator.js +524 -0
- package/dist/adapters/macro-generator.js.map +1 -0
- package/dist/adapters/mock-solidworks-adapter.d.ts +92 -0
- package/dist/adapters/mock-solidworks-adapter.d.ts.map +1 -0
- package/dist/adapters/mock-solidworks-adapter.js +367 -0
- package/dist/adapters/mock-solidworks-adapter.js.map +1 -0
- package/dist/adapters/types.d.ts +376 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +261 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/adapters/winax-adapter-enhanced.d.ts +55 -0
- package/dist/adapters/winax-adapter-enhanced.d.ts.map +1 -0
- package/dist/adapters/winax-adapter-enhanced.js +601 -0
- package/dist/adapters/winax-adapter-enhanced.js.map +1 -0
- package/dist/adapters/winax-adapter.d.ts +55 -0
- package/dist/adapters/winax-adapter.d.ts.map +1 -0
- package/dist/adapters/winax-adapter.js +667 -0
- package/dist/adapters/winax-adapter.js.map +1 -0
- package/dist/api/stainless-api.d.ts +29 -0
- package/dist/api/stainless-api.d.ts.map +1 -0
- package/dist/api/stainless-api.js +408 -0
- package/dist/api/stainless-api.js.map +1 -0
- package/dist/cache/manager.d.ts.map +1 -1
- package/dist/cache/manager.js +4 -3
- package/dist/cache/manager.js.map +1 -1
- package/dist/core/interfaces/core-abstractions.d.ts.map +1 -1
- package/dist/core/interfaces/core-abstractions.js.map +1 -1
- package/dist/db/connection.js +4 -4
- package/dist/db/connection.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +86 -79
- package/dist/index.js.map +1 -1
- package/dist/knowledge/chromadb.d.ts.map +1 -1
- package/dist/knowledge/chromadb.js +5 -3
- package/dist/knowledge/chromadb.js.map +1 -1
- package/dist/macro/recorder.d.ts +1 -1
- package/dist/macro/recorder.d.ts.map +1 -1
- package/dist/macro/recorder.js +10 -10
- package/dist/macro/recorder.js.map +1 -1
- package/dist/resources/base.js +10 -10
- package/dist/resources/base.js.map +1 -1
- package/dist/resources/design-table.d.ts +10 -12
- package/dist/resources/design-table.d.ts.map +1 -1
- package/dist/resources/design-table.js +42 -39
- package/dist/resources/design-table.js.map +1 -1
- package/dist/resources/pdm.d.ts +44 -45
- package/dist/resources/pdm.d.ts.map +1 -1
- package/dist/resources/pdm.js +118 -79
- package/dist/resources/pdm.js.map +1 -1
- package/dist/resources/registry.d.ts +1 -1
- package/dist/resources/registry.d.ts.map +1 -1
- package/dist/resources/registry.js +1 -1
- package/dist/shared/constants/solidworks-constants.d.ts.map +1 -1
- package/dist/shared/constants/solidworks-constants.js +9 -9
- package/dist/shared/constants/solidworks-constants.js.map +1 -1
- package/dist/solidworks/api.d.ts +8 -6
- package/dist/solidworks/api.d.ts.map +1 -1
- package/dist/solidworks/api.js +614 -188
- package/dist/solidworks/api.js.map +1 -1
- package/dist/state/store.d.ts +1 -1
- package/dist/state/store.d.ts.map +1 -1
- package/dist/state/store.js +14 -14
- package/dist/state/store.js.map +1 -1
- package/dist/tools/analysis.d.ts +12 -2
- package/dist/tools/analysis.d.ts.map +1 -1
- package/dist/tools/analysis.js +141 -31
- package/dist/tools/analysis.js.map +1 -1
- package/dist/tools/diagnostics.d.ts +1 -1
- package/dist/tools/diagnostics.d.ts.map +1 -1
- package/dist/tools/diagnostics.js +2 -2
- package/dist/tools/diagnostics.js.map +1 -1
- package/dist/tools/drawing.d.ts +2 -2
- package/dist/tools/drawing.d.ts.map +1 -1
- package/dist/tools/drawing.js +94 -10
- package/dist/tools/drawing.js.map +1 -1
- package/dist/tools/enhanced-drawing.d.ts +1 -1
- package/dist/tools/enhanced-drawing.d.ts.map +1 -1
- package/dist/tools/enhanced-drawing.js +10 -13
- package/dist/tools/enhanced-drawing.js.map +1 -1
- package/dist/tools/export.d.ts +1 -1
- package/dist/tools/export.d.ts.map +1 -1
- package/dist/tools/export.js +88 -14
- package/dist/tools/export.js.map +1 -1
- package/dist/tools/extrusion-helper.d.ts +15 -0
- package/dist/tools/extrusion-helper.d.ts.map +1 -0
- package/dist/tools/extrusion-helper.js +61 -0
- package/dist/tools/extrusion-helper.js.map +1 -0
- package/dist/tools/macro-security.d.ts +2 -2
- package/dist/tools/macro-security.d.ts.map +1 -1
- package/dist/tools/macro-security.js +2 -2
- package/dist/tools/macro-security.js.map +1 -1
- package/dist/tools/modeling.d.ts +2 -2
- package/dist/tools/modeling.d.ts.map +1 -1
- package/dist/tools/modeling.js +6 -6
- package/dist/tools/modeling.js.map +1 -1
- package/dist/tools/native-macro.d.ts +1 -1
- package/dist/tools/native-macro.d.ts.map +1 -1
- package/dist/tools/native-macro.js +246 -239
- package/dist/tools/native-macro.js.map +1 -1
- package/dist/tools/sketch.d.ts +28 -28
- package/dist/tools/sketch.d.ts.map +1 -1
- package/dist/tools/sketch.js +202 -136
- package/dist/tools/sketch.js.map +1 -1
- package/dist/tools/template-manager.d.ts +5 -5
- package/dist/tools/template-manager.d.ts.map +1 -1
- package/dist/tools/template-manager.js +66 -65
- package/dist/tools/template-manager.js.map +1 -1
- package/dist/tools/vba-advanced.d.ts +10 -10
- package/dist/tools/vba-advanced.d.ts.map +1 -1
- package/dist/tools/vba-advanced.js +791 -708
- package/dist/tools/vba-advanced.js.map +1 -1
- package/dist/tools/vba-assembly.d.ts +10 -10
- package/dist/tools/vba-assembly.d.ts.map +1 -1
- package/dist/tools/vba-assembly.js +562 -500
- package/dist/tools/vba-assembly.js.map +1 -1
- package/dist/tools/vba-drawing.d.ts +12 -12
- package/dist/tools/vba-drawing.d.ts.map +1 -1
- package/dist/tools/vba-drawing.js +681 -572
- package/dist/tools/vba-drawing.js.map +1 -1
- package/dist/tools/vba-file-management.d.ts +12 -12
- package/dist/tools/vba-file-management.d.ts.map +1 -1
- package/dist/tools/vba-file-management.js +662 -589
- package/dist/tools/vba-file-management.js.map +1 -1
- package/dist/tools/vba-part.d.ts +10 -10
- package/dist/tools/vba-part.d.ts.map +1 -1
- package/dist/tools/vba-part.js +484 -426
- package/dist/tools/vba-part.js.map +1 -1
- package/dist/tools/vba.d.ts +361 -361
- package/dist/tools/vba.d.ts.map +1 -1
- package/dist/tools/vba.js +67 -81
- package/dist/tools/vba.js.map +1 -1
- package/dist/utils/config.js +2 -2
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/environment.d.ts +243 -0
- package/dist/utils/environment.d.ts.map +1 -0
- package/dist/utils/environment.js +207 -0
- package/dist/utils/environment.js.map +1 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +6 -6
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/solidworks-config.d.ts +39 -0
- package/dist/utils/solidworks-config.d.ts.map +1 -0
- package/dist/utils/solidworks-config.js +156 -0
- package/dist/utils/solidworks-config.js.map +1 -0
- package/package.json +84 -84
- package/scripts/setup.js +70 -70
- package/dist/application/services/command-bus.d.ts +0 -39
- package/dist/application/services/command-bus.d.ts.map +0 -1
- package/dist/application/services/command-bus.js +0 -88
- package/dist/application/services/command-bus.js.map +0 -1
- package/dist/application/services/event-bus.d.ts +0 -31
- package/dist/application/services/event-bus.d.ts.map +0 -1
- package/dist/application/services/event-bus.js +0 -83
- package/dist/application/services/event-bus.js.map +0 -1
- package/dist/application/services/query-bus.d.ts +0 -30
- package/dist/application/services/query-bus.d.ts.map +0 -1
- package/dist/application/services/query-bus.js +0 -59
- package/dist/application/services/query-bus.js.map +0 -1
- package/dist/application/services/tool-registry.d.ts +0 -53
- package/dist/application/services/tool-registry.d.ts.map +0 -1
- package/dist/application/services/tool-registry.js +0 -81
- package/dist/application/services/tool-registry.js.map +0 -1
- package/dist/application/use-cases/analysis/index.d.ts +0 -13
- package/dist/application/use-cases/analysis/index.d.ts.map +0 -1
- package/dist/application/use-cases/analysis/index.js +0 -17
- package/dist/application/use-cases/analysis/index.js.map +0 -1
- package/dist/application/use-cases/drawing/index.d.ts +0 -13
- package/dist/application/use-cases/drawing/index.d.ts.map +0 -1
- package/dist/application/use-cases/drawing/index.js +0 -17
- package/dist/application/use-cases/drawing/index.js.map +0 -1
- package/dist/application/use-cases/export/index.d.ts +0 -13
- package/dist/application/use-cases/export/index.d.ts.map +0 -1
- package/dist/application/use-cases/export/index.js +0 -17
- package/dist/application/use-cases/export/index.js.map +0 -1
- package/dist/application/use-cases/macro/index.d.ts +0 -13
- package/dist/application/use-cases/macro/index.d.ts.map +0 -1
- package/dist/application/use-cases/macro/index.js +0 -17
- package/dist/application/use-cases/macro/index.js.map +0 -1
- package/dist/application/use-cases/modeling/index.d.ts +0 -56
- package/dist/application/use-cases/modeling/index.d.ts.map +0 -1
- package/dist/application/use-cases/modeling/index.js +0 -385
- package/dist/application/use-cases/modeling/index.js.map +0 -1
- package/dist/index.refactored.d.ts +0 -7
- package/dist/index.refactored.d.ts.map +0 -1
- package/dist/index.refactored.js +0 -254
- package/dist/index.refactored.js.map +0 -1
- package/dist/infrastructure/config/configuration-manager.d.ts +0 -381
- package/dist/infrastructure/config/configuration-manager.d.ts.map +0 -1
- package/dist/infrastructure/config/configuration-manager.js +0 -566
- package/dist/infrastructure/config/configuration-manager.js.map +0 -1
- package/dist/infrastructure/container/service-locator.d.ts +0 -14
- package/dist/infrastructure/container/service-locator.d.ts.map +0 -1
- package/dist/infrastructure/container/service-locator.js +0 -38
- package/dist/infrastructure/container/service-locator.js.map +0 -1
- package/dist/infrastructure/logging/logger.d.ts +0 -24
- package/dist/infrastructure/logging/logger.d.ts.map +0 -1
- package/dist/infrastructure/logging/logger.js +0 -65
- package/dist/infrastructure/logging/logger.js.map +0 -1
- package/dist/infrastructure/solidworks/solidworks-adapter.d.ts +0 -43
- package/dist/infrastructure/solidworks/solidworks-adapter.d.ts.map +0 -1
- package/dist/infrastructure/solidworks/solidworks-adapter.js +0 -527
- package/dist/infrastructure/solidworks/solidworks-adapter.js.map +0 -1
- package/dist/presentation/mcp/request-handler.d.ts +0 -41
- package/dist/presentation/mcp/request-handler.d.ts.map +0 -1
- package/dist/presentation/mcp/request-handler.js +0 -100
- package/dist/presentation/mcp/request-handler.js.map +0 -1
- package/dist/presentation/transformers/error-transformer.d.ts +0 -16
- package/dist/presentation/transformers/error-transformer.d.ts.map +0 -1
- package/dist/presentation/transformers/error-transformer.js +0 -44
- package/dist/presentation/transformers/error-transformer.js.map +0 -1
- package/dist/presentation/transformers/response-transformer.d.ts +0 -24
- package/dist/presentation/transformers/response-transformer.d.ts.map +0 -1
- package/dist/presentation/transformers/response-transformer.js +0 -102
- package/dist/presentation/transformers/response-transformer.js.map +0 -1
- package/dist/tools/drawing-analysis.d.ts +0 -9
- package/dist/tools/drawing-analysis.d.ts.map +0 -1
- package/dist/tools/drawing-analysis.js +0 -239
- package/dist/tools/drawing-analysis.js.map +0 -1
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enhanced WinAx Adapter with Intelligent Feature Creation
|
|
3
|
+
*
|
|
4
|
+
* This adapter intelligently decides between direct COM calls and macro fallback
|
|
5
|
+
* based on parameter complexity analysis for ALL SolidWorks features.
|
|
6
|
+
*/
|
|
7
|
+
import type { SolidWorksFeature, SolidWorksModel } from '../solidworks/types.js';
|
|
8
|
+
import type { AdapterHealth, AdapterResult, Command, ExtrusionParameters, ISolidWorksAdapter, LoftParameters, MassProperties, RevolveParameters, SweepParameters } from './types.js';
|
|
9
|
+
export declare class EnhancedWinAxAdapter implements ISolidWorksAdapter {
|
|
10
|
+
private swApp;
|
|
11
|
+
private currentModel;
|
|
12
|
+
private macroGenerator;
|
|
13
|
+
private tempMacroPath;
|
|
14
|
+
private metrics;
|
|
15
|
+
constructor();
|
|
16
|
+
connect(): Promise<void>;
|
|
17
|
+
disconnect(): Promise<void>;
|
|
18
|
+
isConnected(): boolean;
|
|
19
|
+
healthCheck(): Promise<AdapterHealth>;
|
|
20
|
+
private getSuccessRate;
|
|
21
|
+
createExtrusion(params: ExtrusionParameters): Promise<SolidWorksFeature>;
|
|
22
|
+
private createExtrusionDirect;
|
|
23
|
+
private createExtrusionViaMacro;
|
|
24
|
+
createRevolve(params: RevolveParameters): Promise<SolidWorksFeature>;
|
|
25
|
+
private createRevolveDirect;
|
|
26
|
+
private createRevolveViaMacro;
|
|
27
|
+
createSweep(params: SweepParameters): Promise<SolidWorksFeature>;
|
|
28
|
+
private createSweepViaMacro;
|
|
29
|
+
createLoft(params: LoftParameters): Promise<SolidWorksFeature>;
|
|
30
|
+
private createLoftDirect;
|
|
31
|
+
private createLoftViaMacro;
|
|
32
|
+
private selectSketchForFeature;
|
|
33
|
+
private updateResponseTime;
|
|
34
|
+
execute<T>(command: Command): Promise<AdapterResult<T>>;
|
|
35
|
+
executeRaw(method: string, args: any[]): Promise<any>;
|
|
36
|
+
openModel(filePath: string): Promise<SolidWorksModel>;
|
|
37
|
+
closeModel(save?: boolean): Promise<void>;
|
|
38
|
+
createPart(): Promise<SolidWorksModel>;
|
|
39
|
+
createAssembly(): Promise<SolidWorksModel>;
|
|
40
|
+
createDrawing(): Promise<SolidWorksModel>;
|
|
41
|
+
createSketch(plane: string): Promise<string>;
|
|
42
|
+
addLine(x1: number, y1: number, x2: number, y2: number): Promise<void>;
|
|
43
|
+
addCircle(centerX: number, centerY: number, radius: number): Promise<void>;
|
|
44
|
+
addRectangle(x1: number, y1: number, x2: number, y2: number): Promise<void>;
|
|
45
|
+
exitSketch(): Promise<void>;
|
|
46
|
+
getMassProperties(): Promise<MassProperties>;
|
|
47
|
+
exportFile(filePath: string, format: string): Promise<void>;
|
|
48
|
+
getDimension(name: string): Promise<number>;
|
|
49
|
+
setDimension(name: string, value: number): Promise<void>;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Factory function to create enhanced adapter
|
|
53
|
+
*/
|
|
54
|
+
export declare function createEnhancedWinAxAdapter(): Promise<EnhancedWinAxAdapter>;
|
|
55
|
+
//# sourceMappingURL=winax-adapter-enhanced.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"winax-adapter-enhanced.d.ts","sourceRoot":"","sources":["../../src/adapters/winax-adapter-enhanced.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,601 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enhanced WinAx Adapter with Intelligent Feature Creation
|
|
3
|
+
*
|
|
4
|
+
* This adapter intelligently decides between direct COM calls and macro fallback
|
|
5
|
+
* based on parameter complexity analysis for ALL SolidWorks features.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from 'node:fs/promises';
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
import winax from 'winax';
|
|
10
|
+
import { logger } from '../utils/logger.js';
|
|
11
|
+
import { FeatureComplexityAnalyzer } from './feature-complexity-analyzer.js';
|
|
12
|
+
import { MacroGenerator } from './macro-generator.js';
|
|
13
|
+
export class EnhancedWinAxAdapter {
|
|
14
|
+
swApp;
|
|
15
|
+
currentModel;
|
|
16
|
+
macroGenerator;
|
|
17
|
+
tempMacroPath;
|
|
18
|
+
metrics = {
|
|
19
|
+
directCOMCalls: 0,
|
|
20
|
+
macroFallbacks: 0,
|
|
21
|
+
failures: 0,
|
|
22
|
+
averageResponseTime: 0,
|
|
23
|
+
};
|
|
24
|
+
constructor() {
|
|
25
|
+
this.swApp = null;
|
|
26
|
+
this.currentModel = null;
|
|
27
|
+
this.macroGenerator = new MacroGenerator();
|
|
28
|
+
this.tempMacroPath = process.env.TEMP || 'C:\\Temp';
|
|
29
|
+
}
|
|
30
|
+
// Connection Management
|
|
31
|
+
async connect() {
|
|
32
|
+
try {
|
|
33
|
+
this.swApp = new winax.Object('SldWorks.Application');
|
|
34
|
+
this.swApp.Visible = true;
|
|
35
|
+
logger.info('Connected to SolidWorks via Enhanced WinAx adapter');
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
logger.error('Failed to connect to SolidWorks', error);
|
|
39
|
+
throw new Error(`Failed to connect to SolidWorks: ${error}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async disconnect() {
|
|
43
|
+
if (this.currentModel) {
|
|
44
|
+
this.currentModel = null;
|
|
45
|
+
}
|
|
46
|
+
if (this.swApp) {
|
|
47
|
+
this.swApp = null;
|
|
48
|
+
}
|
|
49
|
+
logger.info('Disconnected from SolidWorks');
|
|
50
|
+
}
|
|
51
|
+
isConnected() {
|
|
52
|
+
return this.swApp !== null;
|
|
53
|
+
}
|
|
54
|
+
async healthCheck() {
|
|
55
|
+
const healthy = this.isConnected();
|
|
56
|
+
return {
|
|
57
|
+
healthy,
|
|
58
|
+
lastCheck: new Date(),
|
|
59
|
+
errorCount: this.metrics.failures,
|
|
60
|
+
successCount: this.metrics.directCOMCalls + this.metrics.macroFallbacks,
|
|
61
|
+
averageResponseTime: this.metrics.averageResponseTime,
|
|
62
|
+
connectionStatus: healthy ? 'connected' : 'disconnected',
|
|
63
|
+
metrics: {
|
|
64
|
+
directCOMCalls: this.metrics.directCOMCalls,
|
|
65
|
+
macroFallbacks: this.metrics.macroFallbacks,
|
|
66
|
+
successRate: this.getSuccessRate(),
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
getSuccessRate() {
|
|
71
|
+
const total = this.metrics.directCOMCalls + this.metrics.macroFallbacks + this.metrics.failures;
|
|
72
|
+
if (total === 0)
|
|
73
|
+
return 100;
|
|
74
|
+
return ((this.metrics.directCOMCalls + this.metrics.macroFallbacks) / total) * 100;
|
|
75
|
+
}
|
|
76
|
+
// Feature Creation with Intelligent Fallback
|
|
77
|
+
async createExtrusion(params) {
|
|
78
|
+
if (!this.currentModel)
|
|
79
|
+
throw new Error('No active model');
|
|
80
|
+
const analysis = FeatureComplexityAnalyzer.analyzeExtrusion(params);
|
|
81
|
+
logger.info(`Extrusion analysis: ${JSON.stringify(analysis)}`);
|
|
82
|
+
if (analysis.strategy === 'direct-com') {
|
|
83
|
+
// Try direct COM call for simple extrusions
|
|
84
|
+
try {
|
|
85
|
+
return await this.createExtrusionDirect(params);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
logger.warn('Direct extrusion failed, falling back to macro', error);
|
|
89
|
+
return await this.createExtrusionViaMacro(params);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
// Complex extrusion - use macro directly
|
|
94
|
+
logger.info(`Using macro fallback: ${analysis.reason}`);
|
|
95
|
+
return await this.createExtrusionViaMacro(params);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async createExtrusionDirect(params) {
|
|
99
|
+
const startTime = Date.now();
|
|
100
|
+
try {
|
|
101
|
+
// Select sketch
|
|
102
|
+
this.selectSketchForFeature();
|
|
103
|
+
// Simple extrusion with limited parameters (max 12)
|
|
104
|
+
const feature = this.currentModel.FeatureManager.FeatureExtrusion2(true, // Sd
|
|
105
|
+
params.reverse || false, // Flip
|
|
106
|
+
params.bothDirections || false, // Dir
|
|
107
|
+
0, // T1 (blind)
|
|
108
|
+
0, // T2
|
|
109
|
+
params.depth / 1000, // D1 (convert mm to m)
|
|
110
|
+
0.0, // D2
|
|
111
|
+
false, // Dchk1
|
|
112
|
+
false, // Dchk2
|
|
113
|
+
params.draft || 0, // Dang1
|
|
114
|
+
0, // Dang2
|
|
115
|
+
false // OffsetReverse1
|
|
116
|
+
);
|
|
117
|
+
if (!feature) {
|
|
118
|
+
throw new Error('FeatureExtrusion2 returned null');
|
|
119
|
+
}
|
|
120
|
+
this.metrics.directCOMCalls++;
|
|
121
|
+
this.updateResponseTime(Date.now() - startTime);
|
|
122
|
+
return {
|
|
123
|
+
name: feature.Name || 'Boss-Extrude1',
|
|
124
|
+
type: 'Extrusion',
|
|
125
|
+
suppressed: false,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
this.metrics.failures++;
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async createExtrusionViaMacro(params) {
|
|
134
|
+
const startTime = Date.now();
|
|
135
|
+
const macroCode = this.macroGenerator.generateExtrusionMacro(params);
|
|
136
|
+
const macroPath = path.join(this.tempMacroPath, `extrusion_${Date.now()}.swp`);
|
|
137
|
+
await fs.writeFile(macroPath, macroCode);
|
|
138
|
+
try {
|
|
139
|
+
this.swApp.RunMacro2(macroPath, 'Module1', 'CreateExtrusion', 1, 0);
|
|
140
|
+
const feature = this.currentModel.FeatureByPositionReverse(0);
|
|
141
|
+
this.metrics.macroFallbacks++;
|
|
142
|
+
this.updateResponseTime(Date.now() - startTime);
|
|
143
|
+
return {
|
|
144
|
+
name: feature?.Name || 'Boss-Extrude1',
|
|
145
|
+
type: 'Extrusion',
|
|
146
|
+
suppressed: false,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
finally {
|
|
150
|
+
await fs.unlink(macroPath).catch(() => { });
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
async createRevolve(params) {
|
|
154
|
+
if (!this.currentModel)
|
|
155
|
+
throw new Error('No active model');
|
|
156
|
+
const analysis = FeatureComplexityAnalyzer.determineStrategy('FeatureRevolve2', params);
|
|
157
|
+
logger.info(`Revolve analysis: ${JSON.stringify(analysis)}`);
|
|
158
|
+
if (analysis.strategy === 'direct-com') {
|
|
159
|
+
try {
|
|
160
|
+
return await this.createRevolveDirect(params);
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
logger.warn('Direct revolve failed, falling back to macro', error);
|
|
164
|
+
return await this.createRevolveViaMacro(params);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
return await this.createRevolveViaMacro(params);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
async createRevolveDirect(params) {
|
|
172
|
+
const startTime = Date.now();
|
|
173
|
+
try {
|
|
174
|
+
this.selectSketchForFeature();
|
|
175
|
+
// FeatureRevolve2 has exactly 12 parameters - right at the limit
|
|
176
|
+
const feature = this.currentModel.FeatureManager.FeatureRevolve2(true, // SingleDir
|
|
177
|
+
params.direction === 'Reverse', // IsSolid
|
|
178
|
+
params.direction === 'Both', // IsThin
|
|
179
|
+
false, // Cap
|
|
180
|
+
false, // MakeThinFeature
|
|
181
|
+
(params.angle * Math.PI) / 180, // Angle1
|
|
182
|
+
0, // Angle2
|
|
183
|
+
0, // OffsetDistance1
|
|
184
|
+
0, // OffsetDistance2
|
|
185
|
+
0, // OffsetReverse1
|
|
186
|
+
0, // OffsetReverse2
|
|
187
|
+
params.merge !== false // Merge
|
|
188
|
+
);
|
|
189
|
+
if (!feature) {
|
|
190
|
+
throw new Error('FeatureRevolve2 returned null');
|
|
191
|
+
}
|
|
192
|
+
this.metrics.directCOMCalls++;
|
|
193
|
+
this.updateResponseTime(Date.now() - startTime);
|
|
194
|
+
return {
|
|
195
|
+
name: feature.Name || 'Revolve1',
|
|
196
|
+
type: 'Revolution',
|
|
197
|
+
suppressed: false,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
this.metrics.failures++;
|
|
202
|
+
throw error;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
async createRevolveViaMacro(params) {
|
|
206
|
+
const startTime = Date.now();
|
|
207
|
+
const macroCode = this.macroGenerator.generateRevolveMacro(params);
|
|
208
|
+
const macroPath = path.join(this.tempMacroPath, `revolve_${Date.now()}.swp`);
|
|
209
|
+
await fs.writeFile(macroPath, macroCode);
|
|
210
|
+
try {
|
|
211
|
+
this.swApp.RunMacro2(macroPath, 'Module1', 'CreateRevolve', 1, 0);
|
|
212
|
+
const feature = this.currentModel.FeatureByPositionReverse(0);
|
|
213
|
+
this.metrics.macroFallbacks++;
|
|
214
|
+
this.updateResponseTime(Date.now() - startTime);
|
|
215
|
+
return {
|
|
216
|
+
name: feature?.Name || 'Revolve1',
|
|
217
|
+
type: 'Revolution',
|
|
218
|
+
suppressed: false,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
finally {
|
|
222
|
+
await fs.unlink(macroPath).catch(() => { });
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
async createSweep(params) {
|
|
226
|
+
if (!this.currentModel)
|
|
227
|
+
throw new Error('No active model');
|
|
228
|
+
// Sweep always requires macro due to high parameter count
|
|
229
|
+
const analysis = FeatureComplexityAnalyzer.determineStrategy('InsertProtrusionSwept4', params);
|
|
230
|
+
logger.info(`Sweep analysis: Always complex - strategy: ${analysis.strategy}`);
|
|
231
|
+
return await this.createSweepViaMacro(params);
|
|
232
|
+
}
|
|
233
|
+
async createSweepViaMacro(params) {
|
|
234
|
+
const startTime = Date.now();
|
|
235
|
+
const macroCode = this.macroGenerator.generateSweepMacro(params);
|
|
236
|
+
const macroPath = path.join(this.tempMacroPath, `sweep_${Date.now()}.swp`);
|
|
237
|
+
await fs.writeFile(macroPath, macroCode);
|
|
238
|
+
try {
|
|
239
|
+
this.swApp.RunMacro2(macroPath, 'Module1', 'CreateSweep', 1, 0);
|
|
240
|
+
const feature = this.currentModel.FeatureByPositionReverse(0);
|
|
241
|
+
this.metrics.macroFallbacks++;
|
|
242
|
+
this.updateResponseTime(Date.now() - startTime);
|
|
243
|
+
return {
|
|
244
|
+
name: feature?.Name || 'Sweep1',
|
|
245
|
+
type: 'Sweep',
|
|
246
|
+
suppressed: false,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
finally {
|
|
250
|
+
await fs.unlink(macroPath).catch(() => { });
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
async createLoft(params) {
|
|
254
|
+
if (!this.currentModel)
|
|
255
|
+
throw new Error('No active model');
|
|
256
|
+
const analysis = FeatureComplexityAnalyzer.determineStrategy('InsertProtrusionLoft3', params);
|
|
257
|
+
logger.info(`Loft analysis: ${JSON.stringify(analysis)}`);
|
|
258
|
+
if (analysis.strategy === 'direct-com') {
|
|
259
|
+
try {
|
|
260
|
+
return await this.createLoftDirect(params);
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
logger.warn('Direct loft failed, falling back to macro', error);
|
|
264
|
+
return await this.createLoftViaMacro(params);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
return await this.createLoftViaMacro(params);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
async createLoftDirect(params) {
|
|
272
|
+
const startTime = Date.now();
|
|
273
|
+
try {
|
|
274
|
+
// Select profiles
|
|
275
|
+
for (const profile of params.profiles) {
|
|
276
|
+
this.currentModel.Extension.SelectByID2(profile, 'SKETCH', 0, 0, 0, true, 0, undefined, 0);
|
|
277
|
+
}
|
|
278
|
+
// Simple loft without guides (12 parameters max)
|
|
279
|
+
const feature = this.currentModel.FeatureManager.InsertProtrusionBlend2(false, // Closed
|
|
280
|
+
true, // KeepTangency
|
|
281
|
+
false, // ForceNonRational
|
|
282
|
+
true, // ThinFeature
|
|
283
|
+
true, // UseFeatScope
|
|
284
|
+
true, // AutoSelect
|
|
285
|
+
params.profiles.length, // NumberOfSections
|
|
286
|
+
0, // StartConditions
|
|
287
|
+
0, // EndConditions
|
|
288
|
+
0, // StartTangentType
|
|
289
|
+
0, // EndTangentType
|
|
290
|
+
params.merge !== false // Merge
|
|
291
|
+
);
|
|
292
|
+
if (!feature) {
|
|
293
|
+
throw new Error('InsertProtrusionBlend2 returned null');
|
|
294
|
+
}
|
|
295
|
+
this.metrics.directCOMCalls++;
|
|
296
|
+
this.updateResponseTime(Date.now() - startTime);
|
|
297
|
+
return {
|
|
298
|
+
name: feature.Name || 'Loft1',
|
|
299
|
+
type: 'Loft',
|
|
300
|
+
suppressed: false,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
catch (error) {
|
|
304
|
+
this.metrics.failures++;
|
|
305
|
+
throw error;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
async createLoftViaMacro(params) {
|
|
309
|
+
const startTime = Date.now();
|
|
310
|
+
const macroCode = this.macroGenerator.generateLoftMacro(params);
|
|
311
|
+
const macroPath = path.join(this.tempMacroPath, `loft_${Date.now()}.swp`);
|
|
312
|
+
await fs.writeFile(macroPath, macroCode);
|
|
313
|
+
try {
|
|
314
|
+
this.swApp.RunMacro2(macroPath, 'Module1', 'CreateLoft', 1, 0);
|
|
315
|
+
const feature = this.currentModel.FeatureByPositionReverse(0);
|
|
316
|
+
this.metrics.macroFallbacks++;
|
|
317
|
+
this.updateResponseTime(Date.now() - startTime);
|
|
318
|
+
return {
|
|
319
|
+
name: feature?.Name || 'Loft1',
|
|
320
|
+
type: 'Loft',
|
|
321
|
+
suppressed: false,
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
finally {
|
|
325
|
+
await fs.unlink(macroPath).catch(() => { });
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
// Helper Methods
|
|
329
|
+
selectSketchForFeature() {
|
|
330
|
+
// Method 1 (most reliable): Feature tree traversal
|
|
331
|
+
// Avoids SelectByID2 COM type mismatch issues
|
|
332
|
+
try {
|
|
333
|
+
const featureCount = this.currentModel.GetFeatureCount();
|
|
334
|
+
for (let i = 0; i < Math.min(10, featureCount); i++) {
|
|
335
|
+
const feat = this.currentModel.FeatureByPositionReverse(i);
|
|
336
|
+
if (feat) {
|
|
337
|
+
const typeName = feat.GetTypeName2();
|
|
338
|
+
if (typeName === 'ProfileFeature' || typeName?.toLowerCase().includes('sketch')) {
|
|
339
|
+
feat.Select2(false, 0);
|
|
340
|
+
logger.info(`Selected sketch by feature tree: ${feat.Name || feat.GetName()}`);
|
|
341
|
+
return true;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
catch (e) {
|
|
347
|
+
logger.warn(`Feature tree search failed: ${e}`);
|
|
348
|
+
}
|
|
349
|
+
// Method 2 (fallback): SelectByID2 with undefined for optional params
|
|
350
|
+
const ext = this.currentModel.Extension;
|
|
351
|
+
const sketchNames = ['Sketch1', 'Sketch2', 'Sketch3', 'Sketch4', 'Sketch5'];
|
|
352
|
+
for (const name of sketchNames) {
|
|
353
|
+
try {
|
|
354
|
+
const selected = ext.SelectByID2(name, 'SKETCH', 0, 0, 0, false, 0, undefined, 0);
|
|
355
|
+
if (selected) {
|
|
356
|
+
logger.info(`Selected sketch via SelectByID2: ${name}`);
|
|
357
|
+
return true;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
catch (_e) {
|
|
361
|
+
// Try next
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
return false;
|
|
365
|
+
}
|
|
366
|
+
updateResponseTime(duration) {
|
|
367
|
+
const total = this.metrics.directCOMCalls + this.metrics.macroFallbacks;
|
|
368
|
+
this.metrics.averageResponseTime = (this.metrics.averageResponseTime * (total - 1) + duration) / total;
|
|
369
|
+
}
|
|
370
|
+
// Standard adapter methods (implement remaining interface)
|
|
371
|
+
async execute(command) {
|
|
372
|
+
const startTime = Date.now();
|
|
373
|
+
try {
|
|
374
|
+
let result;
|
|
375
|
+
// Route commands to appropriate methods
|
|
376
|
+
switch (command.name) {
|
|
377
|
+
case 'CreateExtrusion':
|
|
378
|
+
result = await this.createExtrusion(command.parameters);
|
|
379
|
+
break;
|
|
380
|
+
case 'CreateRevolve':
|
|
381
|
+
result = await this.createRevolve(command.parameters);
|
|
382
|
+
break;
|
|
383
|
+
case 'CreateSweep':
|
|
384
|
+
result = await this.createSweep(command.parameters);
|
|
385
|
+
break;
|
|
386
|
+
case 'CreateLoft':
|
|
387
|
+
result = await this.createLoft(command.parameters);
|
|
388
|
+
break;
|
|
389
|
+
default:
|
|
390
|
+
result = await this.executeRaw(command.name, [command.parameters]);
|
|
391
|
+
}
|
|
392
|
+
return {
|
|
393
|
+
success: true,
|
|
394
|
+
data: result,
|
|
395
|
+
timing: {
|
|
396
|
+
start: new Date(startTime),
|
|
397
|
+
end: new Date(),
|
|
398
|
+
duration: Date.now() - startTime,
|
|
399
|
+
},
|
|
400
|
+
metadata: {
|
|
401
|
+
adapter: 'EnhancedWinAx',
|
|
402
|
+
metrics: this.metrics,
|
|
403
|
+
},
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
catch (error) {
|
|
407
|
+
this.metrics.failures++;
|
|
408
|
+
return {
|
|
409
|
+
success: false,
|
|
410
|
+
error: error?.toString() || 'Command execution failed',
|
|
411
|
+
timing: {
|
|
412
|
+
start: new Date(startTime),
|
|
413
|
+
end: new Date(),
|
|
414
|
+
duration: Date.now() - startTime,
|
|
415
|
+
},
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
async executeRaw(method, args) {
|
|
420
|
+
if (!this.swApp)
|
|
421
|
+
throw new Error('Not connected to SolidWorks');
|
|
422
|
+
try {
|
|
423
|
+
const target = this.currentModel || this.swApp;
|
|
424
|
+
return target[method](...args);
|
|
425
|
+
}
|
|
426
|
+
catch (error) {
|
|
427
|
+
logger.error(`Raw execution failed: ${method}`, error);
|
|
428
|
+
throw error;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
// Model operations
|
|
432
|
+
async openModel(filePath) {
|
|
433
|
+
if (!this.swApp)
|
|
434
|
+
throw new Error('Not connected to SolidWorks');
|
|
435
|
+
const errors = { value: 0 };
|
|
436
|
+
const warnings = { value: 0 };
|
|
437
|
+
const ext = filePath.toLowerCase().split('.').pop();
|
|
438
|
+
let docType = 1; // swDocPART
|
|
439
|
+
if (ext === 'sldasm')
|
|
440
|
+
docType = 2; // swDocASSEMBLY
|
|
441
|
+
if (ext === 'slddrw')
|
|
442
|
+
docType = 3; // swDocDRAWING
|
|
443
|
+
this.currentModel = this.swApp.OpenDoc6(filePath, docType, 1, '', errors, warnings);
|
|
444
|
+
if (!this.currentModel) {
|
|
445
|
+
throw new Error(`Failed to open model: ${filePath}`);
|
|
446
|
+
}
|
|
447
|
+
return {
|
|
448
|
+
path: filePath,
|
|
449
|
+
name: this.currentModel.GetTitle(),
|
|
450
|
+
type: ['Part', 'Assembly', 'Drawing'][docType - 1],
|
|
451
|
+
isActive: true,
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
async closeModel(save) {
|
|
455
|
+
if (!this.currentModel)
|
|
456
|
+
return;
|
|
457
|
+
if (save) {
|
|
458
|
+
this.currentModel.Save3(1, 0, 0);
|
|
459
|
+
}
|
|
460
|
+
const title = this.currentModel.GetTitle();
|
|
461
|
+
this.swApp.CloseDoc(title);
|
|
462
|
+
this.currentModel = null;
|
|
463
|
+
}
|
|
464
|
+
async createPart() {
|
|
465
|
+
if (!this.swApp)
|
|
466
|
+
throw new Error('Not connected to SolidWorks');
|
|
467
|
+
this.currentModel = this.swApp.NewPart();
|
|
468
|
+
return {
|
|
469
|
+
path: '',
|
|
470
|
+
name: this.currentModel.GetTitle(),
|
|
471
|
+
type: 'Part',
|
|
472
|
+
isActive: true,
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
async createAssembly() {
|
|
476
|
+
if (!this.swApp)
|
|
477
|
+
throw new Error('Not connected to SolidWorks');
|
|
478
|
+
this.currentModel = this.swApp.NewAssembly();
|
|
479
|
+
return {
|
|
480
|
+
path: '',
|
|
481
|
+
name: this.currentModel.GetTitle(),
|
|
482
|
+
type: 'Assembly',
|
|
483
|
+
isActive: true,
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
async createDrawing() {
|
|
487
|
+
if (!this.swApp)
|
|
488
|
+
throw new Error('Not connected to SolidWorks');
|
|
489
|
+
this.currentModel = this.swApp.NewDrawing();
|
|
490
|
+
return {
|
|
491
|
+
path: '',
|
|
492
|
+
name: this.currentModel.GetTitle(),
|
|
493
|
+
type: 'Drawing',
|
|
494
|
+
isActive: true,
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
// Sketch operations
|
|
498
|
+
async createSketch(plane) {
|
|
499
|
+
if (!this.currentModel)
|
|
500
|
+
throw new Error('No active model');
|
|
501
|
+
const ext = this.currentModel.Extension;
|
|
502
|
+
ext.SelectByID2(`${plane} Plane`, 'PLANE', 0, 0, 0, false, 0, undefined, 0);
|
|
503
|
+
this.currentModel.SketchManager.InsertSketch(true);
|
|
504
|
+
return this.currentModel.SketchManager.ActiveSketch.Name;
|
|
505
|
+
}
|
|
506
|
+
async addLine(x1, y1, x2, y2) {
|
|
507
|
+
if (!this.currentModel)
|
|
508
|
+
throw new Error('No active model');
|
|
509
|
+
this.currentModel.SketchManager.CreateLine(x1 / 1000, y1 / 1000, 0, x2 / 1000, y2 / 1000, 0);
|
|
510
|
+
}
|
|
511
|
+
async addCircle(centerX, centerY, radius) {
|
|
512
|
+
if (!this.currentModel)
|
|
513
|
+
throw new Error('No active model');
|
|
514
|
+
this.currentModel.SketchManager.CreateCircle(centerX / 1000, centerY / 1000, 0, (centerX + radius) / 1000, centerY / 1000, 0);
|
|
515
|
+
}
|
|
516
|
+
async addRectangle(x1, y1, x2, y2) {
|
|
517
|
+
if (!this.currentModel)
|
|
518
|
+
throw new Error('No active model');
|
|
519
|
+
const sketchMgr = this.currentModel.SketchManager;
|
|
520
|
+
sketchMgr.CreateLine(x1 / 1000, y1 / 1000, 0, x2 / 1000, y1 / 1000, 0);
|
|
521
|
+
sketchMgr.CreateLine(x2 / 1000, y1 / 1000, 0, x2 / 1000, y2 / 1000, 0);
|
|
522
|
+
sketchMgr.CreateLine(x2 / 1000, y2 / 1000, 0, x1 / 1000, y2 / 1000, 0);
|
|
523
|
+
sketchMgr.CreateLine(x1 / 1000, y2 / 1000, 0, x1 / 1000, y1 / 1000, 0);
|
|
524
|
+
}
|
|
525
|
+
async exitSketch() {
|
|
526
|
+
if (!this.currentModel)
|
|
527
|
+
throw new Error('No active model');
|
|
528
|
+
this.currentModel.SketchManager.InsertSketch(false);
|
|
529
|
+
}
|
|
530
|
+
// Analysis operations
|
|
531
|
+
async getMassProperties() {
|
|
532
|
+
if (!this.currentModel)
|
|
533
|
+
throw new Error('No active model');
|
|
534
|
+
const massProp = this.currentModel.Extension.CreateMassProperty();
|
|
535
|
+
return {
|
|
536
|
+
mass: massProp.Mass,
|
|
537
|
+
volume: massProp.Volume,
|
|
538
|
+
surfaceArea: massProp.SurfaceArea,
|
|
539
|
+
centerOfMass: {
|
|
540
|
+
x: massProp.CenterOfMass[0],
|
|
541
|
+
y: massProp.CenterOfMass[1],
|
|
542
|
+
z: massProp.CenterOfMass[2],
|
|
543
|
+
},
|
|
544
|
+
momentsOfInertia: {
|
|
545
|
+
Ixx: massProp.MomentOfInertia[0],
|
|
546
|
+
Iyy: massProp.MomentOfInertia[4],
|
|
547
|
+
Izz: massProp.MomentOfInertia[8],
|
|
548
|
+
Ixy: massProp.MomentOfInertia[1],
|
|
549
|
+
Iyz: massProp.MomentOfInertia[5],
|
|
550
|
+
Ixz: massProp.MomentOfInertia[2],
|
|
551
|
+
},
|
|
552
|
+
};
|
|
553
|
+
}
|
|
554
|
+
// Export operations
|
|
555
|
+
async exportFile(filePath, format) {
|
|
556
|
+
if (!this.currentModel)
|
|
557
|
+
throw new Error('No active model');
|
|
558
|
+
const formatMap = {
|
|
559
|
+
step: 203,
|
|
560
|
+
iges: 204,
|
|
561
|
+
stl: 216,
|
|
562
|
+
pdf: 217,
|
|
563
|
+
dwg: 218,
|
|
564
|
+
dxf: 219,
|
|
565
|
+
};
|
|
566
|
+
const exportType = formatMap[format.toLowerCase()] || 203;
|
|
567
|
+
const success = this.currentModel.Extension.SaveAs3(filePath, 0, exportType, undefined, undefined, 0, 0);
|
|
568
|
+
if (!success) {
|
|
569
|
+
throw new Error(`Failed to export to ${format}`);
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
// Dimension operations
|
|
573
|
+
async getDimension(name) {
|
|
574
|
+
if (!this.currentModel)
|
|
575
|
+
throw new Error('No active model');
|
|
576
|
+
const dim = this.currentModel.Parameter(name);
|
|
577
|
+
if (!dim) {
|
|
578
|
+
throw new Error(`Dimension ${name} not found`);
|
|
579
|
+
}
|
|
580
|
+
return dim.SystemValue * 1000; // Convert m to mm
|
|
581
|
+
}
|
|
582
|
+
async setDimension(name, value) {
|
|
583
|
+
if (!this.currentModel)
|
|
584
|
+
throw new Error('No active model');
|
|
585
|
+
const dim = this.currentModel.Parameter(name);
|
|
586
|
+
if (!dim) {
|
|
587
|
+
throw new Error(`Dimension ${name} not found`);
|
|
588
|
+
}
|
|
589
|
+
dim.SystemValue = value / 1000; // Convert mm to m
|
|
590
|
+
this.currentModel.EditRebuild3();
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
/**
|
|
594
|
+
* Factory function to create enhanced adapter
|
|
595
|
+
*/
|
|
596
|
+
export async function createEnhancedWinAxAdapter() {
|
|
597
|
+
const adapter = new EnhancedWinAxAdapter();
|
|
598
|
+
await adapter.connect();
|
|
599
|
+
return adapter;
|
|
600
|
+
}
|
|
601
|
+
//# sourceMappingURL=winax-adapter-enhanced.js.map
|