Files
stylized-rock-generator/tests/test_rock_classes.py
T
D4rkst3randClaude Opus 4.8 d58bfe05e8 Rock Generator 2.6.0: Groessen-Klassen wirken jetzt + Randomize-Bug gefixt
1) KLASSEN-GROESSE (vom User gemeldet): S und M kamen gleich gross raus.
   Ursache war eine Luecke im Design, nicht in der Bedienung: "keep_size"
   normiert die Zufalls-Streuung auf konstantes Volumen - damit wurde alles,
   was ueber scale_min/max eingestellt war, wieder herausgerechnet. Fuer die
   Groesse der KLASSE gab es schlicht keinen Regler.
   Neu: CLASS_SIZES (S=0.45, M=1.0, L=1.9, XL=3.2) plus "Groesse aus Klasse"
   und eine freie "Basis-Groesse". Die Klassengroesse ist bewusst gesetzt und
   von der Streuung getrennt; sie greift auch bei abgeschalteter Randomisierung.
   Gemessen: S 0.85 m | M 1.9 m | L 3.5 m | XL 6.0 m, Volumen-Streuung
   INNERHALB jeder Klasse bleibt bei 1.11x (nur Form).

2) BUG im Zufalls-Button (kam mit 2.5.0): jitter() schrieb einen float in die
   int-Property subsurf_levels -> TypeError, der Operator brach komplett ab.
   jitter() rundet jetzt fuer Int-Properties. Von tests/test_randomize.py
   gefangen.

Neuer Test tests/test_rock_classes.py deckt die Klassengroessen ab.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-31 02:42:17 +02:00

32 lines
1.6 KiB
Python

import bpy, sys, importlib.util
spec=importlib.util.spec_from_file_location("srg", r"A:\eco\stylized_rock_generator\stylized_rock_generator.py")
r=importlib.util.module_from_spec(spec); sys.modules["srg"]=r; spec.loader.exec_module(r)
try: r.unregister()
except Exception: pass
r.register()
s=bpy.context.scene.rock_gen_settings
s.batch_count=5; s.subsurf_levels=3; s.use_modal=False; s.spacing=3
s.scale_min=0.75; s.scale_max=1.25; s.keep_size=True
fails=[]; means={}
print("Klasse | Groesse min..max (m) | Volumen min..max | Streuung")
for kl in ('S','M','L','XL'):
for o in list(bpy.data.objects): bpy.data.objects.remove(o,do_unlink=True)
s.name_class=kl
bpy.ops.object.generate_rocks_batch()
vols=[]; dims=[]
for o in bpy.context.scene.objects:
if o.type!='MESH': continue
bb=o.bound_box
d=[(max(v[i] for v in bb)-min(v[i] for v in bb))*o.scale[i] for i in range(3)]
dims.append(max(d)); vols.append(d[0]*d[1]*d[2])
means[kl]=sum(vols)/len(vols)
print(" %-3s | %.2f .. %.2f | %.2f .. %.2f | %.2fx"
% (kl, min(dims), max(dims), min(vols), max(vols), max(vols)/min(vols)))
if max(vols)/min(vols) > 1.6: fails.append("streuung_%s"%kl)
print("Volumen-Verhaeltnis M/S = %.1fx | L/M = %.1fx | XL/L = %.1fx"
% (means['M']/means['S'], means['L']/means['M'], means['XL']/means['L']))
if not (means['S'] < means['M'] < means['L'] < means['XL']): fails.append("reihenfolge")
if means['M']/means['S'] < 3: fails.append("S_zu_gross")
r.unregister()
print("ERGEBNIS:", "OK" if not fails else "FEHLER: "+", ".join(fails))