Документация
Обработка
Собственное производство, генерация G-кода на основе настроек, предложения, анализ и проверка воспроизведения.
Автоматически переведено с английского. Смотреть оригинал на английском
Отправьте эти запросы на свою работающую сайдкар. Значения остаются в этом браузере.
Как это работает
Сайдкар прослушивает порт обратной связи, выбранный при запуске, и печатает его в своем ready линия; используйте этот URL-адрес и CADCAMFUN_TOKEN с этого началось. Запросы идут прямо с этой страницы на этот адрес.
Sidecar отправляет заголовки CORS только источникам Tauri и http://localhost или http://127.0.0.1 в любом порту. Из размещенных документов браузер блокирует ответ, поэтому запускайте документы локально (bun run dev в packages/web), чтобы использовать игровую площадку, или скопируйте запрос как завиток. Чтобы поэкспериментировать, не затрагивая реальные данные, запустите сайдкар с помощью CADCAMFUN_DATA_DIR указал на одноразовый каталог — см. пошаговое руководство по API.
Операции
5 endpoint в toolpathGenerator группа, созданная на основе собственной сайдкара документ OpenAPI. Защищенные операции занимают Authorization: Bearer $CADCAMFUN_TOKEN; видеть аутентификация. Поведение и ограничения находятся в руководство по подсистеме.
| почта | /api/toolpaths/manufacture | toolpathGenerator.manufacture |
| почта | /api/toolpaths/generate | toolpathGenerator.generate |
| почта | /api/toolpaths/suggest | toolpathGenerator.suggest |
| почта | /api/toolpaths/parse | toolpathGenerator.parse |
| почта | /api/toolpaths/verify | toolpathGenerator.verify |
/api/toolpaths/manufacture
toolpathGenerator.manufacture Требует 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 объект | объект 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
Пример 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 Попробуйте это
/api/toolpaths/generate
toolpathGenerator.generate Требует 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 объект 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
взять пример
// 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 Попробуйте это
/api/toolpaths/suggest
toolpathGenerator.suggest Требует 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 объект 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
взять пример
// 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 Попробуйте это
/api/toolpaths/parse
toolpathGenerator.parse Требует Authorization: Bearer <token>.
{ gcode: string name?: string }
200 объект 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
Пример 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 Попробуйте это
/api/toolpaths/verify
toolpathGenerator.verify Требует 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 объект 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
Пример 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 Попробуйте это
Схемы
Именованные схемы, доступные из параметров, тел и ответов этой группы. А ? отмечает необязательное поле; | null отмечает поле, которое может иметь нулевое значение.
BadRequestEncoded{ _tag: "BadRequest" message: string }
InternalErrorEncoded{ _tag: "InternalError" message: string }
Звонок в эту группу
Идентификаторы операций имеют вид toolpathGenerator.<name>. Сгенерированный Promise SDK (@cadcamfun/api/sdk) выставляет большинство из них как client.<namespace>.<method>(input), где input представляет собой один плоский объект параметров пути и полей тела; В примере SDK каждой карты показаны точный метод доступа и тип ввода. Многочастные загрузки, двоичные ответы или ответы JavaScript, а также необработанные веб-перехватчики не генерируются; эти карты показывают fetch вместо этого.
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
}
} Поиск неисправностей
| Симптом | Вероятная причина | Исправить |
|---|---|---|
| 401 на каждый вызов | Токен от предыдущего запуска или отсутствует Bearer префикс | Отправлять Authorization: Bearer <token> с жетоном, с которого была запущена сайдкар. |
| 400 до того как что-либо произойдёт | Тело или параметр не соответствует схеме | Сравните полезную нагрузку со схемой запроса на карте. |
| 403 или 404 у записи, которую видно в другом месте | Действующий счет отличается | Отправить право x-session-tokenили используйте локальный профиль, которому принадлежит запись. |
| 409 | Конфликтующее состояние, например повторяющееся имя или устаревший заголовок ветки. | Перечитайте ресурс и повторите попытку с текущими данными. |
| Попробуйте, написано «заблокировано CORS». | Документы подаются из источника без обратной связи. | Запустите документы локально или скопируйте запрос как curl. |
| В соединении отказано | Сайдкар перезапустилась в новом порту | Прочтите порт из нового ready строка. |