目录

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. CodeForces798-B. Mike and strings-string中的find()函数

    好久好久好久之前的一个题,今天翻cf,发现这个题没过,补一下. B. Mike and strings time limit per test 2 seconds memory limit per t ...

  2. c# tolist() 浅析

    在介绍tolist()的时候我先个大家介绍一下linq的延迟加载: var products = new List<Product> { , Category = "Electr ...

  3. 教你上传本地代码到github转载

    原创 2015年07月03日 10:47:13 标签: 上传代码github   转载请标明出处: http://blog.csdn.net/hanhailong726188/article/deta ...

  4. 程序员之殇 —— (The Beginning of the End)噩梦、崩坏

    Look at all those faces out there (当我环视周遭的一张张脸孔) We are so different(我们是如此的不同) But we have one thing ...

  5. HDU 2243 Knight Moves

    题目: A friend of you is doing research on the Traveling Knight Problem (TKP) where you are to find th ...

  6. SSL证书安装指引

    https://cloud.tencent.com/document/product/400/4143 下载得到的 www.domain.com.zip 文件,解压获得3个文件夹,分别是Apache. ...

  7. 用dedecms做网站时,空间服务器选择IIS还是apache???

    想做一个dedecms程序的网站,不知道要选择什么样的空间,windows还是linux的?多大的空间比较适合?求高人回答.   如果是基于Linux平台的话,那不必多说自然是Apache了,因为II ...

  8. dede被注入后台提示用户名不存在解决方法

    如果已经发现/data,有很长一个txt记事本,说明已经被其他人SQL注入了,或是已经有人进行尝试SQL注入了了. 记事儿本如:75252sdaswfdfsfq538ef2ad3556_safe.tx ...

  9. async函数解析

    转载请注明出处:async函数解析 async函数是基于Generator函数实现的,也就是说是Generator函数的语法糖.在之前的文章有介绍过Generator函数语法和异步应用,如果对其不了解 ...

  10. python3 第十章 - 如何进行进制转化

    在计算机的世界里,2进制是主流,而在人类的自然世界中,10进制是主流,那么在这之间必然就会存在进制转化的问题.本章我们就来谈谈进制转化,也希望通过本章加深您对前些章所学知识的理解. 原理:先说说关于位 ...