About
← Back to Menu

Sag Chart Creator

Converts sag chart files from various utility software formats into .vlt files compatible with the Vulcan App. Uses JSON structure for improved features and reliability.

How It Works

  1. Upload — Drop in sag chart files (.txt, .csv, .xlsx, .pdf) or images (.jpg, .png) of stringing charts
  2. Detect Format — The system auto-detects the source format (Sag10, PLS-CADD, or image/PDF). For images and scanned PDFs, AI vision reads the chart data. Text-based PDFs are read directly.
  3. Verify — Review every value, edit conductor names, fix any AI errors, reorder sections, and approve each conductor
  4. Download — Export as .vlt

Supported Input Formats

FormatFile TypesSource
Sag10.txtSouthwire Sag10 software output
PLS-CADD.csv, .xlsxPLS-CADD stringing reports
Image / PDF (AI Vision).jpg, .png, .pdfPhotos, screenshots, or scanned PDFs of stringing charts

AI Vision for Images & PDFs

When sag chart images (JPEG/PNG) or scanned PDFs are uploaded, the system uses AI vision (Claude by Anthropic) to extract the data. Text-based PDFs are read directly without AI. This is highly effective but not perfect:

  • Images and PDFs are processed via the Anthropic API (encrypted in transit, not used for training)
  • Accuracy is typically 99%+ on clean, high-resolution charts
  • All extracted values must be reviewed on the verification screen
  • Individual cells can be edited directly if the AI misreads a value

JSON Schema (Version 1)

Each sag chart file contains one or more conductors, each with conditions, ruling spans, and temperature data rows:

{
  "version": 1,                          // Required. Schema version.
  "title": "Chart Name",                 // Optional. Display name.
  "createdBy": "Company/Person",          // Optional. Author.
  "createdDate": "2026-03-30",            // Optional. Date string.
  "loadingDistrict": "250B",              // Optional. Loading district.
  "settings": {                           // Optional. Chart-level config.
    "units": {                            // Optional. Defaults to imperial.
      "rulingSpan": "ft"|"m",
      "spanLength": "ft"|"m",
      "temperature": "F"|"C",
      "tension": "lbf"|"kN"|"kgf",
      "sag": "ft"|"m"|"in"|"cm",
      "weight": "lb/1000ft"|"lb/ft"|"kg/m"|"kg/km"
    },
    "tolerances": {                       // Optional. Auto-applied on load.
      "tension": 50,                      // Same units as settings.units.tension
      "sag": 0.5                          // Same units as settings.units.sag
    }
  },
  "conductors": [                         // Required. At least one.
    {
      "name": "336.4 26/7 ACSR",          // Required. Display name.
      "weight": 462,                      // Optional. In settings.units.weight.
      "conditions": [                     // Required. At least one.
        {
          "name": "Initial",              // Required. Condition name.
          "rulingSpans": [                 // Required. At least one.
            {
              "value": 500,                           // Required. Ruling span length.
              "spanLengths": [300, 400, 500, 600],    // Required. Span lengths.
              "spanTitles": ["1-2", "2-3", "3-4", "4-5"],  // Optional. Must match spanLengths count.
              "data": [                               // Required. Rows in ascending temp order.
                {
                  "temperature": 60,                  // In settings.units.temperature.
                  "tension": 4670,                    // In settings.units.tension.
                  "sags": [1.75, 3.11, 4.87, 7.01]   // In settings.units.sag. Must match spanLengths count.
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

Schema Notes

Units default to imperial
If settings.units is omitted, all values are assumed to be in ft, °F, lbf, and lb/1000ft. The app converts to internal units on import and handles display conversion.
Array counts must match
Each sags array must have the same number of entries as spanLengths for that ruling span. If spanTitles is present, it must also match.
Temperature rows in ascending order
Data rows should be sorted by temperature (low to high) for interpolation to work correctly.
Conditions are separate objects
Initial, Final, and any other conditions (e.g. Creep) are separate entries in the conditions array — not interleaved columns.
One file, many conductors
A single .vlt file can contain multiple conductors, each with multiple conditions and ruling spans.

Need the legacy CSV format? CSV Converter