9f11de19 by shady

Merge remote-tracking branch 'origin/master'

2 parents a7a323f8 0909edd6
......@@ -2605,86 +2605,6 @@ class ImageGenerationWorker(QThread):
# 珠宝设计功能模块
# ============================================================================
# 默认珠宝词库(纯中文)
DEFAULT_JEWELRY_LIBRARY = {
"主石形状": [
"椭圆形",
"圆形",
"祖母绿形",
"梨形",
"垫形",
"公主方形",
"心形"
],
"主石材质": [
"黑发晶",
"莫桑石",
"红宝石",
"蓝宝石",
"绿碧玺",
"黄水晶带天然包裹体",
"钻石",
"粉红蓝宝石"
],
"金属": [
"14K黄金",
"18K玫瑰金",
"14K白金",
"铂金(PT950)",
"双色14K黄金+白金",
"950银镀铑",
"钛金属"
],
"花头形式": [
"花卉风格光环",
"经典圆形光环",
"复古风格米粒边光环",
"双层光环",
"几何六边形光环",
"非对称光环",
"简约爪镶无光环"
],
"戒臂结构": [
"扭转戒臂",
"分裂戒臂",
"刀刃戒臂",
"大教堂戒臂",
"交叉戒臂",
"直线平滑戒臂",
"三股编织戒臂"
],
"戒臂处理": [
"雕刻镂空花丝工艺",
"密钉镶戒臂",
"抛光平滑戒臂",
"浮雕雕刻",
"编织纹理",
"极简干净戒臂",
"穿孔镂空细节",
"锤纹处理"
],
"特殊元素": [
"凯尔特结图案",
"装饰艺术几何元素",
"自然风格叶子图案",
"复古米粒边细节",
"哥特式图案元素",
"天体图案(星星、月亮)",
"藤蔓装饰曲线",
"蝴蝶结装饰"
],
"辅石镶嵌": [
"密钉镶",
"微密钉镶",
"槽镶",
"珠粒镶",
"共爪镶",
"包镶",
"轨道镶"
]
}
class JewelryLibraryManager:
"""珠宝词库管理器"""
......@@ -2697,6 +2617,8 @@ class JewelryLibraryManager:
self.logger = logging.getLogger(__name__)
self.config_dir = config_dir
self.config_path = config_dir / "jewelry_library.json"
# 获取默认词库文件的路径
self.default_library_path = Path(__file__).parent / "data" / "default_jewelry_library.json"
self.library = self.load_library()
def load_library(self) -> Dict[str, List[str]]:
......@@ -2713,14 +2635,35 @@ class JewelryLibraryManager:
return library
except Exception as e:
self.logger.error(f"珠宝词库加载失败: {e},使用默认词库")
return DEFAULT_JEWELRY_LIBRARY.copy()
return self._load_default_library()
else:
# 首次使用,创建默认词库
self.logger.info("未找到珠宝词库文件,创建默认词库")
library = DEFAULT_JEWELRY_LIBRARY.copy()
library = self._load_default_library()
self.save_library(library)
return library
def _load_default_library(self) -> Dict[str, List[str]]:
"""从文件加载默认词库"""
try:
with open(self.default_library_path, 'r', encoding='utf-8') as f:
library = json.load(f)
self.logger.info(f"默认词库加载成功: {self.default_library_path}")
return library
except Exception as e:
self.logger.error(f"默认词库加载失败: {e}")
# 如果默认词库文件也不存在,返回一个最小的词库
return {
"主石形状": ["圆形", "椭圆形"],
"主石材质": ["钻石", "莫桑石"],
"金属": ["14K黄金", "18K白金"],
"花头形式": ["经典圆形光环"],
"戒臂结构": ["直臂"],
"戒臂处理": ["抛光平滑戒臂"],
"辅石镶嵌": ["三石结构"],
"特殊元素": []
}
def _migrate_library_if_needed(self, library: Dict[str, List[str]]) -> Dict[str, List[str]]:
"""检查并执行数据迁移"""
# 如果存在旧的"主石"字段,需要拆分
......@@ -2744,8 +2687,9 @@ class JewelryLibraryManager:
materials.append(material)
# 更新词库
library["主石形状"] = shapes if shapes else DEFAULT_JEWELRY_LIBRARY["主石形状"]
library["主石材质"] = materials if materials else DEFAULT_JEWELRY_LIBRARY["主石材质"]
default_library = self._load_default_library()
library["主石形状"] = shapes if shapes else default_library["主石形状"]
library["主石材质"] = materials if materials else default_library["主石材质"]
# 保留旧字段作为备份
# library.pop("主石", None) # 可以选择是否移除
......@@ -2758,18 +2702,29 @@ class JewelryLibraryManager:
def _extract_shape(self, item: str) -> Optional[str]:
"""从主石描述中提取形状"""
shapes = ["椭圆形", "圆形", "祖母绿形", "梨形", "垫形", "公主方形", "心形"]
# 从默认词库文件获取形状列表,确保同步
default_library = self._load_default_library()
shapes = default_library.get("主石形状", [])
for shape in shapes:
if item.startswith(shape):
# 处理带括号的形状(如"子弹形(Baguette 子弹刻面)")
if "(" in shape:
shape_base = shape.split("(")[0]
if item.startswith(shape_base):
return shape_base
elif item.startswith(shape):
return shape
return None
def _extract_material(self, item: str) -> Optional[str]:
"""从主石描述中提取材质"""
shapes = ["椭圆形", "圆形", "祖母绿形", "梨形", "垫形", "公主方形", "心形"]
# 从默认词库文件获取形状列表,确保同步
default_library = self._load_default_library()
shapes = default_library.get("主石形状", [])
for shape in shapes:
if item.startswith(shape):
material = item[len(shape):]
# 处理带括号的形状(如"子弹形(Baguette 子弹刻面)")
shape_base = shape.split("(")[0] if "(" in shape else shape
if item.startswith(shape_base):
material = item[len(shape_base):]
# 去除可能的连接词
if material.startswith("的"):
material = material[1:]
......@@ -2831,8 +2786,9 @@ class JewelryLibraryManager:
Args:
category: 类别名称
"""
if category in DEFAULT_JEWELRY_LIBRARY:
self.library[category] = DEFAULT_JEWELRY_LIBRARY[category].copy()
default_library = self._load_default_library()
if category in default_library:
self.library[category] = default_library[category].copy()
self.save_library()
self.logger.info(f"恢复默认词库: {category}")
else:
......@@ -2840,7 +2796,7 @@ class JewelryLibraryManager:
def reset_all(self):
"""恢复所有类别的默认词库"""
self.library = DEFAULT_JEWELRY_LIBRARY.copy()
self.library = self._load_default_library()
self.save_library()
self.logger.info("恢复所有默认词库")
......@@ -2946,6 +2902,12 @@ class StyleDesignerTab(QWidget):
# 存储每个类别的 ComboBox
self.combo_boxes = {}
# 存储每个类别的锁定按钮
self.lock_buttons = {}
# 存储锁定的类别
self.locked_fields = set()
# 生成相关
self.generated_image_bytes = None
......@@ -3124,9 +3086,9 @@ class StyleDesignerTab(QWidget):
self.update_prompt_preview()
def randomize_parameters(self):
"""随机生成一套参数"""
"""随机生成一套参数(跳过锁定的字段)"""
for category, combo in self.combo_boxes.items():
if combo.count() > 0:
if category not in self.locked_fields and combo.count() > 0:
random_index = random.randint(0, combo.count() - 1)
combo.setCurrentIndex(random_index)
# 触发prompt预览更新
......@@ -3153,18 +3115,28 @@ class StyleDesignerTab(QWidget):
self.combo_boxes[category] = combo
layout.addWidget(combo, 3)
# 添加按钮
add_btn = QPushButton("添加")
# 添加按钮(使用表情符号)
add_btn = QPushButton("")
add_btn.clicked.connect(lambda: self.add_library_item(category))
add_btn.setFixedWidth(60)
add_btn.setFixedWidth(40)
add_btn.setToolTip("添加词库项")
layout.addWidget(add_btn)
# 删除按钮
del_btn = QPushButton("删除")
# 删除按钮(使用表情符号)
del_btn = QPushButton("🗑️")
del_btn.clicked.connect(lambda: self.remove_library_item(category))
del_btn.setFixedWidth(60)
del_btn.setFixedWidth(40)
del_btn.setToolTip("删除词库项")
layout.addWidget(del_btn)
# 锁定/解锁按钮(使用表情符号)
lock_btn = QPushButton("🔓")
lock_btn.clicked.connect(lambda: self.toggle_field_lock(category))
lock_btn.setFixedWidth(40)
lock_btn.setToolTip("锁定/解锁字段")
self.lock_buttons[category] = lock_btn
layout.addWidget(lock_btn)
widget.setLayout(layout)
return widget
......@@ -3300,6 +3272,21 @@ class StyleDesignerTab(QWidget):
else:
combo.setCurrentIndex(0)
def toggle_field_lock(self, category: str):
"""切换字段锁定状态"""
if category in self.locked_fields:
# 解锁
self.locked_fields.remove(category)
button = self.lock_buttons[category]
button.setText("🔓")
button.setToolTip("字段已解锁")
else:
# 锁定
self.locked_fields.add(category)
button = self.lock_buttons[category]
button.setText("🔒")
button.setToolTip("字段已锁定")
def generate_image(self):
"""Submit image generation task to queue"""
from task_queue import TaskType
......
{
"主石": [
"椭圆形黑发晶",
"圆形莫桑石",
"祖母绿形红宝石",
"梨形蓝宝石",
"垫形绿碧玺",
"椭圆形黄水晶带天然包裹体",
"公主方形钻石",
"心形粉红蓝宝石"
"主石形状": [
"圆形",
"椭圆形",
"梨形",
"马眼形",
"子弹形(Baguette 子弹刻面)",
"垫形",
"公主方形",
"祖母绿形",
"心形",
"风筝形",
"棺材形(Coffin Cut)",
"菱形(Rhombus)",
"正六边形",
"四叶草形",
"梯方形(Tapered Step)",
"阿斯切形",
"平底刻面风格"
],
"主石材质": [
"莫桑石",
"钻石",
"黑发晶",
"蓝宝石",
"红宝石",
"粉蓝宝石",
"绿碧玺",
"黄水晶(天然包体)",
"月光石",
"摩根石",
"海蓝宝",
"天然白玉髓",
"金绿宝石(猫眼)"
],
"金属": [
"14K黄金",
"18K玫瑰金",
"14K白金",
"铂金(PT950)",
"双色14K黄金+白金",
"950银镀铑",
"钛金属"
"14K玫瑰金",
"18K黄金",
"18K白金",
"18K玫瑰金",
"双色金(白金+黄金)",
"950铂金",
"925银镀铑",
"钛金属",
"定制复古做旧金"
],
"花头形式": [
"全halo光环",
"半halo光环",
"双层halo",
"花卉风格光环",
"围圈雕刻光环",
"围圈密钉镶",
"经典圆形光环",
"复古风格米粒边光环",
"双层光环",
"几何六边形光环",
"非对称光环",
"简约爪镶无光环"
"三石花头(cluster 结构)",
"五石花头",
"cluster堆砌花头(大小堆/不规则)",
"双石结构(Two-stone)",
"单石无光环(爪镶/包镶)",
"花头侧面结构",
"高耸花头(Cathedral halo)"
],
"戒臂结构": [
"扭转戒臂",
"分裂戒臂",
"刀刃戒臂",
"大教堂戒臂",
"直臂",
"xox扭臂(交叉扭绞)",
">O< 戒臂结构",
"<O> 戒臂结构",
"V字戒臂",
"交叉戒臂",
"直线平滑戒臂",
"三股编织戒臂"
"overlap重叠戒臂",
"wave波浪戒臂",
"刀锋臂",
"大教堂戒臂(高肩设计)",
"三股编织戒臂",
"分裂戒臂(split shank)",
"戒臂夹层",
"小夹层戒臂(如莲花夹层设计)",
"不对称戒臂"
],
"戒臂处理": [
"雕刻镂空花丝工艺",
"密钉镶戒臂",
"微密钉镶",
"镶石虎爪镶/逼镶",
"抛光平滑戒臂",
"浮雕雕刻",
"编织纹理",
"极简干净戒臂",
"珠边戒臂(milgrain)",
"光金戒臂",
"雕刻镂空花丝",
"浮雕雕刻(凸雕)",
"凹刻雕刻(内刻)",
"几何雕刻纹理",
"复古米粒边装饰(milgrain)",
"编织纹理戒臂",
"穿孔镂空细节",
"锤纹处理"
],
"特殊元素": [
"凯尔特结图案",
"装饰艺术几何元素",
"自然风格叶子图案",
"复古米粒边细节",
"哥特式图案元素",
"天体图案(星星、月亮)",
"藤蔓装饰曲线",
"蝴蝶结装饰"
],
"辅石镶嵌": [
"密钉镶",
"微密钉镶",
"槽镶",
"珠粒镶",
"共爪镶",
"包镶",
"轨道镶"
],
"主石形状": [
"椭圆形",
"圆形",
"祖母绿形",
"梨形",
"垫形",
"公主方形",
"心形"
"三石结构",
"五石结构",
"cluster自由堆砌侧石",
"大小堆组合",
"共爪镶侧钻",
"包镶侧钻",
"轨道镶",
"槽镶"
],
"主石材质": [
"黑发晶",
"莫桑石",
"红宝石",
"蓝宝石",
"绿碧玺",
"黄水晶带天然包裹体",
"钻石",
"粉红蓝宝石"
"特殊元素": [
"花朵元素",
"月亮元素",
"星星元素",
"日月星组合",
"凯尔特结",
"叶子图案",
"自然植物藤蔓纹理",
"蝴蝶结元素",
"装饰艺术几何元素",
"复古花纹",
"哥特式结构元素"
]
}
\ No newline at end of file
......