feat: 实现Revit查看当前模型功能并完善数据显示

- 扩展RevitApi服务,添加getCurrentModel方法调用/api/overview端点
- 重构RevitModelViewer组件支持真实API数据,替换硬编码模拟数据
- 修复CadSidebar中Revit模型加载逻辑,集成真实API调用
- 完善DashboardView中RevitModelViewer的props传递
- 修正RevitAnalysisDashboard的数据结构判断逻辑
- 统一API数据流:CadSidebar → DashboardView → RevitModelViewer
- 保持与Creo实现的架构一致性,支持自动通知和日志记录

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
sladro 2025-09-18 18:08:48 +08:00
parent 69d21cc752
commit 507bc96dcd
5 changed files with 90 additions and 60 deletions

View File

@ -153,19 +153,11 @@ const handleOpenModel = async () => {
emit('show-model-viewer', result.data)
}
} else if (connectedCAD.id === 'revit') {
// Revit
const mockRevitData = {
fileName: 'Revit测试模型.rvt',
sourceSoftware: 'Autodesk Revit 2024',
openTime: new Date().toISOString(),
connectionStatus: '已连接',
partCount: 150,
assemblyLevel: 3,
basicStats: {
fileSize: '45.6 MB'
}
const result = await revitApi.getCurrentModel()
if (result.success) {
cadStore.currentProjectName = result.data.data.project.name
emit('show-model-viewer', result.data.data)
}
emit('show-model-viewer', { data: mockRevitData })
} else if (connectedCAD.id === 'pdms') {
// PDMS
emit('show-model-viewer', {

View File

@ -149,55 +149,78 @@
</template>
<script setup>
import { computed } from 'vue'
import { ElNotification } from 'element-plus'
// Revit
const projectData = {
ProjectName: 'COMMERCIAL_BUILDING_2024',
FilePath: 'C:/BIM_Projects/Commercial_Building_2024.rvt',
RevitVersion: 'Autodesk Revit 2024',
FileSizeDisplay: '87.5 MB',
IsCentralFile: true,
IsLoaded: true
}
const modelStats = {
TotalElements: 8945,
Levels: 12,
Views3D: 8,
LinkedFiles: 6,
FloorPlans: 15,
Elevations: 8,
Sections: 12,
Sheets: 24,
ActiveViews: ['Level 1 Floor Plan', '3D View - Building', 'South Elevation', 'Longitudinal Section'],
ElementCounts: {
'Walls': 2847,
'Doors': 486,
'Windows': 672,
'Floors': 234,
'Ceilings': 189,
'Columns': 145,
'Beams': 398,
'Rooms': 267,
'Stairs': 24,
'Railings': 156
// propsAPI
const props = defineProps({
modelData: {
type: Object,
required: true
}
}
})
const linkData = {
RevitLinks: {
Total: 4,
Loaded: 3,
Unloaded: 1
},
CadLinks: {
Total: 2,
Loaded: 2,
Unloaded: 0
},
PointClouds: 1
}
// API
const projectData = computed(() => {
const project = props.modelData?.project || {}
return {
ProjectName: project.name || 'Unknown Project',
FilePath: project.filePath || 'Unknown Path',
RevitVersion: project.revitVersion || 'Unknown Version',
FileSizeDisplay: project.fileSizeDisplay || 'Unknown Size',
IsCentralFile: project.isCentralFile || false,
IsLoaded: project.status === '活动'
}
})
// API
const modelStats = computed(() => {
const elements = props.modelData?.elements || {}
const structure = props.modelData?.structure || {}
const hierarchy = props.modelData?.hierarchy || {}
return {
TotalElements: elements.total || 0,
Levels: hierarchy.levels?.length || structure.levels || 0,
Views3D: structure.views3D || 0,
LinkedFiles: (props.modelData?.links?.revitLinks?.total || 0) + (props.modelData?.links?.cadLinks?.total || 0),
FloorPlans: structure.floorPlans || 0,
Elevations: structure.elevations || 0,
Sections: structure.sections || 0,
Sheets: structure.sheets || 0,
ActiveViews: ['Level 1 Floor Plan', '3D View - Building', 'South Elevation', 'Longitudinal Section'],
ElementCounts: {
'Walls': elements.walls || 0,
'Doors': elements.doors || 0,
'Windows': elements.windows || 0,
'Floors': elements.floors || 0,
'Ceilings': elements.ceilings || 0,
'Columns': elements.columns || 0,
'Beams': elements.beams || 0,
'Rooms': elements.rooms || 0,
'Stairs': 0, // API0
'Railings': 0 // API0
}
}
})
// API
const linkData = computed(() => {
const links = props.modelData?.links || {}
return {
RevitLinks: {
Total: links.revitLinks?.total || 0,
Loaded: links.revitLinks?.loaded || 0,
Unloaded: links.revitLinks?.unloaded || 0
},
CadLinks: {
Total: links.cadLinks?.total || 0,
Loaded: links.cadLinks?.loaded || 0,
Unloaded: links.cadLinks?.unloaded || 0
},
PointClouds: links.pointClouds || 0
}
})
// Revit
const elementTypeIcons = {

View File

@ -26,7 +26,7 @@
<i class="fas fa-building"></i>
Revit 建筑分析
</h3>
<p class="subtitle">{{ modelData?.data?.fileName || 'Revit测试模型.rvt' }}</p>
<p class="subtitle">{{ modelData?.project?.name || 'Revit测试模型.rvt' }}</p>
</div>
<div class="revit-strategy-selector">
@ -226,7 +226,7 @@ const analysisResults = ref(null)
//
const hasModel = computed(() => {
return props.modelData && props.modelData.data
return props.modelData && props.modelData.project
})
//

View File

@ -29,6 +29,21 @@ class RevitApiService {
}
})
}
/**
* 获取当前模型总览
* @returns {Promise<{success: boolean, data?: any, error?: string}>}
*/
async getCurrentModel() {
const url = buildApiUrl(this.softwareName, 'overview')
return await apiClient.get(url, {
operationContext: {
software: 'Revit',
operation: '获取当前模型'
}
})
}
}
// 导出单例实例

View File

@ -92,7 +92,7 @@
<div v-if="currentPage === PAGE_TYPES.MODEL_VIEWER && showModelViewer" class="page-content">
<CreoModelViewer v-if="currentConnectedSoftware === 'creo'" :model-data="currentModelData" />
<PdmsModelViewer v-else-if="currentConnectedSoftware === 'pdms'" />
<RevitModelViewer v-else-if="currentConnectedSoftware === 'revit'" />
<RevitModelViewer v-else-if="currentConnectedSoftware === 'revit'" :model-data="currentModelData" />
<CreoModelViewer v-else :model-data="currentModelData" />
</div>