git.lucas.co / hou-control
SideFX Houdini customization package
git clone https://git.lucas.co/hou-control.git

commitfc28db85ce9d89ccf654a57db6a47e9e6676dee0
parentfa2195abb3
authorLucas Galante <[email protected]>
date2026-09-16 14:20
developer_analysis: working Class Edge and Element folder

Class Edge's switch expression was missing its ch() so it never
selected the branch, and the branch itself was half-built. It now
measures the mesh's edge lengths, min, max, sum, average, median,
ratio, spread and count, into an edges_info dictionary with the same
toggles and rounding, and passes the geometry through.

The Element folder's wrangle compared against an Attribute SOP that
had no input; the node's second input, the previous frame, was the
intent. Change writes <attr>_change and <attr>_direction, Previous
Value writes <attr>_prev, nothing when the second input is missing.
Named after the attribute so they no longer collide with a dir
vector. The Type menu and Element folder hide for Class Edge. Neither
part ever worked, so the version stays 1.0.

Co-Authored-By: Claude Fable 5.1 <[email protected]>

 developer.md                                    |   2 +-
 otls-audit.md                                   |   5 +++--
 otls/sop_lsgalante.developer_analysis.1.0.hdalc | Bin 16164 -> 12800 bytes
 3 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/developer.md b/developer.md
index b09ba0f..c975977 100644
--- a/developer.md
+++ b/developer.md
@@ -72,7 +72,7 @@ Names are the tab-menu labels without the "Developer" prefix; the file in `otls/
 
 ### Developer
 - Align (Vector Conform, Vector Direct, Vector Unify): steers a vector attribute toward a list of targets in order: local average, global average, a constant, another attribute, or the surface tangent.
-- Analysis (Scalar Analysis, Vector Analysis): writes min, max, sum, average, ratio and spread into the attribute's `<attr>_info` dictionary.
+- Analysis (Scalar Analysis, Vector Analysis): writes min, max, sum, average, ratio and spread of a point attribute into its `<attr>_info` dictionary, or of the mesh's edge lengths into `edges_info`; the Element folder compares against the previous frame.
 - Bleed (Scalar Bleed): decays an attribute toward zero by a per-frame amount.
 - Charge
 - Concentrate (Scalar Concentrate, Vector Concentrate): sharpens an attribute against its neighbours, globally, by distance or by connectivity.
diff --git a/otls-audit.md b/otls-audit.md
index d9abaf6..064bf73 100644
--- a/otls-audit.md
+++ b/otls-audit.md
@@ -17,6 +17,8 @@ Audit of every HDA in `otls/`, run 2026-09-14 against Houdini 22.0.429 (Indie) w
 > | `developer_vector_from_scalar` | `developer_gradient 1.0` | `95abc44` |
 > | `developer_vector_rotate` | `developer_rotate 1.0` | `95abc44` |
 >
+> `developer_analysis` gained a working Class Edge (edge-length statistics into `edges_info`) and Element folder (change, direction and previous value against the second input); the audit's Analysis rows are updated.
+>
 > `developer_select 1.1` reads the random Variation, its seed and Multiplier, builds Random Vector and drops the `newparameter` placeholder; `developer_surface_suture` fuses points past Fusion Threshold within Distance Threshold; `developer_time` and `developer_time_ramp` honour the start of Range.
 >
 > `developer_lead 1.1` takes its radius from a parameter in edge lengths and blends by Amount; 1.0 had a fixed 0.05 radius and ignored Amount.
@@ -155,7 +157,6 @@ For each top-level parameter the audit looked for a channel reference from any c
 
 | node | unreferenced parameters |
 |---|---|
-| `developer_analysis::1.0` | `enable_prev` (`enable_round` and `round_places` are read since `8e87ec2`) |
 | `developer_attribute_clip::1.0` | `range` |
 | `developer_attribute_combine::1.0` | `input_0`, `type_0`, `weight_0`, `x_0`, `y_0`, `z_0`, `input_1`, `type_1`, `weight_1`, `x_1`, `y_1`, `z_1` |
 | `developer_attribute_constant::1.0` | `class` |
@@ -285,7 +286,7 @@ The operator list in `developer.md` uses **Scalar** names (`Scalar Diffuse`, `Sc
 | type | ver | category | submenu | inputs | parms | unread | dummies | bypassed | cook |
 |---|---|---|---|---|---|---|---|---|---|
 | `developer_align` | 1.0 | Sop | Developer | 1-1 | 11 | 0 | 0 | 0 | ok |
-| `developer_analysis` | 1.0 | Sop | Developer | 1-2 | 13 | 1 | 0 | 0 | ok |
+| `developer_analysis` | 1.0 | Sop | Developer | 1-2 | 13 | 0 | 0 | 0 | ok |
 | `developer_attribute_clip` | 1.0 | Sop | Developer/Attribute | 0-1 | 1 | 1 | 0 | 0 | ok |
 | `developer_attribute_combine` | 1.0 | Sop | Developer/Attribute | 1-2 | 18 | 12 | 0 | 0 | ok |
 | `developer_attribute_composite` | 1.0 | Sop | Developer/Attribute | 1-2 | 5 | 0 | 0 | 0 | ok |
diff --git a/otls/sop_lsgalante.developer_analysis.1.0.hdalc b/otls/sop_lsgalante.developer_analysis.1.0.hdalc
index f908452..ac9a29e 100755
Binary files a/otls/sop_lsgalante.developer_analysis.1.0.hdalc and b/otls/sop_lsgalante.developer_analysis.1.0.hdalc differ