feat: Update AI environment labels and preferences for consistency
This commit is contained in:
@@ -39,7 +39,7 @@ class AnyImageImageMenu(bpy.types.Menu):
|
||||
if status["ready"]:
|
||||
layout.operator(
|
||||
"anyimage.open_ai_environment_settings",
|
||||
text="AI Environment Settings",
|
||||
text="Settings",
|
||||
icon="PREFERENCES",
|
||||
)
|
||||
else:
|
||||
|
||||
@@ -17,7 +17,7 @@ def format_download_size(size):
|
||||
|
||||
class SetupAIEnvironment(bpy.types.Operator):
|
||||
bl_idname = "anyimage.setup_ai_environment"
|
||||
bl_label = "Set Up AI Environment"
|
||||
bl_label = "Set Up AI Server"
|
||||
bl_description = "Install the environment and required AI models"
|
||||
|
||||
use_mirror: bpy.props.BoolProperty(
|
||||
@@ -106,7 +106,7 @@ class SetupAIEnvironment(bpy.types.Operator):
|
||||
|
||||
class OpenAIEnvironmentSettings(bpy.types.Operator):
|
||||
bl_idname = "anyimage.open_ai_environment_settings"
|
||||
bl_label = "AI Environment Settings"
|
||||
bl_label = "Settings"
|
||||
bl_description = "Open the AnyImage add-on preferences"
|
||||
|
||||
def execute(self, context):
|
||||
|
||||
@@ -27,7 +27,7 @@ class ServerPanel(bpy.types.Panel):
|
||||
setup_row.enabled = not busy
|
||||
setup_row.operator(
|
||||
"anyimage.setup_ai_environment",
|
||||
text="Set Up AI Environment…",
|
||||
text="Set Up AI Server…",
|
||||
icon="IMPORT",
|
||||
)
|
||||
return
|
||||
|
||||
@@ -13,6 +13,7 @@ from .server.model_catalog import (
|
||||
)
|
||||
|
||||
DEFAULT_MOGE2_MODEL_KEY = "MOGE2_VITS_NORMAL"
|
||||
DEFAULT_BACKGROUND_MODEL_KEY = "BEN2_BASE"
|
||||
DEFAULT_MAX_CUTOUT_MESH_RESOLUTION = 1024
|
||||
MIN_CUTOUT_MESH_RESOLUTION = 4
|
||||
MAX_CUTOUT_MESH_RESOLUTION = 1024
|
||||
@@ -24,6 +25,14 @@ UPSCALE_MODEL_ITEMS = tuple(
|
||||
for index, model in enumerate(UPSCALE_MODELS.values())
|
||||
)
|
||||
|
||||
BACKGROUND_MODEL_ITEMS = (
|
||||
(
|
||||
DEFAULT_BACKGROUND_MODEL_KEY,
|
||||
"BEN2 Base",
|
||||
"Model used for AI Remove Background",
|
||||
),
|
||||
)
|
||||
|
||||
BALLOON_PROFILE_ALGORITHM_ITEMS = (
|
||||
(
|
||||
"POISSON",
|
||||
@@ -104,8 +113,8 @@ class AnyImagePreferences(bpy.types.AddonPreferences):
|
||||
default=0,
|
||||
)
|
||||
upscale_model: bpy.props.EnumProperty(
|
||||
name="Default Upscale Model",
|
||||
description="Model used when starting a new Upscale operation",
|
||||
name="Upscale Image Model",
|
||||
description="Model used to upscale images",
|
||||
items=UPSCALE_MODEL_ITEMS,
|
||||
default=DEFAULT_UPSCALE_MODEL_KEY,
|
||||
)
|
||||
@@ -136,9 +145,15 @@ class AnyImagePreferences(bpy.types.AddonPreferences):
|
||||
items=BALLOON_PROFILE_ALGORITHM_ITEMS,
|
||||
default="POISSON",
|
||||
)
|
||||
background_model: bpy.props.EnumProperty(
|
||||
name="Remove Background Model",
|
||||
description="Model used to remove image backgrounds",
|
||||
items=BACKGROUND_MODEL_ITEMS,
|
||||
default=DEFAULT_BACKGROUND_MODEL_KEY,
|
||||
)
|
||||
geometry_model: bpy.props.EnumProperty(
|
||||
name="Depth & Normal Model",
|
||||
description="MoGe-2 model used for geometry and normal generation",
|
||||
name="Generate Depth Map Model",
|
||||
description="Model used to generate depth maps",
|
||||
items=geometry_model_items,
|
||||
default=0,
|
||||
)
|
||||
@@ -158,14 +173,11 @@ class AnyImagePreferences(bpy.types.AddonPreferences):
|
||||
status = ai_status()
|
||||
models = {model["key"]: model for model in model_catalog()}
|
||||
|
||||
self._draw_section(layout, "Environment")
|
||||
layout.prop(self, "storage_root")
|
||||
layout.prop(self, "device")
|
||||
layout.prop(self, "max_ai_input_size")
|
||||
layout.label(text=f"Environment: {runtime.environment_directory()}")
|
||||
server = self._draw_box(layout, "Server")
|
||||
server.prop(self, "storage_root")
|
||||
server_row = server.row(align=True)
|
||||
if not status["environment_ready"]:
|
||||
layout.label(text="Environment is not installed", icon="ERROR")
|
||||
setup_row = layout.row()
|
||||
setup_row = server_row.row(align=True)
|
||||
setup_row.enabled = not runtime.server_busy()
|
||||
setup_row.operator(
|
||||
"anyimage.setup_ai_environment",
|
||||
@@ -173,106 +185,83 @@ class AnyImagePreferences(bpy.types.AddonPreferences):
|
||||
icon="IMPORT",
|
||||
)
|
||||
else:
|
||||
layout.label(text="Environment is installed", icon="CHECKMARK")
|
||||
if not status["ready"]:
|
||||
required_row = layout.row()
|
||||
required_row.enabled = not runtime.server_busy()
|
||||
required_row.operator(
|
||||
"anyimage.setup_ai_environment",
|
||||
text=ai_setup_label(status),
|
||||
icon="IMPORT",
|
||||
)
|
||||
|
||||
self._draw_section(layout, "Diagnostics")
|
||||
layout.operator(
|
||||
server_row.label(text="Installed", icon="CHECKMARK")
|
||||
server_row.operator(
|
||||
"anyimage.open_server_log",
|
||||
text="Open Server Log",
|
||||
icon="TEXT",
|
||||
)
|
||||
|
||||
section = self._draw_panel(layout, "depth_normal", "Depth & Normal")
|
||||
if section is not None:
|
||||
self._draw_depth_normal(
|
||||
section,
|
||||
if status["environment_ready"]:
|
||||
ai = self._draw_box(layout, "AI")
|
||||
ai.prop(self, "device")
|
||||
ai.prop(self, "max_ai_input_size")
|
||||
ai.separator(type="LINE")
|
||||
self._draw_model_property(
|
||||
ai,
|
||||
"geometry_model",
|
||||
models,
|
||||
status["environment_ready"],
|
||||
DEFAULT_MOGE2_MODEL_KEY,
|
||||
"AI Generate Depth Map",
|
||||
)
|
||||
|
||||
section = self._draw_panel(
|
||||
layout,
|
||||
"remove_background",
|
||||
"Remove Background",
|
||||
)
|
||||
if section is not None:
|
||||
self._draw_model(
|
||||
section,
|
||||
models.get("BEN2_BASE"),
|
||||
status["environment_ready"],
|
||||
)
|
||||
|
||||
section = self._draw_panel(layout, "upscale", "Upscale")
|
||||
if section is not None:
|
||||
self._draw_upscale(
|
||||
section,
|
||||
self._draw_model_property(
|
||||
ai,
|
||||
"background_model",
|
||||
models,
|
||||
status["environment_ready"],
|
||||
DEFAULT_BACKGROUND_MODEL_KEY,
|
||||
"AI Remove Background",
|
||||
)
|
||||
self._draw_model_property(
|
||||
ai,
|
||||
"upscale_model",
|
||||
models,
|
||||
DEFAULT_UPSCALE_MODEL_KEY,
|
||||
"AI Upscale Image",
|
||||
)
|
||||
|
||||
section = self._draw_panel(layout, "cutout", "Cutout")
|
||||
if section is not None:
|
||||
section.prop(self, "max_cutout_mesh_resolution")
|
||||
section.prop(self, "balloon_profile_algorithm")
|
||||
tools = self._draw_box(layout, "Tools")
|
||||
tools.label(text="Depth & Normal")
|
||||
tools.prop(self, "geometry_resolution_level")
|
||||
tools.separator(type="LINE")
|
||||
tools.label(text="Cutout Tool")
|
||||
tools.prop(self, "max_cutout_mesh_resolution")
|
||||
tools.prop(self, "balloon_profile_algorithm")
|
||||
|
||||
def _draw_depth_normal(self, layout, models, environment_ready):
|
||||
layout.prop(self, "geometry_model")
|
||||
geometry_model = getattr(self, "geometry_model", DEFAULT_MOGE2_MODEL_KEY)
|
||||
if geometry_model not in models:
|
||||
geometry_model = DEFAULT_MOGE2_MODEL_KEY
|
||||
self._draw_model(
|
||||
layout,
|
||||
models.get(geometry_model),
|
||||
environment_ready,
|
||||
)
|
||||
layout.prop(self, "geometry_resolution_level")
|
||||
@staticmethod
|
||||
def _draw_box(layout, label):
|
||||
box = layout.box()
|
||||
box.label(text=label)
|
||||
return box
|
||||
|
||||
def _draw_upscale(self, layout, models, environment_ready):
|
||||
layout.prop(self, "upscale_model")
|
||||
upscale_model = getattr(self, "upscale_model", DEFAULT_UPSCALE_MODEL_KEY)
|
||||
if upscale_model not in models:
|
||||
upscale_model = DEFAULT_UPSCALE_MODEL_KEY
|
||||
self._draw_model(
|
||||
layout,
|
||||
models.get(upscale_model),
|
||||
environment_ready,
|
||||
def _draw_model_property(
|
||||
self,
|
||||
layout,
|
||||
property_name,
|
||||
models,
|
||||
default_model_key,
|
||||
ready_label,
|
||||
):
|
||||
model_key = getattr(self, property_name, default_model_key)
|
||||
if model_key not in models:
|
||||
model_key = default_model_key
|
||||
split = layout.split(factor=0.58, align=True)
|
||||
split.column(align=True).prop(self, property_name, text="")
|
||||
self._draw_model_status(
|
||||
split.column(align=True),
|
||||
models.get(model_key),
|
||||
ready_label,
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def _draw_section(layout, label):
|
||||
layout.separator(type="LINE")
|
||||
layout.label(text=label)
|
||||
|
||||
@staticmethod
|
||||
def _draw_panel(layout, panel_id, label):
|
||||
header, body = layout.panel(
|
||||
f"anyimage_preferences_{panel_id}",
|
||||
default_closed=False,
|
||||
)
|
||||
header.label(text=label)
|
||||
return body
|
||||
|
||||
def _draw_model(self, layout, model, environment_ready=True):
|
||||
def _draw_model_status(layout, model, ready_label):
|
||||
from .runtime import runtime
|
||||
|
||||
if model is None:
|
||||
layout.label(text="Model is unavailable", icon="ERROR")
|
||||
return
|
||||
row = layout.row(align=True)
|
||||
row.label(text=model["label"])
|
||||
if model.get("ready"):
|
||||
row.label(text="Ready", icon="CHECKMARK")
|
||||
if model is None:
|
||||
row.label(text="Unavailable", icon="ERROR")
|
||||
return
|
||||
if not environment_ready:
|
||||
row.label(text="Install Environment First", icon="INFO")
|
||||
if model.get("ready"):
|
||||
row.label(text=ready_label, icon="CHECKMARK")
|
||||
return
|
||||
download_row = row.row(align=True)
|
||||
download_row.enabled = not runtime.server_busy()
|
||||
|
||||
@@ -113,7 +113,7 @@ def ai_setup_label(status=None):
|
||||
return (
|
||||
"Download Required Models…"
|
||||
if status["environment_ready"]
|
||||
else "Set Up AI Environment…"
|
||||
else "Set Up AI Server…"
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user