mirror of
https://github.com/deepmodeling/Uni-Lab-OS
synced 2026-04-01 13:53:11 +00:00
- TipInfo 新增 tip_above_rack_length 可选字段 - 编辑器支持 tip_above 与 dz 互算,更新中文标签 - 侧视图绘制枪头露出部分并标注,俯视图/侧视图增加 dx/dy/dz 标注 - 预览增加回中按钮,详情页展示新字段 - 导入时自动计算 tip_above_rack_length - 批量更新 PRCXI 枪头物理尺寸及 registry YAML Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
127 lines
3.2 KiB
Python
127 lines
3.2 KiB
Python
"""Pydantic 数据模型,描述所有 PRCXI 耗材类型的 JSON 结构。"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import uuid as _uuid
|
|
from typing import Any, Dict, List, Literal, Optional
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class MaterialInfo(BaseModel):
|
|
uuid: str = ""
|
|
Code: str = ""
|
|
Name: str = ""
|
|
materialEnum: Optional[int] = None
|
|
SupplyType: Optional[int] = None
|
|
|
|
|
|
class GridInfo(BaseModel):
|
|
"""孔位网格排列参数"""
|
|
num_items_x: int = 12
|
|
num_items_y: int = 8
|
|
dx: float = 0.0
|
|
dy: float = 0.0
|
|
dz: float = 0.0
|
|
item_dx: float = 9.0
|
|
item_dy: float = 9.0
|
|
|
|
|
|
class WellInfo(BaseModel):
|
|
"""孔参数 (Plate)"""
|
|
size_x: float = 8.0
|
|
size_y: float = 8.0
|
|
size_z: float = 10.0
|
|
max_volume: Optional[float] = None
|
|
bottom_type: str = "FLAT" # V / U / FLAT
|
|
cross_section_type: str = "CIRCLE" # CIRCLE / RECTANGLE
|
|
material_z_thickness: Optional[float] = None
|
|
|
|
|
|
class VolumeFunctions(BaseModel):
|
|
"""体积-高度计算函数参数 (矩形 well)"""
|
|
type: str = "rectangle"
|
|
well_length: float = 0.0
|
|
well_width: float = 0.0
|
|
|
|
|
|
class TipInfo(BaseModel):
|
|
"""枪头参数 (TipRack)"""
|
|
spot_size_x: float = 7.0
|
|
spot_size_y: float = 7.0
|
|
spot_size_z: float = 0.0
|
|
tip_volume: float = 300.0
|
|
tip_length: float = 60.0
|
|
tip_fitting_depth: float = 51.0
|
|
tip_above_rack_length: Optional[float] = None
|
|
has_filter: bool = False
|
|
|
|
|
|
class TubeInfo(BaseModel):
|
|
"""管参数 (TubeRack)"""
|
|
size_x: float = 10.6
|
|
size_y: float = 10.6
|
|
size_z: float = 40.0
|
|
max_volume: float = 1500.0
|
|
|
|
|
|
class AdapterInfo(BaseModel):
|
|
"""适配器参数 (PlateAdapter)"""
|
|
adapter_hole_size_x: float = 127.76
|
|
adapter_hole_size_y: float = 85.48
|
|
adapter_hole_size_z: float = 10.0
|
|
dx: Optional[float] = None
|
|
dy: Optional[float] = None
|
|
dz: float = 0.0
|
|
|
|
|
|
LabwareType = Literal["plate", "tip_rack", "trash", "tube_rack", "plate_adapter"]
|
|
|
|
|
|
class LabwareItem(BaseModel):
|
|
"""一个耗材条目的完整 JSON 表示"""
|
|
|
|
id: str = Field(default_factory=lambda: _uuid.uuid4().hex[:8])
|
|
type: LabwareType = "plate"
|
|
function_name: str = ""
|
|
docstring: str = ""
|
|
|
|
# 物理尺寸
|
|
size_x: float = 127.0
|
|
size_y: float = 85.0
|
|
size_z: float = 20.0
|
|
model: Optional[str] = None
|
|
category: Optional[str] = None
|
|
plate_type: Optional[str] = None # non-skirted / semi-skirted / skirted
|
|
|
|
# 材料信息
|
|
material_info: MaterialInfo = Field(default_factory=MaterialInfo)
|
|
|
|
# Registry 字段
|
|
registry_category: List[str] = Field(default_factory=lambda: ["prcxi", "plates"])
|
|
registry_description: str = ""
|
|
|
|
# Plate 特有
|
|
grid: Optional[GridInfo] = None
|
|
well: Optional[WellInfo] = None
|
|
volume_functions: Optional[VolumeFunctions] = None
|
|
|
|
# TipRack 特有
|
|
tip: Optional[TipInfo] = None
|
|
|
|
# TubeRack 特有
|
|
tube: Optional[TubeInfo] = None
|
|
|
|
# PlateAdapter 特有
|
|
adapter: Optional[AdapterInfo] = None
|
|
|
|
# 模板匹配
|
|
include_in_template_matching: bool = False
|
|
template_kind: Optional[str] = None
|
|
|
|
|
|
class LabwareDB(BaseModel):
|
|
"""整个 labware_db.json 的结构"""
|
|
version: str = "1.0"
|
|
items: List[LabwareItem] = Field(default_factory=list)
|