visum-export-analysis.mjsβ’14.8 kB
// EXPORT AUTOMATICO DATI RETE VISUM
// Crea file di analisi approfondita in directory temporanea
import { spawn } from 'child_process';
import { mkdirSync } from 'fs';
console.log("π EXPORT AUTOMATICO DATI RETE CAMPOLEONE");
console.log("β".repeat(45));
console.log("π― Creazione directory temporanea e export completo");
console.log("β".repeat(45));
async function createTempDirectoryAndExport() {
console.log("π Creazione directory temporanea e export dati...\n");
const script = `
try {
# Verify Visum is running
$visumProcess = Get-Process -Name "Visum250" -ErrorAction SilentlyContinue
if (!$visumProcess) {
Write-Host "β Visum non Γ¨ in esecuzione!"
@{ success = $false; error = "Visum not running" } | ConvertTo-Json
exit
}
Write-Host "β
Visum trovato - Process ID: $($visumProcess.Id)"
Write-Host "π Memoria: $([math]::Round($visumProcess.WorkingSet / 1MB, 1)) MB"
Write-Host ""
# Create temporary directory
$tempDir = "C:\\temp\\visum_analysis_$((Get-Date).ToString('yyyyMMdd_HHmmss'))"
try {
New-Item -ItemType Directory -Path $tempDir -Force | Out-Null
Write-Host "π Directory temporanea creata: $tempDir"
} catch {
Write-Host "β Errore creazione directory: $($_.Exception.Message)"
exit
}
# Try COM connection for automated export
Write-Host "π Tentativo connessione COM per export automatico..."
try {
# Try multiple COM approaches
$visum = $null
$comSuccess = $false
# Method 1: GetActiveObject
try {
$visum = [System.Runtime.InteropServices.Marshal]::GetActiveObject("Visum.Visum")
Write-Host "β
GetActiveObject riuscito!"
$comSuccess = $true
} catch {
Write-Host "β οΈ GetActiveObject fallito, provo New-Object..."
# Method 2: New-Object with existing instance detection
try {
$visum = New-Object -ComObject "Visum.Visum"
Write-Host "β
New-Object riuscito!"
$comSuccess = $true
} catch {
Write-Host "β Anche New-Object fallito"
}
}
if ($comSuccess -and $visum) {
Write-Host "π― COM attivo! Inizio export automatico..."
Write-Host ""
# Change to temp directory
Set-Location $tempDir
# Export network elements
Write-Host "π Export elementi di rete..."
try {
# Export nodes
Write-Host " β’ Export nodi..."
$visum.Net.Nodes.SaveToFile("nodes.txt", "DELIMITED", "ATTRIBUTES")
Write-Host " β
nodes.txt creato"
} catch {
Write-Host " β Export nodi fallito: $($_.Exception.Message)"
}
try {
# Export links
Write-Host " β’ Export link..."
$visum.Net.Links.SaveToFile("links.txt", "DELIMITED", "ATTRIBUTES")
Write-Host " β
links.txt creato"
} catch {
Write-Host " β Export link fallito: $($_.Exception.Message)"
}
try {
# Export zones
Write-Host " β’ Export zone..."
$visum.Net.Zones.SaveToFile("zones.txt", "DELIMITED", "ATTRIBUTES")
Write-Host " β
zones.txt creato"
} catch {
Write-Host " β Export zone fallito: $($_.Exception.Message)"
}
try {
# Export link types
Write-Host " β’ Export tipi link..."
$visum.Net.LinkTypes.SaveToFile("linktypes.txt", "DELIMITED", "ATTRIBUTES")
Write-Host " β
linktypes.txt creato"
} catch {
Write-Host " β Export tipi link fallito: $($_.Exception.Message)"
}
try {
# Export vol-cap formulas
Write-Host " β’ Export funzioni volume-capacitΓ ..."
$visum.Net.VolCapFormulas.SaveToFile("volcap_formulas.txt", "DELIMITED", "ATTRIBUTES")
Write-Host " β
volcap_formulas.txt creato"
} catch {
Write-Host " β Export vol-cap fallito: $($_.Exception.Message)"
}
# Get basic statistics
Write-Host ""
Write-Host "π STATISTICHE ESTRATTE:"
try {
$nodeCount = $visum.Net.Nodes.Count
$linkCount = $visum.Net.Links.Count
$zoneCount = $visum.Net.Zones.Count
$linkTypeCount = $visum.Net.LinkTypes.Count
Write-Host " β’ Nodi: $nodeCount"
Write-Host " β’ Link: $linkCount"
Write-Host " β’ Zone: $zoneCount"
Write-Host " β’ Tipi Link: $linkTypeCount"
# Try to get sample link attributes
if ($linkCount -gt 0) {
Write-Host ""
Write-Host "π CAMPIONE ATTRIBUTI LINK:"
$sampleLink = $visum.Net.Links.Item(0)
try {
$length = $sampleLink.GetAttValue("Length")
$v0 = $sampleLink.GetAttValue("V0_PrT")
$capacity = $sampleLink.GetAttValue("VolCapPrT")
$linkType = $sampleLink.GetAttValue("TypeNo")
Write-Host " β’ Lunghezza: $([math]::Round($length, 1)) m"
Write-Host " β’ VelocitΓ libera: $([math]::Round($v0, 1)) km/h"
Write-Host " β’ CapacitΓ : $capacity veic/h"
Write-Host " β’ Tipo link: $linkType"
} catch {
Write-Host " β οΈ Alcuni attributi non disponibili"
}
}
} catch {
Write-Host " β Errore lettura statistiche: $($_.Exception.Message)"
}
# List created files
Write-Host ""
Write-Host "π FILE CREATI:"
$files = Get-ChildItem -Path $tempDir -Filter "*.txt"
foreach ($file in $files) {
$sizeKB = [math]::Round($file.Length / 1KB, 1)
Write-Host " β’ $($file.Name) ($sizeKB KB)"
}
@{
success = $true
method = "COM-Export"
tempDirectory = $tempDir
filesCreated = $files.Count
networkStats = @{
nodes = $nodeCount
links = $linkCount
zones = $zoneCount
linkTypes = $linkTypeCount
}
files = @($files | ForEach-Object { @{ name = $_.Name; sizeKB = [math]::Round($_.Length / 1KB, 1) } })
} | ConvertTo-Json -Depth 4
} else {
Write-Host "β COM non disponibile"
Write-Host ""
Write-Host "π CREAZIONE SCRIPT MANUALE..."
# Create VAL script for manual execution
$valScript = @"
! VAL Script per export automatico
! Eseguire in Visum: File > Run VAL Script
PRINT("Inizio export dati rete...")
! Export nodi
EXPORT NETWORK NODES TO FILE "$tempDir\\nodes.csv" INCLUDEHEADER FORMAT CSV
PRINT("Nodi esportati")
! Export link
EXPORT NETWORK LINKS TO FILE "$tempDir\\links.csv" INCLUDEHEADER FORMAT CSV
PRINT("Link esportati")
! Export zone
EXPORT NETWORK ZONES TO FILE "$tempDir\\zones.csv" INCLUDEHEADER FORMAT CSV
PRINT("Zone esportate")
! Export tipi link
EXPORT NETWORK LINKTYPES TO FILE "$tempDir\\linktypes.csv" INCLUDEHEADER FORMAT CSV
PRINT("Tipi link esportati")
! Export funzioni volume-capacitΓ
EXPORT NETWORK VOLCAPFORMULAS TO FILE "$tempDir\\volcap.csv" INCLUDEHEADER FORMAT CSV
PRINT("Funzioni V-C esportate")
PRINT("Export completato in: $tempDir")
"@
$valScript | Out-File -FilePath "$tempDir\\export_network.val" -Encoding UTF8
Write-Host "β
Script VAL creato: $tempDir\\export_network.val"
# Create batch file for easy execution
$batchScript = @"
@echo off
echo AVVIO EXPORT MANUALE VISUM
echo ========================
echo.
echo Directory: $tempDir
echo.
echo ISTRUZIONI:
echo 1. Apri Visum (giΓ aperto)
echo 2. File > Run VAL Script
echo 3. Seleziona: $tempDir\\export_network.val
echo 4. Esegui lo script
echo.
echo I file saranno creati in: $tempDir
echo.
pause
"@
$batchScript | Out-File -FilePath "$tempDir\\RUN_EXPORT.bat" -Encoding ASCII
Write-Host "β
Script batch creato: $tempDir\\RUN_EXPORT.bat"
@{
success = $true
method = "Manual-Scripts"
tempDirectory = $tempDir
valScript = "$tempDir\\export_network.val"
batchScript = "$tempDir\\RUN_EXPORT.bat"
instructions = @(
"Aprire Visum (giΓ aperto)",
"File > Run VAL Script",
"Selezionare: export_network.val",
"Eseguire lo script",
"Controllare i file CSV creati"
)
} | ConvertTo-Json -Depth 3
}
} catch {
Write-Host "β Errore durante export: $($_.Exception.Message)"
@{
success = $false
error = $_.Exception.Message
tempDirectory = $tempDir
} | ConvertTo-Json
}
} catch {
Write-Host "β Errore generale: $($_.Exception.Message)"
@{
success = $false
error = $_.Exception.Message
} | ConvertTo-Json
}
`;
const powershell = spawn('powershell', ['-ExecutionPolicy', 'Bypass', '-Command', script]);
let output = '';
let allOutput = '';
powershell.stdout.on('data', (data) => {
const text = data.toString();
output += text;
allOutput += text;
console.log(text.trim());
});
powershell.stderr.on('data', (data) => {
const text = data.toString();
allOutput += `STDERR: ${text}`;
console.log("β οΈ", text.trim());
});
return new Promise((resolve) => {
powershell.on('close', (code) => {
console.log(`\nπ Export completato (exit code: ${code})`);
try {
const jsonStart = output.indexOf('{');
if (jsonStart !== -1) {
const jsonStr = output.substring(jsonStart);
const result = JSON.parse(jsonStr);
resolve(result);
} else {
resolve({
success: true,
method: 'Log-based',
note: 'Export eseguito, controlla output'
});
}
} catch (e) {
console.log("β οΈ JSON parsing issue, ma export potrebbe essere riuscito");
resolve({
success: true,
method: 'Execution-completed',
note: 'Export terminato, controlla directory temporanea'
});
}
});
setTimeout(() => {
powershell.kill();
resolve({ success: false, error: 'Timeout after 60s' });
}, 60000);
});
}
async function analyzeExportedData(result) {
if (result.tempDirectory) {
console.log(`\nπ ANALISI FILE ESPORTATI IN: ${result.tempDirectory}`);
console.log("β".repeat(50));
// Analyze the exported files
const analysisScript = `
$tempDir = "${result.tempDirectory}"
if (Test-Path $tempDir) {
Write-Host "π Directory trovata: $tempDir"
Write-Host ""
$files = Get-ChildItem -Path $tempDir -Filter "*.txt","*.csv"
if ($files.Count -gt 0) {
Write-Host "π FILE ESPORTATI TROVATI:"
foreach ($file in $files) {
$sizeKB = [math]::Round($file.Length / 1KB, 1)
Write-Host " β’ $($file.Name) - $sizeKB KB"
# Analyze first few lines of each file
if ($file.Length -gt 0) {
try {
$content = Get-Content $file.FullName -TotalCount 5
Write-Host " Preview:"
foreach ($line in $content) {
if ($line.Length -gt 80) {
Write-Host " $($line.Substring(0,80))..."
} else {
Write-Host " $line"
}
}
Write-Host ""
} catch {
Write-Host " β Errore lettura file"
}
}
}
} else {
Write-Host "β Nessun file di export trovato"
}
} else {
Write-Host "β Directory temporanea non trovata"
}
`;
const powershell = spawn('powershell', ['-ExecutionPolicy', 'Bypass', '-Command', analysisScript]);
powershell.stdout.on('data', (data) => {
console.log(data.toString().trim());
});
return new Promise((resolve) => {
powershell.on('close', () => {
resolve();
});
});
}
}
async function runCompleteExport() {
console.log("π Avvio export completo dati rete...\n");
const result = await createTempDirectoryAndExport();
console.log("\n" + "β".repeat(45));
console.log("π RISULTATI EXPORT");
console.log("β".repeat(45));
if (result.success) {
console.log("π β
EXPORT COMPLETATO!");
console.log(` Metodo: ${result.method}`);
if (result.tempDirectory) {
console.log(` π Directory: ${result.tempDirectory}`);
}
if (result.networkStats) {
console.log("\nποΈ Statistiche Rete:");
console.log(` β’ Nodi: ${result.networkStats.nodes?.toLocaleString()}`);
console.log(` β’ Link: ${result.networkStats.links?.toLocaleString()}`);
console.log(` β’ Zone: ${result.networkStats.zones?.toLocaleString()}`);
console.log(` β’ Tipi Link: ${result.networkStats.linkTypes}`);
}
if (result.files) {
console.log("\nπ File Creati:");
result.files.forEach(file => {
console.log(` β’ ${file.name} (${file.sizeKB} KB)`);
});
}
if (result.instructions) {
console.log("\nπ Istruzioni:");
result.instructions.forEach((instruction, i) => {
console.log(` ${i+1}. ${instruction}`);
});
}
// Analyze exported data
if (result.tempDirectory) {
await analyzeExportedData(result);
}
} else {
console.log("β EXPORT FALLITO");
console.log(` Errore: ${result.error}`);
if (result.tempDirectory) {
console.log(` Directory: ${result.tempDirectory}`);
}
}
console.log("\n" + "β".repeat(45));
console.log("π― EXPORT DATI RETE COMPLETATO!");
console.log("β".repeat(45));
}
runCompleteExport().catch(console.error);