目录

IFC 输出Excel 空间报告文件

本示例将展示从IFC文件读取数据所需的一些概念。它使用IFC4 接口,可以同时用于IFC2x3和IFC4版本。创建EXCEL文件,我们使用开源的组件NPOI。这个例子只需要xBIM Essentials。

引用命名空间:

using NPOI.SS.UserModel;   // EXCEL 组件
using NPOI.XSSF.UserModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using Xbim.Ifc;
using Xbim.Ifc4.Interfaces;

主要的功能如下所示:

//从模板初始化NPOI工作簿
var workbook = new XSSFWorkbook("template.xlsx");
var sheet = workbook.GetSheet("Spaces");//用单位创建漂亮的数字格式。 现实中需要更多的关心的是单位。
//我们只知道我们现在的模型有空间面积以立方米和空间体积为单位
//请注意从Revit导出的原始数据是错误的,因为数据量比应该大1000倍。
//在这个例子中,数据是使用xBIM修复的。
var areaFormat = workbook.CreateDataFormat();
var areaFormatId = areaFormat.GetFormat("# ##0.00 [$m²]");
var areaStyle = workbook.CreateCellStyle();
areaStyle.DataFormat = areaFormatId;
var volumeFormat = workbook.CreateDataFormat();
var volumeFormatId = volumeFormat.GetFormat("# ##0.00 [$m³]");
var volumeStyle = workbook.CreateCellStyle();
volumeStyle.DataFormat = volumeFormatId;
//打开IFC模型。 不会改变模型中的任何东西,所以我们可以把编辑器的信息保留下来。
using (var model = IfcStore.Open("SampleHouse.ifc"))
{
//获取模型中的所有空间.
//需要 ToList() 方便使用 Foreach
var spaces = model.Instances.OfType<IIfcSpace>().ToList();
//设置报表标题
sheet.GetRow().GetCell()
.SetCellValue($"Space Report ({spaces.Count} spaces)");
foreach (var space in spaces)
{
//写报表数据
WriteSpaceRow(space, sheet, areaStyle, volumeStyle);
}
}
//保存 报表
using (var stream = File.Create("spaces.xlsx"))
{
workbook.Write(stream);
stream.Close();
}
//打开保存的EXCEL 文件
Process.Start("spaces.xlsx");

从IFC 读取数据,并为每个空间写一行

private static void WriteSpaceRow(IIfcSpace space, ISheet sheet, ICellStyle areaStyle, ICellStyle volumeStyle)
{
var row = sheet.CreateRow(sheet.LastRowNum + ); var name = space.Name;
row.CreateCell().SetCellValue(name); var floor = GetFloor(space);
row.CreateCell().SetCellValue(floor?.Name); var area = GetArea(space);
if (area != null)
{
var cell = row.CreateCell();
cell.CellStyle = areaStyle;
//如果来自于其他的类型 不保证是数字 (如财产 等)
if (area.UnderlyingSystemType == typeof(double))
cell.SetCellValue((double)(area.Value));
else
cell.SetCellValue(area.ToString());
} var volume = GetVolume(space);
if (volume != null)
{
var cell = row.CreateCell();
cell.CellStyle = volumeStyle;
if (volume.UnderlyingSystemType == typeof(double))
cell.SetCellValue((double)(volume.Value));
else
cell.SetCellValue(volume.ToString());
}
}

WriteSpaceRow

如何获取包含空间的地板,需要执行以下操作

private static IIfcBuildingStorey GetFloor(IIfcSpace space)
{
return
//得到这个模型空间所有关系
space.Decomposes
//选择分解对象 (这些可能是其他空间或建筑层)
.Select(r => r.RelatingObject)
//建筑楼层
.OfType<IIfcBuildingStorey>()
.FirstOrDefault(); //获取第一个
}

IFC 包含数据基础架构, 用于存储与产品及其类型相关的任意数据。此基础结构相当复杂。存储数据的两种主要方法是作为数量或作为属性。数量对于它们所包含的值的类型是明确的, 其中属性可以包含许多不同的数据类型作为值。对于面积和体积, 最好从数量中得到值, 如果它们被定义。在这种情况下, 属性是回退。

private static IIfcValue GetArea(IIfcProduct product)
{
//尝试先从数量中获取
var area =
//获取可以定义属性和数量集的所有关系
product.IsDefinedBy
//在所有属性和数量集之间搜索。
//您可能还希望按名称搜索特定数量
.SelectMany(r => r.RelatingPropertyDefinition.PropertySetDefinitions)
//数量集合
.OfType<IIfcElementQuantity>()
//从数量集获取所有数量
.SelectMany(qset => qset.Quantities)
//我们只对面积感兴趣
.OfType<IIfcQuantityArea>()
//我们将采取第一个。显然有一个以上的面积属性
//所以, 要检查的名称。但是,我们将保持它简单的这个例子。
.FirstOrDefault()?
.AreaValue;
if (area != null)
return area;
//从属性中获取值
return GetProperty(product, "Area");
} private static IIfcValue GetVolume(IIfcProduct product)
{
var volume = product.IsDefinedBy
.SelectMany(r => r.RelatingPropertyDefinition.PropertySetDefinitions)
.OfType<IIfcElementQuantity>()
.SelectMany(qset => qset.Quantities)
.OfType<IIfcQuantityVolume>()
.FirstOrDefault()?.VolumeValue;
if (volume != null)
return volume;
return GetProperty(product, "Volume");
}

更常见的属性在属性集中搜索

private static IIfcValue GetProperty(IIfcProduct product, string name)
{
return
//获取可以定义属性和数量集的所有关系
product.IsDefinedBy
//在所有属性和数量集之间搜索。您可能还希望在特定属性集中搜索
.SelectMany(r => r.RelatingPropertyDefinition.PropertySetDefinitions)
//在这种情况下, 只考虑属性集。
.OfType<IIfcPropertySet>()
//从所有属性集中获取所有属性
.SelectMany(pset => pset.HasProperties)
//只允许考虑单个值属性。还有枚举属性,
//表属性、引用属性、复杂属性和其他
.OfType<IIfcPropertySingleValue>()
.Where(p =>
string.Equals(p.Name, name, System.StringComparison.OrdinalIgnoreCase) ||
p.Name.ToString().ToLower().Contains(name.ToLower()))
.FirstOrDefault()?.NominalValue;
}

最终结果如下

xBIM IFC 输出 Excel 报表的更多相关文章

  1. xBIM 基础15 IFC导出Excel报表

    系列目录    [已更新最新开发文章,点击查看详细]  IFC导出Excel空间报表文件 本篇将向您展示从IFC文件读取数据所需的一些概念.它使用IFC4接口,适用于IFC2x3和IFC4型号.要创建 ...

  2. xBIM IFC 层次结构

    目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...

  3. xBIM IFC 墙壁案例

    目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...

  4. Report_客制化以PLSQL输出XLS标记实现Excel报表(案例)

    2015-02-12 Created By BaoXinjian

  5. 完整的thinphp+phpexcel实现excel报表的输出(有图有效果)

    准备工作:1.下载phpexcel1.7.6类包:2.解压至TP框架的ThinkPHP\Vendor目录下,改类包文件夹名为PHPExcel176,目录结构如下图:       编写代码(以一个订单汇 ...

  6. JasperReport报表中输出Excel时,部分列不显示的问题

    JasperReport开源报表功能强大,是我们WEB系统中做报表开发的一个强有力的工具,上手也比较简单.我碰到的问题是进行报表输出时,在html网页中显示正常,但如果导出为Excel时,部分列不显示 ...

  7. java导出excel报表

    1.java导出excel报表: package cn.jcenterhome.util; import java.io.OutputStream;import java.util.List;impo ...

  8. Java使用POI实现数据导出excel报表

    Java使用POI实现数据导出excel报表 在上篇文章中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅 ...

  9. 10、借助POI实现Java生成并打印excel报表(1)

    10.1.了解 Apache POI 实际开发中,用到最多的是把数据库中数据导出生成报表,尤其是在生产管理或者财务系统中用的非常普遍.生成报表格式一般是EXCEL或者PDF .利用Apache  PO ...

随机推荐

  1. Gym 100952C&&2015 HIAST Collegiate Programming Contest C. Palindrome Again !!【字符串,模拟】

    C. Palindrome Again !! time limit per test:1 second memory limit per test:64 megabytes input:standar ...

  2. JEECG 3.7.2版本发布,企业级JAVA快速开发平台

    JEECG 3.7.2版本发布 -  微云快速开发平台 JEECG是一款基于代码生成器的J2EE快速开发平台,开源界"小普元"超越传统商业企业级开发平台.引领新的开发模式(Onli ...

  3. setTimeout()方法,你真的懂吗?

    今天在群里看到了一道经典的javascript题型,之前也遇到过,可是再次遇到时,还是做错,还是不理解,因此这里来做个笔记吧! 不说了,直接上代码吧 for(var i=1; i<=9; i++ ...

  4. node学习笔记2 —— npm包管理

    全局模式安装包 将包安装为全局可用的可执行命令, 并非可以从任意地方require 将 package.json中bin定义的文件软链到统一的目录下, 该目录可以通过如下方式推算出来: path.re ...

  5. dede:list及dede:arclist 按权重排序的方法

    有时我们需要做文章排名,比如指定第一名到第三名在前面,这样就用到这个权重排序方法.稍改下就可以完美支持.. dede:list 的方法 1 找到"根目录\include\arc.listvi ...

  6. oc 快排算法

    直接复制粘贴就可以用了 - (void)viewDidLoad { [super viewDidLoad]; NSMutableArray *M_arr = [[NSMutableArray allo ...

  7. 实现鼠标hover动画效果自己理解的两种方法——练习笔记

    练习前端技术学院的任务,需要实现"导航栏中的链接,随着鼠标悬浮的位置,相应的链接下出现红色线段"的效果(如图1),我的理解有简易与稍显复杂一些的方法: 首先想到的就是直接利用伪元素 ...

  8. linux 如何降低入向软中断占比

    最近遇到一个问题,当tcp收包的时候,我们的服务器的入向软中断比例很高. 我们知道,napi模式,可以降低收包入向软中断占比,那么,针对napi模式,能不能优化?本文针对2.6.32-358内核进行分 ...

  9. Go_认识golang

    官方地址:https://golang.org/ 什么是Go? 支持并发.垃圾回收的编译型 系统编程语言 Go语言有哪些特点? 1. 类型安全 和 内存安全 2. 以非常直观和极低代价的方案实现高并发 ...

  10. <script>元素在XHTML中的用法

    编写XHTML代码的规则要比编写HTML严格得多,例如如下代码: <script type="text/javascript"> function compare(a, ...