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

View File

@ -149,55 +149,78 @@
</template> </template>
<script setup> <script setup>
import { computed } from 'vue'
import { ElNotification } from 'element-plus' import { ElNotification } from 'element-plus'
// Revit // propsAPI
const projectData = { const props = defineProps({
ProjectName: 'COMMERCIAL_BUILDING_2024', modelData: {
FilePath: 'C:/BIM_Projects/Commercial_Building_2024.rvt', type: Object,
RevitVersion: 'Autodesk Revit 2024', required: true
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
} }
} })
const linkData = { // API
RevitLinks: { const projectData = computed(() => {
Total: 4, const project = props.modelData?.project || {}
Loaded: 3, return {
Unloaded: 1 ProjectName: project.name || 'Unknown Project',
}, FilePath: project.filePath || 'Unknown Path',
CadLinks: { RevitVersion: project.revitVersion || 'Unknown Version',
Total: 2, FileSizeDisplay: project.fileSizeDisplay || 'Unknown Size',
Loaded: 2, IsCentralFile: project.isCentralFile || false,
Unloaded: 0 IsLoaded: project.status === '活动'
}, }
PointClouds: 1 })
}
// 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 // Revit
const elementTypeIcons = { const elementTypeIcons = {

View File

@ -26,7 +26,7 @@
<i class="fas fa-building"></i> <i class="fas fa-building"></i>
Revit 建筑分析 Revit 建筑分析
</h3> </h3>
<p class="subtitle">{{ modelData?.data?.fileName || 'Revit测试模型.rvt' }}</p> <p class="subtitle">{{ modelData?.project?.name || 'Revit测试模型.rvt' }}</p>
</div> </div>
<div class="revit-strategy-selector"> <div class="revit-strategy-selector">
@ -226,7 +226,7 @@ const analysisResults = ref(null)
// //
const hasModel = computed(() => { 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"> <div v-if="currentPage === PAGE_TYPES.MODEL_VIEWER && showModelViewer" class="page-content">
<CreoModelViewer v-if="currentConnectedSoftware === 'creo'" :model-data="currentModelData" /> <CreoModelViewer v-if="currentConnectedSoftware === 'creo'" :model-data="currentModelData" />
<PdmsModelViewer v-else-if="currentConnectedSoftware === 'pdms'" /> <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" /> <CreoModelViewer v-else :model-data="currentModelData" />
</div> </div>