Documentation
Usinage
Fabrication native, génération de code G basée sur les paramètres, suggestions, analyse et vérification de la relecture.
Traduit automatiquement de l'anglais. Voir l'original en anglais
Envoyez ces demandes à votre propre sidecar en cours d’exécution. Les valeurs restent dans ce navigateur.
Comment ça marche
Le sidecar écoute sur un port de bouclage choisi au démarrage et l'imprime dans son ready doubler; utilisez cette URL et le CADCAMFUN_TOKEN ça a commencé avec. Les demandes vont directement de cette page à cette adresse.
Le sidecar envoie les en-têtes CORS uniquement aux origines Tauri et à http://localhost ou http://127.0.0.1 sur n'importe quel port. À partir des documents hébergés, le navigateur bloque la réponse, exécutez donc les documents localement (bun run dev dans packages/web) pour utiliser le terrain de jeu, ou copiez la requête sous forme curl. Pour expérimenter sans toucher aux données réelles, démarrez le sidecar avec CADCAMFUN_DATA_DIR pointé vers un répertoire jetable — voir la procédure pas à pas de l'API.
Opérations
5 endpoints dans le toolpathGenerator groupe, généré à partir du propre sidecar Document OpenAPI. Les opérations protégées prennent Authorization: Bearer $CADCAMFUN_TOKEN; voir authentification. Le comportement et les limites sont en place le guide du sous-système.
| poste | /api/toolpaths/manufacture | toolpathGenerator.manufacture |
| poste | /api/toolpaths/generate | toolpathGenerator.generate |
| poste | /api/toolpaths/suggest | toolpathGenerator.suggest |
| poste | /api/toolpaths/parse | toolpathGenerator.parse |
| poste | /api/toolpaths/verify | toolpathGenerator.verify |
/api/toolpaths/manufacture
toolpathGenerator.manufacture Nécessite Authorization: Bearer <token>.
{ setupOrientation?: "+Z" | "-Z" | "+X" | "-X" | "+Y" | "-Y" material: string machine?: string machineConfig?: { id: string name: string type: string description?: string | null config: object } origin?: "stock-center" | "stock-corner" finishAllowance?: number scallop?: number schemaVersion: 1 id: string name: string elements: object[] stock?: { width: number height: number depth: number radius?: number x?: number y?: number topZ?: number allowance?: number material?: string elementId?: string } tolerance?: number resolution?: number workOffset?: "G54" | "G55" | "G56" | "G57" | "G58" | "G59" operations?: Array<{ id: string name?: string tool: string rpm?: number feed?: number plungeFeed?: number stepdown?: number stepover?: number coolant?: "off" | "flood" | "mist" radialEngagement?: number strategy: "face" bottom: number } | "mist" radialEngagement?: number strategy: "adaptive" region: { boundary: Array<{ x: number y: number }> islands?: Array<Array<{ x: number y: number }>> } top: number bottom: number allowance?: number } | "mist" radialEngagement?: number strategy: "pocket" region: { boundary: Array<{ x: number y: number }> islands?: Array<Array<{ x: number y: number }>> } top: number bottom: number allowance?: number finish?: boolean within?: { boundary: Array<{ x: number y: number }> islands?: Array<Array<{ x: number y: number }>> } } | "mist" radialEngagement?: number strategy: "profile" loop: Array<{ x: number y: number }> side: "outside" | "inside" top: number bottom: number allowance?: number finish?: boolean tabs?: Array<{ position: number width: number height: number }> leadIn?: "direct" | "arc" | "ramp" | "helix" leadRadius?: number } | "mist" radialEngagement?: number strategy: "bore" center: { x: number y: number } diameter: number top: number bottom: number allowance?: number } | "mist" radialEngagement?: number strategy: "drill" points: Array<{ x: number y: number }> top: number bottom: number cut?: "drill" | "spot" | "tap" | "ream" } | "mist" radialEngagement?: number strategy: "thread" center: { x: number y: number } diameter: number pitch: number internal: boolean top: number length: number rightHand?: boolean } | "mist" radialEngagement?: number strategy: "engrave" paths: Array<{ points: Array<{ x: number y: number }> closed: boolean }> top: number depth: number } | "mist" radialEngagement?: number strategy: "chamfer" loops: Array<{ points: Array<{ x: number y: number }> side: "outside" | "inside" }> top: number width: number tipOffset?: number } | "mist" radialEngagement?: number strategy: "surface" mode: "roughing" | "rest" | "parallel" | "waterline" | "steep-shallow" | "scallop" | "spiral" | "radial" | "flat" slopeAngle?: number allowance?: number scallop?: number clearing?: "contour" | "adaptive" angle?: number restFrom?: string center?: { x: number y: number } } | { id: string name?: string tool: string rpm?: number feed?: number plungeFeed?: number stepdown?: number stepover: number coolant?: "off" | "mist" radialEngagement?: number strategy: "multiaxis" mode?: "parallel" | "contour" | "swarf" top: number angle?: number toolAxis?: "normal" | "lead" lead?: number tilt?: number walls?: Array<{ bottom: Array<{ x: number y: number z: number }> top: Array<{ x: number y: number z: number }> normal: Array<{ x: number y: number z: number }> concaveRadius?: number }> near?: Array<{ x: number y: number z: number }> }> tools?: Array<{ id: string name: string kind: "flat" | "ball" | "bull" | "chamfer" | "spot" | "drill" | "facemill" | "threadmill" | "engraver" | "tap" | "reamer" diameter: number flutes: number material: "hss" | "hss-co" | "carbide" | "pcd" coating: "none" | "tin" | "ticn" | "altin" | "alcrn" | "zrn" | "dlc" | "diamond" cornerRadius?: number angle?: number tipDiameter?: number pitch?: number fluteLength: number shankDiameter: number stickout: number holder?: { diameter: number length: number } maxRpm?: number number?: number }> deburr?: number tabs?: { count: number width: number height: number } subprograms?: boolean nativeCycles?: boolean smoothing?: number postDefinition?: unknown print?: { layerHeight?: number firstLayerHeight?: number walls?: number topLayers?: number bottomLayers?: number infillDensity?: number infillPattern?: "lines" | "grid" | "triangles" | "honeycomb" | "gyroid" | "concentric" supports?: "none" | "buildplate" | "everywhere" supportAngle?: number adhesion?: "none" | "skirt" | "brim" | "raft" brimWidth?: number printSpeed?: number nozzleTemperature?: number bedTemperature?: number fan?: number vase?: boolean orientation?: "as-designed" | "auto" seam?: "nearest" | "aligned" | "random" retractionDistance?: number zHop?: number flow?: number relativeExtrusion?: boolean } progress?: { projectId: string runId: string } }
200 objet | objet application/json
{ status: "ok" value: { schemaVersion: 1 jobId: string material: { id: string name: string iso: string } machine: { id: string name: string post: "generic" | "fanuc" | "grbl" | "linuxcnc" | "haas" | "siemens" | "heidenhain" | "okuma" | "mazak" } setupOrientation?: "+Z" | "-Z" | "+X" | "-X" | "+Y" | "-Y" origin: { x: number y: number z: number } stockBounds: { min: { x: number y: number z: number } max: { x: number y: number z: number } } operations: Array<{ id: string name: string strategy: "face" | "adaptive" | "pocket" | "profile" | "bore" | "drill" | "thread" | "engrave" | "chamfer" | "surface" | "multiaxis" | "print" toolId: string cut: "face" | "slot" | "rough-side" | "finish-wall" | "finish-floor" | "finish-3d" | "spot" | "thread-mill" | "tap" | "ream" | "print" status: "ok" | "failed" cutting?: { cut: "face" | "ream" rpm: number vc: number vcRecommended: number effectiveDiameter: number fz: number chipThickness: number feed: number plungeFeed: number ap: number ae: number stepoverPercent: number rampAngle: number helixPitch: number coolant: "off" | "flood" | "mist" peck?: number chipBreak?: boolean feedPerRev?: number passes?: number mrr: number powerKw: number torqueNm: number forceN: number deflectionMm: number limitedBy: string[] warnings: string[] exceeded: string[] source: string reference: { table: "MATERIALS" row: string rowName: string columns: { [key: string]: number } factors: { [key: string]: number } basis: string } } parameters: object overridden: string[] warnings: string[] startZ?: number cutLength: number timeSeconds: number removedVolume: number }> program: { name: string units: "mm" | "inch" workOffset: "G54" | "G55" | "G56" | "G57" | "G58" | "G59" toolpaths: Array<{ id: string name: string toolId: string spindleRpm: number coolant: "off" | "mist" moves: Array<{ _tag: "Rapid" to: { x: number y: number z: number } rotary?: { a?: number b?: number c?: number } expr?: { x?: unknown y?: unknown z?: unknown feed?: unknown } } | { _tag: "Linear" to: { x: number y: number z: number } feed: number rotary?: { a?: number b?: number c?: number } expr?: { x?: unknown y?: unknown z?: unknown feed?: unknown } } | { _tag: "Arc" to: { x: number y: number z: number } center: { x: number y: number } clockwise: boolean feed: number } | { _tag: "Dwell" seconds: number } | { _tag: "Comment" text: string } | { _tag: "Cycle" cycle: "drill" | "dwell" | "peck" | "chipBreak" | "bore" to: { x: number y: number z: number } feed: number peckDepth: number dwellSeconds: number retractHeight: number pitch?: number } | { _tag: "Orient" a?: number b?: number c?: number } | { _tag: "Assign" variable: { scope: "local" | "global" | "system" index: number } | { name: string } value: unknown } | { _tag: "MacroCall" name: string args: object } | { _tag: "If" condition: { cmp: "eq" | "ne" | "lt" | "le" | "gt" | "ge" a: unknown b: unknown } } | { _tag: "Else" } | { _tag: "EndIf" } | { _tag: "While" condition: { cmp: "eq" | { _tag: "EndWhile" } | { _tag: "Label" name: string } | { _tag: "Goto" label: string direction?: "auto" | "forward" | "backward" condition?: { cmp: "eq" | { _tag: "CycleBegin" family: "heidenhain" number: number name: string params: { [key: string]: number } } | { _tag: "CycleEnd" } | { _tag: "Message" text: string }> operation?: { id: string name: string } }> metadata?: { [key: string]: string } } tools: Array<{ id: string name: string kind: "flat" | "ball" | "bull" | "facemill" | "threadmill" | "engraver" | "reamer" diameter: number flutes: number material: "hss" | "hss-co" | "carbide" | "pcd" coating: "none" | "tin" | "ticn" | "altin" | "alcrn" | "zrn" | "dlc" | "diamond" cornerRadius?: number angle?: number tipDiameter?: number pitch?: number fluteLength: number shankDiameter: number stickout: number holder?: { diameter: number length: number } maxRpm?: number number: number }> nc: string claims: Array<{ id: "bed-fit" | "heated-start" | "layers-rise" | "wall-coverage" | "skin-coverage" | "no-spill" | "filament" | "cutting-data" | "machine-limits" | "operations-complete" | "no-rapid-in-stock" | "holder-clearance" | "no-gouge" | "material-removed" | "nc-replay" | "machine-travel" | "machine-clearance" | "setup-workholding" | "part-coverage" status: "passed" | "failed" | "unsupported" | "unresolved" detail: string }> issues: Array<{ tag: "InvalidInput" | "UnknownMaterial" | "UnknownTool" | "NoSuitableTool" | "UnsupportedCapability" | "GenerationFailed" | "EmptyToolpath" | "MachineLimit" | "RapidInStock" | "HolderCollision" | "Gouge" | "RemainingStock" | "ReplayMismatch" | "Cancelled" severity: "error" | "warning" stage: "prepare" | "plan" | "generate" | "post" | "replay" | "evidence" message: string operationId?: string line?: number point?: { x: number y: number z: number } }> release: "blocked" | "preview" | "verified-program" stock: { initialVolume: number finalVolume: number partVolume: number remainingVolume: number maxRemaining: number cellSize: number fiveAxis?: { voxelMm: number removedLower: number removedUpper: number remainingLower: number remainingUpper: number } } cycleTimeSeconds: number identity: { job: string part: string nc: string algorithm: string } notes: string[] print?: { dialect: "marlin" | "klipper" | "reprap" filament: { material: string densityGcm3: number diameter: number } nozzle: { diameter: number temperature: number bedTemperature: number } layers: number layerHeight: number filamentMm: number filamentGrams: number timeSeconds: number travelMm: number retractions: number lengthByKind: { [key: string]: number } size: { x: number y: number z: number } orientation: string settings: { layerHeight?: number firstLayerHeight?: number walls?: number topLayers?: number bottomLayers?: number infillDensity?: number infillPattern?: "lines" | "grid" | "triangles" | "honeycomb" | "gyroid" | "concentric" supports?: "none" | "buildplate" | "everywhere" supportAngle?: number adhesion?: "none" | "skirt" | "brim" | "raft" brimWidth?: number printSpeed?: number nozzleTemperature?: number bedTemperature?: number fan?: number vase?: boolean orientation?: "as-designed" | "auto" seam?: "nearest" | "aligned" | "random" retractionDistance?: number zHop?: number flow?: number relativeExtrusion?: boolean } } tolerance?: { requested: number terms: Array<{ id: "source-tessellation" | "part-model" | "path" | "nc-rounding" | "stock-replay" mm: number basis: string }> achieved: number unbounded: string[] met: boolean } } } | { status: "failed" issues: Array<{ tag: "InvalidInput" | "Cancelled" severity: "error" | "warning" stage: "prepare" | "evidence" message: string operationId?: string line?: number point?: { x: number y: number z: number } }> }
400 BadRequestEncoded application/json
BadRequestEncoded
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 InternalErrorEncoded application/json
InternalErrorEncoded
Exemple de SDK
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// ToolpathGeneratorManufactureInput
const result = await client.toolpathGenerator.manufacture({
setupOrientation: "+Z",
material: "",
machine: "",
machineConfig: {
id: "",
name: "",
type: "",
config: {}
},
origin: "stock-center",
finishAllowance: 0,
scallop: 0,
schemaVersion: 1,
id: "",
name: "",
elements: [
{}
],
stock: {
width: 0,
height: 0,
depth: 0
},
tolerance: 0,
resolution: 0,
workOffset: "G54",
operations: [
{
id: "",
tool: "",
strategy: "face",
bottom: 0
}
],
tools: [
{
id: "",
name: "",
kind: "flat",
diameter: 0,
flutes: 1,
material: "hss",
coating: "none",
fluteLength: 0,
shankDiameter: 0,
stickout: 0
}
],
deburr: 0,
tabs: {
count: 1,
width: 0,
height: 0
},
subprograms: false,
nativeCycles: false,
smoothing: 0,
postDefinition: null,
print: {},
progress: {
projectId: "",
runId: ""
}
}) curl
curl --request POST "${CADCAMFUN_URL}/api/toolpaths/manufacture" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" \
--header "Content-Type: application/json" \
--data-binary @request.json Essayez-le
/api/toolpaths/generate
toolpathGenerator.generate Nécessite Authorization: Bearer <token>.
{ settings?: { machineType?: "mill" | "lathe" | "3dprinter" operationType?: "contour" | "pocket" | "drill" | "engrave" | "profile" | "threading" | "3d_surface" | "probing" | "multiaxis" | "facing" | "turning" | "boring" | "threading" | "grooving" | "parting" | "knurling" | "standard" | "vase" | "support" | "infill" | "raft" | "brim" material?: "aluminum" | "steel" | "wood" | "plastic" | "brass" | "titanium" | "composite" | "other" toolType?: "endmill" | "ballnose" | "drill" | "vbit" | "chamfer" | "threadmill" | "reamer" | "probe" | "toolsetter" | "turning" | "facing" | "threading" | "grooving" | "boring" | "parting" | "brass" | "hardened" | "ruby" | "standard" toolDiameter?: number flutes?: number depth?: number stepdown?: number stepover?: number feedrate?: number plungerate?: number rpm?: number tolerance?: number offset?: "inside" | "outside" | "center" direction?: "climb" | "conventional" coolant?: boolean finishingPass?: boolean finishingAllowance?: number finishingStrategy?: "contour" | "parallel" | "spiral" | "radial" surfaceStrategy?: "roughing" | "parallel" | "waterline" | "steep-shallow" | "scallop" | "spiral" | "radial" | "flat" steepAngle?: number surfaceClearing?: "contour" | "adaptive" adaptiveEngagement?: number scallop?: number rasterAngle?: number rasterOneWay?: boolean useAI?: boolean aiDifficulty?: "simple" | "moderate" | "complex" aiOptimize?: "speed" | "quality" | "balance" optimizePath?: boolean useArcFitting?: boolean useHighSpeedMode?: boolean useExactStop?: boolean useToolCompensation?: boolean useAdaptiveFeeds?: boolean useRestMachining?: boolean restToolDiameter?: number fiveAxisStrategy?: "parallel" | "contour" fiveAxisToolAxis?: "normal" | "lead" fiveAxisLead?: number fiveAxisTilt?: number fiveAxisGouge?: boolean toolNumber?: number workOffset?: "G54" | "G55" | "G56" | "G57" | "G58" | "G59" probeCycle?: "zSurface" | "edgeX" | "edgeY" | "corner" | "bore" | "boss" | "toolLength" probeFeed?: number probeSearch?: number probeStylus?: number probeDialect?: "linuxcnc" | "fanuc" probeFeatureSize?: number threadPitch?: number threadType?: "internal" | "external" threadHand?: "right" | "left" threadPasses?: number threadSpringPasses?: number latheZero?: "face" | "chuck" bedOrigin?: "corner" | "center" nozzleDiameter?: number filamentDiameter?: number layerHeight?: number extrusionWidth?: number printSpeed?: number printTemperature?: number bedWidth?: number bedDepth?: number centerOnBed?: boolean bedTemperature?: number stockDiameter?: number stockLength?: number spindleDirection?: "cw" | "ccw" turningOperation?: "external" | "internal" | "face" applyToolCompensation?: boolean workholding?: "vise" | "clamps" | "plate" | "none" viseJawAxis?: "x" | "y" clampDepth?: number viseJawHeight?: number parallelsHeight?: number workholdingConfigured?: boolean latheTurret?: "rear" | "front" chuckType?: "3-jaw" | "4-jaw" | "collet" noseRadius?: number gripLength?: number tailstock?: boolean stockBore?: number printerKinematics?: "cartesian" | "corexy" | "bed-slinger" | "delta" buildHeight?: number originType?: "workpiece-center" | "workpiece-corner" | "workpiece-corner2" | "machine-zero" | "custom" originX?: number originY?: number originZ?: number } geometry?: { geometryType?: "rectangle" | "circle" | "polygon" | "custom" | "selected" | "cube" | "sphere" | "cylinder" | "cone" | "extrude" | "line" | "pyramid" | "hemisphere" | "ellipsoid" | "capsule" | "triangle" | "ellipse" | "prism" rectangleWidth?: number rectangleHeight?: number circleRadius?: number polygonSides?: number polygonRadius?: number customPath?: string selectedElements?: object[] stock?: { width: number height: number depth: number radius?: number x?: number y?: number topZ?: number allowance?: number material?: string elementId?: string } } printer?: { infillDensity?: number infillPattern?: "grid" | "lines" | "triangles" | "honeycomb" | "gyroid" | "concentric" supportType?: "none" | "minimal" | "full" shellCount?: number printResolution?: "standard" | "high" | "low" printOrientation?: "original" | "auto-optimal" filament?: "pla" | "petg" | "abs" | "asa" | "tpu" | "nylon" | "pc" topLayers?: number bottomLayers?: number firstLayerHeight?: number firstLayerSpeed?: number outerWallSpeed?: number infillSpeed?: number bridgeSpeed?: number supportSpeed?: number travelSpeed?: number retractionDistance?: number retractionSpeed?: number retractMinTravel?: number zHop?: number fanSpeed?: number fanFromLayer?: number minLayerTime?: number flow?: number seam?: "nearest" | "aligned" | "random" outerWallFirst?: boolean supportAngle?: number supportDensity?: number supportXYGap?: number supportZGap?: number supportInterfaceLayers?: number adhesion?: "none" | "skirt" | "brim" | "raft" brimWidth?: number skirtLoops?: number skirtDistance?: number raftLayers?: number flavor?: "marlin" | "klipper" | "reprap" relativeExtrusion?: boolean pressureAdvance?: number acceleration?: number startGcode?: string endGcode?: string } machine?: { id: string name?: string axes?: 3 | 4 | 5 controller?: string fiveAxis?: { layout: "table-AC" | "table-BC" tilt: { min: number max: number } rotation?: { min: number max: number } pivot?: { x: number y: number z: number } tcp?: "control" | "program" } } stamp?: string evidence?: boolean progress?: { projectId: string runId: string } }
200 objet application/json
{ gcode: string cycles: Array<{ gcode: string }> warnings: string[] stats: { lines: number cutLength: number rapidLength: number minZ: number maxZ: number estimatedSeconds: number bounds: { min: { x: number y: number z: number } max: { x: number y: number z: number } } } program: { name: string units: "mm" | "inch" workOffset: "G54" | "G55" | "G56" | "G57" | "G58" | "G59" toolpaths: Array<{ id: string name: string toolId: string spindleRpm: number coolant: "off" | "flood" | "mist" moves: Array<{ _tag: "Rapid" to: { x: number y: number z: number } rotary?: { a?: number b?: number c?: number } expr?: { x?: unknown y?: unknown z?: unknown feed?: unknown } } | { _tag: "Linear" to: { x: number y: number z: number } feed: number rotary?: { a?: number b?: number c?: number } expr?: { x?: unknown y?: unknown z?: unknown feed?: unknown } } | { _tag: "Arc" to: { x: number y: number z: number } center: { x: number y: number } clockwise: boolean feed: number } | { _tag: "Dwell" seconds: number } | { _tag: "Comment" text: string } | { _tag: "Cycle" cycle: "drill" | "dwell" | "peck" | "chipBreak" | "tap" | "ream" | "bore" to: { x: number y: number z: number } feed: number peckDepth: number dwellSeconds: number retractHeight: number pitch?: number } | { _tag: "Orient" a?: number b?: number c?: number } | { _tag: "Assign" variable: { scope: "local" | "global" | "system" index: number } | { name: string } value: unknown } | { _tag: "MacroCall" name: string args: object } | { _tag: "If" condition: { cmp: "eq" | "ne" | "lt" | "le" | "gt" | "ge" a: unknown b: unknown } } | { _tag: "Else" } | { _tag: "EndIf" } | { _tag: "While" condition: { cmp: "eq" | { _tag: "EndWhile" } | { _tag: "Label" name: string } | { _tag: "Goto" label: string direction?: "auto" | "forward" | "backward" condition?: { cmp: "eq" | { _tag: "CycleBegin" family: "heidenhain" number: number name: string params: { [key: string]: number } } | { _tag: "CycleEnd" } | { _tag: "Message" text: string }> operation?: { id: string name: string } }> metadata?: { [key: string]: string } } evidence?: { schema: "cadcamfun/program-record@1" inputs: { digest: string machineType: string operationType: string material: string elements: string[] stock?: { width: number height: number depth: number topZ: number } } tool: { type: string diameter: number flutes: number } process: { rpm: number feed: number plunge: number stepdown: number stepover: number coolant: boolean } cuttingData: { status: "kernel" | "manual" | "not-applicable" detail: string recommended?: { rpm: number feed: number plunge: number stepdown: number } reference?: { table: "MATERIALS" row: string rowName: string columns: { [key: string]: number } factors: { [key: string]: number } basis: string } } program: { sha256: string lines: number cutLength: number estimatedSeconds: number } checks: Array<{ id: "generated" | "cutting-data" | "safe-height" | "no-rapid-in-material" | "tool-clearance" | "within-stock" | "no-gouge" | "nc-interpretation" | "bed-fit" | "heated-start" | "layers-rise" | "wall-coverage" | "skin-coverage" | "no-spill" | "filament" status: "passed" | "failed" | "unresolved" | "not-run" detail: string line?: number }> result: "passed" | "warnings" | "failed" } print?: { layers: number filamentMm: number filamentGrams: number timeSeconds: number travelMm: number retractions: number lengthByKind: { [key: string]: number } size: { x: number y: number z: number } } }
400 BadRequestEncoded application/json
BadRequestEncoded
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 InternalErrorEncoded application/json
InternalErrorEncoded
récupérer un exemple
// Not generated in the Promise SDK (multipart, binary or raw body): call it with fetch.
const response = await fetch(`${process.env.CADCAMFUN_URL}/api/toolpaths/generate`, {
method: "POST",
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
}) curl
curl --request POST "${CADCAMFUN_URL}/api/toolpaths/generate" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" \
--header "Content-Type: application/json" \
--data-binary @request.json Essayez-le
/api/toolpaths/suggest
toolpathGenerator.suggest Nécessite Authorization: Bearer <token>.
{ settings?: { machineType?: "mill" | "lathe" | "3dprinter" operationType?: "contour" | "pocket" | "drill" | "engrave" | "profile" | "threading" | "3d_surface" | "probing" | "multiaxis" | "facing" | "turning" | "boring" | "threading" | "grooving" | "parting" | "knurling" | "standard" | "vase" | "support" | "infill" | "raft" | "brim" material?: "aluminum" | "steel" | "wood" | "plastic" | "brass" | "titanium" | "composite" | "other" toolType?: "endmill" | "ballnose" | "drill" | "vbit" | "chamfer" | "threadmill" | "reamer" | "probe" | "toolsetter" | "turning" | "facing" | "threading" | "grooving" | "boring" | "parting" | "brass" | "hardened" | "ruby" | "standard" toolDiameter?: number flutes?: number depth?: number stepdown?: number stepover?: number feedrate?: number plungerate?: number rpm?: number tolerance?: number offset?: "inside" | "outside" | "center" direction?: "climb" | "conventional" coolant?: boolean finishingPass?: boolean finishingAllowance?: number finishingStrategy?: "contour" | "parallel" | "spiral" | "radial" surfaceStrategy?: "roughing" | "parallel" | "waterline" | "steep-shallow" | "scallop" | "spiral" | "radial" | "flat" steepAngle?: number surfaceClearing?: "contour" | "adaptive" adaptiveEngagement?: number scallop?: number rasterAngle?: number rasterOneWay?: boolean useAI?: boolean aiDifficulty?: "simple" | "moderate" | "complex" aiOptimize?: "speed" | "quality" | "balance" optimizePath?: boolean useArcFitting?: boolean useHighSpeedMode?: boolean useExactStop?: boolean useToolCompensation?: boolean useAdaptiveFeeds?: boolean useRestMachining?: boolean restToolDiameter?: number fiveAxisStrategy?: "parallel" | "contour" fiveAxisToolAxis?: "normal" | "lead" fiveAxisLead?: number fiveAxisTilt?: number fiveAxisGouge?: boolean toolNumber?: number workOffset?: "G54" | "G55" | "G56" | "G57" | "G58" | "G59" probeCycle?: "zSurface" | "edgeX" | "edgeY" | "corner" | "bore" | "boss" | "toolLength" probeFeed?: number probeSearch?: number probeStylus?: number probeDialect?: "linuxcnc" | "fanuc" probeFeatureSize?: number threadPitch?: number threadType?: "internal" | "external" threadHand?: "right" | "left" threadPasses?: number threadSpringPasses?: number latheZero?: "face" | "chuck" bedOrigin?: "corner" | "center" nozzleDiameter?: number filamentDiameter?: number layerHeight?: number extrusionWidth?: number printSpeed?: number printTemperature?: number bedWidth?: number bedDepth?: number centerOnBed?: boolean bedTemperature?: number stockDiameter?: number stockLength?: number spindleDirection?: "cw" | "ccw" turningOperation?: "external" | "internal" | "face" applyToolCompensation?: boolean workholding?: "vise" | "clamps" | "plate" | "none" viseJawAxis?: "x" | "y" clampDepth?: number viseJawHeight?: number parallelsHeight?: number workholdingConfigured?: boolean latheTurret?: "rear" | "front" chuckType?: "3-jaw" | "4-jaw" | "collet" noseRadius?: number gripLength?: number tailstock?: boolean stockBore?: number printerKinematics?: "cartesian" | "corexy" | "bed-slinger" | "delta" buildHeight?: number originType?: "workpiece-center" | "workpiece-corner" | "workpiece-corner2" | "machine-zero" | "custom" originX?: number originY?: number originZ?: number } geometry?: { geometryType?: "rectangle" | "circle" | "polygon" | "custom" | "selected" | "cube" | "sphere" | "cylinder" | "cone" | "extrude" | "line" | "pyramid" | "hemisphere" | "ellipsoid" | "capsule" | "triangle" | "ellipse" | "prism" rectangleWidth?: number rectangleHeight?: number circleRadius?: number polygonSides?: number polygonRadius?: number customPath?: string selectedElements?: object[] stock?: { width: number height: number depth: number radius?: number x?: number y?: number topZ?: number allowance?: number material?: string elementId?: string } } }
200 objet application/json
{ parameters?: { depth: number stepdown: number operationType: "contour" | "pocket" | "drill" | "engrave" | "profile" | "threading" | "3d_surface" | "probing" | "multiaxis" | "facing" | "turning" | "boring" | "threading" | "grooving" | "parting" | "knurling" | "standard" | "vase" | "support" | "infill" | "raft" | "brim" } suggestions: string[] feedback: string statistics: { cuttingSpeed: number chipLoad: number materialRemovalRate: number effectiveStepover: number } operation: { title: string description: string } warnings: string[] }
400 BadRequestEncoded application/json
BadRequestEncoded
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 InternalErrorEncoded application/json
InternalErrorEncoded
récupérer un exemple
// Not generated in the Promise SDK (multipart, binary or raw body): call it with fetch.
const response = await fetch(`${process.env.CADCAMFUN_URL}/api/toolpaths/suggest`, {
method: "POST",
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
}) curl
curl --request POST "${CADCAMFUN_URL}/api/toolpaths/suggest" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" \
--header "Content-Type: application/json" \
--data-binary @request.json Essayez-le
/api/toolpaths/parse
toolpathGenerator.parse Nécessite Authorization: Bearer <token>.
{ gcode: string name?: string }
200 objet application/json
{ warnings: string[] stats: { lines: number cutLength: number rapidLength: number minZ: number maxZ: number estimatedSeconds: number bounds: { min: { x: number y: number z: number } max: { x: number y: number z: number } } } program: { name: string units: "mm" | "inch" workOffset: "G54" | "G55" | "G56" | "G57" | "G58" | "G59" toolpaths: Array<{ id: string name: string toolId: string spindleRpm: number coolant: "off" | "flood" | "mist" moves: Array<{ _tag: "Rapid" to: { x: number y: number z: number } rotary?: { a?: number b?: number c?: number } expr?: { x?: unknown y?: unknown z?: unknown feed?: unknown } } | { _tag: "Linear" to: { x: number y: number z: number } feed: number rotary?: { a?: number b?: number c?: number } expr?: { x?: unknown y?: unknown z?: unknown feed?: unknown } } | { _tag: "Arc" to: { x: number y: number z: number } center: { x: number y: number } clockwise: boolean feed: number } | { _tag: "Dwell" seconds: number } | { _tag: "Comment" text: string } | { _tag: "Cycle" cycle: "drill" | "dwell" | "peck" | "chipBreak" | "tap" | "ream" | "bore" to: { x: number y: number z: number } feed: number peckDepth: number dwellSeconds: number retractHeight: number pitch?: number } | { _tag: "Orient" a?: number b?: number c?: number } | { _tag: "Assign" variable: { scope: "local" | "global" | "system" index: number } | { name: string } value: unknown } | { _tag: "MacroCall" name: string args: object } | { _tag: "If" condition: { cmp: "eq" | "ne" | "lt" | "le" | "gt" | "ge" a: unknown b: unknown } } | { _tag: "Else" } | { _tag: "EndIf" } | { _tag: "While" condition: { cmp: "eq" | { _tag: "EndWhile" } | { _tag: "Label" name: string } | { _tag: "Goto" label: string direction?: "auto" | "forward" | "backward" condition?: { cmp: "eq" | { _tag: "CycleBegin" family: "heidenhain" number: number name: string params: { [key: string]: number } } | { _tag: "CycleEnd" } | { _tag: "Message" text: string }> operation?: { id: string name: string } }> metadata?: { [key: string]: string } } motion?: { paths: Array<{ count: number runs: Array<{ start: number spindle: "cw" | "ccw" | "off" rpm: number css: boolean plane: 17 | 18 | 19 xMode: "diameter" | "radius" tool?: number coolant: "off" | "flood" | "mist" feedMode: "min" | "rev" probe?: boolean }> extrude?: number[] lines?: number[] rpm?: number[] retracts?: number[] homes?: number[] }> unsupported: Array<{ line: number word: string }> } }
400 BadRequestEncoded application/json
BadRequestEncoded
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 InternalErrorEncoded application/json
InternalErrorEncoded
Exemple de SDK
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// ToolpathGeneratorParseInput
const result = await client.toolpathGenerator.parse({
gcode: "",
name: ""
}) curl
curl --request POST "${CADCAMFUN_URL}/api/toolpaths/parse" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" \
--header "Content-Type: application/json" \
--data-binary @request.json Essayez-le
/api/toolpaths/verify
toolpathGenerator.verify Nécessite Authorization: Bearer <token>.
{ gcode?: string program?: { name: string units: "mm" | "inch" workOffset: "G54" | "G55" | "G56" | "G57" | "G58" | "G59" toolpaths: Array<{ id: string name: string toolId: string spindleRpm: number coolant: "off" | "flood" | "mist" moves: Array<{ _tag: "Rapid" to: { x: number y: number z: number } rotary?: { a?: number b?: number c?: number } expr?: { x?: unknown y?: unknown z?: unknown feed?: unknown } } | { _tag: "Linear" to: { x: number y: number z: number } feed: number rotary?: { a?: number b?: number c?: number } expr?: { x?: unknown y?: unknown z?: unknown feed?: unknown } } | { _tag: "Arc" to: { x: number y: number z: number } center: { x: number y: number } clockwise: boolean feed: number } | { _tag: "Dwell" seconds: number } | { _tag: "Comment" text: string } | { _tag: "Cycle" cycle: "drill" | "dwell" | "peck" | "chipBreak" | "tap" | "ream" | "bore" to: { x: number y: number z: number } feed: number peckDepth: number dwellSeconds: number retractHeight: number pitch?: number } | { _tag: "Orient" a?: number b?: number c?: number } | { _tag: "Assign" variable: { scope: "local" | "global" | "system" index: number } | { name: string } value: unknown } | { _tag: "MacroCall" name: string args: object } | { _tag: "If" condition: { cmp: "eq" | "ne" | "lt" | "le" | "gt" | "ge" a: unknown b: unknown } } | { _tag: "Else" } | { _tag: "EndIf" } | { _tag: "While" condition: { cmp: "eq" | { _tag: "EndWhile" } | { _tag: "Label" name: string } | { _tag: "Goto" label: string direction?: "auto" | "forward" | "backward" condition?: { cmp: "eq" | { _tag: "CycleBegin" family: "heidenhain" number: number name: string params: { [key: string]: number } } | { _tag: "CycleEnd" } | { _tag: "Message" text: string }> operation?: { id: string name: string } }> metadata?: { [key: string]: string } } stock: { minX: number maxX: number minY: number maxY: number minZ: number maxZ: number } tool: { kind?: "endmill" | "ballnose" | "drill" | "vbit" | "facemill" diameter: number cuttingLength?: number shankDiameter?: number stickout?: number holderDiameter?: number holderLength?: number angle?: number tipRadius?: number } fixtures?: Array<{ id: string bounds: { minX: number maxX: number minY: number maxY: number minZ: number maxZ: number } }> target?: { solids: Array<{ _tag: "Box" origin: { x: number y: number z: number } size: { x: number y: number z: number } } | { _tag: "Cylinder" origin: { x: number y: number z: number } radius: number height: number segments: number axis?: "z" | "x" | "y" } | { _tag: "Sphere" center: { x: number y: number z: number } radius: number rings: number } | { _tag: "Cone" origin: { x: number y: number z: number } baseRadius: number topRadius: number height: number segments: number axis?: "z" | { _tag: "Torus" center: { x: number y: number z: number } majorRadius: number minorRadius: number rotation?: number majorSegments: number minorSegments: number axis?: "z" | { _tag: "Extrude" profile: Array<{ x: number y: number }> height: number origin?: { x: number y: number z: number } } | { _tag: "Revolve" profile: Array<{ x: number y: number }> angle: number segments?: number }> meshes?: Array<{ positions: number[] indices: number[] }> reliefs?: Array<{ x: number y: number radius: number bottom: number reason: string }> } resolution?: number tolerance?: number start?: { x: number y: number z: number } }
200 objet application/json
{ ok: boolean issues: Array<{ code: "InvalidInput" | "InterpreterWarning" | "RapidInMaterial" | "ShankCollision" | "HolderCollision" | "FixtureCollision" | "BelowStock" | "Gouge" | "UncutStock" | "ResolutionCoarsened" severity: "error" | "warning" | "info" message: string line?: number point?: { x: number y: number z: number } count: number fixtureId?: string }> stats: { cellSize: number cellsX: number cellsY: number samples: number stockVolume: number removedVolume: number remainingVolume: number engagedLength: number airCutLength: number gougeVolume?: number maxGouge?: number uncutVolume?: number maxUncut?: number } preview: { nx: number ny: number minX: number minY: number cellX: number cellY: number minZ: number maxZ: number heights: number[] gouge: number[] } }
400 BadRequestEncoded application/json
BadRequestEncoded
401 UnauthorizedEncoded application/json
UnauthorizedEncoded
500 InternalErrorEncoded application/json
InternalErrorEncoded
Exemple de SDK
import { CadCam } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
// ToolpathGeneratorVerifyInput
const result = await client.toolpathGenerator.verify({
gcode: "",
program: {
name: "",
units: "mm",
workOffset: "G54",
toolpaths: [
{
id: "",
name: "",
toolId: "",
spindleRpm: 0,
coolant: "off",
moves: [
{
_tag: "Rapid",
to: {
x: null,
y: null,
z: null
}
}
]
}
]
},
stock: {
minX: 0,
maxX: 0,
minY: 0,
maxY: 0,
minZ: 0,
maxZ: 0
},
tool: {
diameter: 0
},
fixtures: [
{
id: "",
bounds: {
minX: 0,
maxX: 0,
minY: 0,
maxY: 0,
minZ: 0,
maxZ: 0
}
}
],
target: {
solids: [
{
_tag: "Box",
origin: {
x: 0,
y: 0,
z: 0
},
size: {
x: 0,
y: 0,
z: 0
}
}
]
},
resolution: 0,
tolerance: 0,
start: {
x: 0,
y: 0,
z: 0
}
}) curl
curl --request POST "${CADCAMFUN_URL}/api/toolpaths/verify" \
--header "Authorization: Bearer ${CADCAMFUN_TOKEN}" \
--header "Content-Type: application/json" \
--data-binary @request.json Essayez-le
Schémas
Schémas nommés accessibles à partir des paramètres, des corps et des réponses de ce groupe. UN ? marque un champ facultatif ; | null marque un champ qui peut être présent avec une valeur nulle.
BadRequestEncoded{ _tag: "BadRequest" message: string }
InternalErrorEncoded{ _tag: "InternalError" message: string }
Appel à ce groupe
Les identifiants d'opération ont la forme toolpathGenerator.<name>. Le SDK Promise généré (@cadcamfun/api/sdk) expose la plupart d'entre eux comme client.<namespace>.<method>(input), où input est un objet plat composé de paramètres de chemin et de champs de corps ; L'exemple de SDK de chaque carte montre l'accesseur exact et le type d'entrée. Les téléchargements en plusieurs parties, les réponses binaires ou JavaScript et les webhooks bruts ne sont pas générés ; ces cartes montrent fetch à la place.
import { CadCam, ClientError } from "@cadcamfun/api/sdk"
const client = CadCam.make({
baseUrl: process.env.CADCAMFUN_URL!,
headers: { authorization: `Bearer ${process.env.CADCAMFUN_TOKEN}` },
})
try {
await client.projects.list()
} catch (error) {
if (error instanceof ClientError) {
// Transport | UnexpectedStatus | UnsupportedContentType | MalformedResponse | SseEventTooLarge
} else {
// a declared error body: switch on error._tag
}
} Dépannage
| Symptôme | Cause probable | Réparer |
|---|---|---|
| 401 à chaque appel | Jeton d'un lancement précédent, ou manquant Bearer préfixe | Envoyer Authorization: Bearer <token> avec le jeton avec lequel le sidecar a été démarré. |
| 400 avant que quoi que ce soit se produise | Le corps ou le paramètre ne correspond pas au schéma | Comparez la charge utile avec le schéma de demande sur la carte. |
| 403 ou 404 sur un enregistrement visible ailleurs | Le compte intérimaire diffère | Envoyez le droit x-session-token, ou utilisez le profil local propriétaire de l'enregistrement. |
| 409 | État conflictuel, tel qu'un nom en double ou un chef de succursale obsolète | Relisez la ressource et réessayez avec les données actuelles. |
| Essayez, il est écrit "bloqué par CORS" | Les documents sont servis à partir d'une origine sans bouclage | Exécutez la documentation localement ou copiez la demande en tant que curl. |
| Connexion rejetée | Le sidecar a redémarré sur un nouveau port | Lire le port du nouveau ready ligne. |