MDF в VTK Конвертация с использованием AWK - PullRequest
4 голосов
/ 28 апреля 2020

Я новичок, так что извините, если это уже говорилось, но я не могу найти именно то, что мне нужно для решения моей проблемы. Я пытаюсь написать «скрипт» AWK, который может преобразовать MDF (Me sh Definition File) в качестве входных данных в (VALID) VTK-файл в качестве выходных данных.

У меня есть пример файла MDF, который выглядит как это:

TITLE "1"
NMESHPOINTS 4
NNODES 4
NELEMENTS_TRIANG1 2

TIMESTEP 0.00001
NINTERNAL_TIMESTEPS 1000
NEXTERNAL_TIMESTEPS 100
DAMPING_FACTOR 0.01 

MESHPOINT_COORDINATES
1   0.0   0.0   0.0
2   1.0   0.0   0.0
3   1.0   1.0   0.0
4   0.0   1.0   0.0


NODES_TRIANG1
1 1 2 3
2 1 3 4

И я хочу сделать действительный файл VTK из этого ввода. Вот как должен выглядеть вывод:

# vtk DataFile Version 1.0
2D Unstructured Grid
ASCII

DATASET UNSTRUCTURED_GRID
POINTS 4 float
0.0 0.0 0.0
1.0 0.0 0.0
1.0 1.0 0.0
0.0 1.0 0.0

CELLS 2 8
3 0 1 2
3 0 2 3

CELL_TYPES 2
5
5

Я попытался сделать картину, как работают сопоставления, надеюсь, это объясняет некоторые из них. Для упрощения этого конкретного примера c предположим, что мы хотим работать только с треугольниками. mapping

К сожалению, я не имею тот же файл, что и VTK и MDF, я попытался написать вручную. Есть ли способ сделать это с AWK? Любая помощь будет высоко ценится!

1 Ответ

3 голосов
/ 28 апреля 2020

Отличная диаграмма, показывающая вход -> выходное отображение! Очень легко написать это:

$ cat tst.awk
$1 ~ /^[[:alpha:]]/ { f[$1] = $2 }

!NF { block = "" }

$1 == "MESHPOINT_COORDINATES" {
    block = $1
    print "# vtk DataFile Version 1.0"
    print "2D Unstructured Grid"
    print "ASCII"
    print ""
    print "DATASET UNSTRUCTURED_GRID"
    printf "POINTS %d float\n", f["NMESHPOINTS"]
    next
}

block == "MESHPOINT_COORDINATES" {
    $1 = ""
    sub(/^[[:space:]]+/,"")
    print
}

$1 == "NODES_TRIANG1" {
    block = $1
    printf "\nCELLS %d %d\n", f["NELEMENTS_TRIANG1"], f["NELEMENTS_TRIANG1"] * 4
    next
}

block == "NODES_TRIANG1" {
    printf "%s", 3
    for (i=2; i<=NF; i++) {
        printf " %s", $i - 1
    }
    print ""
    nlines++
}

END {
    printf "\nCELL_TYPES %d\n", nlines
    for (i=1; i<=nlines; i++) {
        print 5
    }
}

.

$ awk -f tst.awk file.mdf
# vtk DataFile Version 1.0
2D Unstructured Grid
ASCII

DATASET UNSTRUCTURED_GRID
POINTS 4 float
0.0 0.0 0.0
1.0 0.0 0.0
1.0 1.0 0.0
0.0 1.0 0.0

CELLS 2 8
3 0 1 2
3 0 2 3

CELL_TYPES 2
5
5

Обычно мы отвечаем только на вопросы, когда постер пытался решить их сам, но вы приложили достаточно усилий для создания пример и описание сопоставления, которое, по-моему, вы заслуживаете помощи в решении, поэтому - посмотрите выше, попробуйте выяснить, как оно работает самостоятельно (добавьте «печатные издания», проверьте страницу руководства и т. д. c.), а затем опубликуйте новый вопрос. если у вас есть какие-либо конкретные c вопросы по этому поводу.

...