WuYongJie 5821d73291 初始提交:3D家具安装展示系统
包含:
- furniture-3d-system:Next.js 16 全栈应用(资产中心、产品管理、3D装配动画)
- autocad-plugin:AutoCAD 家具导出插件源码
- 资产中心改造:编辑弹窗化、删除功能、Toast反馈、自定义Select组件

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-02 14:00:19 +08:00

754 lines
20 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>
/// 原点偏移 [X, Y, Z] (mm)
/// 所有坐标已应用此偏移,使模型居中于原点
/// </summary>
public double[]? OriginOffset { get; set; }
/// <summary>
/// 模型边界尺寸 [宽, 高, 深] (mm)
/// </summary>
public double[]? ModelBounds { 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.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>
/// 被排除的孔位(用于兜底/排查模式)
/// </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>
/// 绑定原因说明(调试/回放)
/// </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>
/// 推断的用途(根据直径)
/// </summary>
public string? InferredUsage { get; set; }
/// <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>
/// 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();
}