Skip to content
Toggle navigation
Toggle navigation
This project
Loading...
Sign in
柴进
/
GoogleNanoBananaApp
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Issue Boards
Files
Commits
Network
Compare
Branches
Tags
9f11de19
authored
2025-12-11 14:55:23 +0800
by
shady
Browse Files
Options
Browse Files
Tag
Download
Plain Diff
Merge remote-tracking branch 'origin/master'
2 parents
a7a323f8
0909edd6
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
185 additions
and
162 deletions
image_generator.py
jewelry_library.json
image_generator.py
View file @
9f11de1
...
...
@@ -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
.
cop
y
()
return
self
.
_load_default_librar
y
()
else
:
# 首次使用,创建默认词库
self
.
logger
.
info
(
"未找到珠宝词库文件,创建默认词库"
)
library
=
DEFAULT_JEWELRY_LIBRARY
.
cop
y
()
library
=
self
.
_load_default_librar
y
()
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
.
cop
y
()
self
.
library
=
self
.
_load_default_librar
y
()
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
c
ategory
not
in
self
.
locked_fields
and
c
ombo
.
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
...
...
jewelry_library.json
View file @
9f11de1
{
"主石"
:
[
"椭圆形黑发晶"
,
"圆形莫桑石"
,
"祖母绿形红宝石"
,
"梨形蓝宝石"
,
"垫形绿碧玺"
,
"椭圆形黄水晶带天然包裹体"
,
"公主方形钻石"
,
"心形粉红蓝宝石"
"主石形状"
:
[
"圆形"
,
"椭圆形"
,
"梨形"
,
"马眼形"
,
"子弹形(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
...
...
Please
register
or
sign in
to post a comment