907 lines
25 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections.Generic;
namespace FurnitureExporter;
/// <summary>
/// 导出数据(JSON 根对象)
/// </summary>
public class ExportData
{
/// <summary>
/// 数据格式版本
/// </summary>
public string Version { get; set; } = "2.4";
/// <summary>
/// 导出时间 (ISO 8601)
/// </summary>
public string ExportedAt { get; set; } = "";
/// <summary>
/// 源文件名
/// </summary>
public string SourceFile { get; set; } = "";
/// <summary>
/// 导出软件
/// </summary>
public string Software { get; set; } = "";
/// <summary>
/// 插件版本
/// </summary>
public string PluginVersion { get; set; } = "";
/// <summary>
/// 板材模型文件名
/// </summary>
public string ModelFile { get; set; } = "";
/// <summary>
/// 板材数量
/// </summary>
public int PanelCount { get; set; }
/// <summary>
/// 图纸单位(毫米/厘米/米等)
/// </summary>
public string Units { get; set; } = "毫米";
/// <summary>
/// CAD 世界坐标系标识。
/// 当前导出统一按 AutoCAD 世界坐标:X 向右,Y 向前,Z 向上。
/// Web 端后续做孔位吸附时,不再需要靠启发式猜测坐标系。
/// </summary>
public string CoordinateSystem { get; set; } = "AUTOCAD_WORLD_Z_UP";
/// <summary>
/// 原点偏移 [X, Y, Z] (mm)
/// 所有坐标已应用此偏移,使模型居中于原点
/// </summary>
public double[]? OriginOffset { get; set; }
/// <summary>
/// 模型包围盒 [minX, minY, minZ, maxX, maxY, maxZ] (mm)
/// 坐标已应用 OriginOffset,与导出的 OBJ 坐标系保持一致。
/// </summary>
public double[]? ModelBounds { get; set; }
/// <summary>
/// 导出模式:
/// - product_bundle:旧整套家具兼容导出
/// - single_asset:资产中心单资产导出
/// </summary>
public string? ExportMode { get; set; }
/// <summary>
/// 资产类型提示(仅 single_asset 模式使用):
/// BOARD / COMPONENT / HARDWARE
/// </summary>
public string? AssetTypeHint { get; set; }
/// <summary>
/// 本次导出的源实体数量(便于排查“选少了/选多了”)
/// </summary>
public int? SourceEntityCount { get; set; }
/// <summary>
/// 板材列表(v2.0 新增)
/// </summary>
public List<PanelInfo> Panels { get; set; } = new();
/// <summary>
/// 孔位列表(v2.0 新增)
/// </summary>
public List<HoleInfo> Holes { get; set; } = new();
/// <summary>
/// 被过滤/排除的孔位列表(兜底用)。
///
/// 说明:
/// - Holes 是“默认展示/默认参与关联”的孔位;
/// - ExcludedHoles 用于排查/兜底模式:当过滤规则误判导致漏孔时,Web 端可让设计师手动复核并启用。
/// - Reason 必须为中文,便于非技术用户理解。
/// </summary>
public List<ExcludedHoleInfo>? ExcludedHoles { get; set; }
/// <summary>
/// 逻辑孔位分组(v2.2.4 新增)
/// 典型用法:偏心件孔(大孔+侧孔)在几何上是两个圆柱孔,但业务上希望计为 1 个“孔位”。
/// </summary>
public List<HoleGroupInfo> HoleGroups { get; set; } = new();
/// <summary>
/// 安装图样(v2.5 新增)
/// 说明:
/// - 吸附面先缩小范围;
/// - HoleGroup 负责把几何孔组织成业务孔位;
/// - MountPattern 负责定义“至少命中几个孔才允许吸附成立”。
/// </summary>
public List<MountPatternInfo> MountPatterns { get; set; } = new();
/// <summary>
/// 逻辑孔位数量(v2.2.4 新增)
/// 计算方式:以 HoleGroupId 合并计数(HoleGroupId 为空则按 Hole.Id 计数)。
/// </summary>
public int? LogicalHoleCount { get; set; }
/// <summary>
/// 边缘特征列表(倒角/圆角)(v2.1 新增)
/// </summary>
public List<EdgeFeatureInfo> EdgeFeatures { get; set; } = new();
/// <summary>
/// 五金件类型列表
/// </summary>
public List<HardwareType> HardwareTypes { get; set; } = new();
/// <summary>
/// 图层信息映射(v2.2 新增)
/// key: 图层名称, value: 图层分类信息
/// </summary>
public Dictionary<string, LayerInfo> Layers { get; set; } = new();
/// <summary>
/// 五金件按图层分类汇总(v2.2 新增)
/// </summary>
public List<HardwareLayerSummary> HardwareSummary { get; set; } = new();
/// <summary>
/// 装配语义导出层(v2.4 草稿)
/// 说明:
/// - 仅导出“板件如何与其他板件/五金发生装配关系”的语义线索;
/// - 不包含最终安装顺序,安装顺序仍由 Web 端人工设定。
/// </summary>
public AssemblyData? Assembly { get; set; }
}
/// <summary>
/// 装配语义导出层
/// </summary>
public class AssemblyData
{
/// <summary>
/// 装配语义格式版本
/// </summary>
public string Version { get; set; } = "1.0";
/// <summary>
/// 每块板件的装配语义
/// </summary>
public List<PanelAssemblyInfo> PanelAssemblies { get; set; } = new();
/// <summary>
/// 板件之间的连接关系
/// </summary>
public List<AssemblyConnectionInfo> Connections { get; set; } = new();
}
/// <summary>
/// 单块板件的装配语义
/// </summary>
public class PanelAssemblyInfo
{
public string PanelId { get; set; } = "";
/// <summary>
/// 装配模式:slide_in / drop_in / rotate_into_place / unknown
/// </summary>
public string MountMode { get; set; } = "unknown";
/// <summary>
/// 主装配轴(单位向量,表示从最终位往外拉开的方向)
/// </summary>
public double[] AssemblyAxis { get; set; } = new double[3];
/// <summary>
/// 离散装配方向:left / right / front / back / top / bottom / unknown
/// </summary>
public string AssemblyDirection { get; set; } = "unknown";
/// <summary>
/// 进入装配前建议预偏移向量(mm)
/// </summary>
public double[]? PreAssembleOffset { get; set; }
/// <summary>
/// 建议装配移动距离(mm)
/// </summary>
public double TravelDistance { get; set; }
/// <summary>
/// 依赖的支撑/目标板件 ID
/// </summary>
public List<string> DependsOn { get; set; } = new();
/// <summary>
/// 主要支撑板件 ID
/// </summary>
public string? PrimarySupportPanelId { get; set; }
/// <summary>
/// 目标板件 ID 列表
/// </summary>
public List<string> TargetPanelIds { get; set; } = new();
/// <summary>
/// 板件级配合面映射(left/right/front/back/top/bottom)
/// </summary>
public PanelAssemblyMateMap Mates { get; set; } = new();
/// <summary>
/// 语义置信度(0-1)
/// </summary>
public double Confidence { get; set; }
/// <summary>
/// 风险/歧义提示
/// </summary>
public List<string> Warnings { get; set; } = new();
/// <summary>
/// 是否为自动推导结果
/// </summary>
public bool AutoGenerated { get; set; } = true;
}
/// <summary>
/// 板件之间的连接关系
/// </summary>
public class AssemblyConnectionInfo
{
public string SourcePanelId { get; set; } = "";
public string TargetPanelId { get; set; } = "";
/// <summary>
/// 连接类型:hole_group_hardware / hole_hardware / panel_hardware / adjacent_face / panel_type_fallback
/// </summary>
public string ConnectionType { get; set; } = "adjacent_face";
public string SelfFace { get; set; } = "unknown";
public string TargetFace { get; set; } = "unknown";
public double Confidence { get; set; }
}
/// <summary>
/// 板件级配合面映射
/// </summary>
public class PanelAssemblyMateMap
{
public List<string>? Left { get; set; }
public List<string>? Right { get; set; }
public List<string>? Front { get; set; }
public List<string>? Back { get; set; }
public List<string>? Top { get; set; }
public List<string>? Bottom { get; set; }
}
/// <summary>
/// 板材信息(v2.0 新增)
/// </summary>
public class PanelInfo
{
/// <summary>
/// 板材 ID(自动生成,如 panel_001)
/// </summary>
public string Id { get; set; } = "";
/// <summary>
/// 源实体句柄
/// </summary>
public string SourceHandle { get; set; } = "";
/// <summary>
/// 源图层名
/// </summary>
public string? SourceLayer { get; set; }
/// <summary>
/// 推断的板件类型(v2.2 新增)
/// </summary>
public string? PanelType { get; set; }
/// <summary>
/// 中心位置 [X, Y, Z] (mm)
/// </summary>
public double[] Position { get; set; } = new double[3];
/// <summary>
/// 尺寸 [长, 宽, 厚] (mm),已排序
/// </summary>
public double[] Size { get; set; } = new double[3];
/// <summary>
/// 板材法向量(厚度方向)[X, Y, Z]
/// </summary>
public double[] Normal { get; set; } = new double[3];
/// <summary>
/// 边界框
/// </summary>
public BoundingBox3D? BoundingBox { get; set; }
/// <summary>
/// 该板材上的孔位列表
/// </summary>
public List<HoleInfo> Holes { get; set; } = new();
/// <summary>
/// 该板件上的逻辑孔位分组(v2.2.4 新增)
/// </summary>
public List<HoleGroupInfo> HoleGroups { get; set; } = new();
/// <summary>
/// 该板件上的安装图样(v2.5 新增)
/// </summary>
public List<MountPatternInfo> MountPatterns { get; set; } = new();
}
/// <summary>
/// 被排除的孔位(用于兜底/排查模式)
/// </summary>
public class ExcludedHoleInfo
{
/// <summary>
/// 孔位数据(与 Holes 相同结构)
/// </summary>
public HoleInfo Hole { get; set; } = new();
/// <summary>
/// 排除原因(中文)
/// </summary>
public string Reason { get; set; } = "";
}
/// <summary>
/// 孔位信息(v2.0 新增)
/// </summary>
public class HoleInfo
{
/// <summary>
/// 孔位 ID(如 panel_001_hole_001)
/// </summary>
public string Id { get; set; } = "";
/// <summary>
/// 孔中心位置 [X, Y, Z] (mm)
/// </summary>
public double[] Position { get; set; } = new double[3];
/// <summary>
/// 孔方向(法向量)[X, Y, Z]
/// </summary>
public double[] Normal { get; set; } = new double[3];
/// <summary>
/// 孔直径 (mm)
/// </summary>
public double Diameter { get; set; }
/// <summary>
/// 孔半径 (mm)
/// </summary>
public double Radius { get; set; }
/// <summary>
/// 孔深度 (mm)
/// </summary>
public double Depth { get; set; }
/// <summary>
/// 所属板材 ID
/// </summary>
public string PanelId { get; set; } = "";
/// <summary>
/// 孔位检测来源:
/// - brep:来自板件实体 Brep 真孔
/// - marker:来自图纸标注/块/点位兜底识别
/// </summary>
public string DetectionSource { get; set; } = "brep";
/// <summary>
/// 孔位与板件的绑定来源:
/// - panel_brep:在当前板件实体内直接提取
/// - marker_face:标注孔贴面匹配到板件
/// - marker_box:标注孔按包围盒退化匹配到板件
/// </summary>
public string BindingSource { get; set; } = "panel_brep";
/// <summary>
/// 孔位与板件绑定的置信度(0-1)
/// </summary>
public double BindingConfidence { get; set; } = 1.0;
/// <summary>
/// 孔位整体可用置信度(0-1)
/// 说明:
/// - BindingConfidence 只表示“孔位和板件绑定得稳不稳”;
/// - Confidence 表示“这个孔位几何与语义整体是否可信”。
/// </summary>
public double Confidence { get; set; } = 1.0;
/// <summary>
/// 绑定原因说明(调试/回放)
/// </summary>
public string? BindingReason { get; set; }
/// <summary>
/// 孔类型:"through"(通孔)| "blind"(盲孔)
/// </summary>
public string Type { get; set; } = "blind";
/// <summary>
/// 逻辑孔位分组 ID(v2.2.4 新增)
/// 偏心件等复合孔会被分到同一个 HoleGroupId,便于“按孔位”计数与展示。
/// </summary>
public string? HoleGroupId { get; set; }
/// <summary>
/// 逻辑孔位分组类型(v2.2.4 新增)
/// 例如:eccentric_screw
/// </summary>
public string? HoleGroupType { get; set; }
/// <summary>
/// 当前孔在分组中的角色(v2.2.4 新增)
/// 例如:main(主孔)/ side(侧孔)
/// </summary>
public string? HoleGroupRole { get; set; }
/// <summary>
/// 当前孔实际打在板件外表面的面标签。
/// 盲孔通常只有 1 个面;通孔通常会有 2 个相对面。
/// 例如:top / bottom / left / right / front / back
/// </summary>
public string[] SurfaceFaces { get; set; } = System.Array.Empty<string>();
/// <summary>
/// 推断的用途(根据直径)
/// </summary>
public string? InferredUsage { get; set; }
/// <summary>
/// 低置信度或歧义提示
/// </summary>
public List<string> Warnings { get; set; } = new();
/// <summary>
/// 针对该孔位的紧固件建议(v2.3 新增)
/// 说明:
/// - 这是“插件端基于几何特征的候选建议”,不是最终装配 BOM。
/// - 常见场景:通过孔径/深度/通孔或盲孔特征,把孔映射到更可能的螺丝直径(例如 4.8mm 的盲孔导孔通常更像 M6)。
/// - Web 端可以直接展示 Top1/Top2,并在低置信度时引导人工复核(不要求设计师额外操作)。
/// </summary>
public List<FastenerSuggestion>? SuggestedFasteners { get; set; }
}
/// <summary>
/// 紧固件建议(v2.3 新增)
/// </summary>
public class FastenerSuggestion
{
/// <summary>
/// 建议类别:screw(螺丝)/ connector(连接件)等
/// 当前版本主要用于 screw
/// </summary>
public string Category { get; set; } = "screw";
/// <summary>
/// 公称直径(mm),例如 6 表示 M6
/// </summary>
public double NominalDiameter { get; set; }
/// <summary>
/// 常见规格示例(来自五金标准库的“常用项”,用于 UI 展示/人工复核)
/// 注意:孔的几何通常无法唯一推断螺丝长度,所以这里给的是候选样例。
/// </summary>
public List<string>? CommonSpecs { get; set; }
/// <summary>
/// 置信度(0-1),用于排序与低置信度提示
/// </summary>
public double Confidence { get; set; }
/// <summary>
/// 可读原因(给调试/回放用)
/// </summary>
public string? Reason { get; set; }
}
/// <summary>
/// 逻辑孔位分组(v2.2.4 新增)
/// </summary>
public class HoleGroupInfo
{
/// <summary>
/// 分组 ID(如 panel_001_group_001)
/// </summary>
public string Id { get; set; } = "";
/// <summary>
/// 所属板件 ID
/// </summary>
public string PanelId { get; set; } = "";
/// <summary>
/// 分组类型:eccentric_screw / unknown 等
/// </summary>
public string GroupType { get; set; } = "unknown";
/// <summary>
/// 该逻辑孔位包含的几何孔 ID 列表
/// </summary>
public string[] HoleIds { get; set; } = System.Array.Empty<string>();
/// <summary>
/// 逻辑孔位参考点(默认取主孔中心)[X, Y, Z] (mm)
/// </summary>
public double[] Position { get; set; } = new double[3];
/// <summary>
/// 逻辑孔位参考方向(默认取主孔法向)[X, Y, Z]
/// </summary>
public double[] Normal { get; set; } = new double[3];
/// <summary>
/// 置信度(0-1),用于调试与后续 Web 端提示
/// </summary>
public double Confidence { get; set; }
/// <summary>
/// 可读原因(调试/回放)
/// </summary>
public string? Reason { get; set; }
/// <summary>
/// 当前孔组默认作用的安装面。
/// 例如:top / bottom / left / right / front / back / unknown
/// </summary>
public string MountFace { get; set; } = "unknown";
/// <summary>
/// 逻辑孔位实际落在哪些板件外表面上。
/// 默认按主孔 + 组内成员孔合并去重。
/// </summary>
public string[] SurfaceFaces { get; set; } = System.Array.Empty<string>();
/// <summary>
/// 低置信度或歧义提示
/// </summary>
public List<string> Warnings { get; set; } = new();
}
/// <summary>
/// 安装图样(v2.5 新增)
/// </summary>
public class MountPatternInfo
{
/// <summary>
/// 图样 ID(如 panel_001_mount_top_001)
/// </summary>
public string Id { get; set; } = "";
/// <summary>
/// 所属板件 ID
/// </summary>
public string PanelId { get; set; } = "";
/// <summary>
/// 默认安装面:top / bottom / left / right / front / back / unknown
/// </summary>
public string MountFace { get; set; } = "unknown";
/// <summary>
/// 图样类型:single / line_2 / triangle_3 / rectangle_4 / generic
/// </summary>
public string PatternType { get; set; } = "generic";
/// <summary>
/// 属于该图样的几何孔位 ID
/// </summary>
public string[] HoleIds { get; set; } = System.Array.Empty<string>();
/// <summary>
/// 必需命中的孔位 ID
/// </summary>
public string[] RequiredHoleIds { get; set; } = System.Array.Empty<string>();
/// <summary>
/// 可选命中的孔位 ID
/// </summary>
public string[] OptionalHoleIds { get; set; } = System.Array.Empty<string>();
/// <summary>
/// 吸附成立所需的最少命中孔数
/// </summary>
public int MinRequiredHoles { get; set; }
/// <summary>
/// 推荐命中孔数(越接近越稳)
/// </summary>
public int PreferredHoleCount { get; set; }
/// <summary>
/// 是否允许对称复用
/// </summary>
public bool Symmetry { get; set; }
/// <summary>
/// 图样参考点(默认取图样中心)
/// </summary>
public double[] Position { get; set; } = new double[3];
/// <summary>
/// 图样参考法向(默认取安装面法向)
/// </summary>
public double[] Normal { get; set; } = new double[3];
/// <summary>
/// 图样置信度(0-1)
/// </summary>
public double Confidence { get; set; }
/// <summary>
/// 低置信度或歧义提示
/// </summary>
public List<string> Warnings { get; set; } = new();
}
/// <summary>
/// 3D 边界框
/// </summary>
public class BoundingBox3D
{
/// <summary>
/// 最小点 [X, Y, Z]
/// </summary>
public double[] Min { get; set; } = new double[3];
/// <summary>
/// 最大点 [X, Y, Z]
/// </summary>
public double[] Max { get; set; } = new double[3];
}
/// <summary>
/// 五金件类型(按几何特征分组)
/// </summary>
public class HardwareType
{
/// <summary>
/// 类型 ID (导出时生成,如 type_001)
/// </summary>
public string TypeId { get; set; } = "";
/// <summary>
/// 几何特征(用于匹配五金件库)
/// </summary>
public GeometrySignature Signature { get; set; } = new();
/// <summary>
/// 此类型的所有实例(安装位置)
/// </summary>
public List<HardwareInstance> Instances { get; set; } = new();
/// <summary>
/// 匹配到的五金件库 ID(服务端填充)
/// </summary>
public string? MatchedHardwareId { get; set; }
/// <summary>
/// 主要来源图层名(v2.2 新增)
/// </summary>
public string? PrimaryLayerName { get; set; }
/// <summary>
/// 根据图层名推断的五金件类型(v2.2 新增)
/// </summary>
public string? InferredHardwareType { get; set; }
}
/// <summary>
/// 几何特征签名(用于五金件匹配)
/// </summary>
public class GeometrySignature
{
/// <summary>
/// 边界框宽度 (mm) - 最大尺寸
/// </summary>
public double Width { get; set; }
/// <summary>
/// 边界框高度 (mm) - 中间尺寸
/// </summary>
public double Height { get; set; }
/// <summary>
/// 边界框深度 (mm) - 最小尺寸
/// </summary>
public double Depth { get; set; }
/// <summary>
/// 体积 (mm³),0 表示未知
/// </summary>
public double Volume { get; set; }
/// <summary>
/// 图块名(如果是图块引用)
/// </summary>
public string? BlockName { get; set; }
}
/// <summary>
/// 五金件实例(单个安装位置)
/// </summary>
public class HardwareInstance
{
/// <summary>
/// 安装位置 (mm)
/// </summary>
public Position3D Position { get; set; } = new();
/// <summary>
/// 旋转角度 (弧度)
/// </summary>
public Rotation3D Rotation { get; set; } = new();
/// <summary>
/// 缩放比例
/// </summary>
public Scale3D? Scale { get; set; }
/// <summary>
/// 源图层名
/// </summary>
public string? SourceLayer { get; set; }
/// <summary>
/// 源实体句柄
/// </summary>
public string? SourceHandle { get; set; }
/// <summary>
/// 源图块名(如果是图块)
/// </summary>
public string? SourceBlockName { get; set; }
// ========== v2.0 新增:关联信息 ==========
/// <summary>
/// 最近的孔位 ID(CAD 层面的初步判断)
/// </summary>
public string? NearestHoleId { get; set; }
/// <summary>
/// 主绑定板件 ID(优先由孔位/孔组反推)
/// </summary>
public string? PrimaryPanelId { get; set; }
/// <summary>
/// 次绑定板件 ID(常见于连接两块板件的五金)
/// </summary>
public string? SecondaryPanelId { get; set; }
/// <summary>
/// 主绑定逻辑孔组 ID(如偏心件孔组、合页孔组)
/// </summary>
public string? BoundHoleGroupId { get; set; }
/// <summary>
/// 当前五金件绑定到的孔位 ID 列表
/// </summary>
public string[]? BoundHoleIds { get; set; }
/// <summary>
/// 绑定模式:
/// - hole_group:按逻辑孔组绑定
/// - hole:按单孔绑定
/// - panel_bbox:按板件包围盒绑定
/// - panel_center:按板件中心邻近绑定
/// - none:未绑定
/// </summary>
public string? BindingMode { get; set; }
/// <summary>
/// 五金件绑定置信度(0-1)
/// </summary>
public double? BindingConfidence { get; set; }
/// <summary>
/// 绑定原因说明(调试/回放)
/// </summary>
public string? BindingReason { get; set; }
/// <summary>
/// 附近的板材 ID 列表
/// </summary>
public string[]? NearbyPanelIds { get; set; }
/// <summary>
/// 与最近孔位的距离 (mm)
/// </summary>
public double? DistanceToNearestHole { get; set; }
}
/// <summary>
/// 3D 位置
/// </summary>
public class Position3D
{
public double X { get; set; }
public double Y { get; set; }
public double Z { get; set; }
}
/// <summary>
/// 3D 旋转
/// </summary>
public class Rotation3D
{
public double X { get; set; }
public double Y { get; set; }
public double Z { get; set; }
}
/// <summary>
/// 3D 缩放
/// </summary>
public class Scale3D
{
public double X { get; set; } = 1;
public double Y { get; set; } = 1;
public double Z { get; set; } = 1;
}
/// <summary>
/// 图层信息(v2.2 新增)
/// </summary>
public class LayerInfo
{
/// <summary>
/// 图层名称
/// </summary>
public string Name { get; set; } = "";
/// <summary>
/// 图层分类:panel(板件)| hardware(五金件)| other(其他)
/// </summary>
public string Category { get; set; } = "other";
/// <summary>
/// 推断的五金件类型(如:hinge, screw, connector 等)
/// </summary>
public string? HardwareType { get; set; }
/// <summary>
/// 该图层上的实体数量
/// </summary>
public int EntityCount { get; set; }
}
/// <summary>
/// 五金件按图层汇总(v2.2 新增)
/// </summary>
public class HardwareLayerSummary
{
/// <summary>
/// 图层名称
/// </summary>
public string LayerName { get; set; } = "";
/// <summary>
/// 推断的五金件类型
/// </summary>
public string HardwareType { get; set; } = "unknown";
/// <summary>
/// 数量
/// </summary>
public int Count { get; set; }
/// <summary>
/// 该类型的所有实例 ID
/// </summary>
public List<string> InstanceIds { get; set; } = new();
}