Aller au contenu
CADCAMFUN
Docs

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.

ModuleRôle
matérielsnuances de pièces avec leurs données d'usinabilité
coupeursassemblages d'outils et la bibliothèque par défaut (70 fraises)
données de coupevitesses, avances, profondeurs, charge et déflexion pour une fraise dans un matériau
planificateurFonctionnalités CAO → opérations ordonnées avec leurs couteaux
exécuterpréparer/exécuter : stratégies, publication, relecture NC indépendante, lignée de stock, réclamations et niveau de version
cinématique, têtetrunnion table (AC / BC) and tilting head (B about Y)
assembléel'ensemble outil 3D (zone de coupe, queue, porte-outil) sous forme de profil et son solide de révolution
collisioncontrôle continu d'un mouvement commun : certifié clair, collision ou non résolu
mouvementcinq axes simultanés : emplacements → poses de table, chaque mouvement divisé et vérifié
actionstock volumétrique sous forme de voxels avec une tranche de volume restant
dédouanement de la machinesupport et tige contre la table à chaque mouvement CN
convexedistance exacte entre les coques convexes (GJK)
Points d'entrée (execute.ts)
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 :

  1. faire face au dessus du stock
  2. rugueux autour des contours et à l'intérieur des poches (adaptatif ou contour, avec une marge murale)
  3. lamages, perçages par points, perçages ou alésages hélicoïdaux, fraisages, fraisage de filetages
  4. finir les murs
  5. casser les bords supérieurs avec un chanfrein 2D lorsqu'un ébavurage est demandé
  6. 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.

flat-6 et assemblyProfile(flat-6) – sortie réelle
{"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}
assemblage à plat 6 sur son balayage Faites glisser vers l'orbite · faites défiler pour zoomer · faites glisser vers la droite pour effectuer un panoramique
Le profil d'assemblage tournait : flûtes r 3 de z 0 à 15 (ambre), tige à z 29, support r 20 à z 79. Pointe au début de la fente ci-dessous, 3 mm dans le haut du stock.

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.

stock.ts
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 }
Fente et anneau de 3 mm de profondeur avec plat-6 — sortie réelle
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
Stock rejoué (limite extérieure) Faites glisser vers l'orbite · faites défiler pour zoomer · faites glisser vers la droite pour effectuer un panoramique
Surface supérieure de chaque colonne de voxels qui n'est même pas éventuellement supprimée, de la course ci-dessus : la fente et l'anneau sont coupés à 3 mm de profondeur (un voxel de mou apparaît sous forme de marches le long des murs).

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.

VerdictSignification
clairsur chaque intervalle, la limite inférieure du jeu est au moins la marge
collisionun point de sonde échantillonné se trouve à l'intérieur d'un obstacle ; à indique où le long du déplacement (0 à 1)
non résoluun intervalle n'a pas pu être prouvé clairement dans la profondeur et aucun chevauchement n'a été trouvé
flat-6 dans une scène linéaire sur tableBox(20, 15, −10, 200, 100, 20) — sortie réelle
// 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ômeCauseRéparer
échec de l'état du travail : version du schéma de travail non prise en chargetravail construit pour un schéma de noyau différentreconstruire le travail avec la version de schéma actuelle
fourchette de volume restant largevoxel trop grossier pour les fonctionnalitésutilisez un voxel plus petit ; le jeu est d'environ un voxel le long de chaque mur
collision sur un rapidele support ou l'enveloppe de tige atteint la table ou la piècerelever le plan de dégagement ou raccourcir la saillie
non résolu sur un long mouvement rotatifla borne Lipschitzienne est faible loin du centre de rotationdiviser le coup, ou accepter la marge que le vérificateur pourrait prouver
opération planifiée avec un cutter inattenduadéquation de la fraise au matériau et à la rigiditépassez une bibliothèque d'outils avec le cutter que vous voulez