BurningTimesAi/공유/기획/FirstRising/아이템/icon_make.py

47 lines
3.2 KiB
Python
Raw Permalink Normal View History

# -*- coding: utf-8 -*-
# 2026-10-02 PD 지시(자율 반복) — "원하는 장비 아이콘을 자유롭게 생성할 수 있는 … 체계". 새 종류든 기존 종류든 한 줄로 뽑는 명령.
# a18 결론: 글자만으로는 형태가 안정되지 않는다 → 정식 경로를 "글자 → 자동 길잡이 → 본 생성" 2단으로 묶는다.
# python icon_make.py <종류> "<초벌 묘사(영어)>" "<본 묘사(영어 · {pal} 자리에 색 조합이 들어간다)>" [초벌 장수=6] [길잡이 수=2] [길잡이당 장수=3]
# 예: python icon_make.py crossbow "a single crossbow, wooden stock, steel limbs" "a crossbow, carved wooden stock, steel limbs with ornate fittings, {pal}"
# 하는 일:
# 1) SDXL 아이콘 모델로 초벌을 그려 자동 채점(물건 하나 · 여백 안 · 한 덩어리)을 통과한 것의 윤곽을 길잡이로 등록(shapes/<종류>__genxl<k>.png)
# 2) 본 묘사를 종류 표(moba_anfg/type_desc.json)에 적는다 — 생성 스크립트가 읽는다
# 3) 그 길잡이로 본 생성(기본 설정 = v4 0.6 · paint · UltraSharp · 다듬기 0.45) → moba_anfg/mk<종류>_*.png + 검토 시트
# 결과는 검토(사람 또는 검토 에이전트)를 거쳐 icon_dataset.py · icon_pack.py 로 넘긴다. 자동 채점은 "그 종류로 읽히는가"를 보지 못한다.
import io, json, os, re, subprocess, sys
HERE = os.path.dirname(os.path.abspath(__file__))
ROOT = os.path.join(HERE, "moba_anfg")
DESC_JSON = os.path.join(ROOT, "type_desc.json")
def main():
kind, draft_desc, final_desc = sys.argv[1], sys.argv[2], sys.argv[3]
n_draft = sys.argv[4] if len(sys.argv) > 4 else "6"
n_guide = sys.argv[5] if len(sys.argv) > 5 else "2"
n_out = sys.argv[6] if len(sys.argv) > 6 else "3"
if not re.match(r"^[a-z_]+$", kind):
print("종류 이름은 영어 소문자와 _ 만"); sys.exit(1)
# 2) 본 묘사 등록
table = json.load(io.open(DESC_JSON, encoding="utf-8")) if os.path.exists(DESC_JSON) else {}
table[kind] = final_desc
json.dump(table, io.open(DESC_JSON, "w", encoding="utf-8"), ensure_ascii=False, indent=1)
env = dict(os.environ, PYTHONIOENCODING="utf-8")
# 1) 초벌 → 길잡이
r = subprocess.run([sys.executable, os.path.join(HERE, "icon_guide_bootstrap.py"), kind, draft_desc, n_draft, n_guide], env=dict(env, BOOT_MODEL="xl"), cwd=HERE)
if r.returncode != 0:
sys.exit(r.returncode)
# 3) 본 생성(이 종류의 SDXL 초벌 길잡이만)
tag = "mk" + kind.replace("_", "")
genv = dict(env, ANFG_TONE="paint", ANFG_UPSCALE="model", ANFG_REFINE="0.45", ANFG_LORA2="FR_anfg_v4.safetensors:0.6",
ANFG_ONLY=kind, ANFG_SKIP="genpd,genmoba,draw,-fr,-ll", ANFG_ROWS="", ANFG_SEED=os.environ.get("ANFG_SEED", "41"))
r = subprocess.run([sys.executable, os.path.join(HERE, "comfy_moba_anfg.py"), ROOT, tag, "0.7", n_out, "512", "1", "lib", "0.6", "0.5"], env=genv, cwd=HERE)
if r.returncode != 0:
sys.exit(r.returncode)
subprocess.run([sys.executable, os.path.join(HERE, "icon_review_sheet.py"), ROOT, tag, "8"], env=env, cwd=HERE)
print("끝: %s\\%s_review_0.png 를 검토한 뒤 picks_%s.json → icon_dataset.py add · icon_pack.py" % (ROOT, tag, tag))
if __name__ == "__main__":
main()