Documentation
Noyau d'usinage CAM
D'un travail de fabrication à la CN et aux preuves : planification, découpeurs, stock de voxels avec une tranche de volume restant et contrôles de collision certifiés.
Traduit automatiquement de l'anglais. Voir l'original en anglais
Qu'est-ce que le noyau CAM
Le noyau CAM dans packages/core/src/cam/kernel (20 fichiers source, environ 5 260 lignes) nécessite un travail de fabrication révisé pour usiner la CN ainsi que des preuves sur cette CN. Il choisit les outils de coupe et les données de coupe, planifie les opérations à partir des fonctionnalités de CAO, exécute les stratégies, publie le code G, relit la CN indépendamment par rapport au stock volumétrique et vérifie le mouvement de l'ensemble d'outils pour détecter les collisions. Son identité d'algorithme est cadcamfun-cam-kernel@1.
| Module | Rôle |
|---|---|
| matériels | nuances de pièces avec leurs données d'usinabilité |
| coupeurs | assemblages d'outils et la bibliothèque par défaut (70 fraises) |
| données de coupe | vitesses, avances, profondeurs, charge et déflexion pour une fraise dans un matériau |
| planificateur | Fonctionnalités CAO → opérations ordonnées avec leurs couteaux |
| exécuter | préparer/exécuter : stratégies, publication, relecture NC indépendante, lignée de stock, réclamations et niveau de version |
| cinématique, tête | trunnion table (AC / BC) and tilting head (B about Y) |
| assemblée | l'ensemble outil 3D (zone de coupe, queue, porte-outil) sous forme de profil et son solide de révolution |
| collision | contrôle continu d'un mouvement commun : certifié clair, collision ou non résolu |
| mouvement | cinq axes simultanés : emplacements → poses de table, chaque mouvement divisé et vérifié |
| action | stock volumétrique sous forme de voxels avec une tranche de volume restant |
| dédouanement de la machine | support et tige contre la table à chaque mouvement CN |
| convexe | distance exacte entre les coques convexes (GJK) |
export const prepareJob: (job: ManufacturingJob) => CamResult<PreparedJob>
export const executeJob: (prepared: PreparedJob) => CamResult<CamArtifact>
export const runJob: (job: ManufacturingJob) => CamResult<CamArtifact> // prepare, then execute
export const planOnly: (job: ManufacturingJob) => CamResult<{ operations; notes; unmachined }>
export const KERNEL_ALGORITHM = "cadcamfun-cam-kernel@1" Planification basée sur les fonctionnalités
Le planificateur séquence une pièce prismatique à la manière d'un programmeur FAO, à partir des fonctionnalités que possède réellement l'historique paramétrique :
- faire face au dessus du stock
- rugueux autour des contours et à l'intérieur des poches (adaptatif ou contour, avec une marge murale)
- lamages, perçages par points, perçages ou alésages hélicoïdaux, fraisages, fraisage de filetages
- finir les murs
- casser les bords supérieurs avec un chanfrein 2D lorsqu'un ébavurage est demandé
- 3Ébauche et finition D de corps de forme libre
Un corps sans historique de caractéristiques (un maillage, un booléen de primitives, une pièce sculptée) est usiné avec les stratégies de surface 3D. La planification choisit uniquement les outils et les régions ; les données de coupe sont calculées par opération lors de l'exécution du travail. Un véritable essai sur un flan POM-C de 44 × 44 × 11 mm prévoyait trois opérations : face avec facemill-50, surface-rough avec plat-16 et surface-finish avec balle-10, relâchée comme verified-program avec un temps de cycle de 149 s. Cette course est attirée fabrication native.
Fraises et ensemble d'outils
The default library has 70 cutters of nine kinds: flat (Ø1–16, plus aluminium ZrN variants), ball (Ø1–10), bull nose, face mill, spot drill, chamfer mill, engraver, thread mills (P0.5–P2) and drills. A cutter's assembly is its half-section profile from the tip, split into cutting zone, shank and holder.
{"id":"flat-6","name":"End mill Ø6 3F carbide ALTIN","kind":"flat","diameter":6,"flutes":3,
"material":"carbide","coating":"altin","fluteLength":15,"shankDiameter":6,"stickout":29,
"holder":{"diameter":40,"length":50}}
{"points":[{"r":0,"z":0},{"r":3,"z":0},{"r":3,"z":15},{"r":3,"z":29},{"r":20,"z":29},{"r":20,"z":79},{"r":0,"z":79}],
"parts":["cutting","cutting","shank","holder","holder","holder"],"length":79,"assumedHolder":false} Stock Voxel et support de volume restant
Stock est une grille de voxels. Après une série de mouvements, chaque voxel est matériel, retiré bien sûr (son cube entier se trouvait à l'intérieur du couteau à une position échantillonnée) ou supprimé possible (son cube rentrait dans l'expansion du cutter : une demi-diagonale plus la moitié de l'espacement des échantillons). Le volume restant constitue donc une parenthèse : la matière non sûrement enlevée est définitivement laissée, la matière non sûrement enlevée peut être laissée. Un voxel n’est jamais appelé supprimé sans qu’un élément de coupe échantillonné ne le recouvre. Les outils inclinés portent leur axe par point de pointe, donc les balayages à cinq axes utilisent les deux mêmes tests.
export const voxelStock: (min: Vec3, max: Vec3, voxel: number) => VoxelStock // sample step = voxel / 2
export const removeTipPath: (stock: VoxelStock, cutter: Cutter, path: ReadonlyArray<Vec3>, axes?: ReadonlyArray<Vec3>) => void
export const remainingVolume: (stock: VoxelStock) => { lower: number; upper: number } const s = voxelStock({ x: 0, y: 0, z: -10 }, { x: 40, y: 30, z: 0 }, 0.5)
// 80 × 60 × 20 = 96 000 voxels, step 0.25
removeTipPath(s, flat6, path) // slot y = 15, x 8→32, then the ring 8..32 × 8..22, all at z −3
remainingVolume(s) // {"lower":9749.5,"upper":10740} 124 ms
// stock 12 000 mm³: between 1 260 and 2 250.5 mm³ removed Le support se rétrécit avec la taille du voxel : diviser par deux le voxel réduit de moitié la bande lâche le long de chaque mur.
Contrôle continu des collisions
Un contrôleur déplace ses articulations de manière linéaire entre deux points, et un conflit peut se produire entre eux. checkMotion checks the whole move: probes (the holder and shank, each non-cutting profile segment enclosed by a capsule) against obstacles (the table envelope and the part box). The lower bound is a Lipschitz argument: a signed distance changes by at most the displacement of the moving solid, so the move is bisected until every interval is proven clear by margin, un chevauchement est échantillonné ou la profondeur (12) s'épuise.
| Verdict | Signification |
|---|---|
| clair | sur chaque intervalle, la limite inférieure du jeu est au moins la marge |
| collision | un point de sonde échantillonné se trouve à l'intérieur d'un obstacle ; à indique où le long du déplacement (0 à 1) |
| non résolu | un intervalle n'a pas pu être prouvé clairement dans la profondeur et aucun chevauchement n'a été trouvé |
// rapid along X at nose z 60
{"verdict":"clear","clearance":26.875,"evaluations":2}
// plunge from nose z 60 to nose z 0
{"verdict":"collision","clearance":-10,"at":1,"evaluations":2}
// standing poses
z 60 {"verdict":"clear","clearance":46.875,"evaluations":2}
z 20 {"verdict":"clear","clearance":6.875,"evaluations":2}
z 10 {"verdict":"unresolved","clearance":-3.125,"evaluations":4097}
z 5 {"verdict":"collision","clearance":-5,"at":0,"evaluations":1} Le rapide rapporte 26.875 plutôt que le permanent 46.875 car un contrôle mobile certifie une limite inférieure : il soustrait le déplacement sur chaque intervalle qu'il n'a pas subdivisé davantage. La pose du nez-z-10 montre pourquoi unresolved existe : la limite inférieure certifiée est négative (l'enveloppe peut se chevaucher) mais aucun point échantillonné n'est à l'intérieur, donc après 4 097 évaluations, le vérificateur rapporte ce qu'il peut prouver au lieu de deviner. Les enveloppes sont conservatrices : une capsule entoure son segment de support, de sorte qu'un chevauchement peut être signalé là où l'outil réel ne ferait que se rapprocher.
Dépannage
| Symptôme | Cause | Réparer |
|---|---|---|
| échec de l'état du travail : version du schéma de travail non prise en charge | travail construit pour un schéma de noyau différent | reconstruire le travail avec la version de schéma actuelle |
| fourchette de volume restant large | voxel trop grossier pour les fonctionnalités | utilisez un voxel plus petit ; le jeu est d'environ un voxel le long de chaque mur |
| collision sur un rapide | le support ou l'enveloppe de tige atteint la table ou la pièce | relever le plan de dégagement ou raccourcir la saillie |
| non résolu sur un long mouvement rotatif | la borne Lipschitzienne est faible loin du centre de rotation | diviser le coup, ou accepter la marge que le vérificateur pourrait prouver |
| opération planifiée avec un cutter inattendu | adéquation de la fraise au matériau et à la rigidité | passez une bibliothèque d'outils avec le cutter que vous voulez |