范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

IFC转MESH和BREPIfcOpenShell

  本文介绍如何利用IfcOpenShell读取IFC文件中的几何数据并生成网格或BREP。
  一、IfcOpenShell简介
  IfcOpenShell 是一个用于处理 IFC 数据的库,采用 LGPL 3.0(自由和开源)许可。
  IfcOpenShell的功能包括: 解析ifc 从 ifc 表示创建几何体 使用 pythonOCC 显示几何体 提供Blender 的 Ifc 导入器 提供3ds Max 的 Ifc 导入器 将几何体转换为多种格式
  一些使用 IfcOpenShell 的项目包括: FreeCAD:参数化 CAD 建模器,包括 BIM 工作台 BIMserver :多用户自托管 BIM 平台,带有插件生态系统以查看、分析、合并等……
  在本文中,我们将使用一个从 ifc 实体生成网格体的函数,在我们的例子中是 IfcWall,看看我们可以得到什么结果。 二、获取原始IFC文件
  首先使用 FreeCAD 创建一个简单墙并导出为 .ifc 文件:
  先决条件:已安装 IfcOpenShell。 此处使用的版本:0.6.0a1 三、IFC转网格体
  首先我们需要引入 ifcopenshell 并打开 ifc 文件: import ifcopenshell from ifcopenshell import geom   def read_geom(ifc_path):      ifc_file = ifcopenshell.open(ifc_path)      settings = geom.settings()
  geom.settings 用于设置转换选项。 默认情况下,ifcopenshell 生成具有顶点、边和面的网格。
  ifc_file.by_type("IfcClass")是获取所选类(包括子类)的所有元素的一种非常方便的方法。 因此,如果使用 IfcBuildingElement,它还将包括 IfcWall、IfcWindow、IfcSlab、IfcBeam 等……
  geom.create_shape(settings, ifc_entity) 是将 ifc 实体转换为网格的函数。 我们可以观察到顶点存储在单个元组中,而不是 xyz 三元组。 边和面也一样。     for ifc_entity in ifc_file.by_type("IfcWall"):         shape = geom.create_shape(settings, ifc_entity)         # ios stands for IfcOpenShell         ios_vertices = shape.geometry.verts         ios_edges = shape.geometry.edges         ios_faces = shape.geometry.faces          # IfcOpenShell store vertices in a single tuple, same for edges and faces         print(ios_vertices)         print(ios_edges)         print(ios_faces)         """ Above will result in : (0.0, 0.0, 0.0, 0.0, 0.0, 3.0, 10.0, 0.0, 0.0, 10.0, 0.0, 3.0, 10.0, 0.2, 0.0, 10.0, 0.2, 3.0, 0.0, 0.2, 0.0, 0.0, 0.2, 3.0) (0, 1, 1, 3, 0, 2, 2, 3, 2, 3, 2, 4, 3, 5, 4, 5, 4, 5, 5, 7, 4, 6, 6, 7, 6, 7, 0, 6, 1, 7, 0, 1, 0, 6, 0, 2, 4, 6, 2, 4, 1, 7, 1, 3, 5, 7, 3, 5) (1, 0, 3, 3, 0, 2, 3, 2, 4, 5, 3, 4, 5, 4, 7, 7, 4, 6, 7, 6, 0, 1, 7, 0, 0, 6, 2, 2, 6, 4, 3, 7, 1, 5, 7, 3) """
  很明显,顶点是 x,y,z 一个接一个的三元组。 但是如何定义边和面呢? 边是由 2 个顶点包围的线,但我们看到的值不是顶点。 网格中的面是由 3 个顶点和 3 条边界定的三角形表面。 如果我们制作一组边和面值,我们会得到一组长度为 8 的值。         print(set(ios_edges))         print(set(ios_faces))         """ Above will result in : {0, 1, 2, 3, 4, 5, 6, 7} {0, 1, 2, 3, 4, 5, 6, 7} """
  如果我们按 3 个值 (x,y,z) 对顶点进行分组,按 2 个值 (vertex1, vertex2) 对边进行分组,按 3 个值对面进行分组(3 个顶点或 3 条边),我们会看到我们的墙几何体由 8 个顶点、24 条边和12个面定义。 边和面值都是顶点索引。         # Let"s parse it and prepare it for FreeCAD import         vertices = [             FreeCAD.Vector(ios_vertices[i : i + 3])             for i in range(0, len(ios_vertices), 3)         ]         edges = [ios_edges[i : i + 2] for i in range(0, len(ios_edges), 2)]         faces = [tuple(ios_faces[i : i + 3]) for i in range(0, len(ios_faces), 3)]          print(             f"This {ifc_entity.is_a()} has been defined by {len(vertices)} vertices, {len(edges)} edges and {len(faces)} faces"         )         print(vertices)         print(edges)         print(faces)         """ Above will result in : This IfcWall has been defined by 8 vertices, 24 edges and 12 faces [(0.0, 0.0, 0.0), (0.0, 0.0, 3.0), (10.0, 0.0, 0.0), (10.0, 0.0, 3.0), (10.0, 0.2, 0.0), (10.0, 0.2, 3.0), (0.0, 0.2, 0.0), (0.0, 0.2, 3.0)] [(0, 1), (1, 3), (0, 2), (2, 3), (2, 3), (2, 4), (3, 5), (4, 5), (4, 5), (5, 7), (4, 6), (6, 7), (6, 7), (0, 6), (1, 7), (0, 1), (0, 6), (0, 2), (4, 6), (2, 4), (1, 7), (1, 3), (5, 7), (3, 5)] [(1, 0, 3), (3, 0, 2), (3, 2, 4), (5, 3, 4), (5, 4, 7), (7, 4, 6), (7, 6, 0), (1, 7, 0), (0, 6, 2), (2, 6, 4), (3, 7, 1), (5, 7, 3)] """         return {"vertices": vertices, "edges": edges, "faces": faces}
  当然 FreeCAD 已经有更好的方法来导入 IfcWall ,但让我们使用自己的网格来生成几何图形: import FreeCAD import FreeCADGui import Mesh  if __name__ == "__main__":     mesh_values = read_geom(         "/home/cyril/git/pythoncvc.net/IfcOpenShellSamples/Wall.ifc"     )      # Create a FreeCAD geometry. A FreeCAD can take vertices and faces as input     mesh = Mesh.Mesh((mesh_values["vertices"], mesh_values["faces"]))     # Ifc lenght internal unit : meter. FreeCAD internal unit : mm.     scale_factor = 1000     matrix = FreeCAD.Matrix()     matrix.scale(scale_factor, scale_factor, scale_factor)     mesh.transform(matrix)      # Allow you to embed FreeCAD in python https://www.freecadweb.org/wiki/Embedding_FreeCAD     FreeCADGui.showMainWindow()     doc = FreeCAD.newDocument()      # Add geometry to FreeCAD scenegraph (Coin)     fc_mesh = doc.addObject("Mesh::Feature", "IfcMesh")     fc_mesh.Mesh = mesh      # Set Draw Style to display mesh edges. Orient view and fit to wall     FreeCADGui.runCommand("Std_DrawStyle",1)      FreeCADGui.Selection.addSelection(fc_mesh)     FreeCADGui.activeView().viewIsometric()     FreeCADGui.SendMsgToActiveView("ViewSelection")          FreeCADGui.exec_loop()
  上图是在 FreeCAD 中生成的几何图形,网格可以快速显示,但它通常不是你想要在 BIM 创作软件中使用的内容。 所以下次我们将看到如何生成边界表示。
  完整的源代码可在此处获得。 四、IFC转BREP
  前面我们使用 IfcOpenShell (IOS) 的标准设置来读取正在生成网格的 ifc 几何体。 要生成其他内容,让我们看一下可用的设置。
  如果你的 IDE 提供了良好的自动完成功能,你将能够看到有哪些选项,但看不到它们的含义。 通过使用其中一个选项作为关键字在 IOS 存储库中进行快速搜索,可以很快找到一个名为 IfcGeomIteratorSettings.h 的头文件,其中包含所有定义: /// Specifies whether to use the Open Cascade BREP format for representation /// items rather than to create triangle meshes. This is useful is IfcOpenShell /// is used as a library in an application that is also built on Open Cascade. USE_BREP_DATA = 1 << 3,
  BREP 代表边界表示,这可能是你在对参数化风管或管道及其相关组件建模时想要使用的。 在 python 中定义设置如下:     # Define settings     settings = geom.settings()     settings.set(settings.USE_BREP_DATA, True)
  如果将生成的 brep 数据写入文件,你将看到它实际上是设置说明中建议的OpenCascade BREP 格式。     shape = geom.create_shape(settings, ifc_entity)     # occ stands for OpenCascade      occ_shape = shape.geometry.brep_data      # IfcOpenShell generate an Open Cascade BREP      with open("IfcOpenShellSamples/brep_data", "w") as file:         file.write(occ_shape)
  幸运的是,被视为 FreeCAD 核心组件的 Part 模块也基于 Open Cascade,这使得将几何体导入 FreeCAD 变得如此简单:     # Create FreeCAD shape from Open Cascade BREP     fc_shape = Part.Shape()     fc_shape.importBrepFromString(occ_shape)          # Ifc lenght internal unit : meter. FreeCAD internal unit : mm.     fc_shape.scale(1000)          # Add geometry to FreeCAD scenegraph (Coin)     fc_part = doc.addObject("Part::Feature", "IfcPart")     fc_part.Shape = fc_shape
  不要忘记在文件顶部导入Part而不是Mesh。
  如果我们使用此处提供的完整代码为之前文章中的墙生成几何图形,将获得相同的实体,但这次不是网格(没有三角形):
  上面只导入了 IfcWall 实体,现在让我们从 wikilab.ifc 的 wikihouse 项目导入 IfcElement 实体,得到以下几何图形:
  当然 FreeCAD 仍然有更好的导入方式,但如果你激活着色模式,会得到更好的效果:
  原文链接:http://www.bimant.com/blog/ifc-to-mesh-and-brep/

2019年刘少奇三子病逝,临终留下遗言丧事从简,谨记父亲的教诲提起刘少奇这三个字,相信许多人都不陌生,他不仅是我国的著名开国元勋之一,也是国家级别的重要领导人。他的一生,可用可歌可泣来赞颂,他出生于1898年,却在1969年含冤而死。刘少奇同陈德修发文称和平可贵ampampquot,台湾艺人正义感爆棚,团结就是力量近日,娱乐圈众多明星圈粉无数,都因有一颗爱国之心,纷纷转发世界只有一个中国。很多台湾艺人不敢转发,陈德修不但转发了,还回怼了很多挑事者的评论,来表达自己有颗爱国之心,为此也收获了很台媒炒作街头出现巨型圆柱武器,无知的民众竟然信以为真近期,由于美国众议院佩洛西的窜台,解放军正在对台湾省进行演训,岛内群众更是人心惶惶,当从国外媒体得知导弹从台上空飞过时,更是对当局产生了怀疑,质疑根本没有能力保护群众。于是,就开始永远不要把人情看得太重作者洞见苏墨世态常为盛时熟,人情多在败中凉。增广贤文有言有钱有酒多兄弟,急难何曾见一人。时间识人,落难知心。经历过方体悟,人心似海,情薄如纸。不把人情看得太重,是一个人最大的成熟与难怪虚竹结局不明,看看他后期遇到了哪位高手?身首异处而亡爱看电影的人对漫威宇宙一定不会感到陌生,在漫威的精心构筑之下,电影中被提及的超级英雄在不同的时间书写着各自的传奇,同时也在合适的时机被整合到了一起。这种巧妙的构思让越来越多的超级英明朝的皇帝姓朱,如果人们想吃猪肉怎么办?老朱怎么解决难题明朝的皇帝都姓朱。如果人们想吃猪肉该怎么办?朱元璋将如何解决这个问题?今天,我们就来谈谈这个话题。朱猪是同音字,这样一来,当人们谈论吃猪肉杀猪的时候,朱元璋不会感到不舒服吗?事实上汉武帝看不上胡人进贡的动物,扔笼子里喂老虎,老虎却伏地不起自古以来,狮与虎这两种猛禽一直在中华文化中占有极高的象征地位。狮子沉稳霸气,自带威严,至今仍以狮子的形象做镇宅之用。老虎凶猛悍勇,常以虎元素形容战争,如虎将虎符等形容事物。但很多人天才基本法张叔平下跪道歉,论文抄袭事件水落石出,真相太残酷你被最好的朋友出卖,遭诬陷后身败名裂,如今事情已经过去了20年,你会选择原谅他吗?这个进退两难的问题在电视剧天才基本法中真实发生了。林兆生本是天才数学家,年纪轻轻就考上了以数学系闻断供天然砂重创台积电?事实真相终于明了点击右上方关注,第一时间获取科技资讯技能攻略产品体验,私信我回复01,送你一份玩机技能大礼包。近期一则新闻可谓是引爆了我的朋友圈,作为对台湾方面的惩戒措施之一,中国大陆禁止了向台湾好大的口气!好大的胆子!日本竟命令中国立即停止军事行动宝岛问题是中国的内政,日本本无权干涉绕岛军事行动也是美国切香肠菜阴文等毒瘤挟洋谋独导致的,日本本应有基本的认知在历史上日本对中国亚州乃至世界各国人民造成了严重的伤害,负有历史的罪责解放军封锁台湾!真的只是演习吗?真相来了大家都知道,就在前几天,美国高官佩洛西窜访台湾,此举在国际上引起巨大反响,很多国家都谴责美国的行为。作为回应,我们解放军画出了六块军演区域,包围了台湾岛,现在,台湾已经是进不能进,
狂胜掘金,逆转森林狼,绝杀鹈鹕!安吉这个老狐狸,把NBA全骗了如果你问NBA球迷,谁是本赛季最让人意外的球队,恐怕很多人会说3连败的76人或者是湖人,但有一支球队的表现,你绝对是想不到的,那就是爵士队。这个休赛期,爵士队决定重建,他们首发中的CCTV5直播CBA第7轮天下足球,奥运频道转中超,5录播中国女篮CCTV5直播CBA第7轮天下足球,奥运频道转中超上海海港VS梅州,5录播中国女篮北京时间10月24日(周一),新的一周开始,中央广播电视总台发布了体育频道(CCTV5)体育赛事频圣徒11爆冷终结枪手八连胜!德甲副班长主场21掀翻领头羊昨夜今晨两场焦点大战,结果两支领头羊相继遭遇至暗时刻!仅取得1平1负的惨淡结局!领先优势变得微乎其微!卫冕冠军曼城和拜仁隔空收礼!具体赛况如下南安普顿11阿森纳英超第十三轮,圣徒南2022年卡塔尔世界杯的多个第一,你知道吗?第二十二届世界杯足球赛于2022年在卡塔尔举办,是世界上最具知名度和影响力的体育赛事。卡塔尔世界杯球场此届世界杯也创造了多个第一,您知道吗?大力神杯与32强球队是历史上首次在卡塔尔新赛季谁有可能拔得头筹第一个下课?不是纳什,哈姆新赛季76人三连败开局,让人大跌眼镜。照理说新赛季76人阵容比上赛季只强不弱。输给凯尔特人和雄鹿就算了,今天马刺居然也敢输,要知道马刺是摆烂奔着文班尼亚去的,76人这波操作是有点看山东泰山迎喜讯,郝伟正式确认,主力球员复出,郑智蒿俊闵麻烦了北京时间10月23日,中超联赛传来最新消息,山东泰山将对阵广州队,泰山队主帅郝伟在出席赛前新闻发布会时正式确认,本场比赛贾德松肯定可以出场,这样的情况对于伤病满营的山东泰山队来说,40岁李宗伟晒全家福!花936万抗癌今瘦脱相,俩儿子手托妈妈孕肚李宗伟运动员生涯持续了19年之多,荣誉满身,其中包括3次奥运银牌,是马来西亚最成功的羽毛球运动员,世界范围内,地位仅次于中国林丹,在退役后,他几乎把所有时间和精力都放在了家庭上,每CBA前6轮排名!广东连升4级,两支黑马进前八,刘维伟开局不利自从10月10日开始,CBA2223赛季的第一阶段已经打了半个月的时间,截止到23日完成了6轮比赛,最新一期的排名又有变化,浙江成了唯一保持全胜的球队,辽宁队输给山西之后落在第二位卡里姆本泽马击败萨迪奥马内获得2022年金球奖卡里姆本泽马在职业生涯中首次击败萨迪奥马内赢得2022年金球奖。这位法国前锋是最有可能获得这一令人垂涎的奖项的热门人选,他在拜仁慕尼黑球星马内现在的前俱乐部利物浦的比赛中将皇马带回怒了!贝弗利我是来帮助湖人夺冠的,不是来看湖人摆烂的湖人开赛三连败,作为刚刚加入湖人队的恶狗贝弗利忍不住了,在输给开拓者的赛后采访环节,贝弗利愤怒的开始抱怨我是来帮助湖人夺冠的,不是来看湖人摆烂的!并指出湖人有些球员就是摆不正自己的CBA最新消息广东队遇难题,冠军教头下课倒计时,多个俱乐部欠薪广东队遇难题,第二阶段继续赛会制。北京时间10月24日,根据篮球媒体人导演我躺那儿的爆料,CBA公司决定第二阶段的比赛将继续采取赛会制的比赛模式,地点将会移改到浙江诸暨,这个消息也