Генерация кода для файла Valve QC с использованием Python

#python #code-generation

#python #генерация кода

Вопрос:

Примерно через год написания этих файлов вручную я ищу способ создания файлов QC. Я пытался просто жестко кодировать команды в списке и просто записывать команду и ее значение в виде текста, но это кажется слишком грубым, и я полагаю, что должен быть более элегантный способ заполнения файла. Если это имеет значение, моя конечная цель — превратить это в дополнение для blender. РЕДАКТИРОВАТЬ: Добавление примера выходного файла / файла контроля качества

 $modelname "AnrachyReignsJack the ripper.mdl"
$maxverts "65000"

$model "Jack" "genericmale.dmx"{
 eyeball "eye_right" "bip_head" -1.66 0.53 66.89 "eyeball_r" 1 4 "iris_unused" 2.9
 eyeball "eye_left" "bip_head" -1.66 0.53 66.89 "eyeball_l" 1 4 "iris_unused" 2.9
 mouth 0 "mouth" "bip_head" 0 1 0
flexcontroller eyes range -65 65 eyes_updown
flexconttroller eye range -65 65 eyes_rightleft
}

$bodygroup "Right Arm"{
 studio "Gattling.dmx"
 blank
}

$bodygroup "Left arm"{
 studio "HandCannon.dmx"
 blank
}

$mostlyopaque

$attacement "eyes" "bip_head" 1 1 1 rotate 0 -80 -90
$attachment "mouth" "bip_head" 0 0 0 rotate 0 0 0

$cdmaterials "modelsGameModelsAnarachyReignsJack"

$sequence "Jack" "genericmale.dmx

  

Комментарии:

1. Можете ли вы привести пример ваших исходных данных, вашего текущего кода и желаемого результата?

2. Меня нет дома, поэтому я не могу обновить свой код, но я создал файл примера и добавил его в вопрос. Подавляющее большинство команд контроля качества представляют собой некоторую пару Ключ / значение, хотя некоторые из них имеют сложные типы, такие как $model и $attachment.

3. Вы могли бы создать «объектную модель документа» для файлов QC; похоже, что у некоторых объектов, таких как model , есть дочерние элементы, у некоторых нет — тогда вы можете просто пройти по дереву, чтобы записать объекты в файл…

Ответ №1:

Как я упоминал в комментариях, вы могли бы создать древовидный API для этих объектов.

Например,

 import json
import sys


class QCObject:
    def __init__(self, tag, parameters=(), children=()):
        self.tag = tag
        self.parameters = list(parameters)
        self.children = list(children)

    def add(self, child):
        self.children.append(child)

    def serialize(self, stream, depth=-1):
        indent = "  " * depth
        if self.tag:
            header_line = [self.tag]
            # Here's hoping JSON serialization is close enough to QC
            header_line.extend([json.dumps(val) for val in self.parameters])
            if self.children:
                header_line.append("{")
            print(indent   " ".join(header_line), file=stream)
        for child in self.children:
            child.serialize(stream, depth=depth   1)
        if self.tag and self.children:
            print(indent   "}", file=stream)


root = QCObject(None)
root.add(QCObject("$modelname", ["Jack.mdl"]))
root.add(QCObject("$maxverts", ["65000"]))

jack_model = QCObject(
    "$model",
    ["Jack" "genericmale.dmx"],
    children=[
        QCObject(
            "eyeball", ["eye_right", "bip_head", -1.66, 0.53, 66.89, "eyeball_r", 1, 4, "iris_unused", 2.9]
        ),
    ],
)

root.add(jack_model)

root.add(
    QCObject("$bodygroup", ["Right Arm"], children=[QCObject("studio", ["Gattling.dmx"]), QCObject("blank"),])
)

root.serialize(sys.stdout)
  

выводит

 $modelname "Jack.mdl"
$maxverts "65000"
$model "Jackgenericmale.dmx" {
  eyeball "eye_right" "bip_head" -1.66 0.53 66.89 "eyeball_r" 1 4 "iris_unused" 2.9
}
$bodygroup "Right Arm" {
  studio "Gattling.dmx"
  blank
}
  

с автоматическим отступом и без искажения строки managel.

Комментарии:

1. Извините, я пропустил ответ прошлой ночью, застрял допоздна. Я попробую и сообщу, что пока это выглядит многообещающе