Sposta 'Pulisci raw e step' e 'Cambia cartella' nel menu File, rinomina 'Nuovo'
Fase 1 (Database) aveva 4 bottoni tutti sullo stesso piano visivo: due configurano il DB, gli altri due (cambio cartella di lavoro, pulizia raw/step) sono azioni occasionali di manutenzione, non passi del wizard. Spostate in File → "Scegli cartella di lavoro..." e "Pulisci raw e step...", raggiungibili in qualunque momento invece che solo dalla fase 1. "File → Nuova estrazione" diventa "Nuovo"; corretto anche un bug per cui InizializzaCartellaLavoro non richiamava AggiornaStatoAvanti, lasciando "Avanti" disabilitato in fase 1 finché non si toccava un altro controllo anche a DB e cartella già caricati all'avvio. Doc aggiornati nello stesso commit: CLAUDE.md, docs/architettura.md, GuidaForm.cs. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
e29a1bf90a
commit
3e9c78074c
4 files changed
+55
-53
No files matched your search
@@ -73,10 +73,11 @@ che conta per capire il prodotto.
|
|||||||
designer visuale):
|
designer visuale):
|
||||||
|
|
||||||
1. **Database** — carica/aggiorna `cad_index.db` (`Indexer.ScanAsync`, radice disco di
|
1. **Database** — carica/aggiorna `cad_index.db` (`Indexer.ScanAsync`, radice disco di
|
||||||
default `X:\` hardcoded in `RadiceDiscoDefault`); qui vive anche la **cartella di lavoro**
|
default `X:\` hardcoded in `RadiceDiscoDefault`); mostra anche la **cartella di lavoro**
|
||||||
(destinazione di CSV/`raw/`/`step/`), proposta dall'ultima usata o dalla cartella del DB se
|
(destinazione di CSV/`raw/`/`step/`), proposta dall'ultima usata o dalla cartella del DB se
|
||||||
non c'è ancora nulla di salvato — vedi `docs/db-cad-index.md` per il dettaglio di schema e
|
non c'è ancora nulla di salvato — cambiabile da "File → Scegli cartella di lavoro..." (non
|
||||||
risoluzione del percorso DB.
|
più un bottone in fase 1: azione occasionale, non un passo del flusso) — vedi
|
||||||
|
`docs/db-cad-index.md` per il dettaglio di schema e risoluzione del percorso DB.
|
||||||
2. **Importa Distinta Base** — `DistintaBaseImporter.ConvertiInCsv` genera il CSV
|
2. **Importa Distinta Base** — `DistintaBaseImporter.ConvertiInCsv` genera il CSV
|
||||||
componente;descrizione nella cartella di lavoro; se il file segue la convenzione del
|
componente;descrizione nella cartella di lavoro; se il file segue la convenzione del
|
||||||
gestionale (`DBP_<codice>_<timestamp>`), aggiunge l'assieme generale come riga in più (da
|
gestionale (`DBP_<codice>_<timestamp>`), aggiunge l'assieme generale come riga in più (da
|
||||||
@@ -103,9 +104,12 @@ designer visuale):
|
|||||||
5. **Verifica completezza** — mostra i `.asm` della distinta già in `raw/`, trascinabili su
|
5. **Verifica completezza** — mostra i `.asm` della distinta già in `raw/`, trascinabili su
|
||||||
Creo per l'esportazione STEP (Distributed Batch, manuale, fuori dall'app).
|
Creo per l'esportazione STEP (Distributed Batch, manuale, fuori dall'app).
|
||||||
|
|
||||||
Menu in cima alla finestra: "File → Nuova estrazione" (Ctrl+N) azzera lo stato delle fasi 2-5
|
Menu in cima alla finestra: "File → Nuovo" (Ctrl+N) azzera lo stato delle fasi 2-5
|
||||||
per ripartire con una nuova distinta, senza toccare DB/cartella di lavoro della fase 1;
|
per ripartire con una nuova distinta, senza toccare DB/cartella di lavoro della fase 1 (va
|
||||||
"Aiuto → Guida" (F1) apre una sintesi interattiva delle 5 fasi (`GuidaForm.cs`).
|
volutamente alla fase 2, non alla 1: quei dati restano quelli già caricati); "File → Scegli
|
||||||
|
cartella di lavoro..." cambia la cartella di CSV/`raw/`/`step/` in qualunque momento; "File →
|
||||||
|
Pulisci raw e step..." svuota le cartelle `raw/`/`step/` nella cartella di lavoro (non tocca
|
||||||
|
l'indice); "Aiuto → Guida" (F1) apre una sintesi interattiva delle 5 fasi (`GuidaForm.cs`).
|
||||||
|
|
||||||
## Script standalone (`scripts/`)
|
## Script standalone (`scripts/`)
|
||||||
|
|
||||||
|
|||||||
+16
-28
@@ -11,18 +11,18 @@ public partial class Form1 : Form
|
|||||||
private readonly Button _btnTrovaPrt = new();
|
private readonly Button _btnTrovaPrt = new();
|
||||||
private readonly Button _btnVerifica = new();
|
private readonly Button _btnVerifica = new();
|
||||||
private readonly ListView _lstAnteprimaAsm = new();
|
private readonly ListView _lstAnteprimaAsm = new();
|
||||||
private readonly Button _btnPulisci = new();
|
|
||||||
private readonly Label _lblStatus = new();
|
private readonly Label _lblStatus = new();
|
||||||
private readonly Label _lblDb = new();
|
private readonly Label _lblDb = new();
|
||||||
private readonly Label _lblUltimoAggiornamento = new();
|
private readonly Label _lblUltimoAggiornamento = new();
|
||||||
private readonly Label _lblCartellaLavoro = new();
|
private readonly Label _lblCartellaLavoro = new();
|
||||||
private readonly Button _btnCambiaCartella = new();
|
|
||||||
private readonly DataGridView _gridImport = new();
|
private readonly DataGridView _gridImport = new();
|
||||||
private readonly DataGridView _gridRaw = new();
|
private readonly DataGridView _gridRaw = new();
|
||||||
private readonly Label _lblImportStatus = new();
|
private readonly Label _lblImportStatus = new();
|
||||||
private readonly ToolTip _tipImportStatus = new();
|
private readonly ToolTip _tipImportStatus = new();
|
||||||
private readonly MenuStrip _menu = new();
|
private readonly MenuStrip _menu = new();
|
||||||
private readonly ToolStripMenuItem _mnuNuovaEstrazione = new("Nuova estrazione");
|
private readonly ToolStripMenuItem _mnuNuovaEstrazione = new("Nuovo");
|
||||||
|
private readonly ToolStripMenuItem _mnuPulisci = new("Pulisci raw e step...");
|
||||||
|
private readonly ToolStripMenuItem _mnuCambiaCartella = new("Scegli cartella di lavoro...");
|
||||||
|
|
||||||
// Wizard: una fase alla volta occupa tutta la finestra, si avanza solo quando quella
|
// Wizard: una fase alla volta occupa tutta la finestra, si avanza solo quando quella
|
||||||
// corrente è "pronta" (vedi AvantiConsentito). NomiFasi/_panelFasi sono paralleli per indice.
|
// corrente è "pronta" (vedi AvantiConsentito). NomiFasi/_panelFasi sono paralleli per indice.
|
||||||
@@ -152,6 +152,12 @@ public partial class Form1 : Form
|
|||||||
_mnuNuovaEstrazione.Click += (_, _) => NuovaEstrazione();
|
_mnuNuovaEstrazione.Click += (_, _) => NuovaEstrazione();
|
||||||
mnuFile.DropDownItems.Add(_mnuNuovaEstrazione);
|
mnuFile.DropDownItems.Add(_mnuNuovaEstrazione);
|
||||||
|
|
||||||
|
_mnuCambiaCartella.Click += (_, _) => ScegliCartellaLavoro();
|
||||||
|
mnuFile.DropDownItems.Add(_mnuCambiaCartella);
|
||||||
|
|
||||||
|
_mnuPulisci.Click += (_, _) => PulisciRawEStep();
|
||||||
|
mnuFile.DropDownItems.Add(_mnuPulisci);
|
||||||
|
|
||||||
var mnuAiuto = new ToolStripMenuItem("Aiuto");
|
var mnuAiuto = new ToolStripMenuItem("Aiuto");
|
||||||
var mnuGuida = new ToolStripMenuItem("Guida") { ShortcutKeys = Keys.F1 };
|
var mnuGuida = new ToolStripMenuItem("Guida") { ShortcutKeys = Keys.F1 };
|
||||||
mnuGuida.Click += (_, _) => new GuidaForm().ShowDialog(this);
|
mnuGuida.Click += (_, _) => new GuidaForm().ShowDialog(this);
|
||||||
@@ -259,7 +265,7 @@ public partial class Form1 : Form
|
|||||||
{
|
{
|
||||||
if (_dbPath is null || _cartellaLavoro is null)
|
if (_dbPath is null || _cartellaLavoro is null)
|
||||||
{
|
{
|
||||||
MessageBox.Show(this, "Carica prima il database in fase 1.", "Nuova estrazione",
|
MessageBox.Show(this, "Carica prima il database in fase 1.", "Nuovo",
|
||||||
MessageBoxButtons.OK, MessageBoxIcon.Information);
|
MessageBoxButtons.OK, MessageBoxIcon.Information);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -337,7 +343,7 @@ public partial class Form1 : Form
|
|||||||
Text = "Cartella di lavoro: qui vengono scritti il CSV della distinta e la "
|
Text = "Cartella di lavoro: qui vengono scritti il CSV della distinta e la "
|
||||||
+ "cartella 'raw' (gli STEP esportati con Creo vanno invece in 'step', "
|
+ "cartella 'raw' (gli STEP esportati con Creo vanno invece in 'step', "
|
||||||
+ "dentro la stessa cartella). Proposta automaticamente (ricordata da un "
|
+ "dentro la stessa cartella). Proposta automaticamente (ricordata da un "
|
||||||
+ "avvio all'altro), modificabile con 'Cambia cartella...'.",
|
+ "avvio all'altro), modificabile da 'File → Scegli cartella di lavoro...'.",
|
||||||
};
|
};
|
||||||
contenuto.Controls.Add(lblIstruzioniCartella);
|
contenuto.Controls.Add(lblIstruzioniCartella);
|
||||||
|
|
||||||
@@ -347,27 +353,6 @@ public partial class Form1 : Form
|
|||||||
_lblCartellaLavoro.Margin = new Padding(0, 0, 0, 4);
|
_lblCartellaLavoro.Margin = new Padding(0, 0, 0, 4);
|
||||||
contenuto.Controls.Add(_lblCartellaLavoro);
|
contenuto.Controls.Add(_lblCartellaLavoro);
|
||||||
|
|
||||||
_btnCambiaCartella.Text = "Cambia cartella...";
|
|
||||||
UiStile.Secondario(_btnCambiaCartella);
|
|
||||||
_btnCambiaCartella.Click += (_, _) => ScegliCartellaLavoro();
|
|
||||||
contenuto.Controls.Add(_btnCambiaCartella);
|
|
||||||
|
|
||||||
var lblManutenzione = new Label
|
|
||||||
{
|
|
||||||
Dock = DockStyle.Top,
|
|
||||||
AutoSize = true,
|
|
||||||
ForeColor = SystemColors.GrayText,
|
|
||||||
Margin = new Padding(0, 20, 0, 8),
|
|
||||||
Text = "Manutenzione: svuota le cartelle 'raw' e 'step' nella cartella di lavoro "
|
|
||||||
+ "prima di un nuovo giro (non tocca l'indice, solo le copie locali).",
|
|
||||||
};
|
|
||||||
contenuto.Controls.Add(lblManutenzione);
|
|
||||||
|
|
||||||
_btnPulisci.Text = "Pulisci raw e step";
|
|
||||||
UiStile.Secondario(_btnPulisci);
|
|
||||||
_btnPulisci.Click += (_, _) => PulisciRawEStep();
|
|
||||||
contenuto.Controls.Add(_btnPulisci);
|
|
||||||
|
|
||||||
var panel = new Panel();
|
var panel = new Panel();
|
||||||
panel.Controls.Add(contenuto);
|
panel.Controls.Add(contenuto);
|
||||||
return panel;
|
return panel;
|
||||||
@@ -707,7 +692,8 @@ public partial class Form1 : Form
|
|||||||
.ToList();
|
.ToList();
|
||||||
if (cartelle.Count == 0)
|
if (cartelle.Count == 0)
|
||||||
{
|
{
|
||||||
ImpostaStatoImport($"Nessuna cartella 'raw' o 'step' trovata in {radice}.", Color.DarkRed);
|
MessageBox.Show(this, $"Nessuna cartella 'raw' o 'step' trovata in {radice}.",
|
||||||
|
"Pulisci raw e step", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -734,7 +720,8 @@ public partial class Form1 : Form
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ImpostaStatoImport($"{eliminati} file eliminati da {string.Join(" e ", cartelle)}.", Color.DarkGreen);
|
MessageBox.Show(this, $"{eliminati} file eliminati da {string.Join(" e ", cartelle)}.",
|
||||||
|
"Pulisci raw e step", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Tutti i codici prt/asm noti all'indice, con i relativi percorsi (ultima
|
/// <summary>Tutti i codici prt/asm noti all'indice, con i relativi percorsi (ultima
|
||||||
@@ -1112,6 +1099,7 @@ public partial class Form1 : Form
|
|||||||
? ultima
|
? ultima
|
||||||
: (_dbPath is not null ? Path.GetDirectoryName(_dbPath) : null) ?? AppContext.BaseDirectory;
|
: (_dbPath is not null ? Path.GetDirectoryName(_dbPath) : null) ?? AppContext.BaseDirectory;
|
||||||
AggiornaLabelCartellaLavoro();
|
AggiornaLabelCartellaLavoro();
|
||||||
|
AggiornaStatoAvanti();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ScegliCartellaLavoro()
|
private void ScegliCartellaLavoro()
|
||||||
|
|||||||
@@ -12,13 +12,14 @@ public class GuidaForm : Form
|
|||||||
Distributed Batch per l'esportazione STEP: indicizza i file di una share di
|
Distributed Batch per l'esportazione STEP: indicizza i file di una share di
|
||||||
rete e guida attraverso 5 fasi, una alla volta, con "Avanti"/"Indietro".
|
rete e guida attraverso 5 fasi, una alla volta, con "Avanti"/"Indietro".
|
||||||
|
|
||||||
"File ▸ Nuova estrazione" (Ctrl+N) azzera distinta/raw/verifica per
|
"File ▸ Nuovo" (Ctrl+N) azzera distinta/raw/verifica per
|
||||||
ripartire con una nuova distinta base, senza dover ricaricare il database.
|
ripartire con una nuova distinta base, senza dover ricaricare il database.
|
||||||
"""),
|
"""),
|
||||||
("1. Database", """
|
("1. Database", """
|
||||||
Carica o aggiorna l'indice "cad_index.db" a partire dalle cartelle di primo
|
Carica o aggiorna l'indice "cad_index.db" a partire dalle cartelle di primo
|
||||||
livello del disco/share (radice di default X:\). Qui si sceglie anche la
|
livello del disco/share (radice di default X:\). Mostra anche la cartella di
|
||||||
cartella di lavoro, dove finiscono CSV, "raw" e "step".
|
lavoro corrente, dove finiscono CSV, "raw" e "step" (cambiabile da
|
||||||
|
"File ▸ Scegli cartella di lavoro...").
|
||||||
"""),
|
"""),
|
||||||
("2. Importa Distinta Base", """
|
("2. Importa Distinta Base", """
|
||||||
Converte il file della distinta (trascinabile nella finestra) in un CSV
|
Converte il file della distinta (trascinabile nella finestra) in un CSV
|
||||||
|
|||||||
+25
-16
@@ -92,7 +92,7 @@ trascinano i `.asm` su Creo Distributed Batch, che scrive in `step/`.
|
|||||||
|
|
||||||
| # | Fase | Bottone → metodo | Cosa fa |
|
| # | Fase | Bottone → metodo | Cosa fa |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| 1 | Database | "Aggiorna indice" → `Indexer.ScanAsync`; "Cambia cartella..." → `ScegliCartellaLavoro` | Crea/aggiorna `cad_index.db` scansionando la share; sceglie/mostra la cartella di lavoro |
|
| 1 | Database | "Aggiorna indice" → `Indexer.ScanAsync` | Crea/aggiorna `cad_index.db` scansionando la share; mostra anche la cartella di lavoro corrente (cambiabile da "File → Scegli cartella di lavoro...") |
|
||||||
| 2 | Importa Distinta Base | selezione file → `ImportaDistinta` → `DistintaBaseImporter.ConvertiInCsv` | Xls/Xml gestionale → CSV componente;descrizione, scritto nella cartella di lavoro |
|
| 2 | Importa Distinta Base | selezione file → `ImportaDistinta` → `DistintaBaseImporter.ConvertiInCsv` | Xls/Xml gestionale → CSV componente;descrizione, scritto nella cartella di lavoro |
|
||||||
| 3 | Crea cartella raw | "Crea cartella raw" → `CreaCartellaRaw` | `TrovaPercorsiCad` + `CopiaFileTrovati` (parallela) → `raw/` dentro la cartella di lavoro |
|
| 3 | Crea cartella raw | "Crea cartella raw" → `CreaCartellaRaw` | `TrovaPercorsiCad` + `CopiaFileTrovati` (parallela) → `raw/` dentro la cartella di lavoro |
|
||||||
| 4 | Trova componenti referenziati | "Trova componenti referenziati" → `TrovaPrtReferenziati` → `RisolviAlberoComponenti` | Legge i `.asm` in `raw/`, risolve ricorsivamente sotto-assiemi/parti nell'indice e li copia anch'essi in `raw/`, insieme ai componenti soppressi e ai modelli citati per riferimento esterno che servono a Creo per aprire l'assieme |
|
| 4 | Trova componenti referenziati | "Trova componenti referenziati" → `TrovaPrtReferenziati` → `RisolviAlberoComponenti` | Legge i `.asm` in `raw/`, risolve ricorsivamente sotto-assiemi/parti nell'indice e li copia anch'essi in `raw/`, insieme ai componenti soppressi e ai modelli citati per riferimento esterno che servono a Creo per aprire l'assieme |
|
||||||
@@ -102,10 +102,14 @@ trascinano i `.asm` su Creo Distributed Batch, che scrive in `step/`.
|
|||||||
`_percorsoInputCorrente`, `_righeCorrenti` (righe del CSV), `_ultimaVerifica` (cache percorsi
|
`_percorsoInputCorrente`, `_righeCorrenti` (righe del CSV), `_ultimaVerifica` (cache percorsi
|
||||||
CAD), `_ultimaCartellaRaw`.
|
CAD), `_ultimaCartellaRaw`.
|
||||||
|
|
||||||
Menu (`MenuStrip`, in cima alla finestra): "File → Nuova estrazione" (Ctrl+N) azzera lo
|
Menu (`MenuStrip`, in cima alla finestra): "File → Nuovo" (Ctrl+N) azzera lo
|
||||||
stato delle fasi 2-5 (`NuovaEstrazione`) per ripartire con una nuova distinta senza
|
stato delle fasi 2-5 (`NuovaEstrazione`) e va direttamente alla fase 2, senza passare dalla
|
||||||
ricaricare il database/la cartella di lavoro (fase 1, che resta invariata); "Aiuto → Guida"
|
fase 1: database e cartella di lavoro restano quelli già caricati, non serve rifare lo scan;
|
||||||
(F1) apre `GuidaForm`, sintesi interattiva delle 5 fasi per chi non ha letto questi docs.
|
"File → Scegli cartella di lavoro..." → `ScegliCartellaLavoro`, cambia in qualunque momento
|
||||||
|
la destinazione di CSV/`raw/`/`step/`; "File → Pulisci raw e step..." svuota le cartelle
|
||||||
|
`raw/`/`step/` nella cartella di lavoro (`PulisciRawEStep`, non tocca l'indice); "Aiuto →
|
||||||
|
Guida" (F1) apre `GuidaForm`, sintesi interattiva delle 5 fasi per chi non ha letto questi
|
||||||
|
docs.
|
||||||
|
|
||||||
Altre responsabilità in Form1.cs:
|
Altre responsabilità in Form1.cs:
|
||||||
- `TrovaPercorsiCad` / `CaricaCodiciNoti` — query sul DB (`files_ultima_versione`), la
|
- `TrovaPercorsiCad` / `CaricaCodiciNoti` — query sul DB (`files_ultima_versione`), la
|
||||||
@@ -189,8 +193,8 @@ completi".
|
|||||||
file) nelle sole colonne Componente/Descrizione, foglio `"Distinta Base"`. Se il nome del
|
file) nelle sole colonne Componente/Descrizione, foglio `"Distinta Base"`. Se il nome del
|
||||||
file segue la convenzione `DBP_<codice>_<timestamp>`, aggiunge l'assieme generale come riga
|
file segue la convenzione `DBP_<codice>_<timestamp>`, aggiunge l'assieme generale come riga
|
||||||
in più (il foglio elenca solo i componenti sotto l'assieme). Scrive il CSV nella cartella
|
in più (il foglio elenca solo i componenti sotto l'assieme). Scrive il CSV nella cartella
|
||||||
passata da `Form1` (la cartella di lavoro scelta in fase 1), non necessariamente accanto al
|
passata da `Form1` (la cartella di lavoro, impostabile da "File → Scegli cartella di lavoro..."),
|
||||||
file di input.
|
non necessariamente accanto al file di input.
|
||||||
|
|
||||||
## Finestre di dialogo (modali, mostrate a fine step)
|
## Finestre di dialogo (modali, mostrate a fine step)
|
||||||
|
|
||||||
@@ -225,15 +229,20 @@ completi".
|
|||||||
## Persistenza
|
## Persistenza
|
||||||
|
|
||||||
- **DB** (`cad_index.db`, SQLite) — vedi tabella `files`/vista `files_ultima_versione` sopra.
|
- **DB** (`cad_index.db`, SQLite) — vedi tabella `files`/vista `files_ultima_versione` sopra.
|
||||||
Percorso: cercato accanto all'eseguibile o nella working directory all'avvio; altrimenti
|
Percorso ricordato tra un avvio e l'altro in `%AppData%/PrepStep/ultimo_db.txt`
|
||||||
selezionabile con "Apri DB...". Radice disco di scansione di default `X:\`
|
(`SalvaUltimoDbUsato`/`LeggiUltimoDbUsato`), scritto ogni volta che si carica un DB
|
||||||
(`Form1.RadiceDiscoDefault`, hardcoded).
|
(all'avvio se già noto, oppure da "Apri DB..." o al termine di "Aggiorna indice"); se il
|
||||||
- **Cartella di lavoro** — salvata in `%AppData%/PrepStep/ultima_cartella_lavoro.txt`
|
file non c'è o punta a un percorso cancellato, `InizializzaDatabase` ripiega su
|
||||||
(stesso meccanismo del DB sopra), proposta di default `AppContext.BaseDirectory` la prima
|
`cad_index.db` accanto all'eseguibile o nella working directory. Radice disco di scansione
|
||||||
volta; selezionabile/cambiabile con "Cambia cartella..." in fase 1. Tutti i file generati a
|
di default `X:\` (`Form1.RadiceDiscoDefault`, hardcoded).
|
||||||
valle ci finiscono dentro: il CSV della distinta, `raw/` (CAD dei componenti e
|
- **Cartella di lavoro** — stesso meccanismo del DB sopra, salvata in
|
||||||
sotto-componenti); `step/` non è scritta dall'app ma è dove l'utente esporta gli STEP a
|
`%AppData%/PrepStep/ultima_cartella_lavoro.txt`; se non c'è una preferenza salvata (o punta
|
||||||
mano con Creo Distributed Batch, a partire dai file trascinati da `raw/` in fase 5.
|
a una cartella cancellata) si propone la cartella del DB caricato, o in ultima istanza
|
||||||
|
`AppContext.BaseDirectory`; cambiabile in qualunque momento da "File → Scegli cartella di
|
||||||
|
lavoro...". Tutti i file generati a valle ci finiscono dentro: il CSV della distinta, `raw/`
|
||||||
|
(CAD dei componenti e sotto-componenti); `step/` non è scritta dall'app ma è dove l'utente
|
||||||
|
esporta gli STEP a mano con Creo Distributed Batch, a partire dai file trascinati da `raw/`
|
||||||
|
in fase 5.
|
||||||
|
|
||||||
## Script standalone (`scripts/`)
|
## Script standalone (`scripts/`)
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user