Vai al contenuto
CADCAMFUN
Documentazione

Documentazione

Interfaccia utente del desktop

Aree di lavoro SolidJS, un client API locale e una shell Tauri che possiede l'integrazione nativa.

Tradotto automaticamente dall'inglese. Vedi l'originale in inglese

Architettura dell'applicazione

L'applicazione desktop combina una visualizzazione web SolidJS, Vite, Three.js e una shell Tauri v2 Rust. La visualizzazione web possiede schermate e stato di interazione. Il sidecar Bun possiede gestori API, accesso al database, sessioni AI e servizi di progetto. Il processo Rust possiede la finestra, i menu, il vassoio, le finestre di dialogo del sistema operativo, l'accesso al portachiavi, gli aggiornamenti e il ciclo di vita del sidecar.

apps/desktop/src/main.tsx monta l'applicazione. app/App.tsx stabilisce la connessione API e fornisce lo stato condiviso; app/routes.tsx mappa gli URL ai moduli di pagina pigri. Schermate delle funzionalità in tempo reale features/. La presenza di un percorso non stabilisce la disponibilità dei suoi servizi esterni: la fatturazione necessita della configurazione di Stripe e l'AI necessita di un provider configurato.

Avvio e ripristino della connessione

  1. La shell avvia il sidecar in bundle con un token di avvio generato, i dati dell'applicazione e le directory di migrazione.
  2. Il sidecar lega un porto effimero 127.0.0.1, attende la risposta del percorso di integrità e scrive un JSON ready evento contenente il porto.
  3. La visualizzazione web invoca get_sidecar_endpoint e crea un client API e un runtime di effetti gestiti.
  4. Una richiesta di integrità riuscita crea lo stato dell'applicazione e monta il router e la shell.

La visualizzazione web concede 150 secondi per il ripristino della connessione, con un timeout di 30 secondi per tentativo e una pausa tra i tentativi di 750 millisecondi. I tentativi falliti eliminano l'endpoint memorizzato nella cache in modo che un sidecar riavviato possa fornire una nuova porta. Il supervisore Rust attende 60 secondi per ogni handshake pronto e consente un riavvio automatico. Il nuovo tentativo diventa disponibile quando scade il budget per la connessione WebView.

L'anteprima del browser utilizza un'API in memoria

Fuori Tauri, un browser senza VITE_SIDECAR_URL usi src/testing/fake-api.ts. I dati di anteprima sono locali rispetto alla pagina in esecuzione; le raccolte non supportate restituiscono HTTP 501. Per connettere un browser a un vero sidecar, forniscili entrambi VITE_SIDECAR_URL e VITE_SIDECAR_TOKEN all'avvio di Vite.

Percorsi sullo schermo

ZonaPercorsi e moduli
Progetti/projects, /projects/create, /projects/:id, e /projects/:id/history; schermi dentro features/projects/screens.
Progettazione e produzione/cad monta CadPage; /cam monta CamPage. I disegni e i percorsi utensile salvati hanno percorsi di dettaglio separati.
Risorse/library, /materials, /tools, /machinee le relative pagine dei dettagli utilizzano i moduli delle funzionalità della libreria. I componenti hanno percorsi di elenco e dettaglio.
Assistente/ai e il pannello assistente ancorato condividono lo stato delle funzionalità AI. L'attività AI attiva/disattiva il pannello.
Impostazioni/settings, /settings/companion, impostazioni MCP e impostazioni di abbonamento.
Conto e collaborazioneAutenticazione, profilo, organizzazione, invito, chat, marketplace, plug-in, costi, analisi e percorsi di amministrazione caricano ogni modulo di funzionalità.

Utilizzo app/routes.tsx per i nomi esatti dei parametri e pages/ per individuare lo schermo montato su un URL. Gli adattatori di percorso sono intenzionalmente piccoli; leggere lo schermo e le relative chiamate API durante la diagnosi di una vista vuota o di un'azione non riuscita.

Organizzazione delle fonti

  • app/: avvio, router, client API globale, integrazione nativa, shell e scorciatoie da tastiera.
  • pages/: gli adattatori di percorso importano o riesportano le schermate.
  • features/: aree di prodotto con schermate, componenti, hook, assistenti di stato e specifici del dominio.
  • shared/: controlli riutilizzabili, componenti della shell, stato dell'applicazione, memorizzazione nella cache delle query e cronologia dei comandi.
  • viewport/: disegno su tela, snap, gesti degli strumenti, rendering Three.js, meshing e riproduzione.
  • i18n/, styles/, e testing/: traduzioni, stili globali e dispositivi di prova.

Il desktop dipende da @cadcamfun/api per il contratto HTTP e così via @cadcamfun/core per operazioni di geometria e CAM. La persistenza del database rimane dietro l'API sidecar. La cronologia dell'editor locale è distinta dalle versioni persistenti del disegno o del percorso utensile e dal controllo della versione del progetto.

Conchiglia nativa

La finestra di produzione è 1440 × 900 per impostazione predefinita, con un minimo di 960 × 600. Tauri mette in scena il frontend da apps/desktop/dist, un sidecar specifico per il target di src-tauri/binariese ha generato migrazioni come risorse. Si registra .cadcam, .nc, e .gcode associazioni di file. L'apertura di un file supportato o l'avvio di una seconda istanza inoltra i percorsi dei file alla finestra esistente.

src-tauri/src/sidecar.rs supervisiona il processo figlio. Chiudendo l'app scrive a {"event":"shutdown"} allinearsi allo stdin del bambino e attendere brevemente prima di raccoglierlo; il bambino osserva anche la chiusura dello stdin. Il token di avvio è di 32 byte casuali, codificato esadecimale come 64 caratteri e le righe di log sidecar che potrebbero contenere credenziali vengono oscurate. I log sono separati da stdout, che trasporta l'handshake ready/error. È possibile accedere ai segreti nativi tramite src-tauri/src/secrets.rs utilizzando il portachiavi del sistema operativo.

Su macOS, la shell registra il plugin Liquid Glass. La visualizzazione web segue l'impostazione del vetro e torna indietro quando l'effetto non è disponibile. La configurazione dell'App Store disabilita l'opzione API privata; la configurazione regolare lo consente. Queste sono configurazioni di build separate.

Limiti di sicurezza e persistenza

La policy del contenuto di produzione consente risorse locali, connessioni API di loopback, immagini di dati/blob e valutazione WebAssembly. Non garantisce l'esecuzione arbitraria di script remoti. L'ambito delle autorizzazioni native è incluso src-tauri/capabilities; la politica di sviluppo consente inoltre Vite e il suo websocket.

open_path canonicalizza i percorsi, li limita alle directory utente/applicazione consentite e rifiuta le estensioni eseguibili come .exe, .app, .sh, .bat, .msi, e .jar. .. segmenti e collegamenti simbolici non possono sfuggire alle cartelle consentite perché entrambi i lati sono canonizzati. La selezione e il salvataggio dei file utilizzano finestre di dialogo e convalida native. Un token di avvio garantisce l'accesso all'API dell'applicazione locale; trattalo separatamente da un token compagno o da un token bridge AI con ambito progetto.

Le impostazioni dell'interfaccia utente, lo stato delle query API, i comandi dell'editor, le versioni del progetto archiviate e i segreti nativi hanno proprietari diversi. Diagnostica ciascuno tramite il suo servizio effettivo anziché presupporre che tutto lo stato dell'applicazione sia archiviato in SQLite.

Integrazione delle funzionalità

I moduli di funzionalità CAD e CAM compongono componenti viewport riutilizzabili con i propri pannelli, archivi e flussi di salvataggio. Il pannello dell'assistente riceve il contesto del progetto e dell'editor e trasmette in streaming gli eventi dello strumento attraverso lo stato della funzionalità AI. Le schermate delle risorse utilizzano il client API invece di accedere direttamente al database.

Per una modifica dell'interfaccia utente, seguire l'adattatore di percorso fino alla relativa schermata delle funzionalità, quindi ispezionare l'archivio delle funzionalità o l'hook che invia la richiesta. Riutilizzare i componenti condivisi solo quando il loro contratto esistente corrisponde all'interazione. Mantieni la geometria pura nel pacchetto principale e il comportamento nativo del sistema operativo nella shell Rust.

Caricamento del percorso ed errori

Ogni percorso utilizza il limite di importazione pigro di Solid. La tabella include una pagina generale, /500, /offlinee vie legali. È necessario fornire una navigazione diretta nel browser tramite il server di sviluppo Vite o la visualizzazione Web in pacchetto in modo che il router client possa risolvere l'URL.

L'API di anteprima implementa un set limitato di raccolte e può inserire deliberatamente richieste non riuscite nei test. Un rendering di anteprima riuscito dimostra il comportamento dell'interfaccia utente rispetto a tali dispositivi; verificare la persistenza, le autorizzazioni, lo streaming e le integrazioni esterne con il sidecar live.

Interfaccia di comando nativa

ComandoScopo
get_sidecar_endpointAttendi il sidecar supervisionato e restituisci l'URL di base e il token di avvio. L'attesa copre un riavvio: due timeout di disponibilità di 60 secondi più 5 secondi (125 secondi).
get_logs_dir, open_pathRisolvi la directory del registro dell'applicazione come stringa e apri un percorso assoluto esistente con l'apri del sistema operativo. I percorsi devono essere risolti nella cartella dati dell'app, registro, documenti, download o desktop.
secret_get, secret_set, secret_deleteAccedi alle voci del portachiavi nativo sotto il file com.cadcamfun.app servizio. Le chiavi sono 1–128 byte di lettere ASCII, cifre e . _ - : (per esempio ai.anthropic.apiKey); secret_get ritorna null per una voce mancante.
pick_file, save_filepick_file({ filters: [{ name, extensions }] }) restituisce il percorso scelto o null all'annullamento. save_file({ defaultName, contents }) scrive il testo UTF-8 nel percorso scelto e lo restituisce, oppure null all'annullamento; le directory e le estensioni eseguibili vengono rifiutate.
set_recent_projectsAggiorna il menu dei progetti recenti del vassoio.
check_for_updates, install_updateRichiedi un controllo dell'aggiornamento o installa un aggiornamento in sospeso. install_update accetta un facoltativo unsavedWork bandiera (predefinito false) in modo che l'installazione non interrompa un editor aperto.

The invoke handler is registered in src-tauri/src/lib.rs. Capabilities and generated command permissions also control availability; command registration alone does not establish webview access. Command errors are serialized as { kind, message } with kinds such as sidecar, invalid_path, io, dialog, and path; no command panics.

Eventi nativi

La conchiglia emette sidecar-status per i cambiamenti del ciclo di vita, open-file con percorsi supportati, menu per la selezione del menu e update://status per l'avanzamento dell'aggiornamento. Le selezioni dei progetti recenti del vassoio sono rappresentate da tray.recent.<projectId> identificatori del menu. Il menu della shell e i moduli del vassoio definiscono i loro set di identificatori completi.

Gli ascoltatori dovrebbero essere limitati al loro componente o al ciclo di vita dell'applicazione e rimossi durante la pulizia. La visualizzazione Web deve risolvere nuovamente l'endpoint dopo un riavvio sidecar anziché continuare a utilizzare la porta precedente.

Sviluppo e verifica

Esegui dalla radice del repository
bun run --filter @cadcamfun/desktop dev
bun run desktop:dev
bun run --filter @cadcamfun/desktop typecheck
bun test apps/desktop/src
bun run build:desktop

Il primo comando esegue un'anteprima del browser. desktop:dev compila il vero sidecar e mette in scena le migrazioni prima di avviare Tauri. Il pacchetto desktop è tauri:dev lo script invece crea uno stub binario solo quando non esiste alcun binario; usalo per il lavoro di shell isolato e controlla quale binario è presente prima di interpretare le sue risposte API.

La scrivania build viene eseguito lo script vite build soltanto; non compila il sidecar né impacchetta un pacchetto Tauri. Utilizzo bun scripts/build.ts per la pipeline di rilascio completa (vedi Pubblicazione).

Preferenze e impostazioni

L'archivio delle impostazioni condivise mantiene un record convalidato in cadcamfun.settings nella memoria locale di Webview. I campi mancanti, non validi o illeggibili rientrano in modo indipendente. Un'area di archiviazione piena o bloccata non interrompe la modifica, ma le modifiche alle preferenze potrebbero non persistere. Le preferenze di anteprima del browser appartengono all'origine del browser e sono separate dalle preferenze di visualizzazione Web native.

CollocamentoValori accettati/predefinitiEffetto operativo
Temalight, dark, system; sistema predefinitoLa modalità di sistema segue le modifiche alla combinazione di colori del sistema operativo.
Unità espositivemm o in; predefinito mmPresentazione dei controlli; le coordinate del disegno principale rimangono millimetri.
DecimaliNumero intero 0–6; predefinito 3Precisione della presentazione della lunghezza.
Posta predefinitagrbl, linuxcnc, smoothwb, gcode, fanuc; grbl predefinitoUna grammatica di output selezionata è una preferenza, non una prova che la macchina sia configurata o verificata.
Tolleranza del disegnoTolleranza centrale convalidata; predefinito 0.01 mmPreferenza di precisione condivisa utilizzata dagli utenti del disegno/percorso utensile.
Stato dello snapBooleano; abilitato per impostazione predefinitaPreferenza di stato condivisa. I singoli redattori possiedono il loro comportamento scattante; quello autonomo Editor2D attualmente abilita internamente lo snap alla griglia.
BicchiereBooleano; abilitato per impostazione predefinitaRichiede il materiale della finestra macOS quando l'host nativo lo supporta.

La schermata Impostazioni contiene le schede Profilo, Account, Sicurezza, Abbonamento, Notifiche, AI, Dispositivi e Lingua. La scheda Dispositivi incorpora il pannello del gateway complementare. Le impostazioni della lingua includono la levetta del vetro. L'archivio locale comune attualmente convalida la locale predefinita; non dedurre ulteriore copertura della traduzione da un elenco di etichette visualizzate.

Salvare e riaprire un programma CAM

  1. Genera o carica il codice NC nel CAM e apri la finestra di dialogo di salvataggio/esportazione dal punto di ingresso esistente.
  2. Per un'esportazione di file, scegli il codice G o il formato del percorso utensile portatile. Il codice G scarica il testo NC corrente; la scelta del percorso utensile scrive un file strutturato .cam.json istantanea.
  3. Per la persistenza dell'applicazione, scegli un progetto esistente, un nuovo progetto o aggiorna il programma già salvato. Fornire il nome del programma e i campi di destinazione richiesti.
  4. Durante l'aggiornamento, il flusso di salvataggio registra il programma completo precedente come versione del percorso utensile prima di sostituire i dati correnti.
  5. Aprire l'elemento salvato nel percorso dei dettagli del percorso utensile per ispezionare o ripristinare le versioni.

Il riepilogo del salvataggio include righe NC, byte, movimenti, identificatori utensile, nomi operazioni, stock, unità, offset pezzo e identità di verifica quando tale prova appartiene all'NC corrente. Un testo NC modificato può rendere obsolete le prove precedentemente calcolate. Esaminare l'attuale relazione codice/evidenza prima di fare affidamento sul riepilogo.

Se la creazione di un nuovo progetto ha esito positivo ma un passaggio di salvataggio successivo non riesce, la modale conserva la destinazione creata per i tentativi e include il relativo identificatore nell'errore. Riprovare all'interno di quella modalità evita di creare nuovamente lo stesso progetto. Non dare per scontato che il flusso di salvataggio sia una transazione atomica tra risorse incrociate.

L'esportazione dei file e la persistenza del progetto sono operazioni diverse

Un file di codice G scaricato non crea una riga del percorso utensile del progetto. Uno snapshot portatile trasporta uno stato più ricco rispetto al semplice NC. Verifica un programma salvato riaprendolo dall'applicazione e verifica un'esportazione controllando il file scaricato.

Diagnosi della tastiera e dei guasti

Cmd/Ctrl+K apre la tavolozza dei comandi e Cmd/Ctrl+J attiva/disattiva il pannello dell'assistente. Le scorciatoie della shell vengono ignorate quando il focus è su un elemento input, textarea, select o content-modificabile. Le tele dell'editor hanno la propria gestione della tastiera. Diversi richiami ai comandi della shell, incluso Salva/Esporta nella tabella di scelta rapida generica, sono segnaposto; utilizzare gli effettivi controlli di salvataggio/esportazione della funzionalità invece di dare per scontato che ogni acceleratore elencato esegua un'operazione sul documento.

Comportamento osservatoControllo
L'avvio attende, quindi viene visualizzato RiprovaOutput di errore/pronto sidecar, file binario di destinazione, risorsa di migrazione e log dell'applicazione. Una porta memorizzata nella cache può appartenere a un processo precedente.
Viene visualizzato uno schermo ma viene richiesto di restituire 501Modalità dispositivo del browser. Avvia il sidecar reale e passa entrambe le variabili dell'endpoint Vite.
I dati del desktop differiscono da uno script manualeLa directory dei dati e il token di ciascun processo; un nome file da solo non identifica il database.
Un comando nativo non è disponibileRichiama la registrazione, le autorizzazioni per le funzionalità, il supporto del sistema operativo e se il codice viene eseguito all'interno di Tauri.
Le impostazioni vengono ripristinate dopo il riavvioDisponibilità e convalida dello spazio di archiviazione. I campi memorizzati non validi tornano ai valori predefiniti.
L'evidenza del programma salvato differisce da NCSe NC è stato modificato dopo la generazione. Ricalcolare la verifica appropriata per il testo/programma effettivo.

Ancore di implementazione: shared/state/settings.ts, app/shortcuts.ts, features/settings/screens/settings.tsx, e features/cam/components/SaveCamModal.tsx.

Payload di eventi nativi

EventoCarico utileNote
sidecar-status{ state: "starting" }, { state: "ready", port }, { state: "restarting" }, { state: "failed", message }Dopo restarting, chiamata get_sidecar_endpoint ancora; il porto cambia.
update://statusstatus: checking, upToDate (version), available (version, notes, date, critical), downloading (downloaded, total), ready (version), failed (message); più dismissibleUn aggiornamento critico e un riavvio in sospeso non sono ignorabili. Un controllo fallito non viene mai visualizzato come errore bloccante.
menuID della voce di menu, ad esempio file.new, file.open, file.save, view.devtools, help.documentationUtilizzo degli articoli del vassoio tray.quit e tray.recent.<projectId>.
open-filePercorsi di .cadcam, .nc, o .gcode fileInviato quando il sistema operativo apre un file con l'app o viene avviata una seconda istanza.
install_update può essere rifiutato con una motivazione digitata: unsavedWork ("l'editor ha del lavoro non salvato; applica l'aggiornamento una volta salvato"), noneAvailable (niente in sospeso o già installato) o failed (download o controllo della firma non riusciti). Installa solo l'aggiornamento annunciato dall'ultimo controllo.
Chiamare comandi nativi dalla visualizzazione web
import { invoke } from "@tauri-apps/api/core"
import { listen } from "@tauri-apps/api/event"

const { baseUrl, token } = await invoke<{ baseUrl: string; token: string }>("get_sidecar_endpoint")

const path = await invoke<string | null>("pick_file", {
  filters: [{ name: "G-code", extensions: ["nc", "gcode"] }],
})                                    // null when the user cancels

await invoke("save_file", { defaultName: "part.nc", contents: gcodeText })

const unlisten = await listen<{ state: string; port?: number }>("sidecar-status", (e) => {
  if (e.payload.state === "ready") reconnect()
})
// later: unlisten()

try {
  await invoke("install_update", { unsavedWork: editorIsDirty })
} catch (error) {
  // { kind, message }: the update variant carries the refusal (unsavedWork | noneAvailable | failed)
}

get_sidecar_endpoint ritorna { baseUrl, token } (serializzato in camelCase da SidecarEndpoint). Gli errori da ogni comando arrivano come valore rifiutato di invoke, sagomato { kind, message }.

Scorciatoie da tastiera

ScorciatoiaAzioneGruppo
Cmd/Ctrl+KApri la tavolozza dei comandinavigazione
Cmd/Ctrl+Shift+PNuovo progettonavigazione
Cmd/Ctrl+Z / Cmd/Ctrl+Shift+ZAnnulla/ripristinamodificare
Cmd/Ctrl+S, Cmd/Ctrl+Shift+ESalva, esporta (segnaposto della shell; utilizza i controlli della funzionalità)modificare
Cmd/Ctrl+0Zoom per adattarevisualizzazione
Cmd/Ctrl+= / Cmd/Ctrl+-Zoom avanti/indietrovisualizzazione
Cmd/Ctrl+JAttiva/disattiva il pannello dell'assistenteai
Cmd si applica su macOS e Ctrl altrove. L'ID di ogni scorciatoia è anche il suffisso della chiave di traduzione (ad esempio settings.shortcut.palette) e la schermata Impostazioni esegue il rendering della stessa tabella, in modo che la documentazione e l'app non possano discostarsi.

Ogni percorso sullo schermo

Il router dentro apps/desktop/src/app/routes.tsx dichiara 68 rotte, ciascuna caricata pigramente da apps/desktop/src/pages/ (i segmenti dinamici sono _id_.tsx file). Raggruppati per primo segmento:

ZonaPercorsi
**
500/500
admin/admin/analytics /admin/feature-flags
ai/ai
analytics/analytics/history /analytics
auth/auth/forgot-password /auth/magic-link /auth/magic-link/verify /auth/reset-password /auth/signin /auth/signup /auth/two-factor /auth/verify-email /auth/verify
cad/cad
cam/cam
costs/costs
components/components/:id /components
drawings/drawings/:id
//
invitations/invitations/:token
legal/legal/privacy /legal/terms /legal/third-party-licenses
library/library
machine/machine/:id /machine
marketplace/marketplace /marketplace/items/:id /marketplace/purchase/success /marketplace/purchases /marketplace/seller/dashboard
materials/materials/:id /materials
mcp/mcp/directory /mcp/servers/:id
offline/offline
organizations/organizations/:id /organizations/:id/chat/:conversationId /organizations/:id/chat /organizations/:id/chat/new-group /organizations/:id/chat/new /organizations/create /organizations
plugins/plugins/:id /plugins
pricing/pricing
profile/profile /profile/settings
projects/projects/:id/history /projects/:id /projects/create /projects
settings/settings /settings/companion /settings/mcp/config-editor /settings/mcp/edit/:id /settings/mcp /settings/subscription
third-party-licenses/third-party-licenses
toolpaths/toolpaths/:id /toolpaths
tools/tools/:id /tools
waitlist/waitlist
* esegue il rendering della pagina 404 e /500 la pagina di errore. /offline esegue il rendering dello schermo offline; come le pagine di autorizzazione, invito, 404, 500 e acquisto riuscito, utilizza il layout autonomo senza l'app Chrome. Poiché ogni pagina è un'importazione lenta, il codice di una schermata viene caricato solo alla prima visita; un caricamento di blocco non riuscito viene visualizzato come errore di percorso, non come app vuota.

Nel 3D

Topologia dei processi desktop Trascina per orbitare · scorri per ingrandire · trascina con il tasto destro per eseguire la panoramica
Processes at run time. The Tauri shell spawns the sidecar and waits for its {”event”:”ready”,”port”:N} line on stdout (sidecar.rs); the webview then talks HTTP to 127.0.0.1 on that port with the bearer token. The sidecar owns the SQLite database, the embedded nikcli AI host (CADCAMFUN_AI_HOST=nikcli, the default) and plugins; the mobile app reaches it through companion pairing.