618 lines
18 KiB
Python
618 lines
18 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
SUWood 常量定义
|
||
翻译自: SUWConstants.rb
|
||
"""
|
||
|
||
import os
|
||
import logging
|
||
from pathlib import Path
|
||
from typing import Optional, Dict, Any
|
||
|
||
# 设置日志
|
||
logger = logging.getLogger(__name__)
|
||
|
||
# 检查Blender可用性
|
||
try:
|
||
import bpy
|
||
BLENDER_AVAILABLE = True
|
||
except ImportError:
|
||
BLENDER_AVAILABLE = False
|
||
|
||
# 辅助函数:获取选择状态信息
|
||
|
||
|
||
def _get_selection_info():
|
||
"""获取选择状态信息 - 替代SUWImpl的选择状态"""
|
||
try:
|
||
from .suw_core import get_selection_manager
|
||
selection_manager = get_selection_manager()
|
||
if selection_manager:
|
||
return {
|
||
'selected_uid': selection_manager.selected_uid(),
|
||
'selected_obj': selection_manager.selected_obj(),
|
||
'selected_zone': selection_manager.selected_zone(),
|
||
'selected_part': selection_manager.selected_part()
|
||
}
|
||
except ImportError:
|
||
pass
|
||
|
||
# 如果无法获取,返回默认值
|
||
return {
|
||
'selected_uid': None,
|
||
'selected_obj': None,
|
||
'selected_zone': None,
|
||
'selected_part': None
|
||
}
|
||
|
||
|
||
def _get_server_path():
|
||
"""获取服务器路径 - 替代SUWImpl.server_path"""
|
||
try:
|
||
from .suw_core import get_data_manager
|
||
data_manager = get_data_manager()
|
||
if data_manager and hasattr(data_manager, 'server_path'):
|
||
return data_manager.server_path
|
||
except ImportError:
|
||
pass
|
||
|
||
# 如果无法获取,返回默认路径
|
||
return os.path.dirname(__file__)
|
||
|
||
|
||
class SUWood:
|
||
"""SUWood 主要常量和功能类"""
|
||
|
||
# 场景操作常量
|
||
SUSceneNew = 1 # 清除之前的订单
|
||
SUSceneOpen = 2 # 清除之前的订单
|
||
SUSceneSave = 3
|
||
SUScenePrice = 4
|
||
|
||
# 单元操作常量
|
||
SUUnitPoint = 11
|
||
SUUnitFace = 12
|
||
SUUnitDelete = 13
|
||
SUUnitContour = 14
|
||
|
||
# 区域操作常量
|
||
SUZoneFront = 20
|
||
SUZoneDiv1 = 21
|
||
SUZoneResize = 22
|
||
SUZoneCombine = 23
|
||
SUZoneReplace = 24
|
||
SUZoneMaterial = 25
|
||
SUZoneHandle = 26
|
||
SUZoneCloth = 27
|
||
SUZoneLight = 28
|
||
|
||
# 空间位置常量
|
||
VSSpatialPos_F = 1 # 前
|
||
VSSpatialPos_K = 2 # 后
|
||
VSSpatialPos_L = 3 # 左
|
||
VSSpatialPos_R = 4 # 右
|
||
VSSpatialPos_B = 5 # 底
|
||
VSSpatialPos_T = 6 # 顶
|
||
|
||
# 单元轮廓常量
|
||
VSUnitCont_Zone = 1 # 区域轮廓
|
||
VSUnitCont_Part = 2 # 部件轮廓
|
||
VSUnitCont_Work = 3 # 挖洞轮廓
|
||
|
||
# 版本常量
|
||
V_Dealer = 1000
|
||
V_Machining = 1100
|
||
V_Division = 1200
|
||
V_PartCategory = 1300
|
||
V_Contour = 1400
|
||
V_Color = 1500
|
||
V_Profile = 1600
|
||
V_Surf = 1700
|
||
V_StretchPart = 1800
|
||
V_Material = 1900
|
||
V_Connection = 2000
|
||
V_HardwareSchema = 2050
|
||
V_HardwareSet = 2100
|
||
V_Hardware = 2200
|
||
V_Groove = 2300
|
||
V_DesignParam = 2400
|
||
V_ProfileSchema = 2500
|
||
V_StructPart = 2600
|
||
V_CraftPart = 2700
|
||
V_SeriesPart = 2800
|
||
V_Drawer = 2900
|
||
V_DesignTemplate = 3000
|
||
V_PriceTemplate = 3100
|
||
V_MachineCut = 3200
|
||
V_MachineCNC = 3300
|
||
V_CorpLabel = 3400
|
||
V_CorpCAM = 3500
|
||
V_PackLabel = 3600
|
||
V_Unit = 5000
|
||
|
||
# 路径常量
|
||
PATH = os.path.dirname(__file__)
|
||
|
||
def __init__(self):
|
||
"""初始化SUWood实例"""
|
||
pass
|
||
|
||
@classmethod
|
||
def icon_path(cls, icon_name, ext='png'):
|
||
"""获取图标路径"""
|
||
return f"{cls.PATH}/icon/{icon_name}.{ext}"
|
||
|
||
@classmethod
|
||
def unit_path(cls):
|
||
"""获取单元路径"""
|
||
try:
|
||
server_path = _get_server_path()
|
||
return f"{server_path}/drawings/Unit"
|
||
except ImportError:
|
||
return f"{cls.PATH}/drawings/Unit"
|
||
|
||
@classmethod
|
||
def suwood_path(cls, ref_v):
|
||
"""根据版本值获取SUWood路径"""
|
||
try:
|
||
server_path = _get_server_path()
|
||
except ImportError:
|
||
server_path = cls.PATH
|
||
|
||
path_mapping = {
|
||
cls.V_Material: f"{server_path}/images/texture",
|
||
cls.V_StretchPart: f"{server_path}/drawings/StretchPart",
|
||
cls.V_StructPart: f"{server_path}/drawings/StructPart",
|
||
cls.V_Unit: f"{server_path}/drawings/Unit",
|
||
cls.V_Connection: f"{server_path}/drawings/Connection",
|
||
cls.V_HardwareSet: f"{server_path}/drawings/HardwareSet",
|
||
cls.V_Hardware: f"{server_path}/drawings/Hardware",
|
||
}
|
||
|
||
return path_mapping.get(ref_v, server_path)
|
||
|
||
@classmethod
|
||
def suwood_pull_size(cls, pos):
|
||
"""根据位置获取拉手尺寸类型"""
|
||
size_mapping = {
|
||
1: "HW", # 右上
|
||
2: "W", # 右中
|
||
3: "HW", # 右下
|
||
4: "H", # 中上
|
||
6: "H", # 中下
|
||
11: "HW", # 右上-竖
|
||
12: "W", # 右中-竖
|
||
13: "HW", # 右下-竖
|
||
14: "H", # 中上-竖
|
||
16: "H", # 中下-竖
|
||
21: "HW", # 右上-横
|
||
22: "W", # 右中-横
|
||
23: "HW", # 右下-横
|
||
24: "H", # 中上-横
|
||
26: "H", # 中下-横
|
||
}
|
||
return size_mapping.get(pos)
|
||
|
||
@classmethod
|
||
def scene_save(cls):
|
||
"""保存场景"""
|
||
try:
|
||
import bpy # Blender Python API
|
||
|
||
scene = bpy.context.scene
|
||
order_id = scene.get("order_id")
|
||
if order_id is None:
|
||
return
|
||
|
||
data = {
|
||
"method": cls.SUSceneSave,
|
||
"order_id": order_id
|
||
}
|
||
cls.set_cmd("r00", data)
|
||
|
||
if not bpy.data.filepath:
|
||
server_path = _get_server_path()
|
||
scene_path = Path(f"{server_path}/blender")
|
||
scene_path.mkdir(exist_ok=True)
|
||
|
||
order_code = scene.get("order_code", "untitled")
|
||
filepath = scene_path / f"{order_code}.blend"
|
||
bpy.ops.wm.save_as_mainfile(filepath=str(filepath))
|
||
else:
|
||
bpy.ops.wm.save_mainfile()
|
||
|
||
except ImportError:
|
||
print("Blender API not available - scene_save not implemented")
|
||
|
||
@classmethod
|
||
def scene_price(cls):
|
||
"""场景价格计算"""
|
||
try:
|
||
import bpy
|
||
scene = bpy.context.scene
|
||
order_id = scene.get("order_id")
|
||
if order_id is None:
|
||
return
|
||
|
||
params = {
|
||
"method": cls.SUScenePrice,
|
||
"order_id": order_id
|
||
}
|
||
cls.set_cmd("r00", params)
|
||
|
||
except ImportError:
|
||
print("Blender API not available - scene_price not implemented")
|
||
|
||
@classmethod
|
||
def import_unit(cls, uid, values, mold):
|
||
"""点击创体(产品UID)"""
|
||
# 原本激活SketchUp工具,这里需要适配到Blender
|
||
try:
|
||
from .suw_unit_point_tool import SUWUnitPointTool
|
||
# 创建单元点工具
|
||
width = values.get("width", 0) * 0.001 # 转换为米
|
||
depth = values.get("depth", 0) * 0.001
|
||
height = values.get("height", 0) * 0.001
|
||
|
||
tool = SUWUnitPointTool(width, depth, height, uid, mold)
|
||
# 在Blender中激活工具的逻辑需要根据具体实现
|
||
print(f"激活单元点工具: {uid}, 尺寸: {width}x{depth}x{height}")
|
||
|
||
except ImportError:
|
||
print("SUWUnitPointTool not available")
|
||
|
||
@classmethod
|
||
def import_face(cls, uid, values, mold):
|
||
"""选面创体(产品UID)"""
|
||
try:
|
||
from .suw_unit_face_tool import SUWUnitFaceTool
|
||
tool = SUWUnitFaceTool(cls.VSSpatialPos_F, uid, mold)
|
||
print(f"激活单元面工具: {uid}")
|
||
|
||
except ImportError:
|
||
print("SUWUnitFaceTool not available")
|
||
|
||
@classmethod
|
||
def front_view(cls):
|
||
"""前视图"""
|
||
try:
|
||
selection_info = _get_selection_info()
|
||
uid = selection_info['selected_uid']
|
||
obj = selection_info['selected_obj']
|
||
|
||
if uid is None or obj is None:
|
||
print("请先选择正视于的基准面!")
|
||
return
|
||
|
||
params = {
|
||
"method": cls.SUZoneFront,
|
||
"uid": uid,
|
||
"oid": obj
|
||
}
|
||
cls.set_cmd("r00", params)
|
||
|
||
except ImportError:
|
||
print("无法获取选择信息")
|
||
|
||
@classmethod
|
||
def delete_unit(cls):
|
||
"""删除单元"""
|
||
try:
|
||
import bpy
|
||
selection_info = _get_selection_info()
|
||
|
||
scene = bpy.context.scene
|
||
order_id = scene.get("order_id")
|
||
uid = selection_info['selected_uid']
|
||
obj = selection_info['selected_obj']
|
||
|
||
if uid is None:
|
||
print("请先选择待删除的柜体!")
|
||
return
|
||
elif order_id is None:
|
||
print("当前柜体不是场景方案的柜体!")
|
||
return
|
||
|
||
# 在实际应用中,这里应该有确认对话框
|
||
# 现在简化为直接执行
|
||
|
||
params = {
|
||
"method": cls.SUUnitDelete,
|
||
"order_id": order_id,
|
||
"uid": uid
|
||
}
|
||
if obj:
|
||
params["oid"] = obj
|
||
|
||
cls.set_cmd("r00", params)
|
||
|
||
except ImportError:
|
||
print("Blender API or SUWImpl not available")
|
||
|
||
@classmethod
|
||
def combine_unit(cls, uid, values, mold):
|
||
"""模块拼接"""
|
||
try:
|
||
selection_info = _get_selection_info()
|
||
|
||
selected_zone = selection_info['selected_zone']
|
||
if selected_zone is None:
|
||
print("请先选择待拼接的空区域!")
|
||
return
|
||
|
||
params = {
|
||
"method": cls.SUZoneCombine,
|
||
"uid": selected_zone.get("uid"),
|
||
"zid": selected_zone.get("zid"),
|
||
"source": uid
|
||
}
|
||
if mold:
|
||
params["module"] = mold
|
||
|
||
cls.set_cmd("r00", params)
|
||
|
||
except ImportError:
|
||
print("无法获取选择信息")
|
||
|
||
@classmethod
|
||
def replace_unit(cls, uid, values, mold):
|
||
"""模块/产品替换"""
|
||
try:
|
||
selection_info = _get_selection_info()
|
||
|
||
if selection_info['selected_zone'] is None and (mold == 1 or mold == 2):
|
||
print("请先选择待替换的区域!")
|
||
return
|
||
elif selection_info['selected_obj'] is None and (mold == 3):
|
||
print("请先选择待替换的部件!")
|
||
return
|
||
|
||
params = {
|
||
"method": cls.SUZoneReplace,
|
||
"source": uid,
|
||
"module": mold
|
||
}
|
||
cls.set_cmd("r00", params)
|
||
|
||
except ImportError:
|
||
print("无法获取选择信息")
|
||
|
||
@classmethod
|
||
def replace_mat(cls, uid, values, mat_type):
|
||
"""材料替换"""
|
||
try:
|
||
selection_info = _get_selection_info()
|
||
|
||
selected_zone = selection_info['selected_zone']
|
||
if selected_zone is None:
|
||
print("请先选择待替换材料的区域!")
|
||
return
|
||
|
||
params = {
|
||
"method": cls.SUZoneMaterial,
|
||
"mat_id": uid,
|
||
"type": mat_type
|
||
}
|
||
cls.set_cmd("r00", params)
|
||
|
||
except ImportError:
|
||
print("无法获取选择信息")
|
||
|
||
@classmethod
|
||
def replace_handle(cls, width, height, set_id, conn_id):
|
||
"""替换拉手"""
|
||
try:
|
||
selection_info = _get_selection_info()
|
||
|
||
selected_zone = selection_info['selected_zone']
|
||
if selected_zone is None:
|
||
print("请先选择待替换拉手的区域!")
|
||
return
|
||
|
||
params = {
|
||
"method": cls.SUZoneHandle,
|
||
"uid": selected_zone.get("uid"),
|
||
"zid": selected_zone.get("zid"),
|
||
"conn_id": conn_id,
|
||
"set_id": set_id
|
||
}
|
||
|
||
if width is not None and width != "":
|
||
params["width"] = int(width)
|
||
if height is not None and height != "":
|
||
params["height"] = int(height)
|
||
|
||
cls.set_cmd("r00", params)
|
||
|
||
except ImportError:
|
||
print("无法获取选择信息")
|
||
|
||
@classmethod
|
||
def clear_current(cls, ref_v):
|
||
"""清除当前选择"""
|
||
try:
|
||
selection_info = _get_selection_info()
|
||
|
||
if (ref_v == 2102 or ref_v == 2103) and selection_info['selected_zone']:
|
||
params = {
|
||
"uid": selection_info['selected_uid']
|
||
}
|
||
cls.set_cmd("r01", params)
|
||
# 清除选择
|
||
from .suw_core import get_selection_manager
|
||
selection_manager = get_selection_manager()
|
||
if selection_manager:
|
||
selection_manager.sel_clear()
|
||
|
||
except ImportError:
|
||
print("无法获取选择信息")
|
||
|
||
@classmethod
|
||
def replace_clothes(cls, front, back, set_id, conn_id):
|
||
"""挂衣杆替换"""
|
||
try:
|
||
selection_info = _get_selection_info()
|
||
|
||
selected_zone = selection_info['selected_zone']
|
||
if selected_zone is None:
|
||
print("请先选择待替换衣杆的区域!")
|
||
return
|
||
|
||
params = {
|
||
"method": cls.SUZoneCloth,
|
||
"uid": selected_zone.get("uid"),
|
||
"zid": selected_zone.get("zid"),
|
||
"conn_id": conn_id,
|
||
"set_id": set_id
|
||
}
|
||
|
||
if front != 0:
|
||
params["front"] = front
|
||
if back != 0:
|
||
params["back"] = back
|
||
|
||
cls.set_cmd("r00", params)
|
||
|
||
except ImportError:
|
||
print("无法获取选择信息")
|
||
|
||
@classmethod
|
||
def replace_lights(cls, front, back, set_id, conn_id):
|
||
"""灯带替换"""
|
||
try:
|
||
selection_info = _get_selection_info()
|
||
|
||
selected_zone = selection_info['selected_zone']
|
||
if selected_zone is None:
|
||
print("请先选择待替换灯带的区域!")
|
||
return
|
||
|
||
# 处理连接ID(可能是数组)
|
||
if isinstance(conn_id, list):
|
||
conns = ",".join(map(str, conn_id))
|
||
else:
|
||
conns = str(conn_id)
|
||
|
||
params = {
|
||
"method": cls.SUZoneLight,
|
||
"uid": selected_zone.get("uid"),
|
||
"zid": selected_zone.get("zid"),
|
||
"conn_id": conns,
|
||
"set_id": set_id
|
||
}
|
||
|
||
if front != 0:
|
||
params["front"] = front
|
||
if back != 0:
|
||
params["back"] = back
|
||
|
||
cls.set_cmd("r00", params)
|
||
|
||
except ImportError:
|
||
print("无法获取选择信息")
|
||
|
||
@classmethod
|
||
def set_cmd(cls, cmd_type, params):
|
||
"""设置命令"""
|
||
try:
|
||
from .suw_client import set_cmd
|
||
set_cmd(cmd_type, params)
|
||
except ImportError:
|
||
print(f"Command: {cmd_type}, Params: {params}")
|
||
|
||
|
||
# 创建全局实例
|
||
suwood = SUWood()
|
||
|
||
# 导出所有常量到模块级别,便于其他模块使用
|
||
# 场景操作常量
|
||
SUSceneNew = SUWood.SUSceneNew
|
||
SUSceneOpen = SUWood.SUSceneOpen
|
||
SUSceneSave = SUWood.SUSceneSave
|
||
SUScenePrice = SUWood.SUScenePrice
|
||
|
||
# 单元操作常量
|
||
SUUnitPoint = SUWood.SUUnitPoint
|
||
SUUnitFace = SUWood.SUUnitFace
|
||
SUUnitDelete = SUWood.SUUnitDelete
|
||
SUUnitContour = SUWood.SUUnitContour
|
||
|
||
# 区域操作常量
|
||
SUZoneFront = SUWood.SUZoneFront
|
||
SUZoneDiv1 = SUWood.SUZoneDiv1
|
||
SUZoneResize = SUWood.SUZoneResize
|
||
SUZoneCombine = SUWood.SUZoneCombine
|
||
SUZoneReplace = SUWood.SUZoneReplace
|
||
SUZoneMaterial = SUWood.SUZoneMaterial
|
||
SUZoneHandle = SUWood.SUZoneHandle
|
||
SUZoneCloth = SUWood.SUZoneCloth
|
||
SUZoneLight = SUWood.SUZoneLight
|
||
|
||
# 空间位置常量
|
||
VSSpatialPos_F = SUWood.VSSpatialPos_F
|
||
VSSpatialPos_K = SUWood.VSSpatialPos_K
|
||
VSSpatialPos_L = SUWood.VSSpatialPos_L
|
||
VSSpatialPos_R = SUWood.VSSpatialPos_R
|
||
VSSpatialPos_B = SUWood.VSSpatialPos_B
|
||
VSSpatialPos_T = SUWood.VSSpatialPos_T
|
||
|
||
# 单元轮廓常量
|
||
VSUnitCont_Zone = SUWood.VSUnitCont_Zone
|
||
VSUnitCont_Part = SUWood.VSUnitCont_Part
|
||
VSUnitCont_Work = SUWood.VSUnitCont_Work
|
||
|
||
# 版本常量
|
||
V_Dealer = SUWood.V_Dealer
|
||
V_Machining = SUWood.V_Machining
|
||
V_Division = SUWood.V_Division
|
||
V_PartCategory = SUWood.V_PartCategory
|
||
V_Contour = SUWood.V_Contour
|
||
V_Color = SUWood.V_Color
|
||
V_Profile = SUWood.V_Profile
|
||
V_Surf = SUWood.V_Surf
|
||
V_StretchPart = SUWood.V_StretchPart
|
||
V_Material = SUWood.V_Material
|
||
V_Connection = SUWood.V_Connection
|
||
V_HardwareSchema = SUWood.V_HardwareSchema
|
||
V_HardwareSet = SUWood.V_HardwareSet
|
||
V_Hardware = SUWood.V_Hardware
|
||
V_Groove = SUWood.V_Groove
|
||
V_DesignParam = SUWood.V_DesignParam
|
||
V_ProfileSchema = SUWood.V_ProfileSchema
|
||
V_StructPart = SUWood.V_StructPart
|
||
V_CraftPart = SUWood.V_CraftPart
|
||
V_SeriesPart = SUWood.V_SeriesPart
|
||
V_Drawer = SUWood.V_Drawer
|
||
V_DesignTemplate = SUWood.V_DesignTemplate
|
||
V_PriceTemplate = SUWood.V_PriceTemplate
|
||
V_MachineCut = SUWood.V_MachineCut
|
||
V_MachineCNC = SUWood.V_MachineCNC
|
||
V_CorpLabel = SUWood.V_CorpLabel
|
||
V_CorpCAM = SUWood.V_CorpCAM
|
||
V_PackLabel = SUWood.V_PackLabel
|
||
V_Unit = SUWood.V_Unit
|
||
|
||
# 路径常量
|
||
PATH = SUWood.PATH
|
||
|
||
# 导出所有类方法为模块级别函数
|
||
icon_path = SUWood.icon_path
|
||
unit_path = SUWood.unit_path
|
||
suwood_path = SUWood.suwood_path
|
||
suwood_pull_size = SUWood.suwood_pull_size
|
||
scene_save = SUWood.scene_save
|
||
scene_price = SUWood.scene_price
|
||
import_unit = SUWood.import_unit
|
||
import_face = SUWood.import_face
|
||
front_view = SUWood.front_view
|
||
delete_unit = SUWood.delete_unit
|
||
combine_unit = SUWood.combine_unit
|
||
replace_unit = SUWood.replace_unit
|
||
replace_mat = SUWood.replace_mat
|
||
replace_handle = SUWood.replace_handle
|
||
clear_current = SUWood.clear_current
|
||
replace_clothes = SUWood.replace_clothes
|
||
replace_lights = SUWood.replace_lights
|
||
set_cmd = SUWood.set_cmd
|