#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. Извините, я пропустил ответ прошлой ночью, застрял допоздна. Я попробую и сообщу, что пока это выглядит многообещающе