14263940 by shady

Merge remote-tracking branch 'origin/master'

2 parents 9f11de19 9f656728
......@@ -2604,6 +2604,138 @@ class ImageGenerationWorker(QThread):
# ============================================================================
# 珠宝设计功能模块
# ============================================================================
DEFAULT_JEWELRY_LIBRARY = {
"主石形状": [
"圆形",
"椭圆形",
"梨形",
"马眼形",
"子弹形(Baguette 子弹刻面)",
"垫形",
"公主方形",
"祖母绿形",
"心形",
"风筝形",
"棺材形(Coffin Cut)",
"菱形(Rhombus)",
"正六边形",
"四叶草形",
"梯方形(Tapered Step)",
"阿斯切形",
"平底刻面风格"
],
"主石材质": [
"莫桑石",
"钻石",
"黑发晶",
"蓝宝石",
"红宝石",
"粉蓝宝石",
"绿碧玺",
"黄水晶(天然包体)",
"月光石",
"摩根石",
"海蓝宝",
"天然白玉髓",
"金绿宝石(猫眼)"
],
"金属": [
"14K黄金",
"14K白金",
"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自由堆砌侧石",
"大小堆组合",
"共爪镶侧钻",
"包镶侧钻",
"轨道镶",
"槽镶"
],
"特殊元素": [
"花朵元素",
"月亮元素",
"星星元素",
"日月星组合",
"凯尔特结",
"叶子图案",
"自然植物藤蔓纹理",
"蝴蝶结元素",
"装饰艺术几何元素",
"复古花纹",
"哥特式结构元素"
]
}
class JewelryLibraryManager:
"""珠宝词库管理器"""
......@@ -2635,35 +2767,14 @@ class JewelryLibraryManager:
return library
except Exception as e:
self.logger.error(f"珠宝词库加载失败: {e},使用默认词库")
return self._load_default_library()
return DEFAULT_JEWELRY_LIBRARY.copy()
else:
# 首次使用,创建默认词库
self.logger.info("未找到珠宝词库文件,创建默认词库")
library = self._load_default_library()
library = DEFAULT_JEWELRY_LIBRARY.copy()
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]]:
"""检查并执行数据迁移"""
# 如果存在旧的"主石"字段,需要拆分
......@@ -2687,9 +2798,8 @@ class JewelryLibraryManager:
materials.append(material)
# 更新词库
default_library = self._load_default_library()
library["主石形状"] = shapes if shapes else default_library["主石形状"]
library["主石材质"] = materials if materials else default_library["主石材质"]
library["主石形状"] = shapes if shapes else DEFAULT_JEWELRY_LIBRARY["主石形状"]
library["主石材质"] = materials if materials else DEFAULT_JEWELRY_LIBRARY["主石材质"]
# 保留旧字段作为备份
# library.pop("主石", None) # 可以选择是否移除
......@@ -2702,9 +2812,8 @@ class JewelryLibraryManager:
def _extract_shape(self, item: str) -> Optional[str]:
"""从主石描述中提取形状"""
# 从默认词库文件获取形状列表,确保同步
default_library = self._load_default_library()
shapes = default_library.get("主石形状", [])
# 直接从 DEFAULT_JEWELRY_LIBRARY 获取形状列表,确保同步
shapes = DEFAULT_JEWELRY_LIBRARY.get("主石形状", [])
for shape in shapes:
# 处理带括号的形状(如"子弹形(Baguette 子弹刻面)")
if "(" in shape:
......@@ -2717,9 +2826,8 @@ class JewelryLibraryManager:
def _extract_material(self, item: str) -> Optional[str]:
"""从主石描述中提取材质"""
# 从默认词库文件获取形状列表,确保同步
default_library = self._load_default_library()
shapes = default_library.get("主石形状", [])
# 直接从 DEFAULT_JEWELRY_LIBRARY 获取形状列表,确保同步
shapes = DEFAULT_JEWELRY_LIBRARY.get("主石形状", [])
for shape in shapes:
# 处理带括号的形状(如"子弹形(Baguette 子弹刻面)")
shape_base = shape.split("(")[0] if "(" in shape else shape
......@@ -2786,9 +2894,8 @@ class JewelryLibraryManager:
Args:
category: 类别名称
"""
default_library = self._load_default_library()
if category in default_library:
self.library[category] = default_library[category].copy()
if category in DEFAULT_JEWELRY_LIBRARY:
self.library[category] = DEFAULT_JEWELRY_LIBRARY[category].copy()
self.save_library()
self.logger.info(f"恢复默认词库: {category}")
else:
......@@ -2796,7 +2903,7 @@ class JewelryLibraryManager:
def reset_all(self):
"""恢复所有类别的默认词库"""
self.library = self._load_default_library()
self.library = DEFAULT_JEWELRY_LIBRARY.copy()
self.save_library()
self.logger.info("恢复所有默认词库")
......