Zum Inhalt springen
CADCAMFUN
Doku

Dokumentation

CAM-Bearbeitungskernel

Von einem Fertigungsauftrag bis hin zu NC und Beweisen: Planung, Fräser, Voxelbestand mit Restvolumenhalterung und zertifizierte Kollisionsprüfungen.

Automatisch aus dem Englischen übersetzt. Englisches Original ansehen

Was der CAM-Kernel ist

Der CAM-Kernel in packages/core/src/cam/kernel (20 Quelldateien, ca. 5 260 Zeilen) benötigt einen überarbeiteten Fertigungsauftrag zur maschinellen Bearbeitung von NC sowie Beweise zu dieser NC. Es wählt Fräser und Schnittdaten aus, plant Vorgänge anhand der CAD-Funktionen, führt die Strategien aus, postet G-Code, spielt die NC unabhängig mit dem volumetrischen Rohteil ab und prüft die Bewegung der Werkzeugbaugruppe auf Kollisionen. Seine Algorithmusidentität ist cadcamfun-cam-kernel@1.

ModulRolle
materialienwerkstücksorten mit ihren Bearbeitbarkeitsdaten
fräserwerkzeugbaugruppen und die Standardbibliothek (70 Schneider)
schnittdatengeschwindigkeiten, Vorschübe, Tiefen, Belastung und Durchbiegung für einen Fräser in einem Material
planerCAD-Funktionen → geordnete Operationen mit ihren Fräsern
ausführenvorbereiten/Ausführen: Strategien, Post, unabhängige NC-Wiedergabe, Bestandsherkunft, Ansprüche und Release-Level
kinematik, Kopftrunnion table (AC / BC) and tilting head (B about Y)
montagedie 3D-Werkzeugbaugruppe (Schneidzone, Schaft, Halter) als Profil und ihr Rotationskörper
kollisionkontinuierliche Überprüfung einer gemeinsamen Bewegung: bescheinigt frei, Kollision oder ungelöst
bewegungsimultane Fünf-Achsen-Positionen → Tischpositionen, jede Bewegung aufgeteilt und überprüft
aktievolumenbestand als Voxel mit einer Restvolumenklammer
maschinenräumunghalten Sie Halter und Schaft bei jeder NC-Bewegung gegen den Tisch
konvexgenauer Abstand zwischen konvexen Hüllen (GJK)
Einstiegspunkte (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"

Funktionsbasierte Planung

Der Planer sequenziert ein prismatisches Teil auf die Art und Weise, wie es ein CAM-Programmierer tut, und zwar anhand der Merkmale, die der parametrische Verlauf tatsächlich aufweist:

  1. gesicht zur Schaftoberseite
  2. rau um die Konturen und innerhalb der Taschen (adaptiv oder konturiert, mit Wandzugabe)
  3. senkungen, Anbohren, Bohren oder Spiralbohren, Senken, Gewindefräsen
  4. die Wände fertigstellen
  5. brechen Sie die Oberkanten mit einer 2D-Fase, wenn eine Entgratung erforderlich ist
  6. 3D Schruppen und Schlichten von Freiformkörpern

Ein Körper ohne Feature-Historie (ein Netz, ein Boolescher Wert von Grundelementen, ein geformtes Teil) wird mit den 3D-Oberflächenstrategien bearbeitet. Die Planung wählt nur Tools und Regionen aus. Die Schnittdaten werden pro Vorgang berechnet, wenn der Job ausgeführt wird. Ein realer Lauf an einem 44 × 44 × 11 mm POM-C-Rohling sah drei Arbeitsgänge vor: face mit Planfräser-50, surface-rough mit flat-16 und surface-finish mit ball-10, freigegeben als verified-program mit einer Zykluszeit von 149 s. Dieser Lauf ist eingezeichnet einheimische Fertigung.

Fräser und Werkzeugbaugruppe

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 und AssemblyProfile(flat-6) – echte Ausgabe
{"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}
flache 6-Anordnung über seinen Sweep Zum Orbit ziehen · zum Zoomen scrollen · zum Schwenken mit der rechten Maustaste ziehen
Das Montageprofil drehte sich: Nuten r 3 von z 0 nach 15 (Bernstein), Schaft nach z 29, Halter r 20 nach z 79. Spitze am Anfang des Schlitzes unten, 3 mm in die Schaftoberseite hinein.

Voxel-Bestand und die Restvolumen-Klammer

Stock ist ein Voxelgitter. Nach einer Reihe von Bewegungen ist jedes Voxel materiell, sicher entfernt (sein ganzer Würfel lag an einer abgetasteten Stelle im Fräser) oder entfernt möglich (sein Würfel lag innerhalb der Ausdehnung des Fräsers: eine halbe Diagonale plus die Hälfte des Probenabstands). Das verbleibende Volumen ist daher eine Klammer: möglicherweise nicht entferntes Material bleibt definitiv übrig, nicht sicher entferntes Material kann übrig bleiben. Ein Voxel wird niemals als entfernt bezeichnet, ohne dass ein abgetasteter Schnitt ihn bedeckt. Gekippte Werkzeuge führen ihre Achse pro Spitzenpunkt, sodass bei Fünf-Achsen-Sweeps dieselben beiden Tests verwendet werden.

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 }
Schlitz und Ring 3 mm tief mit Flach-6 – echte Leistung
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
Wiederholter Bestand (äußere Grenze) Zum Orbit ziehen · zum Zoomen scrollen · zum Schwenken mit der rechten Maustaste ziehen
Obere Oberfläche jeder Voxelspalte, die möglicherweise nicht einmal entfernt wurde, aus der obigen Reihe: Der Schlitz und der Ring sind 3 mm tief ausgeschnitten (ein Voxel des Durchhangs wird als Stufen entlang der Wände angezeigt).

Die Klammer wird mit der Voxelgröße schmaler: Durch die Halbierung des Voxels wird das lockere Band entlang jeder Wand halbiert.

Kontinuierliche Kollisionsprüfung

Ein Controller bewegt seine Gelenke linear zwischen zwei Punkten, und es kann zu einer Kollision zwischen ihnen kommen. 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, eine Überlappung wird abgetastet oder die Tiefe (12) geht zur Neige.

UrteilBedeutung
klarin jedem Intervall beträgt die untere Grenze des Abstands mindestens den Spielraum
kollisionein abgetasteter Sondenpunkt liegt innerhalb eines Hindernisses; at gibt an, wo entlang der Bewegung (0 nach 1)
ungelöstein Intervall innerhalb der Tiefe konnte nicht eindeutig nachgewiesen werden, und es wurde keine Überlappung festgestellt
flat-6 in einer linearen Szene über tableBox(20, 15, −10, 200, 100, 20) – echte Ausgabe
// 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}

Die schnelle Meldung 26.875 und nicht die stehende 46.875, da eine gleitende Prüfung eine Untergrenze bestätigt: Sie subtrahiert die Verschiebung über jedes Intervall, das sie nicht weiter unterteilt hat. Die Nose-z-10-Pose zeigt, warum unresolved existiert: Die zertifizierte untere Grenze ist negativ (der Umschlag könnte sich überlappen), es liegt jedoch kein abgetasteter Punkt darin, sodass der Prüfer nach 4 097-Auswertungen meldet, was er beweisen kann, anstatt zu raten. Umschläge sind konservativ: Eine Kapsel umschließt ihr Haltersegment, sodass eine Überlappung gemeldet werden kann, bei der das echte Werkzeug nur nahe kommen würde.

Fehlerbehebung

SymptomUrsacheFix
jobstatus fehlgeschlagen: Nicht unterstützte Jobschemaversionjob, der für ein anderes Kernel-Schema erstellt wurdeerstellen Sie den Job mit der aktuellen schemaVersion neu
restvolumen-Klammer breitvoxel zu grob für die Featuresverwenden Sie ein kleineres Voxel. Der Durchhang beträgt etwa ein Voxel entlang jeder Wand
kollision auf einer Stromschnellehalter oder Schaftumschlag den Tisch oder Teil erreichenerhöhen Sie die Abstandsebene oder verkürzen Sie den Stickout
bei einer langen Drehbewegung ungelöstdie Lipschitz-Grenze ist weit vom Rotationszentrum entfernt schwachteilen Sie den Zug auf oder akzeptieren Sie den Spielraum, den der Dame nachweisen könnte
operation mit einem unerwarteten Cutter geplanteignung des Fräsers für das Material und die Steifigkeitübergeben Sie eine Werkzeugbibliothek mit dem gewünschten Fräser