|
import traceback |
|
import modules.sd_samplers |
|
import modules.scripts as scripts |
|
import gradio as gr |
|
import json |
|
import os |
|
import platform |
|
import subprocess as sp |
|
|
|
|
|
BASEDIR = scripts.basedir() |
|
CONFIG_TXT2IMG_CUSTOM_TRACKED_COMPONENTS_FILE_NAME = "config-txt2img-custom-tracked-components.txt" |
|
CONFIG_IMG2IMG_CUSTOM_TRACKED_COMPONENTS_FILE_NAME = "config-img2img-custom-tracked-components.txt" |
|
CONFIG_TXT2IMG_FILE_NAME = "config-txt2img.json" |
|
CONFIG_IMG2IMG_FILE_NAME = "config-img2img.json" |
|
|
|
|
|
def load_txt2img_custom_tracked_component_ids() -> list[str]: |
|
txt2img_custom_tracked_components_ids = [] |
|
try: |
|
with open(f"{BASEDIR}/{CONFIG_TXT2IMG_CUSTOM_TRACKED_COMPONENTS_FILE_NAME}", "r") as file: |
|
for line in file: |
|
line = line.strip() |
|
if not line.startswith("#") and line != "": |
|
txt2img_custom_tracked_components_ids.append(line) |
|
|
|
|
|
except FileNotFoundError: |
|
|
|
|
|
txt2img_custom_tracked_components_default_text = """# Put custom txt2img tracked component IDs here. This will allow those fields to be saved as a config preset. |
|
# Lines starting with a # are ignored. |
|
# Component IDs can be found in the HTML (id="..."), in modules/ui.py (elem_id="..."), or in an extensions python code. IDs like "component-5890" won't work because the number at the end will change each startup. |
|
# Entering an invalid component ID here will cause this extension to error and not load. Components that do not have a value associated with them, such as tabs and accordions, are not supported. |
|
# Note that components on the top row of the UI cannot be added here, such as "setting_sd_model_checkpoint", "setting_sd_vae", and "setting_CLIP_stop_at_last_layers". |
|
|
|
# Other fields: |
|
#txt2img_prompt |
|
#txt2img_neg_prompt |
|
#txt2img_styles |
|
#txt2img_subseed_show |
|
#txt2img_subseed |
|
#txt2img_subseed_strength |
|
#txt2img_seed_resize_from_w |
|
#txt2img_seed_resize_from_h |
|
#txt2img_tiling |
|
#txt2img_hr_resize_x |
|
#txt2img_hr_resize_y |
|
|
|
# Script dropdown: |
|
#script_list |
|
|
|
# X/Y/Z plot (script): |
|
#script_txt2txt_xyz_plot_x_type |
|
#script_txt2txt_xyz_plot_y_type |
|
#script_txt2txt_xyz_plot_z_type |
|
#script_txt2txt_xyz_plot_x_values |
|
#script_txt2txt_xyz_plot_y_values |
|
#script_txt2txt_xyz_plot_z_values |
|
|
|
# Latent Couple (extension): |
|
#cd_txt2img_divisions |
|
#cd_txt2img_positions |
|
#cd_txt2img_weights |
|
#cd_txt2img_end_at_this_step |
|
|
|
# ControlNet (extension): |
|
#txt2img_controlnet_ControlNet-0_controlnet_enable_checkbox |
|
#txt2img_controlnet_ControlNet-0_controlnet_low_vram_checkbox |
|
#txt2img_controlnet_ControlNet-0_controlnet_pixel_perfect_checkbox |
|
#txt2img_controlnet_ControlNet-0_controlnet_preprocessor_preview_checkbox |
|
#txt2img_controlnet_ControlNet-0_controlnet_preprocessor_dropdown |
|
#txt2img_controlnet_ControlNet-0_controlnet_model_dropdown |
|
#txt2img_controlnet_ControlNet-0_controlnet_control_weight_slider |
|
#txt2img_controlnet_ControlNet-0_controlnet_start_control_step_slider |
|
#txt2img_controlnet_ControlNet-0_controlnet_ending_control_step_slider |
|
#txt2img_controlnet_ControlNet-0_controlnet_control_mode_radio |
|
#txt2img_controlnet_ControlNet-0_controlnet_resize_mode_radio |
|
#txt2img_controlnet_ControlNet-0_controlnet_automatically_send_generated_images_checkbox |
|
|
|
#txt2img_controlnet_ControlNet-1_controlnet_enable_checkbox |
|
#txt2img_controlnet_ControlNet-1_controlnet_low_vram_checkbox |
|
#txt2img_controlnet_ControlNet-1_controlnet_pixel_perfect_checkbox |
|
#txt2img_controlnet_ControlNet-1_controlnet_preprocessor_preview_checkbox |
|
#txt2img_controlnet_ControlNet-1_controlnet_preprocessor_dropdown |
|
#txt2img_controlnet_ControlNet-1_controlnet_model_dropdown |
|
#txt2img_controlnet_ControlNet-1_controlnet_control_weight_slider |
|
#txt2img_controlnet_ControlNet-1_controlnet_start_control_step_slider |
|
#txt2img_controlnet_ControlNet-1_controlnet_ending_control_step_slider |
|
#txt2img_controlnet_ControlNet-1_controlnet_control_mode_radio |
|
#txt2img_controlnet_ControlNet-1_controlnet_resize_mode_radio |
|
#txt2img_controlnet_ControlNet-1_controlnet_automatically_send_generated_images_checkbox |
|
|
|
#txt2img_controlnet_ControlNet-2_controlnet_enable_checkbox |
|
#txt2img_controlnet_ControlNet-2_controlnet_low_vram_checkbox |
|
#txt2img_controlnet_ControlNet-2_controlnet_pixel_perfect_checkbox |
|
#txt2img_controlnet_ControlNet-2_controlnet_preprocessor_preview_checkbox |
|
#txt2img_controlnet_ControlNet-2_controlnet_preprocessor_dropdown |
|
#txt2img_controlnet_ControlNet-2_controlnet_model_dropdown |
|
#txt2img_controlnet_ControlNet-2_controlnet_control_weight_slider |
|
#txt2img_controlnet_ControlNet-2_controlnet_start_control_step_slider |
|
#txt2img_controlnet_ControlNet-2_controlnet_ending_control_step_slider |
|
#txt2img_controlnet_ControlNet-2_controlnet_control_mode_radio |
|
#txt2img_controlnet_ControlNet-2_controlnet_resize_mode_radio |
|
#txt2img_controlnet_ControlNet-2_controlnet_automatically_send_generated_images_checkbox |
|
|
|
# Tiled Diffusion (extension) |
|
#MD-t2i-enabled |
|
#MD-t2i-overwrite-image-size |
|
#MD-overwrite-width-t2i |
|
#MD-overwrite-height-t2i |
|
#MD-t2i-method |
|
#MD-t2i-control-tensor-cpu |
|
#MD-t2i-latent-tile-width |
|
#MD-t2i-latent-tile-height |
|
#MD-t2i-latent-tile-overlap |
|
#MD-t2i-latent-tile-batch-size |
|
# Tiled Diffusion - Region Prompt Control |
|
#MD-t2i-enable-bbox-control |
|
#MD-t2i-draw-background |
|
#MD-t2i-cfg-name |
|
# Tiled Diffusion - Region Prompt Control - Region 1 |
|
#MD-bbox-t2i-0-enable |
|
#MD-t2i-0-blend-mode |
|
#MD-t2i-0-feather |
|
#MD-t2i-0-x |
|
#MD-t2i-0-y |
|
#MD-t2i-0-w |
|
#MD-t2i-0-h |
|
#MD-t2i-0-prompt |
|
#MD-t2i-0-neg-prompt |
|
#MD-t2i-0-seed |
|
# Tiled Diffusion - Region Prompt Control - Region 2 |
|
#MD-bbox-t2i-1-enable |
|
#MD-t2i-1-blend-mode |
|
#MD-t2i-1-feather |
|
#MD-t2i-1-x |
|
#MD-t2i-1-y |
|
#MD-t2i-1-w |
|
#MD-t2i-1-h |
|
#MD-t2i-1-prompt |
|
#MD-t2i-1-neg-prompt |
|
#MD-t2i-1-seed |
|
# Tiled Diffusion - Region Prompt Control - Region 3 |
|
#MD-bbox-t2i-2-enable |
|
#MD-t2i-2-blend-mode |
|
#MD-t2i-2-feather |
|
#MD-t2i-2-x |
|
#MD-t2i-2-y |
|
#MD-t2i-2-w |
|
#MD-t2i-2-h |
|
#MD-t2i-2-prompt |
|
#MD-t2i-2-neg-prompt |
|
#MD-t2i-2-seed |
|
# Tiled Diffusion - Tiled VAE |
|
#tiledvae-t2i-enable |
|
#tiledvae-t2i-vae2gpu |
|
#tiledvae-t2i-enc-size |
|
#tiledvae-t2i-dec-size |
|
#tiledvae-t2i-fastenc |
|
#tiledvae-t2i-fastenc-colorfix |
|
#tiledvae-t2i-fastdec |
|
|
|
# ADetailer (extension) |
|
#script_txt2img_adetailer_ad_enable |
|
# ADetailer - 1st tab |
|
#script_txt2img_adetailer_ad_model |
|
#script_txt2img_adetailer_ad_prompt |
|
#script_txt2img_adetailer_ad_negative_prompt |
|
# ADetailer - 1st tab - Detection |
|
#script_txt2img_adetailer_ad_confidence |
|
#script_txt2img_adetailer_ad_mask_min_ratio |
|
#script_txt2img_adetailer_ad_mask_max_ratio |
|
# ADetailer - 1st tab - Mask Preprocessing |
|
#script_txt2img_adetailer_ad_x_offset |
|
#script_txt2img_adetailer_ad_y_offset |
|
#script_txt2img_adetailer_ad_dilate_erode |
|
#script_txt2img_adetailer_ad_mask_merge_invert |
|
# ADetailer - 1st tab - Inpainting |
|
#script_txt2img_adetailer_ad_mask_blur |
|
#script_txt2img_adetailer_ad_denoising_strength |
|
#script_txt2img_adetailer_ad_inpaint_full_res |
|
#script_txt2img_adetailer_ad_inpaint_full_res_padding |
|
#script_txt2img_adetailer_ad_use_inpaint_width_height |
|
#script_txt2img_adetailer_ad_inpaint_width |
|
#script_txt2img_adetailer_ad_inpaint_height |
|
#script_txt2img_adetailer_ad_use_steps |
|
#script_txt2img_adetailer_ad_steps |
|
#script_txt2img_adetailer_ad_use_cfg_scale |
|
#script_txt2img_adetailer_ad_cfg_scale |
|
#script_txt2img_adetailer_ad_restore_face |
|
# ADetailer - 1st tab - ControlNet |
|
#script_txt2img_adetailer_ad_controlnet_model |
|
#script_txt2img_adetailer_ad_controlnet_weight |
|
#script_txt2img_adetailer_ad_controlnet_guidance_start |
|
#script_txt2img_adetailer_ad_controlnet_guidance_end |
|
# ADetailer - 2nd tab |
|
#script_txt2img_adetailer_ad_model_2nd |
|
#script_txt2img_adetailer_ad_prompt_2nd |
|
#script_txt2img_adetailer_ad_negative_prompt_2nd |
|
# ADetailer - 2nd tab - Detection |
|
#script_txt2img_adetailer_ad_confidence_2nd |
|
#script_txt2img_adetailer_ad_mask_min_ratio_2nd |
|
#script_txt2img_adetailer_ad_mask_max_ratio_2nd |
|
# ADetailer - 2nd tab - Mask Preprocessing |
|
#script_txt2img_adetailer_ad_x_offset_2nd |
|
#script_txt2img_adetailer_ad_y_offset_2nd |
|
#script_txt2img_adetailer_ad_dilate_erode_2nd |
|
#script_txt2img_adetailer_ad_mask_merge_invert_2nd |
|
# ADetailer - 2nd tab - Inpainting |
|
#script_txt2img_adetailer_ad_mask_blur_2nd |
|
#script_txt2img_adetailer_ad_denoising_strength_2nd |
|
#script_txt2img_adetailer_ad_inpaint_full_res_2nd |
|
#script_txt2img_adetailer_ad_inpaint_full_res_padding_2nd |
|
#script_txt2img_adetailer_ad_use_inpaint_width_height_2nd |
|
#script_txt2img_adetailer_ad_inpaint_width_2nd |
|
#script_txt2img_adetailer_ad_inpaint_height_2nd |
|
#script_txt2img_adetailer_ad_use_steps_2nd |
|
#script_txt2img_adetailer_ad_steps_2nd |
|
#script_txt2img_adetailer_ad_use_cfg_scale_2nd |
|
#script_txt2img_adetailer_ad_cfg_scale_2nd |
|
#script_txt2img_adetailer_ad_restore_face_2nd |
|
# ADetailer - 2nd tab - ControlNet |
|
#script_txt2img_adetailer_ad_controlnet_model_2nd |
|
#script_txt2img_adetailer_ad_controlnet_weight_2nd |
|
#script_txt2img_adetailer_ad_controlnet_guidance_start_2nd |
|
#script_txt2img_adetailer_ad_controlnet_guidance_end_2nd |
|
""" |
|
|
|
write_text_to_file(txt2img_custom_tracked_components_default_text, CONFIG_TXT2IMG_CUSTOM_TRACKED_COMPONENTS_FILE_NAME) |
|
print(f"[Config Presets] txt2img custom tracked components config file not found, created default config at {BASEDIR}/{CONFIG_TXT2IMG_CUSTOM_TRACKED_COMPONENTS_FILE_NAME}") |
|
|
|
return txt2img_custom_tracked_components_ids |
|
|
|
|
|
|
|
def load_img2img_custom_tracked_component_ids() -> list[str]: |
|
img2img_custom_tracked_components_ids = [] |
|
try: |
|
with open(f"{BASEDIR}/{CONFIG_IMG2IMG_CUSTOM_TRACKED_COMPONENTS_FILE_NAME}", "r") as file: |
|
for line in file: |
|
line = line.strip() |
|
if not line.startswith("#") and line != "": |
|
img2img_custom_tracked_components_ids.append(line) |
|
|
|
|
|
except FileNotFoundError: |
|
|
|
|
|
img2img_custom_tracked_components_ids = """# Put custom img2img tracked component IDs here. This will allow those fields to be saved as a config preset. |
|
# Lines starting with a # are ignored. |
|
# Component IDs can be found in the HTML (id="..."), in modules/ui.py (elem_id="..."), or in an extensions python code. IDs like "component-5890" won't work because the number at the end will change each startup. |
|
# Entering an invalid component ID here will cause this extension to error and not load. Components that do not have a value associated with them, such as tabs and accordions, are not supported. |
|
# Note that components on the top row of the UI cannot be added here, such as "setting_sd_model_checkpoint", "setting_sd_vae", and "setting_CLIP_stop_at_last_layers". |
|
|
|
# Other fields: |
|
#img2img_prompt |
|
#img2img_neg_prompt |
|
#img2img_mask_mode |
|
#img2img_mask_blur |
|
#img2img_mask_alpha |
|
#img2img_inpainting_fill |
|
#img2img_inpaint_full_res |
|
#img2img_inpaint_full_res_padding |
|
#resize_mode |
|
#img2img_scale |
|
#img2img_seed |
|
#img2img_subseed_show |
|
#img2img_subseed |
|
#img2img_subseed_strength |
|
#img2img_seed_resize_from_w |
|
#img2img_seed_resize_from_h |
|
#img2img_restore_faces |
|
#img2img_tiling |
|
#img2img_batch_input_dir |
|
#img2img_batch_output_dir |
|
#img2img_batch_inpaint_mask_dir |
|
|
|
# Script dropdown: |
|
#script_list |
|
|
|
# X/Y/Z plot (script): |
|
#script_img2txt_xyz_plot_x_type |
|
#script_img2txt_xyz_plot_y_type |
|
#script_img2txt_xyz_plot_z_type |
|
#script_img2txt_xyz_plot_x_values |
|
#script_img2txt_xyz_plot_y_values |
|
#script_img2txt_xyz_plot_z_values |
|
|
|
# Loopback (script): |
|
#script_loopback_loops |
|
#script_loopback_final_denoising_strength |
|
|
|
# SD upscale (script): |
|
#script_sd_upscale_overlap |
|
#script_sd_upscale_scale_factor |
|
#script_sd_upscale_upscaler_index |
|
|
|
# Latent Couple (extension): |
|
#cd_img2img_divisions |
|
#cd_img2img_positions |
|
#cd_img2img_weights |
|
#cd_img2img_end_at_this_step |
|
|
|
# ControlNet (extension): |
|
#img2img_controlnet_ControlNet-0_controlnet_enable_checkbox |
|
#img2img_controlnet_ControlNet-0_controlnet_low_vram_checkbox |
|
#img2img_controlnet_ControlNet-0_controlnet_pixel_perfect_checkbox |
|
#img2img_controlnet_ControlNet-0_controlnet_preprocessor_preview_checkbox |
|
#img2img_controlnet_ControlNet-0_controlnet_preprocessor_dropdown |
|
#img2img_controlnet_ControlNet-0_controlnet_model_dropdown |
|
#img2img_controlnet_ControlNet-0_controlnet_control_weight_slider |
|
#img2img_controlnet_ControlNet-0_controlnet_start_control_step_slider |
|
#img2img_controlnet_ControlNet-0_controlnet_ending_control_step_slider |
|
#img2img_controlnet_ControlNet-0_controlnet_control_mode_radio |
|
#img2img_controlnet_ControlNet-0_controlnet_resize_mode_radio |
|
#img2img_controlnet_ControlNet-0_controlnet_automatically_send_generated_images_checkbox |
|
|
|
#img2img_controlnet_ControlNet-1_controlnet_enable_checkbox |
|
#img2img_controlnet_ControlNet-1_controlnet_low_vram_checkbox |
|
#img2img_controlnet_ControlNet-1_controlnet_pixel_perfect_checkbox |
|
#img2img_controlnet_ControlNet-1_controlnet_preprocessor_preview_checkbox |
|
#img2img_controlnet_ControlNet-1_controlnet_preprocessor_dropdown |
|
#img2img_controlnet_ControlNet-1_controlnet_model_dropdown |
|
#img2img_controlnet_ControlNet-1_controlnet_control_weight_slider |
|
#img2img_controlnet_ControlNet-1_controlnet_start_control_step_slider |
|
#img2img_controlnet_ControlNet-1_controlnet_ending_control_step_slider |
|
#img2img_controlnet_ControlNet-1_controlnet_control_mode_radio |
|
#img2img_controlnet_ControlNet-1_controlnet_resize_mode_radio |
|
#img2img_controlnet_ControlNet-1_controlnet_automatically_send_generated_images_checkbox |
|
|
|
#img2img_controlnet_ControlNet-2_controlnet_enable_checkbox |
|
#img2img_controlnet_ControlNet-2_controlnet_low_vram_checkbox |
|
#img2img_controlnet_ControlNet-2_controlnet_pixel_perfect_checkbox |
|
#img2img_controlnet_ControlNet-2_controlnet_preprocessor_preview_checkbox |
|
#img2img_controlnet_ControlNet-2_controlnet_preprocessor_dropdown |
|
#img2img_controlnet_ControlNet-2_controlnet_model_dropdown |
|
#img2img_controlnet_ControlNet-2_controlnet_control_weight_slider |
|
#img2img_controlnet_ControlNet-2_controlnet_start_control_step_slider |
|
#img2img_controlnet_ControlNet-2_controlnet_ending_control_step_slider |
|
#img2img_controlnet_ControlNet-2_controlnet_control_mode_radio |
|
#img2img_controlnet_ControlNet-2_controlnet_resize_mode_radio |
|
#img2img_controlnet_ControlNet-2_controlnet_automatically_send_generated_images_checkbox |
|
|
|
# Tiled Diffusion (extension) |
|
#MD-i2i-enabled |
|
#MD-i2i-keep-input-size |
|
#MD-i2i-method |
|
#MD-i2i-control-tensor-cpu |
|
#MD-i2i-latent-tile-width |
|
#MD-i2i-latent-tile-height |
|
#MD-i2i-latent-tile-overlap |
|
#MD-i2i-latent-tile-batch-size |
|
#MD-i2i-upscaler-index |
|
#MD-i2i-upscaler-factor |
|
# Tiled Diffusion - Noise Inversion |
|
#MD-i2i-noise-inverse |
|
#MD-i2i-noise-inverse-steps |
|
#MD-i2i-noise-inverse-retouch |
|
#MD-i2i-noise-inverse-renoise-strength |
|
#MD-i2i-noise-inverse-renoise-kernel |
|
# Tiled Diffusion - Region Prompt Control |
|
#MD-i2i-enable-bbox-control |
|
#MD-i2i-draw-background |
|
#MD-i2i-cfg-name |
|
# Tiled Diffusion - Region Prompt Control - Region 1 |
|
#MD-bbox-i2i-0-enable |
|
#MD-i2i-0-blend-mode |
|
#MD-i2i-0-feather |
|
#MD-i2i-0-x |
|
#MD-i2i-0-y |
|
#MD-i2i-0-w |
|
#MD-i2i-0-h |
|
#MD-i2i-0-prompt |
|
#MD-i2i-0-neg-prompt |
|
#MD-i2i-0-seed |
|
# Tiled Diffusion - Region Prompt Control - Region 2 |
|
#MD-bbox-i2i-1-enable |
|
#MD-i2i-1-blend-mode |
|
#MD-i2i-1-feather |
|
#MD-i2i-1-x |
|
#MD-i2i-1-y |
|
#MD-i2i-1-w |
|
#MD-i2i-1-h |
|
#MD-i2i-1-prompt |
|
#MD-i2i-1-neg-prompt |
|
#MD-i2i-1-seed |
|
# Tiled Diffusion - Region Prompt Control - Region 3 |
|
#MD-bbox-i2i-2-enable |
|
#MD-i2i-2-blend-mode |
|
#MD-i2i-2-feather |
|
#MD-i2i-2-x |
|
#MD-i2i-2-y |
|
#MD-i2i-2-w |
|
#MD-i2i-2-h |
|
#MD-i2i-2-prompt |
|
#MD-i2i-2-neg-prompt |
|
#MD-i2i-2-seed |
|
# Tiled Diffusion - Tiled VAE |
|
#tiledvae-i2i-enable |
|
#tiledvae-i2i-vae2gpu |
|
#tiledvae-i2i-enc-size |
|
#tiledvae-i2i-dec-size |
|
#tiledvae-i2i-fastenc |
|
#tiledvae-i2i-fastenc-colorfix |
|
#tiledvae-i2i-fastdec |
|
|
|
# StableSR (extension) |
|
#SR Model does not have an ID as of June 1 2023 |
|
#StableSR-scale |
|
#StableSR-color-fix |
|
#StableSR-save-original |
|
#StableSR-pure-noise |
|
|
|
# ADetailer (extension) |
|
#script_img2img_adetailer_ad_enable |
|
# ADetailer - 1st tab |
|
#script_img2img_adetailer_ad_model |
|
#script_img2img_adetailer_ad_prompt |
|
#script_img2img_adetailer_ad_negative_prompt |
|
# ADetailer - 1st tab - Detection |
|
#script_img2img_adetailer_ad_confidence |
|
#script_img2img_adetailer_ad_mask_min_ratio |
|
#script_img2img_adetailer_ad_mask_max_ratio |
|
# ADetailer - 1st tab - Mask Preprocessing |
|
#script_img2img_adetailer_ad_x_offset |
|
#script_img2img_adetailer_ad_y_offset |
|
#script_img2img_adetailer_ad_dilate_erode |
|
#script_img2img_adetailer_ad_mask_merge_invert |
|
# ADetailer - 1st tab - Inpainting |
|
#script_img2img_adetailer_ad_mask_blur |
|
#script_img2img_adetailer_ad_denoising_strength |
|
#script_img2img_adetailer_ad_inpaint_full_res |
|
#script_img2img_adetailer_ad_inpaint_full_res_padding |
|
#script_img2img_adetailer_ad_use_inpaint_width_height |
|
#script_img2img_adetailer_ad_inpaint_width |
|
#script_img2img_adetailer_ad_inpaint_height |
|
#script_img2img_adetailer_ad_use_steps |
|
#script_img2img_adetailer_ad_steps |
|
#script_img2img_adetailer_ad_use_cfg_scale |
|
#script_img2img_adetailer_ad_cfg_scale |
|
#script_img2img_adetailer_ad_restore_face |
|
# ADetailer - 1st tab - ControlNet |
|
#script_img2img_adetailer_ad_controlnet_model |
|
#script_img2img_adetailer_ad_controlnet_weight |
|
#script_img2img_adetailer_ad_controlnet_guidance_start |
|
#script_img2img_adetailer_ad_controlnet_guidance_end |
|
# ADetailer - 2nd tab |
|
#script_img2img_adetailer_ad_model_2nd |
|
#script_img2img_adetailer_ad_prompt_2nd |
|
#script_img2img_adetailer_ad_negative_prompt_2nd |
|
# ADetailer - 2nd tab - Detection |
|
#script_img2img_adetailer_ad_confidence_2nd |
|
#script_img2img_adetailer_ad_mask_min_ratio_2nd |
|
#script_img2img_adetailer_ad_mask_max_ratio_2nd |
|
# ADetailer - 2nd tab - Mask Preprocessing |
|
#script_img2img_adetailer_ad_x_offset_2nd |
|
#script_img2img_adetailer_ad_y_offset_2nd |
|
#script_img2img_adetailer_ad_dilate_erode_2nd |
|
#script_img2img_adetailer_ad_mask_merge_invert_2nd |
|
# ADetailer - 2nd tab - Inpainting |
|
#script_img2img_adetailer_ad_mask_blur_2nd |
|
#script_img2img_adetailer_ad_denoising_strength_2nd |
|
#script_img2img_adetailer_ad_inpaint_full_res_2nd |
|
#script_img2img_adetailer_ad_inpaint_full_res_padding_2nd |
|
#script_img2img_adetailer_ad_use_inpaint_width_height_2nd |
|
#script_img2img_adetailer_ad_inpaint_width_2nd |
|
#script_img2img_adetailer_ad_inpaint_height_2nd |
|
#script_img2img_adetailer_ad_use_steps_2nd |
|
#script_img2img_adetailer_ad_steps_2nd |
|
#script_img2img_adetailer_ad_use_cfg_scale_2nd |
|
#script_img2img_adetailer_ad_cfg_scale_2nd |
|
#script_img2img_adetailer_ad_restore_face_2nd |
|
# ADetailer - 2nd tab - ADetailer ControlNet |
|
#script_img2img_adetailer_ad_controlnet_model_2nd |
|
#script_img2img_adetailer_ad_controlnet_weight_2nd |
|
#script_img2img_adetailer_ad_controlnet_guidance_start_2nd |
|
#script_img2img_adetailer_ad_controlnet_guidance_end_2nd |
|
""" |
|
|
|
write_text_to_file(img2img_custom_tracked_components_ids, CONFIG_IMG2IMG_CUSTOM_TRACKED_COMPONENTS_FILE_NAME) |
|
print(f"[Config Presets] img2img custom tracked components config file not found, created default config at {BASEDIR}/{CONFIG_TXT2IMG_CUSTOM_TRACKED_COMPONENTS_FILE_NAME}") |
|
|
|
return img2img_custom_tracked_components_ids |
|
|
|
|
|
def load_txt2img_config_file(): |
|
try: |
|
with open(f"{BASEDIR}/{CONFIG_TXT2IMG_FILE_NAME}") as file: |
|
txt2img_config_presets = json.load(file) |
|
|
|
except FileNotFoundError: |
|
|
|
|
|
txt2img_config_presets = { |
|
"None": {}, |
|
"Low quality ------ 512x512, steps: 10, batch size: 8, DPM++ 2M Karras": { |
|
"txt2img_sampling": "DPM++ 2M Karras", |
|
"txt2img_steps": 10, |
|
"txt2img_width": 512, |
|
"txt2img_height": 512, |
|
"txt2img_enable_hr": False, |
|
"txt2img_batch_count": 1, |
|
"txt2img_batch_size": 8, |
|
|
|
}, |
|
"Medium quality - 512x512, steps: 15, batch size: 4, DPM++ 2M Karras": { |
|
"txt2img_sampling": "DPM++ 2M Karras", |
|
"txt2img_steps": 15, |
|
"txt2img_width": 512, |
|
"txt2img_height": 512, |
|
"txt2img_enable_hr": False, |
|
"txt2img_batch_count": 1, |
|
"txt2img_batch_size": 4, |
|
|
|
}, |
|
"High quality ------ 512x768, steps: 20, batch size: 4, DPM++ 2M Karras": { |
|
"txt2img_prompt": "masterpiece, best quality, ultra-detailed, 1girl, solo", |
|
"txt2img_neg_prompt": "verybadimagenegative_v1.3, ng_deepnegative_v1_75t, easynegative, badhandv4, sketch by bad-artist, bad anatomy, disfigured, deformed, extra hands, extra legs, extra arms, text, error, cropped, worst quality, low quality, jpeg artifacts, signature, watermark, username, blurry", |
|
"txt2img_sampling": "DPM++ 2M Karras", |
|
"txt2img_steps": 20, |
|
"txt2img_width": 512, |
|
"txt2img_height": 768, |
|
"txt2img_enable_hr": False, |
|
"txt2img_batch_count": 2, |
|
"txt2img_batch_size": 2, |
|
|
|
}, |
|
"Low quality ------ 768x768, steps: 10, batch size: 8, DPM++ 2M Karras": { |
|
"txt2img_sampling": "DPM++ 2M Karras", |
|
"txt2img_steps": 10, |
|
"txt2img_width": 768, |
|
"txt2img_height": 768, |
|
"txt2img_enable_hr": False, |
|
"txt2img_batch_count": 1, |
|
"txt2img_batch_size": 8, |
|
|
|
}, |
|
"Medium quality - 768x768, steps: 15, batch size: 4, DPM++ 2M Karras": { |
|
"txt2img_sampling": "DPM++ 2M Karras", |
|
"txt2img_steps": 15, |
|
"txt2img_width": 768, |
|
"txt2img_height": 768, |
|
"txt2img_enable_hr": False, |
|
"txt2img_batch_count": 1, |
|
"txt2img_batch_size": 4, |
|
|
|
}, |
|
"High quality ------ 768x768, steps: 20, batch size: 4, DPM++ 2S a Karras": { |
|
"txt2img_prompt": "masterpiece, best quality, ultra-detailed, 1girl, solo", |
|
"txt2img_neg_prompt": "verybadimagenegative_v1.3, ng_deepnegative_v1_75t, easynegative, badhandv4, sketch by bad-artist, bad anatomy, disfigured, deformed, extra hands, extra legs, extra arms, text, error, cropped, worst quality, low quality, jpeg artifacts, signature, watermark, username, blurry", |
|
"txt2img_sampling": "DPM++ 2S a Karras", |
|
"txt2img_steps": 20, |
|
"txt2img_width": 768, |
|
"txt2img_height": 768, |
|
"txt2img_enable_hr": False, |
|
"txt2img_batch_count": 1, |
|
"txt2img_batch_size": 4, |
|
|
|
}, |
|
"High res -------- 1024x1024, steps: 30, batch size: 1, DPM++ 2M Karras, [Upscale by: 2, Denoising: 0.4, Hires steps: 10]": { |
|
"txt2img_prompt": "masterpiece, best quality, ultra-detailed, 1girl, solo", |
|
"txt2img_neg_prompt": "verybadimagenegative_v1.3, ng_deepnegative_v1_75t, easynegative, badhandv4, sketch by bad-artist, bad anatomy, disfigured, deformed, extra hands, extra legs, extra arms, text, error, cropped, worst quality, low quality, jpeg artifacts, signature, watermark, username, blurry", |
|
"txt2img_steps": 30, |
|
"txt2img_sampling": "DPM++ 2M Karras", |
|
"txt2img_width": 512, |
|
"txt2img_height": 512, |
|
"txt2img_enable_hr": True, |
|
"txt2img_hr_scale": 2, |
|
"txt2img_hires_steps": 10, |
|
"txt2img_denoising_strength": 0.4, |
|
"txt2img_batch_count": 1, |
|
"txt2img_batch_size": 1, |
|
|
|
}, |
|
"1080p ----------- 1920x1080, steps: 20, batch size: 1, DPM++ 2M Karras, [Upscale by: 2.5, Denoising: 0.4, Hires steps: 10]": { |
|
|
|
"txt2img_prompt": "masterpiece, best quality, ultra-detailed, 1girl, solo", |
|
"txt2img_neg_prompt": "verybadimagenegative_v1.3, ng_deepnegative_v1_75t, easynegative, badhandv4, sketch by bad-artist, bad anatomy, disfigured, deformed, extra hands, extra legs, extra arms, text, error, cropped, worst quality, low quality, jpeg artifacts, signature, watermark, username, blurry", |
|
"txt2img_steps": 20, |
|
"txt2img_sampling": "DPM++ 2M Karras", |
|
"txt2img_width": 768, |
|
"txt2img_height": 432, |
|
"txt2img_enable_hr": True, |
|
"txt2img_hr_scale": 2.5, |
|
"txt2img_hires_steps": 10, |
|
"txt2img_denoising_strength": 0.4, |
|
"txt2img_batch_count": 1, |
|
"txt2img_batch_size": 1, |
|
|
|
}, |
|
"1440p ----------- 2560x1440, steps: 25, batch size: 1, DPM++ 2M Karras, [Upscale by: 3.3334, Denoising: 0.3, Hires steps: 10]": { |
|
|
|
"txt2img_prompt": "masterpiece, best quality, ultra-detailed, 1girl, solo", |
|
"txt2img_neg_prompt": "verybadimagenegative_v1.3, ng_deepnegative_v1_75t, easynegative, badhandv4, sketch by bad-artist, bad anatomy, disfigured, deformed, extra hands, extra legs, extra arms, text, error, cropped, worst quality, low quality, jpeg artifacts, signature, watermark, username, blurry", |
|
"txt2img_steps": 25, |
|
"txt2img_sampling": "DPM++ 2M Karras", |
|
"txt2img_width": 768, |
|
"txt2img_height": 432, |
|
"txt2img_enable_hr": True, |
|
"txt2img_hr_scale": 3.3334, |
|
"txt2img_hires_steps": 10, |
|
"txt2img_denoising_strength": 0.3, |
|
"txt2img_batch_count": 1, |
|
"txt2img_batch_size": 1, |
|
|
|
}, |
|
"4k ---------------- 3840x2160, steps: 30, batch size: 1, DPM++ 2S a Karras, [Upscale by: 5, Denoising: 0.3, Hires steps: 15]": { |
|
|
|
"txt2img_prompt": "masterpiece, best quality, ultra-detailed, 1girl, solo", |
|
"txt2img_neg_prompt": "verybadimagenegative_v1.3, ng_deepnegative_v1_75t, easynegative, badhandv4, sketch by bad-artist, bad anatomy, disfigured, deformed, extra hands, extra legs, extra arms, text, error, cropped, worst quality, low quality, jpeg artifacts, signature, watermark, username, blurry", |
|
"txt2img_steps": 30, |
|
"txt2img_sampling": "DPM++ 2S a Karras", |
|
"txt2img_width": 768, |
|
"txt2img_height": 432, |
|
"txt2img_enable_hr": True, |
|
"txt2img_hr_scale": 5, |
|
"txt2img_hires_steps": 15, |
|
"txt2img_denoising_strength": 0.3, |
|
"txt2img_batch_count": 1, |
|
"txt2img_batch_size": 1, |
|
|
|
}, |
|
} |
|
|
|
write_json_to_file(txt2img_config_presets, CONFIG_TXT2IMG_FILE_NAME) |
|
print(f"[Config Presets] txt2img config file not found, created default config at {BASEDIR}/{CONFIG_TXT2IMG_FILE_NAME}") |
|
|
|
return txt2img_config_presets |
|
|
|
|
|
def load_img2img_config_file(): |
|
try: |
|
with open(f"{BASEDIR}/{CONFIG_IMG2IMG_FILE_NAME}") as file: |
|
img2img_config_presets = json.load(file) |
|
|
|
except FileNotFoundError: |
|
|
|
|
|
img2img_config_presets = { |
|
"None": {}, |
|
"Low denoising ------- 512x512, denoising: 0.25, steps: 10, DPM++ 2M Karras": { |
|
"img2img_sampling": "DPM++ 2M Karras", |
|
"img2img_steps": 10, |
|
"img2img_width": 512, |
|
"img2img_height": 512, |
|
|
|
|
|
|
|
"img2img_denoising_strength": 0.25, |
|
}, |
|
"Medium denoising -- 512x512, denoising: 0.50, steps: 15, DPM++ 2M Karras": { |
|
"img2img_sampling": "DPM++ 2M Karras", |
|
"img2img_steps": 15, |
|
"img2img_width": 512, |
|
"img2img_height": 512, |
|
|
|
|
|
|
|
"img2img_denoising_strength": 0.50, |
|
}, |
|
"High denoising ------- 512x512, denoising: 0.75, steps: 20, DPM++ 2M Karras": { |
|
"img2img_sampling": "DPM++ 2M Karras", |
|
"img2img_steps": 20, |
|
"img2img_width": 512, |
|
"img2img_height": 512, |
|
|
|
|
|
|
|
"img2img_denoising_strength": 0.75, |
|
}, |
|
} |
|
|
|
write_json_to_file(img2img_config_presets, CONFIG_IMG2IMG_FILE_NAME) |
|
print(f"[Config Presets] img2img config file not found, created default config at {BASEDIR}/{CONFIG_IMG2IMG_FILE_NAME}") |
|
|
|
return img2img_config_presets |
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_config_preset_dropdown_choices(new_config_presets: list[str]) -> list[str]: |
|
new_choices = [] |
|
if len(new_config_presets) > 0: |
|
|
|
|
|
|
|
|
|
new_choices.extend(new_config_presets) |
|
return new_choices |
|
|
|
|
|
class Script(scripts.Script): |
|
|
|
def __init__(self, *args, **kwargs): |
|
super().__init__(*args, **kwargs) |
|
|
|
|
|
txt2img_custom_tracked_components_ids = load_txt2img_custom_tracked_component_ids() |
|
img2img_custom_tracked_components_ids = load_img2img_custom_tracked_component_ids() |
|
|
|
|
|
self.txt2img_component_ids = [ |
|
"txt2img_sampling", |
|
"txt2img_steps", |
|
"txt2img_width", |
|
"txt2img_height", |
|
"txt2img_batch_count", |
|
"txt2img_batch_size", |
|
"txt2img_restore_faces", |
|
"txt2img_enable_hr", |
|
"txt2img_hr_scale", |
|
"txt2img_hr_upscaler", |
|
"txt2img_hires_steps", |
|
"txt2img_denoising_strength", |
|
"txt2img_cfg_scale", |
|
] |
|
self.txt2img_component_ids += txt2img_custom_tracked_components_ids |
|
|
|
self.img2img_component_ids = [ |
|
"img2img_sampling", |
|
"img2img_steps", |
|
"img2img_width", |
|
"img2img_height", |
|
"img2img_batch_count", |
|
"img2img_batch_size", |
|
"img2img_cfg_scale", |
|
"img2img_denoising_strength", |
|
"img2img_restore_faces", |
|
] |
|
self.img2img_component_ids += img2img_custom_tracked_components_ids |
|
|
|
|
|
self.txt2img_component_map = {k: None for k in self.txt2img_component_ids} |
|
self.img2img_component_map = {k: None for k in self.img2img_component_ids} |
|
|
|
|
|
self.txt2img_config_presets = load_txt2img_config_file() |
|
self.img2img_config_presets = load_img2img_config_file() |
|
|
|
|
|
|
|
def title(self): |
|
return "Config Presets" |
|
|
|
def show(self, is_img2img): |
|
return scripts.AlwaysVisible |
|
|
|
def after_component(self, component, **kwargs): |
|
|
|
|
|
component_map = None |
|
component_ids = None |
|
config_file_name = None |
|
custom_tracked_components_config_file_name = None |
|
if self.is_txt2img: |
|
component_map = self.txt2img_component_map |
|
component_ids = self.txt2img_component_ids |
|
config_file_name = CONFIG_TXT2IMG_FILE_NAME |
|
custom_tracked_components_config_file_name = CONFIG_TXT2IMG_CUSTOM_TRACKED_COMPONENTS_FILE_NAME |
|
else: |
|
component_map = self.img2img_component_map |
|
component_ids = self.img2img_component_ids |
|
config_file_name = CONFIG_IMG2IMG_FILE_NAME |
|
custom_tracked_components_config_file_name = CONFIG_IMG2IMG_CUSTOM_TRACKED_COMPONENTS_FILE_NAME |
|
|
|
|
|
if component.elem_id in component_map: |
|
component_map[component.elem_id] = component |
|
|
|
|
|
|
|
|
|
|
|
if component.elem_id == "txt2img_generation_info_button" or component.elem_id == "img2img_generation_info_button": |
|
|
|
|
|
|
|
|
|
for component_name, component in component_map.items(): |
|
|
|
if component is None: |
|
log_error(f"The {'txt2img' if self.is_txt2img else 'img2img'} component '{component_name}' could not be processed. This may be because you are running an outdated version of the Config-Presets extension, or you included a component ID in the custom tracked components config file that does not exist, no longer exists (if you updated an extension), or is an invalid component (if this is the case, you need to manually edit the config file at {BASEDIR}\\{custom_tracked_components_config_file_name} or just delete it so it resets to defaults). This extension will not work until this issue is resolved.") |
|
|
|
if "controlnet_control_mod_radio" in component_name: |
|
|
|
|
|
replace_text_in_file("controlnet_control_mod_radio", "controlnet_control_mode_radio", custom_tracked_components_config_file_name) |
|
log(f"'{component_name}' is from an outdated version of the ControlNet extension. Your config file has been automatically fixed to replace it with the correct ID ('control_mode_radio'). Please reload the Web UI to load the fix.") |
|
|
|
return |
|
|
|
|
|
index_type_components = [] |
|
for component in component_map.values(): |
|
|
|
if getattr(component, "type", "No type attr") == "index": |
|
|
|
index_type_components.append(component.elem_id) |
|
|
|
preset_values = [] |
|
config_presets: dict[str, any] = None |
|
if self.is_txt2img: |
|
config_presets = self.txt2img_config_presets |
|
else: |
|
config_presets = self.img2img_config_presets |
|
|
|
preset_values: list[str] = list(config_presets.keys()) |
|
|
|
|
|
|
|
|
|
fields_checkboxgroup = gr.CheckboxGroup(choices=component_ids, |
|
value=component_ids, |
|
label="Fields to save", |
|
show_label=True, |
|
interactive=True, |
|
elem_id="script_config_preset_fields_to_save", |
|
).unrender() |
|
|
|
with gr.Column(min_width=600, elem_id="config_preset_wrapper_txt2img" if self.is_txt2img else "config_preset_wrapper_img2img"): |
|
with gr.Row(): |
|
with gr.Column(scale=8, min_width=100) as dropdown_column: |
|
|
|
|
|
def config_preset_dropdown_change(dropdown_value, *components_value): |
|
config_preset = config_presets[dropdown_value] |
|
print(f"[Config-Presets] Changed to: {dropdown_value}") |
|
|
|
|
|
current_components = dict(zip(component_map.keys(), components_value)) |
|
|
|
current_components.update(config_preset) |
|
|
|
|
|
for component_name, component_value in current_components.items(): |
|
|
|
if component_name in index_type_components and type(component_value) == int: |
|
current_components[component_name] = component_map[component_name].choices[component_value] |
|
|
|
|
|
|
|
return list(current_components.values()) |
|
|
|
config_preset_dropdown = gr.Dropdown( |
|
label="Config Presets", |
|
|
|
choices=get_config_preset_dropdown_choices(preset_values), |
|
elem_id="config_preset_txt2img_dropdown" if self.is_txt2img else "config_preset_img2img_dropdown", |
|
) |
|
config_preset_dropdown.style(container=False) |
|
|
|
|
|
|
|
try: |
|
components = list(component_map.values()) |
|
config_preset_dropdown.change( |
|
fn=config_preset_dropdown_change, |
|
show_progress=False, |
|
inputs=[config_preset_dropdown, *components], |
|
outputs=components |
|
) |
|
except AttributeError: |
|
print(traceback.format_exc()) |
|
log_critical_error("The Config-Presets extension encountered a fatal error. A component required by this extension no longer exists in the Web UI. This is most likely due to the A1111 Web UI being updated. Try updating the Config-Presets extension. If that doesn't work, please post a bug report at https://github.com/Zyin055/Config-Presets/issues and delete your extensions/Config-Presets folder until an update is published.") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
with gr.Column(scale=8, min_width=100, visible=False) as collapsable_column: |
|
with gr.Row(): |
|
with gr.Column(scale=1, min_width=10): |
|
|
|
def delete_selected_preset(config_preset_name): |
|
if config_preset_name in config_presets.keys(): |
|
del config_presets[config_preset_name] |
|
print(f'[Config-Presets] deleted: "{config_preset_name}"') |
|
|
|
write_json_to_file(config_presets, config_file_name) |
|
|
|
preset_keys = list(config_presets.keys()) |
|
return gr.Dropdown.update(value=preset_keys[len(preset_keys)-1], |
|
|
|
choices=get_config_preset_dropdown_choices(preset_keys), |
|
) |
|
return gr.Dropdown.update() |
|
|
|
trash_button = gr.Button( |
|
value="\U0001f5d1\ufe0f", |
|
elem_id="script_config_preset_trash_button", |
|
) |
|
trash_button.click( |
|
fn=delete_selected_preset, |
|
inputs=[config_preset_dropdown], |
|
outputs=[config_preset_dropdown], |
|
) |
|
|
|
with gr.Column(scale=2, min_width=190): |
|
def open_file(f): |
|
path = os.path.normpath(f) |
|
|
|
if not os.path.exists(path): |
|
print(f'Config Presets: The file at "{path}" does not exist.') |
|
return |
|
|
|
|
|
if platform.system() == "Windows": |
|
os.startfile(path) |
|
elif platform.system() == "Darwin": |
|
sp.Popen(["open", path]) |
|
else: |
|
sp.Popen(["xdg-open", path]) |
|
|
|
open_config_file_button = gr.Button( |
|
value="📂 Open config file...", |
|
elem_id="script_config_preset_open_config_file_button", |
|
) |
|
open_config_file_button.click( |
|
fn=lambda: open_file(f"{BASEDIR}/{config_file_name}"), |
|
inputs=[], |
|
outputs=[], |
|
) |
|
|
|
with gr.Column(scale=2, min_width=50): |
|
cancel_button = gr.Button( |
|
value="Cancel", |
|
elem_id="script_config_preset_cancel_save_button", |
|
) |
|
|
|
with gr.Column(scale=1, min_width=120, visible=True) as add_remove_button_column: |
|
add_remove_button = gr.Button( |
|
value="Add/Remove...", |
|
elem_id="script_config_preset_add_button", |
|
) |
|
|
|
with gr.Row() as collapsable_row: |
|
collapsable_row.visible = False |
|
with gr.Column(): |
|
with gr.Row(): |
|
with gr.Column(scale=10, min_width=100): |
|
save_textbox = gr.Textbox( |
|
label="New preset name", |
|
placeholder="Ex: Low quality", |
|
|
|
max_lines=1, |
|
elem_id="script_config_preset_save_textbox", |
|
) |
|
with gr.Column(scale=2, min_width=200): |
|
save_button = gr.Button( |
|
|
|
value="💾 Save", |
|
variant="primary", |
|
elem_id="script_config_preset_save_button", |
|
) |
|
|
|
save_button.click( |
|
fn=save_config(config_presets, component_map, config_file_name), |
|
inputs=list( |
|
[save_textbox] + [fields_checkboxgroup] + [component_map[comp_name] for comp_name in |
|
component_ids if |
|
component_map[comp_name] is not None]), |
|
outputs=[config_preset_dropdown, save_textbox], |
|
) |
|
|
|
def add_remove_button_click(save_textbox_text: str, config_preset_dropdown_value: str): |
|
if save_textbox_text == "" or save_textbox_text is None: |
|
if config_preset_dropdown_value != "" and config_preset_dropdown_value is not None: |
|
|
|
|
|
return gr.Textbox.update(value=config_preset_dropdown_value) |
|
return gr.Textbox.update() |
|
|
|
|
|
def expand_edit_ui(): |
|
return gr.update(visible=True), gr.update(visible=True), gr.update(visible=False) |
|
|
|
def collapse_edit_ui(): |
|
return gr.update(visible=False), gr.update(visible=False), gr.update(visible=True) |
|
|
|
add_remove_button.click( |
|
fn=add_remove_button_click, |
|
inputs=[save_textbox, config_preset_dropdown], |
|
outputs=[save_textbox], |
|
) |
|
add_remove_button.click( |
|
fn=expand_edit_ui, |
|
inputs=[], |
|
outputs=[collapsable_column, collapsable_row, add_remove_button_column], |
|
) |
|
|
|
cancel_button.click( |
|
fn=collapse_edit_ui, |
|
inputs=[], |
|
outputs=[collapsable_column, collapsable_row, add_remove_button_column], |
|
) |
|
|
|
with gr.Row(): |
|
fields_checkboxgroup.render() |
|
|
|
with gr.Row(): |
|
with gr.Column(scale=1): |
|
open_custom_tracked_components_config_file_button = gr.Button( |
|
value="📂 Add custom fields...", |
|
elem_id="script_config_preset_open_custom_tracked_components_config", |
|
) |
|
open_custom_tracked_components_config_file_button.click( |
|
fn=lambda: open_file(f"{BASEDIR}/{custom_tracked_components_config_file_name}"), |
|
inputs=[], |
|
outputs=[], |
|
) |
|
with gr.Column(scale=2): |
|
pass |
|
|
|
|
|
def ui(self, is_img2img): |
|
pass |
|
|
|
def run(self, p, *args): |
|
pass |
|
|
|
|
|
|
|
def save_config(config_presets, component_map, config_file_name): |
|
|
|
|
|
def func(new_setting_name, fields_to_save_list, *new_setting): |
|
|
|
|
|
|
|
|
|
|
|
if new_setting_name == "": |
|
return gr.Dropdown.update(), "" |
|
|
|
new_setting_map = {} |
|
|
|
|
|
|
|
|
|
for i, component_id in enumerate(component_map.keys()): |
|
|
|
if component_id not in fields_to_save_list: |
|
|
|
continue |
|
|
|
if component_map[component_id] is not None: |
|
new_value = new_setting[i] |
|
if component_id == "txt2img_sampling": |
|
new_setting_map[component_id] = modules.sd_samplers.samplers[new_value].name |
|
elif component_id == "img2img_sampling": |
|
new_setting_map[component_id] = modules.sd_samplers.samplers_for_img2img[new_value].name |
|
else: |
|
new_setting_map[component_id] = new_value |
|
|
|
|
|
|
|
|
|
|
|
config_presets.update({new_setting_name: new_setting_map}) |
|
write_json_to_file(config_presets, config_file_name) |
|
|
|
|
|
|
|
|
|
|
|
print(f"[Config-Presets] Added new preset: {new_setting_name}") |
|
|
|
return gr.Dropdown.update(value=new_setting_name, |
|
|
|
choices=get_config_preset_dropdown_choices(config_presets.keys()), |
|
), "" |
|
|
|
return func |
|
|
|
|
|
def write_json_to_file(json_data, file_name: str): |
|
with open(f"{BASEDIR}/{file_name}", "w") as file: |
|
file.write(json.dumps(json_data, indent=4)) |
|
|
|
|
|
def write_text_to_file(text, file_name: str): |
|
with open(f"{BASEDIR}/{file_name}", "w") as file: |
|
file.write(text) |
|
|
|
|
|
def replace_text_in_file(old: str, new: str, file_name: str): |
|
with open(f"{BASEDIR}/{file_name}", "r") as file: |
|
content = file.read() |
|
|
|
with open(f"{BASEDIR}/{file_name}", "w") as file: |
|
file.write(content.replace(old, new)) |
|
|
|
|
|
def log(text: str): |
|
print(f"[Config Presets] {text}") |
|
|
|
|
|
def log_error(text: str): |
|
print(f"[ERROR][Config Presets] {text}") |
|
|
|
|
|
def log_critical_error(text: str): |
|
print(f"[ERROR][CRITICAL][Config Presets] {text}") |