diff --git a/src/components/pages/ReportLogViewer.vue b/src/components/pages/ReportLogViewer.vue index f1615d6..c39ac5a 100644 --- a/src/components/pages/ReportLogViewer.vue +++ b/src/components/pages/ReportLogViewer.vue @@ -58,58 +58,140 @@ -
- -
-
- 分析模型数 - {{ currentReport.resultMetrics.modelCount }} -
-
- 识别特征总数 - {{ currentReport.resultMetrics.featureCount }} -
-
- 处理部件数 - {{ currentReport.resultMetrics.processedCount }} -
-
+ + +
+ +
+
+ 分析模型数 + {{ currentReport.resultMetrics.modelCount }} +
+
+ 识别特征总数 + {{ currentReport.resultMetrics.featureCount }} +
+
+ 处理部件数 + {{ currentReport.resultMetrics.processedCount }} +
+
- -
-

特征结果详情

- - - - - - - - - - - - -
+ +
+

特征结果详情

+ + + + + + + + + + + + +
- -
-

异常日志

-
- {{ currentReport.errorInfo }} -
-
-
+ +
+

异常日志

+
+ {{ currentReport.errorInfo }} +
+
+
+ + + +
+
+ + 自动读取 (当前任务记录) + 手动选择比对文件 + +
+ + +
+
+ 当前报告未包含比对数据 +
+
+
+ {{ currentReport.comparisonData.sourceFormat }} + + {{ currentReport.comparisonData.targetFormat }} +
+ +
+
+
文件体积减小
+
{{ currentReport.comparisonData.sizeReduction }}
+
+
+
多边形面片缩减
+
{{ currentReport.comparisonData.polygonReduction }}
+
+
+ +
+
+

基准原始模型

+
    +
  • + {{ key }} + {{ val }} +
  • +
+
+
VS
+
+

轻量化结果模型

+
    +
  • + {{ key }} + {{ val }} +
  • +
+
+
+
+
+ + +
+
+
+ +

请选择基准源文件 (.asm, .rvt...)

+ 选择基准文件 +
+
VS
+
+ +

请选择轻量化目标 (.prt, .ifc...)

+ 选择目标文件 +
+
+
+ 开始比对分析 +
+
+
+
+
@@ -126,6 +208,8 @@ import { ref, computed } from 'vue' import { ElMessage } from 'element-plus' const searchQuery = ref('') +const activeTab = ref('overview') +const comparisonMode = ref('auto') // 模拟报告数据 const mockReports = [ @@ -142,6 +226,26 @@ const mockReports = [ { featureName: 'FILLET_002', featureType: '倒角', recommendedAction: '建议保留', recommendedSteps: ['标记为特征', '跳过删除向导'] }, { featureName: 'POCKET_003', featureType: '凹槽', recommendedAction: '用户确认', recommendedSteps: ['提示用户审查该凸台'] } ], + comparisonData: { + sourceFormat: 'ASM (Creo)', + targetFormat: 'Shrinkwrap PRT', + sizeReduction: '76.5%', + polygonReduction: '45.2%', + sourceProps: { + '文件大小': '125.4 MB', + '多边形体积': '1,245,600 面片', + '特征/部件总数': '4,520 个', + '装配体层级': '12 层级', + '外包络体积': '15.42 m³' + }, + targetProps: { + '文件大小': '29.5 MB', + '多边形体积': '682,100 面片', + '特征/部件总数': '342 个 (不可见件全清除)', + '装配体层级': '单层 (已重组成一个实体)', + '外包络体积': '15.41 m³ (误差 <0.1%)' + } + }, errorInfo: null }, { @@ -354,8 +458,6 @@ const exportSelectedReport = () => { .detail-body { padding: var(--spacing-lg); - overflow-y: auto; - flex: 1; display: flex; flex-direction: column; gap: var(--spacing-xl); @@ -444,4 +546,207 @@ const exportSelectedReport = () => { --el-table-text-color: var(--color-text-primary); --el-table-header-text-color: var(--color-text-primary); } + +/* 对比视图样式 */ +.report-tabs { + flex: 1; + display: flex; + flex-direction: column; + overflow: hidden; +} + +:deep(.el-tabs__content) { + flex: 1; + overflow-y: auto; + padding: 0; +} + +:deep(.el-tabs__header) { + margin-bottom: 0; + padding: 0 var(--spacing-lg); + background: var(--color-bg-primary); + border-bottom: 1px solid var(--color-border-primary); +} + +.comparison-view { + padding: var(--spacing-lg); + display: flex; + flex-direction: column; + gap: var(--spacing-xl); +} + +.comparison-mode-switch { + display: flex; + justify-content: center; + margin-bottom: var(--spacing-md); +} + +.result-badges { + display: flex; + align-items: center; + justify-content: center; + gap: var(--spacing-md); + margin-bottom: var(--spacing-lg); + font-size: var(--font-size-lg); +} + +.badge-arrow { + color: var(--color-text-secondary); +} + +.compress-rates { + display: flex; + gap: var(--spacing-lg); + margin-bottom: var(--spacing-xl); +} + +.rate-card { + flex: 1; + background: var(--color-white-rgb-05); + border-radius: var(--size-border-radius); + padding: var(--spacing-lg); + text-align: center; + border: 1px solid var(--color-border-primary); +} + +.rate-title { + color: var(--color-text-secondary); + font-size: var(--font-size-sm); + margin-bottom: var(--spacing-sm); +} + +.rate-value { + font-size: 32px; + font-weight: bold; +} + +.comparison-columns { + display: flex; + gap: var(--spacing-lg); + align-items: stretch; +} + +.comp-col { + flex: 1; + background: var(--color-bg-primary); + border: 1px dashed var(--color-border-primary); + border-radius: var(--size-border-radius); + padding: var(--spacing-lg); +} + +.comp-col h4 { + margin: 0 0 var(--spacing-lg) 0; + display: flex; + align-items: center; + gap: var(--spacing-sm); + color: var(--color-text-primary); + border-bottom: 1px solid var(--color-border-primary); + padding-bottom: var(--spacing-sm); +} + +.vs-divider { + display: flex; + align-items: center; + justify-content: center; + font-weight: bold; + font-size: 24px; + color: var(--color-text-tertiary); + padding: 0 var(--spacing-md); +} + +.prop-list { + list-style: none; + padding: 0; + margin: 0; +} + +.prop-list li { + display: flex; + justify-content: space-between; + padding: var(--spacing-sm) 0; + border-bottom: 1px solid var(--color-white-rgb-05); +} + +.prop-list li:last-child { + border-bottom: none; +} + +.prop-label { + color: var(--color-text-secondary); +} + +.prop-value { + font-weight: 500; + text-align: right; +} + +.empty-data { + text-align: center; + padding: 40px; + color: var(--color-text-tertiary); + font-size: var(--font-size-lg); + display: flex; + flex-direction: column; + gap: 16px; + align-items: center; +} + +.empty-data i { + font-size: 48px; +} + +.upload-panels { + display: flex; + gap: var(--spacing-xl); + align-items: center; + margin-bottom: var(--spacing-xl); +} + +.upload-box { + flex: 1; + height: 200px; + border: 2px dashed var(--color-border-primary); + border-radius: var(--size-border-radius-lg); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: var(--spacing-md); + color: var(--color-text-secondary); + transition: all 0.3s; + cursor: pointer; + background: var(--color-bg-primary); +} + +.upload-box:hover { + border-color: var(--color-primary); + background: rgba(var(--color-primary-rgb), 0.05); +} + +.upload-box.target:hover { + border-color: var(--color-success); + background: rgba(var(--color-success-rgb), 0.05); +} + +.upload-box i { + font-size: 48px; + color: var(--color-text-tertiary); +} + +.upload-box:hover i { + color: var(--color-primary); +} +.upload-box.target:hover i { + color: var(--color-success); +} + +.vs-icon { + font-size: 32px; + font-weight: bold; + color: var(--color-text-tertiary); +} + +.manual-actions { + text-align: center; +} diff --git a/src/components/pages/UniversalConverter.vue b/src/components/pages/UniversalConverter.vue index e853962..67ae103 100644 --- a/src/components/pages/UniversalConverter.vue +++ b/src/components/pages/UniversalConverter.vue @@ -7,19 +7,41 @@

格式转换

-

将STP文件转换为GLTF格式,用于Web展示

+

将STP文件转换为GLTF格式,用于Web展示

+

将IFC建筑信息模型转换为STP通用三维格式

+
+
+ + STP 转 GLTF +
+
+ + IFC 转 STP +
+
+
-

1. 选择STP文件

-

选择要转换的STEP格式文件

+

1. 选择STP文件

+

1. 选择IFC文件

+

选择要转换的STEP格式文件

+

选择要转换的IFC格式文件

@@ -29,7 +51,8 @@

2. 转换处理

-

自动处理几何数据和材质

+

自动处理几何数据和材质

+

解析BIM数据并重建BREP几何

@@ -38,18 +61,22 @@
-

3. 下载GLTF

-

获取Web优化的3D模型文件

+

3. 下载GLTF

+

3. 下载STP

+

获取Web优化的3D模型文件

+

获取通用的STEP实体模型文件

-
+
-

拖拽STP文件到此处

+

拖拽STP文件到此处

+

拖拽IFC文件到此处

或点击选择文件

- + +