apdl-parser 0.1.0

Parser for ANSYS APDL text listings (NLIST/ELIST/DLIST/PRNSOL)
Documentation
# apdl-parser

Небольшая библиотека на Rust для парсинга текстовых листингов из **ANSYS APDL** (вывод команд вроде `NLIST`, `ELIST`, `DLIST`, `PRNSOL`).

Проект полезен, когда нужно **автоматически вытащить сетку/результаты из текстового вывода** APDL и дальше обработать это в своём пайплайне (CSV/JSON, постпроцессинг, проверки качества, интеграция с Python и т.д.).

## Что умеет

- Парсит строки данных (whitespace-separated) в типизированные структуры:
  - `Nlist`: координаты узлов (`NLIST`)
  - `Elist`: информация об элементах и их узлах (`ELIST`)
  - `Dlist`: табличные данные вида `node label real imag` (`DLIST`)
  - `Prnsol`: пример результатов по узлам (`PRNSOL`, сейчас `NODE TEMP`)
- Имеет общий хелпер `get_list()` для чтения файла и парсинга в `Vec<T>`.

## Типовые сценарии применения

- **Экспорт сетки** из APDL в свой формат (узлы/элементы) для дальнейшей геометрической обработки.
- **Проверки качества модели** (поиск “дыр” в нумерации, контроль координат/материалов/типов элементов).
- **Постпроцессинг результатов**: собрать результаты из `PRNSOL`/`DLIST` и построить графики/отчёты.
- **Интеграция в CI/пайплайны расчётов**: сравнение результатов между версиями модели, регресс-тесты.

## Установка

Добавьте зависимость в `Cargo.toml`:

```toml
[dependencies]
apdl-parser = { git = "https://github.com/indraine/apdl-parser" }
```

После публикации в crates.io можно будет заменить на обычную версию.

## Использование

### Пример: прочитать `NLIST` из файла

```rust
use std::path::Path;

use apdl_parser::{Nlist, get_list};

fn main() -> anyhow::Result<()> {
    let nodes: Vec<Nlist> = get_list(Path::new("NLIST.txt"))?;
    println!("nodes: {}", nodes.len());
    println!("{nodes:#?}");
    Ok(())
}
```

### Примеры для файлов из репозитория (`files/*.lis`)

В репозитории есть папка `files/` с примерами листингов. Их можно прогнать через готовые примеры:

```bash
cargo run --example parse_nlist
cargo run --example parse_elist
cargo run --example parse_dlist
cargo run --example parse_prnsol
```

### Пример: парсинг одной строки

```rust
use apdl_parser::Elist;

fn main() -> anyhow::Result<()> {
    let e: Elist = "1  1  1  0  0  0  10  20  30".parse()?;
    println!("{e:?}");
    Ok(())
}
```

## Поддерживаемые типы

- `Nlist``src/nlist.rs`
- `Elist``src/elist.rs`
- `Dlist``src/dlist.rs`
- `Prnsol``src/prnsol.rs`

## Roadmap (идеи)

- Больше вариантов `PRNSOL` (не только `TEMP`).
- Болеe строгая валидация формата и сообщения об ошибках.
- Экспорт в CSV/JSON (в отдельном crate, чтобы не тащить зависимости в core).
- Опциональная поддержка `f64`.

## Лицензия

Двойная лицензия: **MIT OR Apache-2.0**. См. `LICENSE-MIT` и `LICENSE-APACHE`.