天天看點

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上半年,還是心有餘悸。。。過來了,就好了很多。想一起學習的别忘了私信我哦,我來做整合,大家一起加油吧!