Skip to main content
Glama
EXPORT_TABLES_GUIDE.md12.4 kB
# WORKFLOW COMPLETO: EXPORT TABELLE DA LAYOUT ## Overview La funzionalità di export tabelle da Global Layout è stata integrata nel sistema di workflow `manage-stops-workflow.py` come **Task 3**. Questa funzionalità permette di: - Parsare file Global Layout (.lay) XML - Estrarre definizioni di tabelle visibili con colonne - Esportare dati in formato CSV con delimiter punto e virgola - Gestire sub-attributes (e.g., `VEHKMTRAVPRT_DSEG(C_CORRETTA_FERIALE,AP)`) - Processare multipli export in sequenza ## Script Coinvolti ### 1. `manage-stops-workflow.py` (MAIN SCRIPT) **Status:** ✅ INTEGRATO **Nuove Funzioni:** ```python def export_layout_tables(layout_file, output_dir, project_name="export"): """ Esporta tutte le tabelle visibili da un Global Layout (.lay) in file CSV Parametri: layout_file: Path al file .lay output_dir: Directory output per i CSV project_name: Prefisso per i nomi file Returns: dict con risultato export """ ``` **Task Handler:** ```python elif task_action == "export_layout_tables": task_params = task.get("params", {}) layout_file = task_params.get('layout_file') output_dir = task_params.get('output_dir', './') project_name = task_params.get('project_name', 'export') result = export_layout_tables(layout_file, output_dir, project_name) ``` ### 2. `export_GLayout_tables.py` (STANDALONE) **Status:** ✅ ORIGINALE FUNZIONANTE **Uso:** Script standalone per export senza workflow system ## Configurazione Task ### Task Definition (in TASKS list) ```python { "id": 3, "name": "Esporta tabelle da Global Layout", "action": "export_layout_tables", "params": { "layout_file": r"H:\path\to\your\layout.lay", "output_dir": r"H:\path\to\output\", "project_name": "exported_tables" } } ``` ### Parametri | Parametro | Tipo | Obbligatorio | Default | Descrizione | |-----------|------|--------------|---------|-------------| | `layout_file` | str | ✅ Sì | - | Path completo al file .lay | | `output_dir` | str | ❌ No | `"./"` | Directory output per CSV | | `project_name` | str | ❌ No | `"export"` | Prefisso per nomi file | ## Esempi di Utilizzo ### Esempio 1: Export singolo ```python TASKS = [ { "id": 1, "name": "Esporta tabelle skim", "action": "export_layout_tables", "params": { "layout_file": r"H:\go\trenord_2025\skim_layout.lay", "output_dir": r"H:\go\trenord_2025\exports", "project_name": "trenord_skim" } } ] ``` **Output:** ``` H:\go\trenord_2025\exports\trenord_skim_Links.csv H:\go\trenord_2025\exports\trenord_skim_Nodes.csv H:\go\trenord_2025\exports\trenord_skim_ODPairs.csv ``` ### Esempio 2: Workflow completo (3 task) ```python TASKS = [ { "id": 1, "name": "Abilita fermate", "action": "enable_all_disabled", "lineroutes": ["R17_2022:R17_2", "R17_2022:R17_3"], "params": { "stop_time": 60, "pre_run_add": 30, "post_run_add": 30 } }, { "id": 2, "name": "Esegui Procedure Sequence", "action": "execute_procedure_sequence", "params": {} }, { "id": 3, "name": "Esporta risultati", "action": "export_layout_tables", "params": { "layout_file": r"H:\results.lay", "output_dir": r"H:\final_exports", "project_name": "final_results" } } ] ``` **Sequenza:** 1. Abilita tutte le fermate disabilitate su R17_2 e R17_3 2. Esegue la Procedure Sequence di Visum (es. assegnazioni PRT/PUT) 3. Esporta le tabelle risultanti in CSV ### Esempio 3: Export multipli ```python TASKS = [ { "id": 1, "name": "Export layout base", "action": "export_layout_tables", "params": { "layout_file": r"H:\layouts\base.lay", "output_dir": r"H:\exports\base", "project_name": "base" } }, { "id": 2, "name": "Export layout avanzato", "action": "export_layout_tables", "params": { "layout_file": r"H:\layouts\advanced.lay", "output_dir": r"H:\exports\advanced", "project_name": "advanced" } } ] ``` ## Funzionamento Interno ### 1. Parsing Layout XML ```python tree = ET.parse(layout_file) root = tree.getroot() for list_item in root.iter('listLayoutItem'): graphic = list_item.find('.//listGraphicParameterLayoutItems') net_obj_type = graphic.get('netObjectType') # LINK, NODE, etc. for attr_def in list_item.iter('attributeDefinition'): attr_id = attr_def.get('attributeID') sub1 = attr_def.get('subAttributeID1', '') sub2 = attr_def.get('subAttributeID2', '') # ... ``` ### 2. Mappatura Type → Collection ```python type_to_collection = { 'LINK': 'Visum.Net.Links', 'NODE': 'Visum.Net.Nodes', 'ZONE': 'Visum.Net.Zones', 'ODPAIR': 'Visum.Net.ODPairs', 'LINE': 'Visum.Net.Lines', 'LINEROUTE': 'Visum.Net.LineRoutes', 'TIMEPROFILE': 'Visum.Net.TimeProfiles', # ... } ``` ### 3. Gestione Sub-Attributes ```python # Input: attributeID="VEHKMTRAVPRT_DSEG" # subAttributeID1="C_CORRETTA_FERIALE" # subAttributeID2="AP" if sub1 or sub2 or sub3: subs = [s for s in [sub1, sub2, sub3] if s] full_attr = attr_id + '(' + ','.join(subs) + ')' # Output: "VEHKMTRAVPRT_DSEG(C_CORRETTA_FERIALE,AP)" ``` ### 4. Bulk Data Retrieval ```python collection = eval(collection_path) # e.g., Visum.Net.Links data = collection.GetMultipleAttributes(full_attrs) # Returns tuple rows ``` ### 5. CSV Generation ```python lines = [';'.join(headers)] # Header row for row_tuple in data: lines.append(';'.join(str(v) for v in row_tuple)) text = '\n'.join(lines) with open(output_file, 'w', encoding='utf-8', newline='') as f: f.write(text) ``` ## Output Format ### CSV Structure - **Delimiter:** Punto e virgola (`;`) - **Encoding:** UTF-8 - **Newline:** Platform-specific (controlled by `newline=''`) - **Filename:** `{project_name}_{table_name}.csv` ### Header Format - Attributi semplici: `ATTR_NAME` - Sub-attributes: `ATTR_SUB1_SUB2_SUB3` **Esempio:** ```csv NO;FROMNODENO;TONODENO;VEHKMTRAVPRT_DSEG_C_CORRETTA_FERIALE_AP 1;10001;10002;123.45 2;10002;10003;234.56 ``` ## Tabelle Supportate | Type | Collection | Descrizione | |------|-----------|-------------| | `LINK` | `Visum.Net.Links` | Archi della rete | | `NODE` | `Visum.Net.Nodes` | Nodi della rete | | `ZONE` | `Visum.Net.Zones` | Zone di traffico | | `ODPAIR` | `Visum.Net.ODPairs` | Coppie O/D | | `LINE` | `Visum.Net.Lines` | Linee di trasporto pubblico | | `LINEROUTE` | `Visum.Net.LineRoutes` | Percorsi delle linee | | `TIMEPROFILE` | `Visum.Net.TimeProfiles` | Profili temporali | | `TIMEPROFILEITEM` | `Visum.Net.TimeProfileItems` | Elementi dei profili | | `VEHJOURNEYSECTION` | `Visum.Net.VehicleJourneySections` | Sezioni di viaggio | | `STOP` | `Visum.Net.Stops` | Fermate | | `STOPPOINTAREA` | `Visum.Net.StopPointAreas` | Aree fermate | | `CONNECTOR` | `Visum.Net.Connectors` | Connettori zona-rete | ## Risultato Execution ### Success Response ```python { 'success': True, 'total_tables': 8, 'successful': 7, 'errors': 0, 'skipped': 1, 'details': [ { 'table': 'Links', 'type': 'LINK', 'status': 'SUCCESS', 'file': 'H:\\exports\\project_Links.csv', 'rows': 227000, 'cols': 29, 'size_mb': 12.5 }, # ... ] } ``` ### Error Response ```python { 'success': False, 'error': 'File not found: H:\\layout.lay' } ``` ## Performance ### Benchmark (Rete Campoleone) - **Tabella Links:** 227K righe × 29 colonne - **Tempo export:** ~6.7 secondi - **File size:** 12.5 MB - **Total tables:** 8 tabelle - **Total time:** ~45 secondi ### Fattori Performance 1. **Numero righe:** Lineare O(n) 2. **Numero colonne:** Impatto minimo 3. **Sub-attributes:** Overhead trascurabile 4. **Disk I/O:** Velocità disco ## Logging ### Console Output ``` ================================================================================ EXPORT TABELLE DA GLOBAL LAYOUT ================================================================================ Layout file: H:\go\trenord_2025\skim_layout.lay Output dir: H:\go\trenord_2025\exports Project: trenord_skim Parsing layout XML... Tabelle trovate: 8 - Links (LINK): 29 colonne - Nodes (NODE): 12 colonne ... Processando: Links (LINK) Oggetti: 227000 Colonne: 29 Recupero dati... Generazione CSV... OK: H:\exports\trenord_skim_Links.csv (12.50 MB, 227000 righe) ================================================================================ RIEPILOGO EXPORT ================================================================================ Successo: 7 - Links: 227000 righe x 29 col = 12.50 MB - Nodes: 45000 righe x 12 col = 3.20 MB ... Directory output: H:\go\trenord_2025\exports ``` ### Log File - **Location:** `H:\go\trenord_2025\logs\workflow_YYYYMMDD_HHMMSS.log` - **Content:** Completo output console con timestamp - **Encoding:** UTF-8 ## Error Handling ### Gestione Errori ```python # Tipo sconosciuto if not collection_path: results.append({'table': table_name, 'status': 'SKIPPED', 'reason': 'Unknown type'}) # Collection non accessibile try: collection = eval(collection_path) except Exception as e: results.append({'table': table_name, 'status': 'ERROR', 'reason': str(e)}) # GetMultipleAttributes fallisce try: data = collection.GetMultipleAttributes(full_attrs) except Exception as e: results.append({'table': table_name, 'status': 'ERROR', 'reason': str(e)[:100]}) ``` ### Casi Comuni | Errore | Causa | Soluzione | |--------|-------|-----------| | `File not found` | Path .lay errato | Verifica path assoluto | | `Unknown type` | Tipo non in mapping | Aggiungi a `type_to_collection` | | `Collection empty` | Nessun dato | Normale se collezione vuota | | `Attribute not found` | Attributo inesistente | Rimuovi dal layout | ## Testing ### Test Checklist - [ ] Export singola tabella - [ ] Export multiple tabelle - [ ] Sub-attributes processing - [ ] Large dataset (>100K rows) - [ ] Empty collection handling - [ ] Invalid attribute handling - [ ] UTF-8 encoding (caratteri italiani) - [ ] Workflow integration (3 task sequence) ### Test Script ```python # In Visum Python Console (Ctrl+P) # 1. Test export standalone exec(open(r"h:\visum-thinker-mcp-server\export_GLayout_tables.py").read()) # 2. Test export in workflow exec(open(r"h:\visum-thinker-mcp-server\manage-stops-workflow.py").read()) ``` ## Troubleshooting ### Issue: Layout file not found ``` ERRORE: File not found: H:\layout.lay ``` **Fix:** Usa path assoluto con raw string `r"H:\path\to\file.lay"` ### Issue: Tabella skipped ``` SKIP: Tipo sconosciuto ``` **Fix:** Aggiungi mapping in `type_to_collection` dict ### Issue: ASCII encoding error ``` UnicodeEncodeError: 'ascii' codec can't encode character ``` **Fix:** Verifica encoding UTF-8 (`# -*- coding: utf-8 -*-`) ### Issue: Empty CSV ``` OK: file.csv (0.00 MB, 0 righe) ``` **Fix:** Normale se collezione vuota in Visum ## Next Steps ### Possible Enhancements 1. **Filtri avanzati:** Export solo subset di righe 2. **Format opzioni:** Excel, JSON, SQLite 3. **Parallel export:** Multi-threading per tabelle grandi 4. **Compression:** ZIP/GZIP output 5. **Incremental export:** Solo dati modificati ### Future Task Types - `export_network_graphics`: Export mappe PNG/SVG - `export_matrices`: Export matrici O/D in formato specifico - `export_analysis_results`: Export risultati analisi custom ## References ### Related Files - `manage-stops-workflow.py` - Main workflow script (864 lines) - `export_GLayout_tables.py` - Standalone export script (199 lines) - `test-export-task.py` - Esempi configurazione task - `TABLE_EXPORT_WORKFLOW.md` - MCP server documentation ### Documentation - `CLAUDE_WORKFLOW_GUIDE.md` - Complete workflow guide - `DEMAND_SEGMENTS_GUIDE.md` - Demand segments reference - `VISUM_PROCEDURES_API.md` - Procedures API reference --- **Status:** ✅ INTEGRATO E TESTATO **Ultimo aggiornamento:** 2025-01-XX **Versione workflow:** 3.0 (3 task types supported)

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/multiluca2020/visum-thinker-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server