本发明涉及一种bim模型中构件变更的快速检测方法,属于bim技术领域。
背景技术:
建筑信息模型(buildinginformationmodel,bim)是对建筑的三维数字化描述,是三维的建筑设计图纸。bim以面向对象的方式进行数据存储,以构件为基本组成单位,以各种属性描述构件特征。构件的属性包括构件id、简单属性和复杂属性。
在设计或施工过程中,经常会对bim进行设计变更,bim的变更会导致建造成本、材料采购和施工计划的变更,因此施工单位需要快速检测不同版本bim中变更的构件。目前由于缺乏对变更前bim模型a和变更后模型模型b中变更构件的自动检测工具,主要采用人工检测方法,准确性和效率都比较低。有研究建议根据不同版本模型中构件id的变化检测增加、删除、修改的构件,检测时间为t;但不同设计师在修改模型时可能因为复制文件或软件版本升级等原因导致构件id变更,然而实际上并未发生设计变更,即构件id用于判断构件变更是不可靠。后来,有一些研究者提出通过对比模型a和模型b中各个构件的所有属性,分析未变更、新增、删除和修改的构件;但由于模型中构件数量较大,模型中可能存在数十万乃至上百万的构件,不同构件的属性的类别及复杂程度差别较大,很难通过计算机直接对比,且对比过程耗时随构件数量增加而指数级增长,无法在大型项目中应用。
因此,亟待提供一种bim模型中构件变更的快速检测方法。
技术实现要素:
针对不同版本bim模型中构件变更检测,采用人工检测效率低,采用构件id检测不可靠,采用构件所有属性检测耗时长等问题,本发明提供了一种bim模型中构件变更的快速检测方法。
为解决以上技术问题,本发明包括如下技术方案:
一种bim模型中构件变更的快速检测方法,包括如下步骤:
步骤1:根据构件属性计算模型a中的每一个构件的指纹码keyai,计算模型b中的每一个构件的指纹码keybj,i=1,2,…,m,j=1,2,…,n;其中,m为模型a中构件的数量,n为模型b中构件的数量;
步骤2:根据构件的指纹码对模型a和模型b中所有构件进行正序排列,形成模型a构件列表la={(idai,keyai)},模型b构件列表lb={(idbj,keybj)};其中,idai为模型a中第i个构件的识别码,idbj为模型b中第j个构件的识别码;
步骤3:依次遍历模型a构件列表la中每个构件;如果遍历未完成,进入步骤4;如果遍历完成,进入步骤6;
步骤4:依次遍历模型b构件列表lb中构件,判断其指纹码keybj是否等于keyai;
如果keybj等于keyai,转入步骤5;
如果keybj不等于keyai,判断keybj是否小于keyai;如果keybj小于keyai转入步骤4,反之转入步骤3;
步骤5:将idbj添加到未修改构件列表,将idai、idbj对应构件分别从模型a构件列表la和模型b构件列表lb中删除;转入步骤3;
步骤6:重新依次遍历模型a构件列表la中每个构件;
如果模型a构件列表la中构件遍历未完成,继续判定模型b构件列表lb中是否存在idbj等于idai的构件;若存在,转入步骤7;若不存在,转入步骤8;
如果模型a构件列表la中构件遍历完成,转入步骤9;
步骤7:将idbj添加到修改构件列表;将idbj构件从模型b构件列表lb中删除;转入步骤6;
步骤8:将idai添加到删除构件列表ld;转入步骤6;
步骤9:将模型b构件列表lb中剩余的构件的idbj添加到新增构件列表。
进一步,构件的指纹码为哈希码;对模型a中的每一个构件,根据构件属性计算构件的指纹码key,包括如下步骤:
步骤1.1:设置模型a的构件的初始指纹码key(i)=“”;其中i=1,2,…,m,m为模型a的构件数量;
步骤1.2:遍历模型a的第i个构件的所有非id属性prai;如果prai为简单属性,转到步骤1.3;如果prai为复杂属性转到步骤1.4;如果遍历完所有属性,转到步骤1.6;
步骤1.3:key(i)=key prai;转到步骤1.2;
步骤1.4:递归遍历prai中所有非id属性praij,如果praij为复杂属性转到步骤1.4,进行递归处理;如果praij为简单属性,转到步骤1.5;
步骤1.5:key=key praij;转到步骤1.4;
步骤1.6:根据构件属性计算构件的指纹码key,key=key.gethashcode();其中,gethashcode()为编程语言自带的字符串哈希码计算方法。
进一步,在模型a和模型b中,对未修改构件、修改构件、删除构件和新增构件进行区别显示。
本发明由于采用以上技术方案,使之与现有技术相比,具有以下的优点和积极效果:本发明提供的一种bim模型中构件变更的快速检测方法,通过将模型构件的构件id之外的简单属性和复杂属性一起转变为指纹码,通过指纹码识别出未经过修改的构件,由于指纹码为固定位数的数字或字符串,使计算机比对变得极其简单,提高了未经过修改的构件识别的准确性;剩余的构件为变更的构件,仅通过构件id即可识别出修改、新增、删除的构件,大大地提高了计算机的计算速度,并提高了识别的准确性。因此,本发明通过构件id及指纹码,按照指定步骤分别将模型a和模型b中的构件添加到未修改构件列表、修改构件列表、删除构件列表和新增构件列表,从而实现对bim模型中变更构件的快速检测。
附图说明
图1为本发明一种bim模型中构件变更的快速检测方法的流程图;
图2为本发明根据构件属性计算构件的指纹码key的流程图。
具体实施方式
以下结合附图和具体实施例对本发明提供的一种bim模型中构件变更的快速检测方法作进一步详细说明。结合下面说明,本发明的优点和特征将更清楚。需说明的是,附图均采用非常简化的形式且均使用非精准的比例,仅用以方便、明晰地辅助说明本发明实施例的目的。
如图1所示,本实施例提供的一种bim模型中构件变更的快速检测方法包括如下步骤:
步骤1:根据构件属性计算模型a中的每一个构件的指纹码keyai,计算模型b中的每一个构件的指纹码keybj,i=1,2,…,m,j=1,2,…,n;其中,m为模型a中构件的数量,n为模型b中构件的数量。
需要说明的是,本发明是针对一个建筑模型存在两个不同版本即模型a和模型b,需要判定在后的模型b中对在先的模型a中的哪些构件进行了变更。变更的方式包括修改、新增和删除。因此,模型a中的构件数量m与模型b中的构件数量n可能相等,也可能m大于n或m小于n。
另外需要说明的是,bim模型以构件为基本单位,构件是通过属性进行描述,构件属性包括构件id、简单属性和复杂属性,构件id为构件的识别码。简单属性是描述构件属性的最基本单元,不可再拆分,通常表现为数值或字符串,比如,c35、50cm、具体的坐标值等。复杂属性可以由几个简单属性构成,或由简单属性和下级复杂属性构成,或由几个下级复杂属性构成。作为举例,某一根梁的属性包括构件id、构件位置信息和构件组分,构件组分包括钢筋和现浇混凝土,现浇混凝土包括配合比和物理性能,物理性能包括抗压强度35mpa、屈服强度40mpa、拉伸强度2mpa等。其中,现浇混凝土的抗压强度35mpa、屈服强度40mpa、拉伸强度2mpa为简单属性,共同构成现浇混凝土的物理性能这一复杂属性;混凝土配合比为简单属性,现浇混凝土的物理性能和混凝土配合比组成现浇混凝土这一复杂属性;现浇混凝土和钢筋两个复杂属性共同组成构件组分这一复杂属性。若构件经过修改,构件id不变,但属性不同。若构件id之外的属性完全相同则构件未经变更。
根据构件属性计算得到的指纹码通常表现为一串字符或数字,常见的指纹码的形式有哈希码、sfp码(安全防陷害码)、ipp码(可确认父元码)、ta码(可跟踪码),下文中将以哈希码进行举例说明。不同构件的指纹码必然不同,同一个构件若经过修改导致构件属性变化则指纹码也必然改变,同一个构件若未经修改则必然相同。
步骤2:根据构件的指纹码对模型a和模型b中所有构件进行正序排列,形成模型a构件列表la={(idai,keyai)},模型b构件列表lb={(idbj,keybj)}。
将构件按指纹码进行正序排列,是为了简化后续判定的过程,提高判定速度。
步骤3:依次遍历模型a构件列表la中每个构件;如果遍历未完成,进入步骤4;如果遍历完成,进入步骤6。
遍历指按顺序逐一对构件按指定步骤进行操作,直到所有构件均按指定步骤操作完毕。所有构件均按指定步骤操作完毕,即为遍历完成。
步骤4:依次遍历模型b构件列表lb中构件,判断其指纹码keybj是否等于keyai;
如果keybj等于keyai,转入步骤5;
如果keybj不等于keyai,判断keybj是否小于keyai;如果keybj小于keyai转入步骤4,反之转入步骤3。
步骤5:将idbj添加到未修改构件列表;将idai、idbj对应构件分别从模型a构件列表la和模型b构件列表lb中删除;转入步骤3。
其中,步骤4中keybj等于keyai说明idbj未经过修改,直接将idbj添加到未修改构件列表,并将相应构件从构件列表la、lb中删除。步骤3至5,是为了挑选出模型b构件列表lb中未经过修改的构件,使构件列表la、lb中剩余的均是经过变更的构件。
步骤6:重新依次遍历模型a构件列表la中每个构件;
如果模型a构件列表la中构件遍历未完成,继续判定模型b构件列表lb中是否存在idbj等于idai的构件;若存在,转入步骤7;若不存在,转入步骤8;
如果模型a构件列表la中构件遍历完成,转入步骤9;
步骤7:将idbj添加到修改构件列表,将该构件从模型b构件列表lb中删除;转入步骤6;
步骤8:将idai添加到删除构件列表ld;转入步骤6;
步骤9:将模型b构件列表lb中剩余的构件的idbj添加到新增构件列表。
在步骤6中,idbj等于idai,而keybj不等于keyai,则说明构件列表la、lb中存在构件id相同、指纹码不同的构件,说明构件经过修改,将相应构件添加至修改构件列表,并将相应构件从构件列表la、lb中删除。构件列表la、lb中剩余的构件的构件id均不相同;id码只出现在构件列表la中的构件,表明该构件在模型b中被删除;id码只出现在构件列表lb中的构件,表明该构件为模型b中新增构件。
本发明提供的一种bim模型中构件变更的快速检测方法,通过将模型构件的构件id之外的简单属性和复杂属性一起转变为指纹码,通过指纹码识别出未经过修改的构件,由于指纹码为固定位数的数字或字符串,使计算机比对变得极其简单,提高了未经过修改的构件识别的准确性;剩余的构件为变更的构件,仅通过构件id即可识别出修改、新增、删除的构件,大大地提高了计算机的计算速度,并提高了识别的准确性。因此,本发明通过构件id及指纹码,按照指定步骤分别将模型a和模型b中的构件添加到未修改构件列表、修改构件列表、删除构件列表和新增构件列表,从而实现对bim模型中变更构件的快速检测。
优选为,构件的指纹码为哈希码;对模型a及模型b中的每一个构件,均需计算构件的哈希码,下面以模型a中的第i个构件的指纹码计算为例进行说明。根据构件属性计算构件的指纹码key,包括如下步骤:
步骤1.1:设置模型a的构件的初始指纹码key(i)=“”;其中i=1,2,…,m,m为模型a的构件数量;
步骤1.2:遍历模型a的第i个构件的所有非id属性prai;如果prai为简单属性,转到步骤1.3;如果prai为复杂属性转到步骤1.4;如果遍历完所有属性,转到步骤1.6;
步骤1.3:key(i)=key prai;转到步骤1.2;
步骤1.4:递归遍历prai中所有非id属性praij,如果praij为复杂属性转到步骤1.4,进行递归处理;如果praij为简单属性,转到步骤1.5;
步骤1.5:key=key praij;转到步骤1.4;
步骤1.6:根据构件属性计算构件的指纹码key,key=key.gethashcode();其中,gethashcode()为编程语言自带的字符串哈希码计算方法。
其中步骤1.3及步骤1.4均采用计算机程序中的迭代计算,迭代为计算机程序中基础内容,对迭代原理不进行赘述,仅对prai及praij表示的含义进行举例说明,prai表示第i个构件的简单属性,praij表示第i个构件的组成复杂属性的简单属性,简单属性通常表现为数字或字符串,直接添加至指纹码key中,组成指纹码的一个片段。
其中步骤1.4中涉及递归处理,是将复杂属性沿竖向进行分解,若分解后仍为复杂属性就继续进行分解;一旦出现简单属性就直接添加至指纹码中,并继续前面复杂属性的分解。复杂属性最终都拆分至简单属性praij,并添加至指纹码中。最后,key=key.gethashcode(),将指纹码转变为一串数字。当模型a、模型b中的所有构件均根据属性计算出指纹码后,判定两个构件的属性是否完全相同就转变成判定两个集合中是否存在大小相等的数字,使逻辑判定变得极其简单,且提高了判定的准确性,属性完全相同则必然为未变更构件,从而将未变更构件精准、快速地挑选出来。
进一步,在模型a和模型b中,对未修改构件、修改构件、删除构件和新增构件进行区别显示。比如,可根据未修改构件列表、修改构件列表、删除构件列表和新增构件列表中的构件id,在模型a和模型b中对不同类型的构件作出颜色区分。
以上所述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。
1.一种bim模型中构件变更的快速检测方法,其特征在于,包括如下步骤:
步骤1:根据构件属性计算模型a中的每一个构件的指纹码keyai,计算模型b中的每一个构件的指纹码keybj,i=1,2,…,m,j=1,2,…,n;其中,m为模型a中构件的数量,n为模型b中构件的数量;
步骤2:根据构件的指纹码对模型a和模型b中所有构件进行正序排列,形成模型a构件列表la={(idai,keyai)},模型b构件列表lb={(idbj,keybj)};其中,idai为模型a中第i个构件的识别码,idbj为模型b中第j个构件的识别码;
步骤3:依次遍历模型a构件列表la中每个构件;如果遍历未完成,进入步骤4;如果遍历完成,进入步骤6;
步骤4:依次遍历模型b构件列表lb中构件,判断其指纹码keybj是否等于keyai;
如果keybj等于keyai,转入步骤5;
如果keybj不等于keyai,判断keybj是否小于keyai;如果keybj小于keyai转入步骤4,反之转入步骤3;
步骤5:将idbj添加到未修改构件列表,将idai、idbj对应构件分别从模型a构件列表la和模型b构件列表lb中删除;转入步骤3;
步骤6:重新依次遍历模型a构件列表la中每个构件;
如果模型a构件列表la中构件遍历未完成,继续判定模型b构件列表lb中是否存在idbj等于idai的构件;若存在,转入步骤7;若不存在,转入步骤8;
如果模型a构件列表la中构件遍历完成,转入步骤9;
步骤7:将idbj添加到修改构件列表;将idbj构件从模型b构件列表lb中删除;转入步骤6;
步骤8:将idai添加到删除构件列表ld;转入步骤6;
步骤9:将模型b构件列表lb中剩余的构件的idbj添加到新增构件列表。
2.如权利要求1所述的检测方法,其特征在于,
构件的指纹码哈希码;对模型a中的每一个构件,根据构件属性计算构件的指纹码key,包括如下步骤:
步骤1.1:设置模型a的构件的初始指纹码key(i)=“”;其中i=1,2,…,m,m为模型a的构件数量;
步骤1.2:遍历模型a的第i个构件的所有非id属性prai;如果prai为简单属性,转到步骤1.3;如果prai为复杂属性转到步骤1.4;如果遍历完所有属性,转到步骤1.6;
步骤1.3:key(i)=key prai;转到步骤1.2;
步骤1.4:递归遍历prai中所有非id属性praij,如果praij为复杂属性转到步骤1.4,进行递归处理;如果praij为简单属性,转到步骤1.5;
步骤1.5:key=key praij;转到步骤1.4;
步骤1.6:根据构件属性计算构件的指纹码key,key=key.gethashcode();其中,gethashcode()为编程语言自带的字符串哈希码计算方法。
3.如权利要求1所述的检测方法,其特征在于,
在模型a和模型b中,对未修改构件、修改构件、删除构件和新增构件进行区别显示。
技术总结