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:
+93
-51
@@ -1,7 +1,7 @@
|
||||
bl_info = {
|
||||
"name": "Stylized Tree Generator",
|
||||
"author": "D4rkst3r",
|
||||
"version": (1, 23, 0),
|
||||
"version": (1, 24, 0),
|
||||
"blender": (4, 2, 0),
|
||||
"location": "View3D > Sidebar > Tree Gen",
|
||||
"description": "Parametrischer Baum-/Palmen-/Busch-Generator (Geometry Nodes) mit Wachstums-Stufen",
|
||||
@@ -1518,6 +1518,7 @@ class TREEGEN_OT_create(Operator):
|
||||
|
||||
|
||||
class VIEW3D_PT_tree_generator(Panel):
|
||||
"""Haupt-Panel: Vorlage, Name, Erzeugen. Der Rest sitzt in Unter-Panels."""
|
||||
bl_label = "Tree Generator"
|
||||
bl_idname = "VIEW3D_PT_tree_generator"
|
||||
bl_space_type = 'VIEW_3D'
|
||||
@@ -1528,60 +1529,96 @@ class VIEW3D_PT_tree_generator(Panel):
|
||||
layout = self.layout
|
||||
s = context.scene.tree_gen_settings
|
||||
|
||||
box = layout.box()
|
||||
box.label(text="Vorlage", icon='PRESET')
|
||||
box.prop(s, "preset", text="")
|
||||
box.prop(s, "seed")
|
||||
row = box.row(align=True)
|
||||
layout.prop(s, "preset", text="")
|
||||
row = layout.row(align=True)
|
||||
row.prop(s, "art_name", text="")
|
||||
row.prop(s, "variant")
|
||||
box.label(text="Name: %s_%02d%s" % (_art(s), s.variant,
|
||||
"_S1..S%d" % s.stages if s.use_growth else ""),
|
||||
icon='INFO')
|
||||
|
||||
box = layout.box()
|
||||
box.label(text="Wachstum")
|
||||
box.prop(s, "use_growth")
|
||||
sub = box.column(align=True)
|
||||
sub.enabled = s.use_growth
|
||||
sub.prop(s, "stages")
|
||||
sub.prop(s, "spacing")
|
||||
|
||||
box = layout.box()
|
||||
box.label(text="Zufall", icon='FILE_REFRESH')
|
||||
box.prop(s, "random_amount")
|
||||
box.operator("object.treegen_randomize", icon='FILE_REFRESH')
|
||||
|
||||
box = layout.box()
|
||||
box.label(text="Blattwerk", icon='OUTLINER_OB_POINTCLOUD')
|
||||
box.prop(s, "leaf_card")
|
||||
sub = box.column(align=True)
|
||||
sub.enabled = s.leaf_card is not None
|
||||
sub.prop(s, "leaf_density")
|
||||
sub.prop(s, "leaf_size")
|
||||
sub.prop(s, "leaf_size_var")
|
||||
sub.prop(s, "leaf_max_radius")
|
||||
sub.prop(s, "leaf_tilt")
|
||||
sub.prop(s, "leaf_budget")
|
||||
box.operator("object.treegen_leaves", icon='OUTLINER_OB_POINTCLOUD')
|
||||
if s.leaf_card is None:
|
||||
box.label(text="Ohne Card bleibt _Leaf leer", icon='INFO')
|
||||
|
||||
box = layout.box()
|
||||
box.label(text="Zusatz-Ebenen")
|
||||
box.prop(s, "make_leaf")
|
||||
box.prop(s, "make_frucht")
|
||||
|
||||
box = layout.box()
|
||||
box.label(text="Export")
|
||||
box.prop(s, "apply_modifier")
|
||||
row = box.row()
|
||||
row.enabled = s.apply_modifier
|
||||
row.prop(s, "generate_lightmap_uv")
|
||||
|
||||
layout.separator()
|
||||
layout.operator("object.treegen_create", icon='OUTLINER_OB_MESH')
|
||||
layout.label(text="Feinjustierung: am Modifier 'GN_Tree'", icon='INFO')
|
||||
col = layout.column(align=True)
|
||||
col.scale_y = 1.4
|
||||
col.operator("object.treegen_create", text="Baum erzeugen",
|
||||
icon='OUTLINER_OB_MESH')
|
||||
layout.label(text="%s_%02d%s" % (_art(s), s.variant,
|
||||
"_S1..S%d" % s.stages if s.use_growth else ""),
|
||||
icon='INFO')
|
||||
|
||||
row = layout.row(align=True)
|
||||
row.prop(s, "seed")
|
||||
row.prop(s, "random_amount", text="")
|
||||
row.operator("object.treegen_randomize", text="", icon='FILE_REFRESH')
|
||||
|
||||
layout.label(text="Feinjustierung: Modifier 'GN_Tree'", icon='MODIFIER')
|
||||
|
||||
|
||||
class _TreeSub(Panel):
|
||||
"""Basis aller Unter-Panels."""
|
||||
bl_space_type = 'VIEW_3D'
|
||||
bl_region_type = 'UI'
|
||||
bl_category = "Tree Gen"
|
||||
bl_parent_id = "VIEW3D_PT_tree_generator"
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
|
||||
|
||||
class VIEW3D_PT_tree_growth(_TreeSub):
|
||||
bl_label = "1 - Wachstum"
|
||||
|
||||
def draw_header(self, context):
|
||||
self.layout.prop(context.scene.tree_gen_settings, "use_growth", text="")
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
s = context.scene.tree_gen_settings
|
||||
col = layout.column(align=True)
|
||||
col.active = s.use_growth
|
||||
col.prop(s, "stages")
|
||||
col.prop(s, "spacing")
|
||||
if s.use_growth:
|
||||
layout.label(text="Setzling bis Baum in %d Stufen" % s.stages,
|
||||
icon='INFO')
|
||||
|
||||
|
||||
class VIEW3D_PT_tree_leaves(_TreeSub):
|
||||
bl_label = "2 - Blattwerk"
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
s = context.scene.tree_gen_settings
|
||||
layout.prop(s, "leaf_card")
|
||||
col = layout.column(align=True)
|
||||
col.active = s.leaf_card is not None
|
||||
col.prop(s, "leaf_density")
|
||||
col.prop(s, "leaf_size")
|
||||
col.prop(s, "leaf_size_var")
|
||||
col.prop(s, "leaf_max_radius")
|
||||
col.prop(s, "leaf_tilt")
|
||||
col.prop(s, "leaf_budget")
|
||||
layout.separator()
|
||||
layout.operator("object.treegen_leaves", icon='OUTLINER_OB_POINTCLOUD')
|
||||
if s.leaf_card is None:
|
||||
layout.label(text="Ohne Card bleibt _Leaf leer", icon='INFO')
|
||||
|
||||
|
||||
class VIEW3D_PT_tree_layers(_TreeSub):
|
||||
bl_label = "3 - Zusatz-Ebenen"
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
s = context.scene.tree_gen_settings
|
||||
layout.prop(s, "make_leaf")
|
||||
layout.prop(s, "make_frucht")
|
||||
|
||||
|
||||
class VIEW3D_PT_tree_export(_TreeSub):
|
||||
bl_label = "4 - Export"
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
s = context.scene.tree_gen_settings
|
||||
layout.prop(s, "apply_modifier")
|
||||
row = layout.row()
|
||||
row.active = s.apply_modifier
|
||||
row.prop(s, "generate_lightmap_uv")
|
||||
|
||||
|
||||
classes = (
|
||||
@@ -1589,7 +1626,12 @@ classes = (
|
||||
TREEGEN_OT_randomize,
|
||||
TREEGEN_OT_leaves,
|
||||
TREEGEN_OT_create,
|
||||
# Eltern-Panel zuerst, sonst findet Blender die bl_parent_id nicht.
|
||||
VIEW3D_PT_tree_generator,
|
||||
VIEW3D_PT_tree_growth,
|
||||
VIEW3D_PT_tree_leaves,
|
||||
VIEW3D_PT_tree_layers,
|
||||
VIEW3D_PT_tree_export,
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user