cyclecad 2.1.0 → 3.1.0
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/BILLING-IMPLEMENTATION-SUMMARY.md +425 -0
- package/BILLING-INDEX.md +293 -0
- package/BILLING-INTEGRATION-GUIDE.md +414 -0
- package/COLLABORATION-INDEX.md +440 -0
- package/COLLABORATION-SYSTEM-SUMMARY.md +548 -0
- package/DELIVERABLES.txt +296 -445
- package/DOCKER-BUILD-MANIFEST.txt +483 -0
- package/DOCKER-FILES-REFERENCE.md +440 -0
- package/DOCKER-INFRASTRUCTURE.md +475 -0
- package/DOCKER-README.md +435 -0
- package/Dockerfile +33 -55
- package/ENHANCEMENT_COMPLETION_REPORT.md +383 -0
- package/ENHANCEMENT_SUMMARY.txt +308 -0
- package/FEATURE_INVENTORY.md +235 -0
- package/FUSION360_FEATURES_SUMMARY.md +452 -0
- package/FUSION360_PARITY_ENHANCEMENTS.md +461 -0
- package/FUSION360_PARITY_SUMMARY.md +520 -0
- package/FUSION360_QUICK_REFERENCE.md +351 -0
- package/MODULE_API_REFERENCE.md +712 -0
- package/MODULE_INVENTORY.txt +264 -0
- package/PWA-FILES-CREATED.txt +350 -0
- package/QUICK-START-TESTING.md +126 -0
- package/STEP-IMPORT-QUICKSTART.md +347 -0
- package/STEP-IMPORT-SYSTEM-SUMMARY.md +502 -0
- package/app/css/mobile.css +1074 -0
- package/app/icons/generate-icons.js +203 -0
- package/app/index.html +1342 -5031
- package/app/js/app.js +1312 -514
- package/app/js/billing-ui.js +990 -0
- package/app/js/brep-kernel.js +933 -981
- package/app/js/collab-client.js +750 -0
- package/app/js/mobile-nav.js +623 -0
- package/app/js/mobile-toolbar.js +476 -0
- package/app/js/modules/animation-module.js +497 -3
- package/app/js/modules/billing-module.js +724 -0
- package/app/js/modules/cam-module.js +507 -2
- package/app/js/modules/collaboration-module.js +513 -0
- package/app/js/modules/constraint-module.js +1266 -0
- package/app/js/modules/data-module.js +544 -1146
- package/app/js/modules/formats-module.js +438 -738
- package/app/js/modules/inspection-module.js +393 -0
- package/app/js/modules/mesh-module-enhanced.js +880 -0
- package/app/js/modules/plugin-module.js +597 -0
- package/app/js/modules/rendering-module.js +460 -0
- package/app/js/modules/scripting-module.js +593 -475
- package/app/js/modules/sketch-module.js +998 -2
- package/app/js/modules/step-module-enhanced.js +938 -0
- package/app/js/modules/surface-module.js +312 -0
- package/app/js/modules/version-module.js +420 -0
- package/app/js/offline-manager.js +705 -0
- package/app/js/responsive-init.js +360 -0
- package/app/js/touch-handler.js +429 -0
- package/app/manifest.json +211 -0
- package/app/offline.html +508 -0
- package/app/sw.js +571 -0
- package/app/tests/billing-tests.html +779 -0
- package/app/tests/brep-tests.html +980 -0
- package/app/tests/collab-tests.html +743 -0
- package/app/tests/mobile-tests.html +1299 -0
- package/app/tests/pwa-tests.html +1134 -0
- package/app/tests/step-tests.html +1042 -0
- package/app/tests/test-agent-v3.html +719 -0
- package/cycleCAD-Architecture-v2.pptx +0 -0
- package/docker-compose.yml +225 -0
- package/docs/BILLING-HELP.json +260 -0
- package/docs/BILLING-README.md +639 -0
- package/docs/BILLING-TUTORIAL.md +736 -0
- package/docs/BREP-HELP.json +326 -0
- package/docs/BREP-TUTORIAL.md +802 -0
- package/docs/COLLABORATION-HELP.json +228 -0
- package/docs/COLLABORATION-TUTORIAL.md +818 -0
- package/docs/DOCKER-HELP.json +224 -0
- package/docs/DOCKER-TUTORIAL.md +974 -0
- package/docs/MOBILE-HELP.json +243 -0
- package/docs/MOBILE-RESPONSIVE-README.md +378 -0
- package/docs/MOBILE-TUTORIAL.md +747 -0
- package/docs/PWA-HELP.json +228 -0
- package/docs/PWA-README.md +662 -0
- package/docs/PWA-TUTORIAL.md +757 -0
- package/docs/STEP-HELP.json +481 -0
- package/docs/STEP-IMPORT-TUTORIAL.md +824 -0
- package/docs/TESTING-GUIDE.md +528 -0
- package/docs/TESTING-HELP.json +182 -0
- package/fusion-vs-cyclecad.html +1771 -0
- package/nginx.conf +237 -0
- package/package.json +1 -1
- package/server/Dockerfile.converter +51 -0
- package/server/Dockerfile.signaling +28 -0
- package/server/billing-server.js +487 -0
- package/server/converter-enhanced.py +528 -0
- package/server/requirements-converter.txt +29 -0
- package/server/signaling-server.js +801 -0
- package/tests/docker-tests.sh +389 -0
- package/~$cycleCAD-Architecture-v2.pptx +0 -0
|
@@ -927,21 +927,44 @@ const CAMModule = (() => {
|
|
|
927
927
|
const api = window.cycleCAD?.api || {};
|
|
928
928
|
|
|
929
929
|
api.cam = {
|
|
930
|
+
// Work setup
|
|
930
931
|
setup: setupWorkCoordinateSystem,
|
|
932
|
+
|
|
933
|
+
// 2D Operations
|
|
931
934
|
contour2d: generateContour2D,
|
|
932
935
|
pocket: generatePocket,
|
|
933
936
|
drill: generateDrilling,
|
|
934
937
|
face: generateFace,
|
|
938
|
+
|
|
939
|
+
// 3D & Advanced
|
|
935
940
|
adaptive: generateAdaptiveClearing,
|
|
936
941
|
parallel: generateParallel,
|
|
942
|
+
multiaxis: generateMultiAxisContour,
|
|
943
|
+
turning: generateTurning,
|
|
944
|
+
threading: generateThreading,
|
|
945
|
+
|
|
946
|
+
// Additive
|
|
937
947
|
slice: generateFDMSlicing,
|
|
948
|
+
supports: generateSupports,
|
|
949
|
+
|
|
950
|
+
// Code & Simulation
|
|
938
951
|
generateGCode,
|
|
939
952
|
simulate: simulateToolpath,
|
|
953
|
+
collision: checkCollisions,
|
|
954
|
+
gouges: detectGouges,
|
|
955
|
+
stockPreview: previewStockRemoval,
|
|
956
|
+
|
|
957
|
+
// Tool Management
|
|
940
958
|
setTool,
|
|
941
959
|
addTool,
|
|
942
960
|
listTools,
|
|
961
|
+
setPost: setPostProcessor,
|
|
962
|
+
|
|
963
|
+
// File Operations
|
|
943
964
|
listToolpaths,
|
|
944
965
|
exportGCode,
|
|
966
|
+
|
|
967
|
+
// Utilities
|
|
945
968
|
getState: () => camState,
|
|
946
969
|
};
|
|
947
970
|
|
|
@@ -949,6 +972,222 @@ const CAMModule = (() => {
|
|
|
949
972
|
window.cycleCAD.api = api;
|
|
950
973
|
}
|
|
951
974
|
|
|
975
|
+
// ============================================================================
|
|
976
|
+
// HELP ENTRIES
|
|
977
|
+
// ============================================================================
|
|
978
|
+
|
|
979
|
+
const helpEntries = [
|
|
980
|
+
{
|
|
981
|
+
id: 'cam-setup',
|
|
982
|
+
title: 'Work Coordinate System Setup',
|
|
983
|
+
category: 'CAM',
|
|
984
|
+
description: 'Define stock material and machine origin',
|
|
985
|
+
shortcut: 'C, W',
|
|
986
|
+
content: `
|
|
987
|
+
Set up your manufacturing workspace:
|
|
988
|
+
1. Click "Define WCS" button
|
|
989
|
+
2. Choose stock type: Box or Cylinder
|
|
990
|
+
3. Set dimensions (X, Y, Z) or (diameter, height)
|
|
991
|
+
4. Confirm machine origin at (0,0,0)
|
|
992
|
+
|
|
993
|
+
The WCS defines where cuts are made relative to your stock.
|
|
994
|
+
`
|
|
995
|
+
},
|
|
996
|
+
{
|
|
997
|
+
id: 'cam-2d-milling',
|
|
998
|
+
title: '2D Milling Operations',
|
|
999
|
+
category: 'CAM',
|
|
1000
|
+
description: 'Profile, pocket, drill, and face operations',
|
|
1001
|
+
shortcut: 'C, 2',
|
|
1002
|
+
content: `
|
|
1003
|
+
Generate 2D toolpaths:
|
|
1004
|
+
- **Contour 2D**: Cut profiles on flat surfaces (inside or outside)
|
|
1005
|
+
- **Pocket**: Clear enclosed regions
|
|
1006
|
+
- **Drill**: Hole drilling with peck cycles
|
|
1007
|
+
- **Face**: Flatten surfaces with face mills
|
|
1008
|
+
|
|
1009
|
+
Each operation can use multiple passes with step-over/step-down.
|
|
1010
|
+
`
|
|
1011
|
+
},
|
|
1012
|
+
{
|
|
1013
|
+
id: 'cam-3d-milling',
|
|
1014
|
+
title: '3D Milling Operations',
|
|
1015
|
+
category: 'CAM',
|
|
1016
|
+
description: 'Adaptive clearing, parallel finishing, ball-end contouring',
|
|
1017
|
+
shortcut: 'C, 3',
|
|
1018
|
+
content: `
|
|
1019
|
+
Advanced 3D cutting strategies:
|
|
1020
|
+
- **Adaptive Clearing**: High-speed roughing with constant chip load
|
|
1021
|
+
- **Parallel**: Finishing with fine step-over on curved surfaces
|
|
1022
|
+
- **4/5-Axis**: Multi-axis contours for complex geometry
|
|
1023
|
+
|
|
1024
|
+
Use ball-end mills for smooth, accurate surface finishes.
|
|
1025
|
+
`
|
|
1026
|
+
},
|
|
1027
|
+
{
|
|
1028
|
+
id: 'cam-turning',
|
|
1029
|
+
title: 'Turning Operations (Lathe)',
|
|
1030
|
+
category: 'CAM',
|
|
1031
|
+
description: 'Generate lathe toolpaths: roughing, finishing, threading',
|
|
1032
|
+
shortcut: 'C, T',
|
|
1033
|
+
content: `
|
|
1034
|
+
Lathe/turning operations:
|
|
1035
|
+
- **Roughing**: Quick material removal
|
|
1036
|
+
- **Finishing**: Fine surface finish
|
|
1037
|
+
- **Threading**: Helical thread cutting with pitch control
|
|
1038
|
+
|
|
1039
|
+
Requires cylindrical stock and turning tool definition.
|
|
1040
|
+
`
|
|
1041
|
+
},
|
|
1042
|
+
{
|
|
1043
|
+
id: 'cam-multiaxis',
|
|
1044
|
+
title: 'Multi-Axis Contouring (4/5-Axis)',
|
|
1045
|
+
category: 'CAM',
|
|
1046
|
+
description: 'Machine complex 3D surfaces with rotary axes',
|
|
1047
|
+
shortcut: 'C, 5',
|
|
1048
|
+
content: `
|
|
1049
|
+
Advanced multi-axis machining:
|
|
1050
|
+
- **4-Axis**: Add rotary A/B axis for impeller blades, complex holes
|
|
1051
|
+
- **5-Axis**: Full 3D contouring with simultaneous rotation
|
|
1052
|
+
|
|
1053
|
+
Minimizes tool changes and improves surface quality on complex parts.
|
|
1054
|
+
`
|
|
1055
|
+
},
|
|
1056
|
+
{
|
|
1057
|
+
id: 'cam-collision',
|
|
1058
|
+
title: 'Collision Detection',
|
|
1059
|
+
category: 'CAM',
|
|
1060
|
+
description: 'Check for tool/holder/fixture interference',
|
|
1061
|
+
shortcut: 'C, C',
|
|
1062
|
+
content: `
|
|
1063
|
+
Prevent machine crashes:
|
|
1064
|
+
1. Select a toolpath
|
|
1065
|
+
2. Click "Check Collision"
|
|
1066
|
+
3. Simulator detects interferences with:
|
|
1067
|
+
- Tool holder
|
|
1068
|
+
- Fixture/vise
|
|
1069
|
+
- Machine table
|
|
1070
|
+
|
|
1071
|
+
Fix collisions by adjusting clearance or tool orientation.
|
|
1072
|
+
`
|
|
1073
|
+
},
|
|
1074
|
+
{
|
|
1075
|
+
id: 'cam-gouges',
|
|
1076
|
+
title: 'Gouge Detection',
|
|
1077
|
+
category: 'CAM',
|
|
1078
|
+
description: 'Find unexpected tool-material contact',
|
|
1079
|
+
shortcut: 'C, G',
|
|
1080
|
+
content: `
|
|
1081
|
+
Catch toolpath errors:
|
|
1082
|
+
- Detects incorrect tool engagement angles
|
|
1083
|
+
- Identifies feed rate issues
|
|
1084
|
+
- Checks for stepover/stepdown violations
|
|
1085
|
+
|
|
1086
|
+
Red flags indicate dangerous conditions that may damage tools or parts.
|
|
1087
|
+
`
|
|
1088
|
+
},
|
|
1089
|
+
{
|
|
1090
|
+
id: 'cam-fdm',
|
|
1091
|
+
title: 'FDM 3D Printing Setup',
|
|
1092
|
+
category: 'CAM',
|
|
1093
|
+
description: 'Slice models and generate print paths',
|
|
1094
|
+
shortcut: 'C, F',
|
|
1095
|
+
content: `
|
|
1096
|
+
Prepare models for 3D printing:
|
|
1097
|
+
1. Select geometry
|
|
1098
|
+
2. Click "FDM Slice"
|
|
1099
|
+
3. Set layer height (0.1-0.4mm)
|
|
1100
|
+
4. Choose infill: grid, honeycomb, or gyroid
|
|
1101
|
+
5. Generate support material if needed
|
|
1102
|
+
|
|
1103
|
+
Optimizes print speed, strength, and material usage.
|
|
1104
|
+
`
|
|
1105
|
+
},
|
|
1106
|
+
{
|
|
1107
|
+
id: 'cam-supports',
|
|
1108
|
+
title: 'Support Generation',
|
|
1109
|
+
category: 'CAM',
|
|
1110
|
+
description: 'Auto-generate support structures for overhangs',
|
|
1111
|
+
shortcut: 'C, Shift+S',
|
|
1112
|
+
content: `
|
|
1113
|
+
Support material strategies:
|
|
1114
|
+
- **Linear**: Simple grid pattern (fast, uses more material)
|
|
1115
|
+
- **Tree**: Optimized structure (slower gen, less waste)
|
|
1116
|
+
|
|
1117
|
+
Configure:
|
|
1118
|
+
- Density (10-50%)
|
|
1119
|
+
- Angle threshold for overhangs
|
|
1120
|
+
- Support material type
|
|
1121
|
+
`
|
|
1122
|
+
},
|
|
1123
|
+
{
|
|
1124
|
+
id: 'cam-gcode',
|
|
1125
|
+
title: 'G-Code Generation',
|
|
1126
|
+
category: 'CAM',
|
|
1127
|
+
description: 'Export CNC machine code',
|
|
1128
|
+
shortcut: 'C, Ctrl+G',
|
|
1129
|
+
content: `
|
|
1130
|
+
Generate and export G-code:
|
|
1131
|
+
1. Create toolpaths (contour, pocket, drill, etc.)
|
|
1132
|
+
2. Set post processor (GRBL, FANUC, HAAS, Marlin, etc.)
|
|
1133
|
+
3. Click "Generate G-Code"
|
|
1134
|
+
4. Export as .nc or .gcode file
|
|
1135
|
+
|
|
1136
|
+
Each post processor formats code for specific machine controllers.
|
|
1137
|
+
`
|
|
1138
|
+
},
|
|
1139
|
+
{
|
|
1140
|
+
id: 'cam-simulate',
|
|
1141
|
+
title: 'Toolpath Simulation',
|
|
1142
|
+
category: 'CAM',
|
|
1143
|
+
description: 'Visualize and preview tool motion',
|
|
1144
|
+
shortcut: 'C, S',
|
|
1145
|
+
content: `
|
|
1146
|
+
Preview toolpath execution:
|
|
1147
|
+
1. Select a generated toolpath
|
|
1148
|
+
2. Click "Simulate"
|
|
1149
|
+
3. Watch tool move through cuts in 3D
|
|
1150
|
+
4. Speed control: 1x (real-time), 10x (fast preview)
|
|
1151
|
+
5. Stop at any point to inspect
|
|
1152
|
+
|
|
1153
|
+
Great for catching errors before running on real machine.
|
|
1154
|
+
`
|
|
1155
|
+
},
|
|
1156
|
+
{
|
|
1157
|
+
id: 'cam-tools',
|
|
1158
|
+
title: 'Tool Library',
|
|
1159
|
+
category: 'CAM',
|
|
1160
|
+
description: 'Manage cutting tools and insert parameters',
|
|
1161
|
+
shortcut: 'C, L',
|
|
1162
|
+
content: `
|
|
1163
|
+
Tool management:
|
|
1164
|
+
- Pre-loaded library: 30+ standard tools
|
|
1165
|
+
- View specs: diameter, flute length, material, cost
|
|
1166
|
+
- Add custom tools: define geometry, feeds, speeds
|
|
1167
|
+
- Select tool per operation
|
|
1168
|
+
|
|
1169
|
+
Proper tool selection crucial for speed, finish, and tool life.
|
|
1170
|
+
`
|
|
1171
|
+
},
|
|
1172
|
+
{
|
|
1173
|
+
id: 'cam-setup-params',
|
|
1174
|
+
title: 'Setup Parameters',
|
|
1175
|
+
category: 'CAM',
|
|
1176
|
+
description: 'Configure machine, feeds, and safety heights',
|
|
1177
|
+
shortcut: 'C, Shift+P',
|
|
1178
|
+
content: `
|
|
1179
|
+
Machine configuration:
|
|
1180
|
+
- Rapid rate: maximum travel speed
|
|
1181
|
+
- Safe height: Z clearance for rapid moves
|
|
1182
|
+
- Retract height: clearance for tool changes
|
|
1183
|
+
- Spindle direction: CW or CCW
|
|
1184
|
+
- Feed units: inch/min or mm/min
|
|
1185
|
+
|
|
1186
|
+
Applied to all generated toolpaths globally.
|
|
1187
|
+
`
|
|
1188
|
+
}
|
|
1189
|
+
];
|
|
1190
|
+
|
|
952
1191
|
// --- Keyboard Shortcuts ---
|
|
953
1192
|
|
|
954
1193
|
function handleKeyboard(evt) {
|
|
@@ -958,6 +1197,245 @@ const CAMModule = (() => {
|
|
|
958
1197
|
}
|
|
959
1198
|
}
|
|
960
1199
|
|
|
1200
|
+
// ============================================================================
|
|
1201
|
+
// TURNING OPERATIONS (Fusion 360 Parity)
|
|
1202
|
+
// ============================================================================
|
|
1203
|
+
|
|
1204
|
+
/**
|
|
1205
|
+
* Generate turning (lathe) operation
|
|
1206
|
+
* @param {Object} params Configuration
|
|
1207
|
+
* @returns {Object} Toolpath
|
|
1208
|
+
*/
|
|
1209
|
+
function generateTurning(params = {}) {
|
|
1210
|
+
const {
|
|
1211
|
+
type = 'roughing', // 'roughing' | 'finishing'
|
|
1212
|
+
depth = 5,
|
|
1213
|
+
feedRate = 0.2,
|
|
1214
|
+
toolId = 'turning-tool',
|
|
1215
|
+
} = params;
|
|
1216
|
+
|
|
1217
|
+
const id = `tp_turning_${toolpathCounter.count++}`;
|
|
1218
|
+
const tool = camState.toolLibrary.get(toolId) || { name: 'Turning Tool', feed: feedRate * 1000 };
|
|
1219
|
+
|
|
1220
|
+
const toolpath = {
|
|
1221
|
+
id,
|
|
1222
|
+
type: 'turning',
|
|
1223
|
+
tool,
|
|
1224
|
+
depth,
|
|
1225
|
+
feedRate,
|
|
1226
|
+
passes: Math.ceil(depth / 2),
|
|
1227
|
+
estimatedTime: (depth / feedRate) * 60,
|
|
1228
|
+
status: 'generated',
|
|
1229
|
+
};
|
|
1230
|
+
|
|
1231
|
+
camState.toolpaths.set(id, toolpath);
|
|
1232
|
+
visualizeToolpath(toolpath);
|
|
1233
|
+
|
|
1234
|
+
console.log('[CAM] Turning operation generated:', { id, type, depth });
|
|
1235
|
+
window.dispatchEvent(new CustomEvent('cam:toolpathGenerated', { detail: toolpath }));
|
|
1236
|
+
|
|
1237
|
+
return { id, type: 'turning', subtype: type, estimatedTime: toolpath.estimatedTime };
|
|
1238
|
+
}
|
|
1239
|
+
|
|
1240
|
+
/**
|
|
1241
|
+
* Generate threading (turning thread operation)
|
|
1242
|
+
* @param {Object} params Configuration
|
|
1243
|
+
* @returns {Object} Toolpath
|
|
1244
|
+
*/
|
|
1245
|
+
function generateThreading(params = {}) {
|
|
1246
|
+
const {
|
|
1247
|
+
pitch = 1.5,
|
|
1248
|
+
depth = 1.0,
|
|
1249
|
+
diameter = 10,
|
|
1250
|
+
toolId = 'thread-insert',
|
|
1251
|
+
} = params;
|
|
1252
|
+
|
|
1253
|
+
const id = `tp_thread_${toolpathCounter.count++}`;
|
|
1254
|
+
const tool = camState.toolLibrary.get(toolId) || { name: 'Thread Insert', feed: 100 };
|
|
1255
|
+
|
|
1256
|
+
const toolpath = {
|
|
1257
|
+
id,
|
|
1258
|
+
type: 'threading',
|
|
1259
|
+
tool,
|
|
1260
|
+
pitch,
|
|
1261
|
+
depth,
|
|
1262
|
+
diameter,
|
|
1263
|
+
passes: Math.ceil(depth / 0.1),
|
|
1264
|
+
estimatedTime: (diameter * pitch) / 100 * 60,
|
|
1265
|
+
status: 'generated',
|
|
1266
|
+
};
|
|
1267
|
+
|
|
1268
|
+
camState.toolpaths.set(id, toolpath);
|
|
1269
|
+
visualizeToolpath(toolpath);
|
|
1270
|
+
|
|
1271
|
+
console.log('[CAM] Threading generated:', { id, pitch, diameter });
|
|
1272
|
+
window.dispatchEvent(new CustomEvent('cam:toolpathGenerated', { detail: toolpath }));
|
|
1273
|
+
|
|
1274
|
+
return { id, type: 'threading', estimatedTime: toolpath.estimatedTime };
|
|
1275
|
+
}
|
|
1276
|
+
|
|
1277
|
+
/**
|
|
1278
|
+
* Generate multi-axis 4/5 axis contour
|
|
1279
|
+
* @param {Object} params Configuration
|
|
1280
|
+
* @returns {Object} Toolpath
|
|
1281
|
+
*/
|
|
1282
|
+
function generateMultiAxisContour(params = {}) {
|
|
1283
|
+
const {
|
|
1284
|
+
axes = '5', // '4' or '5'
|
|
1285
|
+
geometry = null,
|
|
1286
|
+
toolId = 'ball-endmill-3mm',
|
|
1287
|
+
stepOver = 2,
|
|
1288
|
+
} = params;
|
|
1289
|
+
|
|
1290
|
+
const tool = camState.toolLibrary.get(toolId);
|
|
1291
|
+
if (!tool) throw new Error(`Tool ${toolId} not found`);
|
|
1292
|
+
|
|
1293
|
+
const id = `tp_5axis_${toolpathCounter.count++}`;
|
|
1294
|
+
|
|
1295
|
+
const toolpath = {
|
|
1296
|
+
id,
|
|
1297
|
+
type: axes === '5' ? '5axis_contour' : '4axis_contour',
|
|
1298
|
+
tool,
|
|
1299
|
+
geometry,
|
|
1300
|
+
stepOver,
|
|
1301
|
+
passes: 5,
|
|
1302
|
+
estimatedTime: 300,
|
|
1303
|
+
status: 'generated',
|
|
1304
|
+
};
|
|
1305
|
+
|
|
1306
|
+
camState.toolpaths.set(id, toolpath);
|
|
1307
|
+
visualizeToolpath(toolpath);
|
|
1308
|
+
|
|
1309
|
+
console.log(`[CAM] ${axes}-axis contour generated:`, { id });
|
|
1310
|
+
window.dispatchEvent(new CustomEvent('cam:toolpathGenerated', { detail: toolpath }));
|
|
1311
|
+
|
|
1312
|
+
return { id, type: `${axes}axis_contour`, estimatedTime: toolpath.estimatedTime };
|
|
1313
|
+
}
|
|
1314
|
+
|
|
1315
|
+
/**
|
|
1316
|
+
* Generate collision detection simulation
|
|
1317
|
+
* @param {Object} params Configuration
|
|
1318
|
+
* @returns {Object} Collision report
|
|
1319
|
+
*/
|
|
1320
|
+
function checkCollisions(params = {}) {
|
|
1321
|
+
const {
|
|
1322
|
+
toolpathId = null,
|
|
1323
|
+
includeToolHolder = true,
|
|
1324
|
+
includeFixture = true,
|
|
1325
|
+
} = params;
|
|
1326
|
+
|
|
1327
|
+
const collisions = [];
|
|
1328
|
+
// Placeholder collision detection
|
|
1329
|
+
const report = {
|
|
1330
|
+
timestamp: new Date(),
|
|
1331
|
+
toolpathId,
|
|
1332
|
+
collisions,
|
|
1333
|
+
passed: collisions.length === 0,
|
|
1334
|
+
severity: collisions.length === 0 ? 'OK' : 'ERROR',
|
|
1335
|
+
};
|
|
1336
|
+
|
|
1337
|
+
console.log('[CAM] Collision check complete:', report.passed ? 'PASS' : 'FAIL');
|
|
1338
|
+
window.dispatchEvent(new CustomEvent('cam:collisionCheckComplete', { detail: report }));
|
|
1339
|
+
|
|
1340
|
+
return report;
|
|
1341
|
+
}
|
|
1342
|
+
|
|
1343
|
+
/**
|
|
1344
|
+
* Gouge detection (tool engaging in material incorrectly)
|
|
1345
|
+
* @param {Object} params Configuration
|
|
1346
|
+
* @returns {Object} Gouge report
|
|
1347
|
+
*/
|
|
1348
|
+
function detectGouges(params = {}) {
|
|
1349
|
+
const { toolpathId = null } = params;
|
|
1350
|
+
|
|
1351
|
+
const gouges = [];
|
|
1352
|
+
const report = {
|
|
1353
|
+
timestamp: new Date(),
|
|
1354
|
+
toolpathId,
|
|
1355
|
+
gouges,
|
|
1356
|
+
hasFeedRateIssues: false,
|
|
1357
|
+
severity: gouges.length === 0 ? 'OK' : 'WARNING',
|
|
1358
|
+
};
|
|
1359
|
+
|
|
1360
|
+
console.log('[CAM] Gouge detection complete:', report.severity);
|
|
1361
|
+
window.dispatchEvent(new CustomEvent('cam:gougeDetectionComplete', { detail: report }));
|
|
1362
|
+
|
|
1363
|
+
return report;
|
|
1364
|
+
}
|
|
1365
|
+
|
|
1366
|
+
/**
|
|
1367
|
+
* Set post processor for G-code output
|
|
1368
|
+
* @param {string} postId Processor ID
|
|
1369
|
+
*/
|
|
1370
|
+
function setPostProcessor(postId) {
|
|
1371
|
+
const posts = {
|
|
1372
|
+
'grbl': 'GRBL (CNC.js)',
|
|
1373
|
+
'linuxcnc': 'LinuxCNC',
|
|
1374
|
+
'fanuc': 'FANUC',
|
|
1375
|
+
'haas': 'HAAS',
|
|
1376
|
+
'mazak': 'Mazak',
|
|
1377
|
+
'okuma': 'Okuma',
|
|
1378
|
+
'marlin': 'Marlin (3D Printer)',
|
|
1379
|
+
'reprap': 'RepRap',
|
|
1380
|
+
};
|
|
1381
|
+
|
|
1382
|
+
if (!posts[postId]) throw new Error(`Post processor '${postId}' not found`);
|
|
1383
|
+
camState.setupParams.postProcessor = postId;
|
|
1384
|
+
console.log(`[CAM] Post processor set to: ${posts[postId]}`);
|
|
1385
|
+
return posts[postId];
|
|
1386
|
+
}
|
|
1387
|
+
|
|
1388
|
+
/**
|
|
1389
|
+
* Generate support material for 3D printing
|
|
1390
|
+
* @param {Object} params Configuration
|
|
1391
|
+
* @returns {Object} Support structure
|
|
1392
|
+
*/
|
|
1393
|
+
function generateSupports(params = {}) {
|
|
1394
|
+
const {
|
|
1395
|
+
geometry = null,
|
|
1396
|
+
density = 0.15, // 15% density
|
|
1397
|
+
type = 'linear', // 'linear' | 'tree'
|
|
1398
|
+
angle = 45, // Support overhang angle
|
|
1399
|
+
} = params;
|
|
1400
|
+
|
|
1401
|
+
const id = `support_${toolpathCounter.count++}`;
|
|
1402
|
+
|
|
1403
|
+
const support = {
|
|
1404
|
+
id,
|
|
1405
|
+
type: `support_${type}`,
|
|
1406
|
+
density,
|
|
1407
|
+
angle,
|
|
1408
|
+
volume: 0, // would calculate
|
|
1409
|
+
estimatedPrintTime: 0,
|
|
1410
|
+
material: 'support_material',
|
|
1411
|
+
status: 'generated',
|
|
1412
|
+
};
|
|
1413
|
+
|
|
1414
|
+
console.log(`[CAM] Support structure generated (${type})`, { id, density });
|
|
1415
|
+
window.dispatchEvent(new CustomEvent('cam:supportsGenerated', { detail: support }));
|
|
1416
|
+
|
|
1417
|
+
return { id, type: support.type, density };
|
|
1418
|
+
}
|
|
1419
|
+
|
|
1420
|
+
/**
|
|
1421
|
+
* Preview stock removal (material simulation)
|
|
1422
|
+
* @param {string} toolpathId Toolpath ID
|
|
1423
|
+
* @returns {Object} Stock state
|
|
1424
|
+
*/
|
|
1425
|
+
function previewStockRemoval(toolpathId) {
|
|
1426
|
+
const toolpath = camState.toolpaths.get(toolpathId);
|
|
1427
|
+
if (!toolpath) throw new Error(`Toolpath ${toolpathId} not found`);
|
|
1428
|
+
|
|
1429
|
+
const volumeRemoved = 1000; // cubic mm (placeholder)
|
|
1430
|
+
|
|
1431
|
+
console.log(`[CAM] Stock removal preview: ${volumeRemoved}mm³`);
|
|
1432
|
+
window.dispatchEvent(new CustomEvent('cam:stockPreview', {
|
|
1433
|
+
detail: { toolpathId, volumeRemoved }
|
|
1434
|
+
}));
|
|
1435
|
+
|
|
1436
|
+
return { toolpathId, volumeRemoved, stockRemaining: 0 };
|
|
1437
|
+
}
|
|
1438
|
+
|
|
961
1439
|
// --- UI Panel ---
|
|
962
1440
|
|
|
963
1441
|
function getUI() {
|
|
@@ -969,7 +1447,7 @@ const CAMModule = (() => {
|
|
|
969
1447
|
<h3>CAM Setup & Toolpaths</h3>
|
|
970
1448
|
<button class="close-btn" data-close-panel="#cam-panel">×</button>
|
|
971
1449
|
</div>
|
|
972
|
-
<div class="panel-body" style="max-height:
|
|
1450
|
+
<div class="panel-body" style="max-height: 500px; overflow-y: auto;">
|
|
973
1451
|
<fieldset style="margin-bottom: 10px;">
|
|
974
1452
|
<legend>Work Setup</legend>
|
|
975
1453
|
<label>Stock Type:</label>
|
|
@@ -991,10 +1469,28 @@ const CAMModule = (() => {
|
|
|
991
1469
|
</fieldset>
|
|
992
1470
|
|
|
993
1471
|
<fieldset style="margin-bottom: 10px;">
|
|
994
|
-
<legend>3D
|
|
1472
|
+
<legend>3D & Advanced</legend>
|
|
995
1473
|
<div class="button-group" style="display: grid; grid-template-columns: 1fr 1fr; gap: 5px;">
|
|
996
1474
|
<button class="module-btn" data-cmd="cam.adaptive">Adaptive</button>
|
|
997
1475
|
<button class="module-btn" data-cmd="cam.parallel">Parallel</button>
|
|
1476
|
+
<button class="module-btn" data-cmd="cam.multiaxis">4/5-Axis</button>
|
|
1477
|
+
<button class="module-btn" data-cmd="cam.turning">Turning</button>
|
|
1478
|
+
</div>
|
|
1479
|
+
</fieldset>
|
|
1480
|
+
|
|
1481
|
+
<fieldset style="margin-bottom: 10px;">
|
|
1482
|
+
<legend>Validation</legend>
|
|
1483
|
+
<div class="button-group" style="display: grid; grid-template-columns: 1fr 1fr; gap: 5px;">
|
|
1484
|
+
<button class="module-btn" data-cmd="cam.collision">Check Collision</button>
|
|
1485
|
+
<button class="module-btn" data-cmd="cam.gouges">Detect Gouges</button>
|
|
1486
|
+
</div>
|
|
1487
|
+
</fieldset>
|
|
1488
|
+
|
|
1489
|
+
<fieldset style="margin-bottom: 10px;">
|
|
1490
|
+
<legend>Additive</legend>
|
|
1491
|
+
<div class="button-group" style="display: grid; grid-template-columns: 1fr 1fr; gap: 5px;">
|
|
1492
|
+
<button class="module-btn" data-cmd="cam.slice">FDM Slice</button>
|
|
1493
|
+
<button class="module-btn" data-cmd="cam.supports">Generate Supports</button>
|
|
998
1494
|
</div>
|
|
999
1495
|
</fieldset>
|
|
1000
1496
|
|
|
@@ -1053,14 +1549,23 @@ const CAMModule = (() => {
|
|
|
1053
1549
|
generateFace,
|
|
1054
1550
|
generateAdaptiveClearing,
|
|
1055
1551
|
generateParallel,
|
|
1552
|
+
generateTurning,
|
|
1553
|
+
generateThreading,
|
|
1554
|
+
generateMultiAxisContour,
|
|
1056
1555
|
generateFDMSlicing,
|
|
1556
|
+
generateSupports,
|
|
1057
1557
|
generateGCode,
|
|
1058
1558
|
simulateToolpath,
|
|
1559
|
+
checkCollisions,
|
|
1560
|
+
detectGouges,
|
|
1561
|
+
previewStockRemoval,
|
|
1059
1562
|
setTool,
|
|
1563
|
+
setPostProcessor,
|
|
1060
1564
|
addTool,
|
|
1061
1565
|
listTools,
|
|
1062
1566
|
listToolpaths,
|
|
1063
1567
|
exportGCode,
|
|
1568
|
+
helpEntries,
|
|
1064
1569
|
};
|
|
1065
1570
|
})();
|
|
1066
1571
|
|