# 使用提醒:
# 1. xbot包提供软件自动化、数据表格、Excel、日志、AI等功能
# 2. package包提供访问当前应用数据的功能,如获取元素、访问全局变量、获取资源文件等功能
# 3. 当此模块作为流程独立运行时执行main函数
# 4. 可视化流程中可以通过"调用模块"的指令使用此模块
import xbot
from xbot import print, sleep
from .import package
from .package import variables as glv
from functools import wraps
from xbot_extensions.activity_photoshop import ps_back
IT_BEEN_DECORATED = False
_original_set_text_of_layer_by_name = ps_back.set_text_of_layer_by_name
_original_change_content_of_layer_by_name_from_file = ps_back.change_content_of_layer_by_name_from_file
def get_layer_by_name(ps_instance, layer_name):
if ">" not in layer_name:
try:
active_layer = ps_instance.app.ActiveDocument.ArtLayers(layer_name)
except:
active_layer = ps_instance.layer(layer_name, only_visible=False)
else:
*layersets, layer_name = [path.strip() for path in layer_name.split(">")]
current_layerset = ps_instance.doc
for layerset_name in layersets:
current_layerset = current_layerset.LayerSets(layerset_name)
active_layer = current_layerset.Layers(layer_name)
return active_layer
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
ps_instance = kwargs['photoshop_instance']
layer_name = kwargs['name_of_layer']
layer = get_layer_by_name(ps_instance, layer_name)
before_replace_bounds = layer.Bounds
func(*args, **kwargs)
after_replace_bounds = layer.Bounds
center_x = (before_replace_bounds[0] + before_replace_bounds[2]) // 2
center_y = (before_replace_bounds[1] + before_replace_bounds[3]) // 2
new_center_x = (after_replace_bounds[0] + after_replace_bounds[2]) // 2
new_center_y = (after_replace_bounds[1] + after_replace_bounds[3]) // 2
x_offset = center_x - new_center_x
y_offset = center_y - new_center_y
layer.Translate(x_offset, y_offset)
return wrapper
def add_patch_decorator():
global IT_BEEN_DECORATED
if IT_BEEN_DECORATED:
return
# 应用装饰器
ps_back.set_text_of_layer_by_name = decorator(_original_set_text_of_layer_by_name)
ps_back.change_content_of_layer_by_name_from_file = decorator(_original_change_content_of_layer_by_name_from_file)
IT_BEEN_DECORATED = True
def remove_patch_decorator():
global IT_BEEN_DECORATED
if not IT_BEEN_DECORATED:
return
# 移除装饰器
ps_back.set_text_of_layer_by_name = _original_set_text_of_layer_by_name
ps_back.change_content_of_layer_by_name_from_file = _original_change_content_of_layer_by_name_from_file
IT_BEEN_DECORATED = False