#:project ../PrepStep/PrepStep.csproj #:property TargetFramework=net10.0-windows #:package Microsoft.Data.Sqlite@10.0.12 // dotnet run scripts/ExtractCreoStrings.cs -- [cad_index.db] [output.txt] // // Come scripts/BomViaDb.cs, ma senza passare "codiciNoti" a EstraiCodiciReferenziati: si // riconoscono solo i codici numerici Pro-E (che si validano dalla forma, senza bisogno del // DB - vedi PrepStep/AssemblyComponentScanner.cs), non le parti commerciali con nome // alfabetico. Prova più semplice/mirata rispetto a BomViaDb.cs, utile quando serve solo // individuare/segnalare codici numerici mancanti dall'indice. using Microsoft.Data.Sqlite; using PrepStep; if (args.Length < 1) { Console.WriteLine("Uso: dotnet run ExtractCreoStrings.cs -- [cad_index.db] [output.txt]"); return 1; } string asmIniziale = args[0]; string dbPath = args.Length > 1 ? args[1] : "cad_index.db"; string outPath = args.Length > 2 ? args[2] : "BOM.txt"; using var connection = new SqliteConnection($"Data Source={dbPath};Mode=ReadOnly"); connection.Open(); var codiciNoti = new Dictionary>(StringComparer.OrdinalIgnoreCase); using (var command = connection.CreateCommand()) { command.CommandText = "SELECT codice, tipo_file, percorso_completo FROM files_ultima_versione " + "WHERE LOWER(tipo_file) IN ('prt', 'asm') ORDER BY codice, tipo_file, data_modifica DESC"; using var reader = command.ExecuteReader(); while (reader.Read()) { string codice = reader.GetString(0); string tipo = reader.GetString(1).ToLowerInvariant(); var lista = codiciNoti.TryGetValue(codice, out var l) ? l : codiciNoti[codice] = new(); if (!lista.Any(x => x.Tipo == tipo)) lista.Add((tipo, reader.GetString(2))); } } Console.WriteLine($"Codici prt/asm noti nell'indice: {codiciNoti.Count}"); var codiceProprio = Path.GetFileName(asmIniziale).Split('.')[0]; var codiceRadice = AssemblyComponentScanner.CodiceRadice(codiceProprio); var componentiTrovati = new SortedSet(StringComparer.OrdinalIgnoreCase); var nonTrovati = new List(); var codiciVisti = new HashSet(StringComparer.OrdinalIgnoreCase) { codiceProprio, codiceRadice }; var daScansionare = new Queue(new[] { asmIniziale }); while (daScansionare.Count > 0) { var asm = daScansionare.Dequeue(); foreach (var codice in AssemblyComponentScanner.EstraiCodiciReferenziati(asm)) { if (!codiciVisti.Add(codice)) continue; if (!codiciNoti.TryGetValue(codice, out var componenti)) { nonTrovati.Add(codice); continue; } componentiTrovati.Add(codice); foreach (var (tipo, percorso) in componenti) if (tipo == "asm") daScansionare.Enqueue(percorso); } } File.WriteAllLines(outPath, componentiTrovati); Console.WriteLine($"{componentiTrovati.Count} componenti scritti in {outPath}"); if (nonTrovati.Count > 0) Console.WriteLine($"Codici trovati nel file ma non nell'indice (scartati): {string.Join(", ", nonTrovati)}"); return 0;