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>
32 lines
1.6 KiB
Python
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))
|