Panels aufgeraeumt (alle vier Addons) + Test-Suite instandgesetzt
Panel-Umbau
-----------
Jedes Addon hatte seine Einstellungen als Kette dauerhaft offener Boxen - beim
Rock Generator 15 Stueck, man musste am ganzen Panel vorbeiscrollen, um an den
Erzeugen-Knopf zu kommen. Jetzt steht oben nur, was man bei jedem Asset anfasst
(Vorlage, Name, grosser Erzeugen-Knopf, Zufall), der Rest liegt in nummerierten,
eingeklappten Unter-Panels in der Reihenfolge des Arbeitsablaufs:
Rock Gen 9 Unter-Panels (Benennung ... Textur-Bake)
Tree Gen 4 (Wachstum, Blattwerk, Zusatz-Ebenen, Export)
Grass Gen 4 (Form, Haltung, Batch, Kanal-Belegung)
Asset Utils 5 (war schon so, dient als Vorlage)
Schalter, die ein ganzes Unter-Panel steuern (Vertex-Farben backen,
Wachstums-Stufen), sitzen jetzt als Haekchen im Panel-Kopf - Zustand sichtbar
ohne aufzuklappen.
Gemessen statt geglaubt: test_panels.py registriert alle vier Addons, laesst
jedes Panel zeichnen, prueft Tab-Zugehoerigkeit und Auf-/Zugeklappt-Absicht,
dass jeder angebotene Operator existiert - und vor allem, dass JEDE definierte
Property irgendwo erreichbar bleibt (Zweige wie base_shape='BOX' werden dabei
durchgeschaltet). Ergebnis: 0 von 122 Properties beim Umbau verloren.
Test-Suite
----------
Beim Gegenpruefen kam heraus, dass fuenf Tests still veraltet waren und eine
echte Regression nicht gemeldet haetten:
test_rock_gen suchte Objekte mit Praefix "Rock_" - die heissen seit dem
Benennungssystem "Fels_A_M_01". Fand 0 von 3.
test_base_shapes loeschte am Schleifenanfang ALLE Objekte, auch die eigenen
Kopien aus vorigen Durchlaeufen -> StructRNA removed.
test_ecogame_tree erwartete eine feste Namensliste ohne die spaeter
dazugekommenen _Leaf-Objekte.
test_tree_addon dito, ausserdem Zip-Version 1.22.0 fest verdrahtet.
test_leaves Zip-Version 1.23.0 fest verdrahtet.
Drei Muster vermieden statt nur die Symptome geflickt: neue Objekte ueber die
Differenz vorher/nachher finden statt ueber ein Namens-Praefix, Zips per glob
statt mit fester Version, Zusatz-Ebenen beim Zaehlen herausfiltern.
Neu: run_tests.ps1 faehrt die komplette Suite mit einem Befehl (-Filter fuer
einzelne). Genau das fehlte - deshalb war das Veralten nicht aufgefallen.
13 von 13 Tests bestehen.
Nebenbei
--------
build.ps1 ruft server-generate jetzt mit --html auf (browsbare index.html fuer
statisches Hosting). Nachgemessen und im README festgehalten: zwei Zips
derselben Extension-ID sind KEIN Versions-Archiv - server-generate warnt
("archive found with duplicates ... conflicting blender versions"), mehrere
Versionen einer ID gehen nur bei verschiedenen Blender-Bereichen.
Versionen: Rock 2.13.0, Tree 1.24.0, Grass 1.1.0, Asset Utils 1.1.0
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -26,21 +26,31 @@ VARS=[("Wuerfel",'CUBE',None),
|
||||
print("%-9s %-6s %s" % ("Variante","Form","Abmessungen X/Y/Z (m)"))
|
||||
keep=[]; x=0.0
|
||||
for name,shape,prop in VARS:
|
||||
for o in list(bpy.data.objects): bpy.data.objects.remove(o,do_unlink=True)
|
||||
# FALLE: das hier loeschte frueher ALLE Objekte - auch die Kopien aus den
|
||||
# vorigen Durchlaeufen. Die waren beim Rendern tot ("StructRNA ... removed").
|
||||
kept = {k[0] for k in keep}
|
||||
for o in list(bpy.data.objects):
|
||||
if o not in kept: bpy.data.objects.remove(o,do_unlink=True)
|
||||
s.base_shape=shape; s.box_variation=0.0
|
||||
if prop: s.box_proportions=prop
|
||||
s.seed=7
|
||||
# Die behaltenen Kopien stehen weiter in der Szene - [0] wuerde eine davon
|
||||
# greifen statt des frisch erzeugten Steins. Deshalb ueber die Differenz.
|
||||
before=set(bpy.context.scene.objects)
|
||||
bpy.ops.object.generate_rocks_batch()
|
||||
ob=[o for o in bpy.context.scene.objects if o.type=='MESH'][0]
|
||||
ob=[o for o in bpy.context.scene.objects
|
||||
if o.type=='MESH' and o not in before][0]
|
||||
bb=ob.bound_box
|
||||
d=[max(v[i] for v in bb)-min(v[i] for v in bb) for i in range(3)]
|
||||
print("%-9s %-6s %.2f / %.2f / %.2f" % (name,shape,d[0],d[1],d[2]))
|
||||
if name=="Platte" and not (d[2] < d[0]*0.45): fails.append("platte_nicht_flach")
|
||||
if name=="Riegel" and not (d[0] > d[1]*1.5): fails.append("riegel_nicht_laenglich")
|
||||
cp=ob.copy(); cp.data=ob.data.copy(); keep.append((cp,x))
|
||||
cp=ob.copy(); cp.data=ob.data.copy()
|
||||
bpy.context.collection.objects.link(cp) # sofort verlinken, nicht spaeter
|
||||
keep.append((cp,x))
|
||||
x+=2.4
|
||||
for cp,px in keep:
|
||||
bpy.context.collection.objects.link(cp); cp.location=(px,0,0)
|
||||
cp.location=(px,0,0)
|
||||
cp.data.materials.clear(); cp.data.materials.append(mat)
|
||||
for o in list(bpy.context.scene.objects):
|
||||
if o.type=='MESH' and o not in [k[0] for k in keep]: bpy.data.objects.remove(o,do_unlink=True)
|
||||
|
||||
Reference in New Issue
Block a user