天天看点

IfcOpenShell - Python 2022最新安装步骤 兼谈IFC的理解与认识前言前期准备IfcOpenShell 安装检验是否成功结尾1-漫谈IFC的价值和缺陷结尾2-漫谈IFC的学习方法

前言

我之前2020年写了一个IfcOpenShell - Python的安装教程,相信不少对IFC感兴趣的朋友已经看过。两年多以后发生了很多事情,我的工作重心也不再是IFC IFCXML。目前我对IFC的理解就是“底层数据库”,以他为数据库我可以做很多尝试,但是单纯让我研究这个数据库,说真的确实有难度。

时至今日,我对Revit等建筑类信息软件导出的IFC的文本,也只是敢保证“我应该能看懂”,很多实体的具体含义以及各种用法还是有些糊涂。这个就好比大家本科学高数的时候,【懂原理】和【会做题】的感觉。我目前大概属于【会做题】,还达不到【懂原理】。但是我觉得比较新人菜鸟而言,我的学习经验以及成长之路还是足够用了的。有想一起学习了解ifc ifcxml的朋友可以私信我,我把你们都整合到一起。

前期准备

Python编译器就随便了,老版安装指南那个时候,我用的是pycharm,现在我用的是VSCODE,反正都一样,我就默认大家已经安装好了。

这个是重点:需要自行安装anaconda并且配置好环境变量。我安装的最新版,对应的是Python3.9.13。地址如下:

https://www.anaconda.com/

安装的时候要注意这里,环境变量这里一定一定要选上,会节省很多不必要的麻烦。另外说一下这个截图是网上找的,版本应该是2020年末,2021年初的版本,因此对应的Python是3.8。如果安装最新版就是3.9了,我只是拿出来做个例子,大家不要恐慌。

IfcOpenShell - Python 2022最新安装步骤 兼谈IFC的理解与认识前言前期准备IfcOpenShell 安装检验是否成功结尾1-漫谈IFC的价值和缺陷结尾2-漫谈IFC的学习方法

然后就安装好了!接下来就是安装ifcopenshell。

IfcOpenShell 安装

看过老版的都应该有点印象,安装过程非常复杂且繁琐。

大家现在可以喘口气了,新版会非常简单。

打开anaconda prompt,建议管理员身份,如下图所示。

IfcOpenShell - Python 2022最新安装步骤 兼谈IFC的理解与认识前言前期准备IfcOpenShell 安装检验是否成功结尾1-漫谈IFC的价值和缺陷结尾2-漫谈IFC的学习方法

打开后熟悉的黑漆漆一片,然后输入语句:

conda install -c ifcopenshell -c conda-forge ifcopenshell
           

语句的作用是安装最新版ifcopenshell,目前是0.7.0版本。来源在这里:

https://blenderbim.org/docs-python/ifcopenshell-python/installation.html

两年之后,ifcopenshell已经有了专属于他的documentation,创作者我没猜错的话,应该是BlenderBIM Add-on的开发者,也是OSArch社区的创始人(之一)Dion Moult 小哥。他也是我目前认为BIM IFC 领域做插件 做二次开发最顶尖的几个人之一。当时在2020年年初写ifc系列文章的时候,Moult小哥也给了我一些指导和鼓励,让我(至少在2020年)坚持下来做内容输出分享。

哈哈有点陷入回忆了,我们继续。

在黑乎乎的页面输入语句后系统自动检查并匹配环境,一段时间后(我是半个小时多点)会列出需要安装的软件列表,需要我们手动点击y。然后就是安装过程。我在境外,安装网速也比较给力,安装过程3~5分钟就解决了。

截图中最上面的两行是指ifcopenshell安装完毕。剩下的就是TensorFlow的安装(机器学习深度学习的东西,和建筑信息化基本无关)。由于版本比较高,我没有安装成功TensorFlow,但是pytorch我安装好了,所以不耽误干活。又扯远了哈哈,关注ifcopenshell即可。

IfcOpenShell - Python 2022最新安装步骤 兼谈IFC的理解与认识前言前期准备IfcOpenShell 安装检验是否成功结尾1-漫谈IFC的价值和缺陷结尾2-漫谈IFC的学习方法

安装步骤就结束了,一次成功。

检验是否成功

最后检验一下是否成功。

我有一个用VSCODE运行顺利的Gamma函数图像程序,上文提到了我还安装了pytorch,于是乎我一起检验一下,不报错就说明都成功了。如下图所示。

IfcOpenShell - Python 2022最新安装步骤 兼谈IFC的理解与认识前言前期准备IfcOpenShell 安装检验是否成功结尾1-漫谈IFC的价值和缺陷结尾2-漫谈IFC的学习方法

一次成功!这次一共用了(加上我写这篇文章)一个小时,比两年前那篇文章好太多了。

结尾1-漫谈IFC的价值和缺陷

最后随便说说ifc吧。

对我的研究生涯 学习生涯而言,ifc起到了非常重大的作用。我靠着研究ifcxml的数据结构发了top 期刊(JCR Q1; 中科院Q2但是今年有希望升级),没有他我肯定毕不了业,更不可能找到目前到手的工作。

但是ifc对于建筑行业呢?真的有很大意义吗?我始终觉得ifc有点过于面面俱到。对于general的内容,ifc(实际上是背后的母公司buildsmart)恨不得把所有的内容全解释清楚,全都想到。于是乎IFC搞出了那么多个实体,单单是IFC的documentation就足以让小白 初学者望而却步。实际上如果是专注于工民建的同学,真的耐着性子“啃”几个ifc建筑模型,说真的doc中给出的实体,能用上20%就不错了,搞不好只有5%到10%。而且IFC对于特定领域还没啥用,对于A领域要做拓展,B领域要做拓展。。。简单说IFC基本盘“太满”,特定林谷又“不足”,初学者上手困难,文本语句不好理解,documentation也是一知半解。

结尾2-漫谈IFC的学习方法

初学者往往会陷入“先泛读后精读”的思维定式,因此很多初学者一开始接触ifc,看了我的或者其他博主的一些文章,知道了ifc的那个online doc,就直接跑去看doc了。说实在话那玩意“狗都不看”。初学者几乎完全看不懂,一腔热情喂了狗,要不是为了毕业/挣钱,早他妈换方向了。。。

我的理解是,documentation实际上相当于字典。而初学者小白们相当于三岁小孩学写字。我印象中好像没有哪个教育学家或者补习机构,是让小孩看着字典一页一页翻,来学习写字的。一般而言,教学都是依据教材来进行的,这个工序是越低年级越依赖教材,越高年级越不依赖教材。比如高中语文除了文言文默写,其他的课文基本上对高考没什么意义,阅读理解题 作文 这些反而更依赖学生的课外阅读量和逻辑思维能力等等。而小学一年级语文必须跟着教材走,从拼音到简单独体字到偏旁部首。所欲对于ifc而言,初学者小白也一样,你们需要教材,而不是字典。而且还不止ifc一本教材,编程什么的也得现学(如果之前没基础,是纯土建的话)。

偏偏buildingsmart不是什么教育家,他们以极其富有程序员思维的面向对象方式编辑出了一套文本格式ifc以及对应的documentation。再加上ifc比编程语言小众的多得多,导致市面上也没什么教材。因此初学者确确实实很难上手,更别提感兴趣了。

我的观点是,没有教材,要自己创造教材。我们可以通过目前现有的主流信息化软件如Revit,Civil3D,Blender BIM,自己设计一些建筑构件,比如一个一层框架,四根梁 四根柱子 四面墙 两个楼板。然后输出ifc ifcxml格式。从头到尾仔仔细细阅读一下这两份文件。ifc文件看着不适应可以从ifcxml入手,用xml的标签化文本加深对实体 属性 属性集等语法概念的理解(如下2图,对比一下)。之后逐渐加深难度,一个平房,一栋大楼,一个真实建筑模型等等。当一个同学能把简单框架,平房,大楼,真实模型这四个建筑模型对应的ifc ifcxml通读下来且能达到一半以上的理解,基本上就算“识字量3000”,不再是“文盲”了。在这里举两个例子,都是一根柱子以及相关的语句,IFC和IFCXML完全不是一个风格:

#418= IFCCARTESIANTRANSFORMATIONOPERATOR3D($,$,#6,1.,$);
#419= IFCMAPPEDITEM(#398,#418);
#421= IFCSHAPEREPRESENTATION(#102,'Body','MappedRepresentation',(#419));
#423= IFCPRODUCTDEFINITIONSHAPE($,$,(#421));
#427= IFCCARTESIANPOINT((-12502.8686011416,9028.41606591032,0.));
#429= IFCAXIS2PLACEMENT3D(#427,$,$);
#430= IFCLOCALPLACEMENT(#122,#429);
#432= IFCCOLUMN('0SxatZTarACPgizhCG4JI4',#41,'\X2\77E95F6267F1\X0\:475 x 610mm:314634',$,'475 x 610mm',#430,#423,'314634');
#441= IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('475 x 610mm'),$);
#442= IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.F.),$);
#443= IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$);
#444= IFCPROPERTYSET('05PNohEsD3Rv_4ph6XtmWm',#41,'Pset_ColumnCommon',$,(#441,#442,#443));
#449= IFCRELDEFINESBYPROPERTIES('15kRsx1rjC$BbM1rYo93oK',#41,$,$,(#432),#444);
           
<IfcAxis2Placement3D id="i7394">
			<Location>
				<IfcCartesianPoint xsi:nil="true" ref="i1642"/>
			</Location>
		</IfcAxis2Placement3D>
		<IfcRepresentationMap id="i7395">
			<MappingOrigin>
				<IfcAxis2Placement3D xsi:nil="true" ref="i7394"/>
			</MappingOrigin>
			<MappedRepresentation>
				<IfcShapeRepresentation xsi:nil="true" ref="i7390"/>
			</MappedRepresentation>
		</IfcRepresentationMap>
		<IfcColumnType id="i7396">
			<GlobalId>0SxatZTarACPgi$hCG4JPI</GlobalId>
			<OwnerHistory>
				<IfcOwnerHistory xsi:nil="true" ref="i1677"/>
			</OwnerHistory>
			<Name>475 x 610mm</Name>
			<RepresentationMaps exp:cType="list-unique">
				<IfcRepresentationMap exp:pos="0" xsi:nil="true" ref="i7395"/>
			</RepresentationMaps>
			<Tag>52557</Tag>
			<ElementType>475 x 610mm</ElementType>
			<PredefinedType>column</PredefinedType>
		</IfcColumnType>
		<IfcMappedItem id="i7398">
			<MappingSource>
				<IfcRepresentationMap xsi:nil="true" ref="i7395"/>
			</MappingSource>
			<MappingTarget>
				<IfcCartesianTransformationOperator3D xsi:nil="true" ref="i2054"/>
			</MappingTarget>
		</IfcMappedItem>
		<IfcShapeRepresentation id="i7400">
			<ContextOfItems>
				<IfcGeometricRepresentationSubContext xsi:nil="true" ref="i1738"/>
			</ContextOfItems>
			<RepresentationIdentifier>Body</RepresentationIdentifier>
			<RepresentationType>MappedRepresentation</RepresentationType>
			<Items exp:cType="set">
				<IfcMappedItem xsi:nil="true" ref="i7398"/>
			</Items>
		</IfcShapeRepresentation>
		<IfcProductDefinitionShape id="i7402">
			<Representations exp:cType="list">
				<IfcShapeRepresentation exp:pos="0" xsi:nil="true" ref="i7400"/>
			</Representations>
		</IfcProductDefinitionShape>
		<IfcCartesianPoint id="i7404">
			<Coordinates exp:cType="list">
				<IfcLengthMeasure exp:pos="0">12097.1314</IfcLengthMeasure>
				<IfcLengthMeasure exp:pos="1">-7771.583934</IfcLengthMeasure>
				<IfcLengthMeasure exp:pos="2">0.</IfcLengthMeasure>
			</Coordinates>
		</IfcCartesianPoint>
		<IfcAxis2Placement3D id="i7406">
			<Location>
				<IfcCartesianPoint xsi:nil="true" ref="i7404"/>
			</Location>
		</IfcAxis2Placement3D>
		<IfcLocalPlacement id="i7407">
			<PlacementRelTo>
				<IfcLocalPlacement xsi:nil="true" ref="i1758"/>
			</PlacementRelTo>
			<RelativePlacement>
				<IfcAxis2Placement3D xsi:nil="true" ref="i7406"/>
			</RelativePlacement>
		</IfcLocalPlacement>
		<IfcColumn id="i7408">
			<GlobalId>0SxatZTarACPgizhCG4JPI</GlobalId>
			<OwnerHistory>
				<IfcOwnerHistory xsi:nil="true" ref="i1677"/>
			</OwnerHistory>
			<Name>矩形柱:475 x 610mm:315356</Name>
			<ObjectType>475 x 610mm</ObjectType>
			<ObjectPlacement>
				<IfcLocalPlacement xsi:nil="true" ref="i7407"/>
			</ObjectPlacement>
			<Representation>
				<IfcProductDefinitionShape xsi:nil="true" ref="i7402"/>
			</Representation>
			<Tag>315356</Tag>
		</IfcColumn>
		<IfcPropertySet id="i7411">
			<GlobalId>1e4Rp$oOz5K9gpH1Lh5URA</GlobalId>
			<OwnerHistory>
				<IfcOwnerHistory xsi:nil="true" ref="i1677"/>
			</OwnerHistory>
			<Name>Pset_ColumnCommon</Name>
			<HasProperties exp:cType="set">
				<IfcPropertySingleValue xsi:nil="true" ref="i2077"/>
				<IfcPropertySingleValue xsi:nil="true" ref="i2078"/>
				<IfcPropertySingleValue xsi:nil="true" ref="i2079"/>
			</HasProperties>
		</IfcPropertySet>
           

至于之后是想要做某一领域拓展,还是格式转换,数据轻量化,做其他研究的数据库等等,只要基本理解了ifc的语句含义,再做一些其他工作也好办一些。

总之,希望各位能够在ifc的世界中尽快上手,初学过程实在是太过于痛苦了。我现在回想一下2019下半年和2020上半年,还是心有余悸。。。过来了,就好了很多。想一起学习的别忘了私信我哦,我来做整合,大家一起加油吧!