目录

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. 【BZOJ】初级水题列表——献给那些想要进军BZOJ的OIers(自用,怕荒废了最后的六月考试月,刷刷水题,水水更健康)

    BZOJ初级水题列表——献给那些想要进军BZOJ的OIers 代码长度解释一切! 注:以下代码描述均为C++ RunID User Problem Result Memory Time Code_Le ...

  2. MySQL数据库全备

    #function:MYSQL自动全备 #version:1.0.0 #author:wangyanlin #date:2017/08/03 #---------------------------- ...

  3. 打开redis和solr

  4. 分享给有需要的你,精选了10套web开发免费视频教程~~

    在这里给大家精选百度传课里的一些比较好的视频教程,比较适合新手们,有需要的可以收藏着学习!!  蓝鸥微信小程序全方位深度解析 链接:http://www.chuanke.com/v4702151-19 ...

  5. 客户端怎么查看SVN的代码库

    安装SVN客户端,比如TortoiseSVN,然后将代码库checkout到本地,或者通过客户端的版本库浏览器直接连接SVN服务器查看代码库的目录结构. 如果SVN服务器端安装的时候是和Apache集 ...

  6. ThinkPhp 添加模型类

    ----------------------------------------------- <?phpnamespace app\common\model;use traits\model\ ...

  7. CUDA共享内存的使用示例

    CUDA共享内存使用示例如下:参考教材<GPU高性能编程CUDA实战>.P54-P65 教材下载地址:http://download.csdn.net/download/yizhaoyan ...

  8. PostgreSql 分页limit

    摘录自:http://jingyan.baidu.com/article/a17d528538119b8098c8f2ca.html 语法: select * from persons limit   ...

  9. ASP.NET导出word实例

    ASP.NET导出word实例 最近遇到一个题目就是如何在asp.net中将数据导出到word中,由于数据是动态的,所以需要在后台拼出想要的的格式,翻遍了网页找出了一个比较满意的代码,感谢那位高手.代 ...

  10. RSync实现文件备份同步,rsync服务器

    转自:http://www.cnblogs.com/itech/archive/2009/08/10/1542945.html [rsync实现网站的备份,文件的同步,不同系统的文件的同步,如果是wi ...