node leaf sorting

This commit is contained in:
2026-03-26 19:15:02 -07:00
parent 673b2cae6b
commit 711d7995b3
10 changed files with 44 additions and 45 deletions

View File

@@ -86,14 +86,13 @@ for category, class_names in MENU_LAYOUT.items():
} }
def get_menu_metadata(class_name: str, fallback_category: str = "uncategorized") -> dict[str, Any]: def get_menu_metadata(class_name: str) -> dict[str, Any]:
metadata = _NODE_METADATA.get(class_name) metadata = _NODE_METADATA.get(class_name)
if metadata is not None: if metadata is not None:
return dict(metadata) return dict(metadata)
fallback_order = _CATEGORY_ORDER.get(fallback_category, len(_CATEGORY_ORDER))
return { return {
"category": fallback_category, "category": "Unsorted",
"category_order": fallback_order, "category_order": len(_CATEGORY_ORDER),
"menu_order": 10_000, "menu_order": 10_000,
} }

View File

@@ -39,7 +39,7 @@ def get_node_info(class_name: str) -> dict[str, Any]:
""" """
cls = NODE_CLASS_MAPPINGS[class_name] cls = NODE_CLASS_MAPPINGS[class_name]
input_types: dict = cls.INPUT_TYPES() input_types: dict = cls.INPUT_TYPES()
menu_metadata = get_menu_metadata(class_name, getattr(cls, "CATEGORY", "uncategorized")) menu_metadata = get_menu_metadata(class_name)
return { return {
"name": class_name, "name": class_name,

View File

@@ -33,7 +33,7 @@ class Statistics:
RETURN_TYPES = ("MEASURE_TABLE",) RETURN_TYPES = ("MEASURE_TABLE",)
RETURN_NAMES = ("stats",) RETURN_NAMES = ("stats",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "analysis"
DESCRIPTION = ( DESCRIPTION = (
"Compute basic surface statistics: min, max, mean, RMS roughness, median, " "Compute basic surface statistics: min, max, mean, RMS roughness, median, "
"and skewness. Equivalent to gwy_data_field_get_min/max/avg/rms." "and skewness. Equivalent to gwy_data_field_get_min/max/avg/rms."
@@ -82,7 +82,7 @@ class Histogram:
RETURN_TYPES = ("MEASURE_TABLE", "COORDPAIR",) RETURN_TYPES = ("MEASURE_TABLE", "COORDPAIR",)
RETURN_NAMES = ("measurements", "marker pair",) RETURN_NAMES = ("measurements", "marker pair",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "analysis"
DESCRIPTION = ( DESCRIPTION = (
"Compute the height distribution histogram (DH). " "Compute the height distribution histogram (DH). "
"Use log scale to reveal small peaks next to a dominant background. " "Use log scale to reveal small peaks next to a dominant background. "
@@ -185,7 +185,7 @@ class Cursors:
RETURN_TYPES = ("MEASURE_TABLE","COORDPAIR",) RETURN_TYPES = ("MEASURE_TABLE","COORDPAIR",)
RETURN_NAMES = ("measurement","coord pair",) RETURN_NAMES = ("measurement","coord pair",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "analysis"
DESCRIPTION = ( DESCRIPTION = (
"Place two cursors on a line plot or 2D field. " "Place two cursors on a line plot or 2D field. "
"On lines it reports x/y positions and dx/dy. " "On lines it reports x/y positions and dx/dy. "
@@ -353,7 +353,7 @@ class FFT2D:
RETURN_TYPES = ("DATA_FIELD", "DATA_FIELD", "DATA_FIELD", "DATA_FIELD") RETURN_TYPES = ("DATA_FIELD", "DATA_FIELD", "DATA_FIELD", "DATA_FIELD")
RETURN_NAMES = ("log_magnitude", "magnitude", "phase", "psdf") RETURN_NAMES = ("log_magnitude", "magnitude", "phase", "psdf")
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "analysis"
DESCRIPTION = ( DESCRIPTION = (
"Compute the 2D FFT with optional windowing and mean/plane subtraction. " "Compute the 2D FFT with optional windowing and mean/plane subtraction. "
"Outputs log magnitude, magnitude, phase, and PSDF as separate channels. " "Outputs log magnitude, magnitude, phase, and PSDF as separate channels. "
@@ -511,7 +511,7 @@ class InverseFFT2D:
RETURN_TYPES = ("DATA_FIELD",) RETURN_TYPES = ("DATA_FIELD",)
RETURN_NAMES = ("image",) RETURN_NAMES = ("image",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "analysis"
DESCRIPTION = ( DESCRIPTION = (
"Reconstruct a spatial-domain image from a 2D frequency spectrum. " "Reconstruct a spatial-domain image from a 2D frequency spectrum. "
"For exact reconstruction, connect magnitude/phase (or log magnitude/phase, " "For exact reconstruction, connect magnitude/phase (or log magnitude/phase, "
@@ -658,7 +658,7 @@ class CrossSection:
RETURN_TYPES = ("LINE", "COORDPAIR",) RETURN_TYPES = ("LINE", "COORDPAIR",)
RETURN_NAMES = ("profile", "marker pair",) RETURN_NAMES = ("profile", "marker pair",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "analysis"
DESCRIPTION = ( DESCRIPTION = (
"Extract a cross-section profile along a line between two points. " "Extract a cross-section profile along a line between two points. "
"Drag the markers on the image to set the line endpoints. " "Drag the markers on the image to set the line endpoints. "
@@ -1010,7 +1010,7 @@ class Stats:
RETURN_TYPES = ("FLOAT",) RETURN_TYPES = ("FLOAT",)
RETURN_NAMES = ("value",) RETURN_NAMES = ("value",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "analysis"
DESCRIPTION = ( DESCRIPTION = (
"Compute a contextual scalar statistic from a LINE, record table, DATA_FIELD, or IMAGE. " "Compute a contextual scalar statistic from a LINE, record table, DATA_FIELD, or IMAGE. "
"The available operations adapt to the connected input type." "The available operations adapt to the connected input type."

View File

@@ -348,7 +348,7 @@ class ColorMap:
RETURN_TYPES = ("COLORMAP",) RETURN_TYPES = ("COLORMAP",)
RETURN_NAMES = ("colormap",) RETURN_NAMES = ("colormap",)
FUNCTION = "build" FUNCTION = "build"
CATEGORY = "display"
DESCRIPTION = ( DESCRIPTION = (
"Build a reusable colormap. Choose a preset, or create a custom gradient with min/max colours " "Build a reusable colormap. Choose a preset, or create a custom gradient with min/max colours "
"and any number of intermediate stops." "and any number of intermediate stops."
@@ -389,7 +389,7 @@ class Font:
RETURN_TYPES = ("FONT",) RETURN_TYPES = ("FONT",)
RETURN_NAMES = ("font",) RETURN_NAMES = ("font",)
FUNCTION = "build" FUNCTION = "build"
CATEGORY = "display"
DESCRIPTION = ( DESCRIPTION = (
"Build a reusable font spec for annotation overlays. Choose a discovered system font, " "Build a reusable font spec for annotation overlays. Choose a discovered system font, "
"use the default fallback stack, or point to a custom font file." "use the default fallback stack, or point to a custom font file."
@@ -429,7 +429,7 @@ class Annotations:
RETURN_TYPES = ("DATA_FIELD",) RETURN_TYPES = ("DATA_FIELD",)
RETURN_NAMES = ("annotated",) RETURN_NAMES = ("annotated",)
FUNCTION = "render" FUNCTION = "render"
CATEGORY = "display"
DESCRIPTION = ( DESCRIPTION = (
"Attach optional publication-style annotations to a DATA_FIELD without flattening the raw data. " "Attach optional publication-style annotations to a DATA_FIELD without flattening the raw data. "
"The preview shows a scale bar and/or side colour legend, while downstream field operations keep the underlying AFM values." "The preview shows a scale bar and/or side colour legend, while downstream field operations keep the underlying AFM values."
@@ -488,7 +488,7 @@ class Markup:
RETURN_TYPES = ("DATA_FIELD",) RETURN_TYPES = ("DATA_FIELD",)
RETURN_NAMES = ("annotated",) RETURN_NAMES = ("annotated",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "display"
DESCRIPTION = ( DESCRIPTION = (
"Draw simple vector markup over a DATA_FIELD without flattening the underlying data. " "Draw simple vector markup over a DATA_FIELD without flattening the underlying data. "
"Choose a shape mode, colour, and stroke width, then drag directly on the preview to place lines, rectangles, circles, or arrows." "Choose a shape mode, colour, and stroke width, then drag directly on the preview to place lines, rectangles, circles, or arrows."
@@ -549,7 +549,7 @@ class PreviewImage:
RETURN_TYPES = () RETURN_TYPES = ()
FUNCTION = "preview" FUNCTION = "preview"
CATEGORY = "display"
OUTPUT_NODE = True OUTPUT_NODE = True
DESCRIPTION = "Display an IMAGE or DATA_FIELD as a coloured thumbnail. Connect either input." DESCRIPTION = "Display an IMAGE or DATA_FIELD as a coloured thumbnail. Connect either input."
@@ -614,7 +614,7 @@ class View3D:
RETURN_TYPES = () RETURN_TYPES = ()
FUNCTION = "render" FUNCTION = "render"
CATEGORY = "display"
OUTPUT_NODE = True OUTPUT_NODE = True
DESCRIPTION = ( DESCRIPTION = (
"Interactive 3D surface view of a DATA_FIELD. " "Interactive 3D surface view of a DATA_FIELD. "
@@ -691,7 +691,7 @@ class PrintTable:
RETURN_TYPES = () RETURN_TYPES = ()
FUNCTION = "print_table" FUNCTION = "print_table"
CATEGORY = "display"
OUTPUT_NODE = True OUTPUT_NODE = True
DESCRIPTION = "Send a measurement or record table to the browser as a WebSocket message for display." DESCRIPTION = "Send a measurement or record table to the browser as a WebSocket message for display."
@@ -724,7 +724,7 @@ class ValueDisplay:
RETURN_TYPES = ("FLOAT",) RETURN_TYPES = ("FLOAT",)
RETURN_NAMES = ("value",) RETURN_NAMES = ("value",)
FUNCTION = "display_value" FUNCTION = "display_value"
CATEGORY = "display"
DESCRIPTION = "Display a FLOAT, or a selected numeric row from a measurement table, and pass the value through unchanged." DESCRIPTION = "Display a FLOAT, or a selected numeric row from a measurement table, and pass the value through unchanged."
_broadcast_value_fn = None _broadcast_value_fn = None

View File

@@ -34,7 +34,7 @@ class GaussianFilter:
RETURN_TYPES = ("DATA_FIELD",) RETURN_TYPES = ("DATA_FIELD",)
RETURN_NAMES = ("filtered",) RETURN_NAMES = ("filtered",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "filters"
DESCRIPTION = "Apply a Gaussian blur. Equivalent to gwy_data_field_filter_gaussian." DESCRIPTION = "Apply a Gaussian blur. Equivalent to gwy_data_field_filter_gaussian."
def process(self, field: DataField, sigma: float) -> tuple: def process(self, field: DataField, sigma: float) -> tuple:
@@ -61,7 +61,7 @@ class MedianFilter:
RETURN_TYPES = ("DATA_FIELD",) RETURN_TYPES = ("DATA_FIELD",)
RETURN_NAMES = ("filtered",) RETURN_NAMES = ("filtered",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "filters"
DESCRIPTION = "Apply a median filter. Equivalent to gwy_data_field_filter_median." DESCRIPTION = "Apply a median filter. Equivalent to gwy_data_field_filter_median."
def process(self, field: DataField, size: int) -> tuple: def process(self, field: DataField, size: int) -> tuple:
@@ -90,7 +90,7 @@ class EdgeDetect:
RETURN_TYPES = ("DATA_FIELD",) RETURN_TYPES = ("DATA_FIELD",)
RETURN_NAMES = ("edges",) RETURN_NAMES = ("edges",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "filters"
DESCRIPTION = ( DESCRIPTION = (
"Detect edges using Sobel, Prewitt, Laplacian, or LoG operators. " "Detect edges using Sobel, Prewitt, Laplacian, or LoG operators. "
"Equivalent to gwy_data_field_filter_sobel / gwy_data_field_filter_laplacian." "Equivalent to gwy_data_field_filter_sobel / gwy_data_field_filter_laplacian."
@@ -229,7 +229,7 @@ class FFTFilter1D:
RETURN_TYPES = ("LINE",) RETURN_TYPES = ("LINE",)
RETURN_NAMES = ("filtered",) RETURN_NAMES = ("filtered",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "filters"
DESCRIPTION = ( DESCRIPTION = (
"Frequency-domain filtering of a 1-D line profile. " "Frequency-domain filtering of a 1-D line profile. "
"Supports lowpass, highpass, bandpass, and notch (band-reject) modes " "Supports lowpass, highpass, bandpass, and notch (band-reject) modes "
@@ -295,7 +295,7 @@ class FFTFilter2D:
RETURN_TYPES = ("DATA_FIELD",) RETURN_TYPES = ("DATA_FIELD",)
RETURN_NAMES = ("filtered",) RETURN_NAMES = ("filtered",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "filters"
DESCRIPTION = ( DESCRIPTION = (
"Frequency-domain filtering of a 2-D data field. " "Frequency-domain filtering of a 2-D data field. "
"Supports lowpass, highpass, bandpass, and notch (band-reject) modes " "Supports lowpass, highpass, bandpass, and notch (band-reject) modes "

View File

@@ -147,7 +147,7 @@ class Image:
RETURN_TYPES = ("DATA_FIELD",) RETURN_TYPES = ("DATA_FIELD",)
RETURN_NAMES = ("field",) RETURN_NAMES = ("field",)
FUNCTION = "load" FUNCTION = "load"
CATEGORY = "io"
DESCRIPTION = ( DESCRIPTION = (
"Load any supported file. " "Load any supported file. "
"SPM formats (.gwy, .sxm, .ibw) provide calibrated dimensions; " "SPM formats (.gwy, .sxm, .ibw) provide calibrated dimensions; "
@@ -384,7 +384,7 @@ class ImageDemo:
RETURN_TYPES = ("DATA_FIELD",) RETURN_TYPES = ("DATA_FIELD",)
RETURN_NAMES = ("field",) RETURN_NAMES = ("field",)
FUNCTION = "load" FUNCTION = "load"
CATEGORY = "io"
DESCRIPTION = "Load a bundled demo file so you can try the app without providing your own data." DESCRIPTION = "Load a bundled demo file so you can try the app without providing your own data."
def load(self, name: str = "", colormap: str = "viridis", colormap_map=None): def load(self, name: str = "", colormap: str = "viridis", colormap_map=None):
@@ -408,7 +408,7 @@ class Folder:
RETURN_TYPES = ("DIRECTORY",) RETURN_TYPES = ("DIRECTORY",)
RETURN_NAMES = ("directory",) RETURN_NAMES = ("directory",)
FUNCTION = "list_files" FUNCTION = "list_files"
CATEGORY = "io"
DESCRIPTION = ( DESCRIPTION = (
"Pick a folder and output its directory path plus one file socket per compatible image, array, or SPM file inside it. " "Pick a folder and output its directory path plus one file socket per compatible image, array, or SPM file inside it. "
"Supported files include common images, .npy/.npz arrays, and .gwy/.sxm/.ibw scans." "Supported files include common images, .npy/.npz arrays, and .gwy/.sxm/.ibw scans."
@@ -441,7 +441,7 @@ class Coordinate:
RETURN_TYPES = ("COORD",) RETURN_TYPES = ("COORD",)
RETURN_NAMES = ("point",) RETURN_NAMES = ("point",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "io"
DESCRIPTION = "Output a fractional (x, y) coordinate pair in [0, 1]." DESCRIPTION = "Output a fractional (x, y) coordinate pair in [0, 1]."
def process(self, x: float, y: float) -> tuple: def process(self, x: float, y: float) -> tuple:
@@ -464,7 +464,7 @@ class CoordinatePair:
RETURN_TYPES = ("COORDPAIR",) RETURN_TYPES = ("COORDPAIR",)
RETURN_NAMES = ("coord pair",) RETURN_NAMES = ("coord pair",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "io"
DESCRIPTION = "Output a pair of coordinates." DESCRIPTION = "Output a pair of coordinates."
def process(self, a: tuple, b: tuple) -> tuple: def process(self, a: tuple, b: tuple) -> tuple:
@@ -490,7 +490,7 @@ class Number:
RETURN_TYPES = ("FLOAT",) RETURN_TYPES = ("FLOAT",)
RETURN_NAMES = ("value",) RETURN_NAMES = ("value",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "io"
DESCRIPTION = ( DESCRIPTION = (
"Output a fixed numeric value. " "Output a fixed numeric value. "
"When connected to FLOAT inputs the exact value is used; " "When connected to FLOAT inputs the exact value is used; "
@@ -528,7 +528,7 @@ class RangeSlider:
RETURN_TYPES = ("FLOAT",) RETURN_TYPES = ("FLOAT",)
RETURN_NAMES = ("value",) RETURN_NAMES = ("value",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "io"
DESCRIPTION = ( DESCRIPTION = (
"Interactive float slider. Set min and max bounds, then drag the slider to output a FLOAT value." "Interactive float slider. Set min and max bounds, then drag the slider to output a FLOAT value."
) )
@@ -584,7 +584,7 @@ class SaveImage:
RETURN_TYPES = () RETURN_TYPES = ()
FUNCTION = "save" FUNCTION = "save"
CATEGORY = "io"
OUTPUT_NODE = True OUTPUT_NODE = True
MANUAL_TRIGGER = True MANUAL_TRIGGER = True
DESCRIPTION = ( DESCRIPTION = (

View File

@@ -33,7 +33,7 @@ class PlaneLevelField:
RETURN_TYPES = ("DATA_FIELD",) RETURN_TYPES = ("DATA_FIELD",)
RETURN_NAMES = ("leveled",) RETURN_NAMES = ("leveled",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "level"
DESCRIPTION = ( DESCRIPTION = (
"Fit and subtract a least-squares plane from the data. " "Fit and subtract a least-squares plane from the data. "
"Equivalent to gwy_data_field_fit_plane + gwy_data_field_plane_level." "Equivalent to gwy_data_field_fit_plane + gwy_data_field_plane_level."
@@ -83,7 +83,7 @@ class PolyLevelField:
RETURN_TYPES = ("DATA_FIELD", "DATA_FIELD") RETURN_TYPES = ("DATA_FIELD", "DATA_FIELD")
RETURN_NAMES = ("leveled", "background") RETURN_NAMES = ("leveled", "background")
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "level"
DESCRIPTION = ( DESCRIPTION = (
"Fit and subtract a polynomial background of given degree in x and y. " "Fit and subtract a polynomial background of given degree in x and y. "
"Equivalent to gwy_data_field_fit_polynom." "Equivalent to gwy_data_field_fit_polynom."
@@ -131,7 +131,7 @@ class FixZero:
RETURN_TYPES = ("DATA_FIELD",) RETURN_TYPES = ("DATA_FIELD",)
RETURN_NAMES = ("zeroed",) RETURN_NAMES = ("zeroed",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "level"
DESCRIPTION = ( DESCRIPTION = (
"Shift data so that the minimum (or mean/median) is zero. " "Shift data so that the minimum (or mean/median) is zero. "
"Equivalent to fix_zero in Gwyddion's level.c." "Equivalent to fix_zero in Gwyddion's level.c."

View File

@@ -173,7 +173,7 @@ class DrawMask:
RETURN_TYPES = ("IMAGE",) RETURN_TYPES = ("IMAGE",)
RETURN_NAMES = ("mask",) RETURN_NAMES = ("mask",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "mask"
DESCRIPTION = ( DESCRIPTION = (
"Paint a binary mask directly over an image preview. " "Paint a binary mask directly over an image preview. "
"Pen size controls newly drawn strokes, the overlay lets you clear the mask, " "Pen size controls newly drawn strokes, the overlay lets you clear the mask, "
@@ -227,7 +227,7 @@ class ThresholdMask:
RETURN_TYPES = ("IMAGE",) RETURN_TYPES = ("IMAGE",)
RETURN_NAMES = ("mask",) RETURN_NAMES = ("mask",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "mask"
DESCRIPTION = ( DESCRIPTION = (
"Create a binary mask by thresholding data. " "Create a binary mask by thresholding data. "
"Otsu automatically finds the optimal threshold. " "Otsu automatically finds the optimal threshold. "
@@ -295,7 +295,7 @@ class MaskMorphology:
RETURN_TYPES = ("IMAGE",) RETURN_TYPES = ("IMAGE",)
RETURN_NAMES = ("mask",) RETURN_NAMES = ("mask",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "mask"
DESCRIPTION = ( DESCRIPTION = (
"Apply morphological operations to a binary mask. " "Apply morphological operations to a binary mask. "
"Dilate expands regions, erode shrinks them, " "Dilate expands regions, erode shrinks them, "
@@ -358,7 +358,7 @@ class MaskInvert:
RETURN_TYPES = ("IMAGE",) RETURN_TYPES = ("IMAGE",)
RETURN_NAMES = ("mask",) RETURN_NAMES = ("mask",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "mask"
DESCRIPTION = "Invert a binary mask — swap masked and unmasked regions." DESCRIPTION = "Invert a binary mask — swap masked and unmasked regions."
_broadcast_fn = None _broadcast_fn = None
@@ -400,7 +400,7 @@ class MaskCombine:
RETURN_TYPES = ("IMAGE",) RETURN_TYPES = ("IMAGE",)
RETURN_NAMES = ("mask",) RETURN_NAMES = ("mask",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "mask"
DESCRIPTION = ( DESCRIPTION = (
"Combine two binary masks with a boolean operation. " "Combine two binary masks with a boolean operation. "
"AND keeps overlap, OR merges, XOR keeps non-overlapping regions, " "AND keeps overlap, OR merges, XOR keeps non-overlapping regions, "

View File

@@ -30,7 +30,7 @@ class ColormapAdjust:
RETURN_TYPES = ("DATA_FIELD",) RETURN_TYPES = ("DATA_FIELD",)
RETURN_NAMES = ("field",) RETURN_NAMES = ("field",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "modify"
DESCRIPTION = ( DESCRIPTION = (
"Adjust how a DATA_FIELD maps into its colormap without changing the underlying data. " "Adjust how a DATA_FIELD maps into its colormap without changing the underlying data. "
"offset and scale operate in normalized display coordinates; Auto resets to the full data range." "offset and scale operate in normalized display coordinates; Auto resets to the full data range."
@@ -71,7 +71,7 @@ class CropResizeField:
RETURN_TYPES = ("DATA_FIELD",) RETURN_TYPES = ("DATA_FIELD",)
RETURN_NAMES = ("field",) RETURN_NAMES = ("field",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "modify"
DESCRIPTION = ( DESCRIPTION = (
"Crop a DATA_FIELD with a draggable rectangle defined by two corners, then optionally resize it. " "Crop a DATA_FIELD with a draggable rectangle defined by two corners, then optionally resize it. "
"Incoming COORD inputs can lock either corner. Cropping updates physical extents and offsets; " "Incoming COORD inputs can lock either corner. Cropping updates physical extents and offsets; "
@@ -212,7 +212,7 @@ class RotateField:
RETURN_TYPES = ("DATA_FIELD",) RETURN_TYPES = ("DATA_FIELD",)
RETURN_NAMES = ("field",) RETURN_NAMES = ("field",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "modify"
DESCRIPTION = ( DESCRIPTION = (
"Rotate a DATA_FIELD counterclockwise by an angle in degrees. " "Rotate a DATA_FIELD counterclockwise by an angle in degrees. "
"Optionally expand the canvas to keep the full rotated field while preserving the field center." "Optionally expand the canvas to keep the full rotated field while preserving the field center."

View File

@@ -30,7 +30,7 @@ class ParticleAnalysis:
RETURN_TYPES = ("RECORD_TABLE",) RETURN_TYPES = ("RECORD_TABLE",)
RETURN_NAMES = ("particle_stats",) RETURN_NAMES = ("particle_stats",)
FUNCTION = "process" FUNCTION = "process"
CATEGORY = "particles"
DESCRIPTION = ( DESCRIPTION = (
"Label connected particle regions in a binary mask and compute per-particle " "Label connected particle regions in a binary mask and compute per-particle "
"statistics: area, equivalent diameter, mean/max height, bounding box. " "statistics: area, equivalent diameter, mean/max height, bounding box. "