发明内容
为解决现有技术中存在的不足,本发明的目的在于解决上述缺陷,进而提出一种基于BIM平台考试开发方法与系统。
本发明采用如下的技术方案。
本发明第一方面公开了一种基于BIM平台考试开发方法,包括如下步骤:
步骤1,获取每一个BIM对象的所有构件的信息,每一个构件的信息至少包括:构件类型与三维坐标;
步骤2,依次判断每一个未被删掉的构件
:找出其他BIM对象中与
空间关系一致的其他构件;并根据
与其他构件所属的BIM对象,将
插入预设的多个链表中,并删掉
与其他构件;其中,预设的多个链表的数量为
,
为BIM对象的数量;
步骤3,根据预设的多个链表,对BIM对象进行建模与渲染,并最终显示在考试页面上。
本发明第二方面公开了一种基于BIM平台考试开发系统,包括:BIM模块与逻辑计算模块;
逻辑计算模块用于获取每一个BIM对象的所有构件的信息,每一个构件的信息至少包括:构件类型与三维坐标;以及
依次判断每一个未被删掉的构件
:找出其他BIM对象中与
空间关系一致的其他构件;并根据
与其他构件所属的BIM对象,将
插入预设的多个链表中,并删掉
与其他构件;其中,预设的多个链表的数量为
,
为BIM对象的数量;
BIM模块用于根据预设的多个链表,对BIM对象进行建模与渲染,并最终显示在考试页面上。
本发明的有益效果在于,与现有技术相比,本发明具有以下优点:
(1)当选择题的选项所对应的BIN对象大致相同时,本发明的方法提高了页面的刷新速率。
(2)本发明对极端情况进行了校验,防止因为坐标误差对BIM对象的相似性判断造成误判,避免造成性能浪费。
具体实施方式
下面结合附图对本申请作进一步描述。以下实施例仅用于更加清楚地说明本发明的技术方案,而不能以此来限制本申请的保护范围。
本段首先对BIM进行说明,BIM的原理与3D图形学的原理基本上是一致的。最终,通过BIM所展现出的图片是通过3D场景“拍摄”出来的。因此,其基本要经历3个步骤:首先是建模,即建立场景;其次是渲染,即基于拍摄生成图像;最后是显示。其中,建立场景的过程是创造性的,艺术的过程,可以类比为实际的物理现实。而渲染与显示则主要以计算为主。可以理解的是,一旦场景建立起来,剩下的渲染与显示则是水到渠成的。
需要注意的是,本发明所使用的BIM平台基于revit软件开发得到。revit是一种基于面向对象的语言,族库是该软件的关键所在。相对于其他的软件,revit接口更加严谨,对新手更加友好。因此,其再建立场景时所需花费的时间也较长。
在BIM平台考试开发系统中,当用户刷新到新的页面时,如图1所示,由于该新页面对应的BIM对象数量较多,且BIM对象的建模过程较为耗时,页面会出现卡顿的情形。
考虑到考试系统中,选择题中各个选项的BIM对象存在高度的一致性,本发明公开了一种基于BIM平台考试开发方法,如图3所示,对BIM对象的建模过程进行了优化。该方法可以包括如下步骤:
步骤1,获取每一个BIM对象的所有构件的信息,每一个构件的信息至少包括:构件类型与三维坐标。
需要说明的是,本发明的BIM基于revit软件开发得到。考虑到revit面向对象的特性,因此,构件类型可以指的是revit族库内的某个类(class)名,也可以是研发人员自己开发出的某个类(class)名。说明:正常情况下,研发人员会对revit族库内的某个基类或继承类,进行二次开发,得到一个新的继承类。注意,本发明中所指的构件类型是需要区分基类与继承类的。
其中,三维坐标是所有类的标准接口,在对象实例化后必须给出具体的数值。
步骤2,依次判断每一个未被删掉的构件
:找出其他BIM对象中与
空间关系一致的其他构件;并根据
与其他构件所属的BIM对象,将
插入预设的多个链表中,并删掉
与其他构件;其中,预设的多个链表的数量为
,
为BIM对象的数量。
这里需要说明的是,若某个构件已经被删掉,则无需进入步骤2重复判断。在本发明中,由于选择题通常是4个选项,因此
可以取4,
一般不超过5。
具体的,步骤2中根据
与其他构件所属的BIM对象,将
插入预设的多个链表中,具体包括:
步骤2.3,清空所有标记。
由于步骤2本质上是一个多次迭代的过程,因此,每一次迭代结束需要将本次迭代的标记进行清空。
步骤3,根据预设的多个链表,对所有BIM对象进行建模与渲染,并最终显示在考试页面上。
在本发明的第一实施例中,在执行步骤2之前,步骤1结束后还可以步骤S11~S12。
步骤S11,确定至少4个基准构件,使得满足在所有的BIM对象中,所有基准构件的相对位置一致。
需要说明的是,步骤S11中相对位置一致,其含义是,首先所有的BIM对象中均包含该至少4个基准构件,并且,将任意的BIM对象的四个基准构件的三维坐标进行一定的空间变换(例如:平移或转动)必然等于另一个BIM对象的四个基准构件的三维坐标。
优选的,基准构件的数量为4,且4个基准构件不能近乎在同一个平面上。
步骤S12,根据至少4个基准构件,确定每一个BIM对象的坐标偏移量与方向偏移量。
同时,在本发明的第一实施例中,步骤2中判断每一个未被删掉的构件
:找出其他BIM对象中与
空间关系一致的其他构件,可以具体包括步骤S21~S22。
步骤S21,判断每一个未被删掉的构件
,并获取x所属的BIM对象
。
步骤S22,依次判断除了
之外的其他BIM对象
,根据
的坐标偏移量与方向偏移量以及
的坐标偏移量与方向偏移量,计算出
在中对应的三维坐标是否存在与
相同类型的构件
,若存在
,则
为其他BIM对象中与
空间关系一致的其他构件。
然而需要注意的是,在本发明的第一实施例中,考虑到BIM模型中,三维坐标通常是非实数的,并且由于步骤S12中需要对每一个构件的坐标进行矩阵变换,计算量颇为繁复。更为重要的是,revit中并没有提供一个接口,能够输入三维坐标同时输出该坐标下是否存在一个构件。因此,步骤S22需要在判断每一个构件时,要将所有其他的构件的坐标均进行一次坐标变换计算。这显然是不合理的。基于上述缺陷,在本发明第二实施例中,在执行步骤2之前,步骤1结束后还可以步骤T11~T13。
步骤T11,确定至少4个基准构件,使得满足在所有的BIM对象中,所有基准构件的相对位置一致。
步骤T12,根据至少4个基准构件,确定统一的空间划分方法,并记录在映射表中,映射表的数量为M个,且每一个映射表关联一个BIM对象。
需要说明的是,确定统一的空间划分方法其具体过程可以是:将三维空间按照预设的等间距划分为多个立方格,并对所有包含有至少一个BIM构件的立方格进行存储。例如,可以用步骤T12的映射表进行存储,并以该立方格的中心点作为该映射表的键。
上文中预设的等间距可以按照将立方格划分成1000份来设置,因此,可以随便选取一个坐标轴,例如x轴,找出一个BIM对象中构件的三维坐标的x的最大值以及x的最小值,将二者相减除以10即可。
同时,在第二实施例中,步骤2可以具体包括步骤T21~T22。
步骤T21,对每一个BIM对象,对该BIM对象内的每一个构件,根据该构件的三维坐标,确定该BIM对象关联的映射表的键,并根据该构件的构件类型,更新该键对应的值。
具体的,步骤T21中,根据该构件的构件类型,更新该键对应的值,可以如下式所示:
其中,
为更新后该键对应的值,
为更新后该键对应的值,
为构件类型关联的类型值,
为预设的素数,为取余符号。应当确保
足够大。
在一些实施例中,构件类型关联的类型值可以是构件的共有的任意一个静态函数的地址。
步骤T22,再次对每一个BIM对象的每一个构件进行判断,根据该构件的信息,计算出该构件的键
以及获取该BIM对象关联的映射表
,若已被标注,返回步骤T22对下一个构件进行判断;否则,对其他所有的映射表
依次进行判断,若
,则对
进行标注;待所有其他的映射表判断结束,将该构件插入编号为
的链表中:
其中,
,
均表示映射表的编号,
,
均为键
在映射表
,
中对应的值,若
被标记,则
;否则
。
由于映射表与BIM对象是一一关联的,因此,映射表的编号本质上也就是BIM对象的编号。
在一些特殊情况下,在步骤T21中,根据该构件的三维坐标,确定该BIM对象关联的映射表的键,往往会存在偏差。这是因为该构件的三维坐标往往是有理数,并非整数。这就可能导致处于立方格边界处的构件被误算。因此,在一些实施例中,步骤T22还包括:
若
,获取至多26个与
相邻的键,若26个与相邻的键中恰好只存在一个
满足
,其中,符号
表示不等于;则对下面的条件表达式进行判断:
可以理解的是,若
,则26个与
相邻的键分别是
,其中,
可取
,
,
;
可取
,
,
;
可取
,
,
,
为预设的等间距。
在一些特殊情况下,有的构件的三维坐标往往是不准确的,甚至是错误的。此处首先需要对revit进行说明,构件可以分为主体构件与连接件。连接件指的是用于连接主体构件的小零件,根据BIM对象的不同,可以指的是螺钉、轴承、钢筋等物体,主体构件则是除了连接件之外的其他构件,是构成BIM对象的基本构件。可理解的,连接件至少连接2个主体构件,因此,其内部的函数可以提供输出该2个主体构件的接口,正因如此,连接件的三维坐标往往意义不大,这是因为即便其三维坐标标错了,只要连接的主体构件的位置是固定的,则连接件也不会在建模时出错。正因如此,出题人在实例化BIM对象时,为了偷懒,甚至于根本不标注连接件的三维坐标。为了解决该问题,在一些实施例中,步骤T21中,对该BIM对象内的每一个构件,根据该构件的三维坐标,确定该BIM对象关联的映射表的键,并根据该构件的构件类型,更新该键对应的值,可以具体包括步骤T211~T212。
步骤T211,对该BIM对象内的每一个构件,判断该构件是否为连接件。
步骤T212,若该构件不为连接件,根据该构件的三维坐标,确定该BIM对象关联的映射表的键,并根据该构件的构件类型,更新该键对应的值。
步骤T213,若该构件为连接件,获取该构件关联的所有的主体构件,并依次对关联的每一个主体构件执行:根据该主体构件的三维坐标,确定该BIM对象关联的映射表的键;获取该主体构件调用该连接件的静态函数,以该静态函数的地址更新该键对应的值。
可以理解的是,在该实施例中,一个连接件可能会更新好几个键的值,这取决于其主体构件的数量。此外,获取该主体构件调用该连接件的静态函数是为了防止重复,这是因为一个主体构件关联的相同类型的连接件可能有很多个,因此需要找到一个独有的数值,也就是该主体构件调用该连接件的静态函数作为对连接件三维坐标的替代,从而对该键对应的值进行更新。最后,更新该键对应的值的方法与步骤T212一致。
当用户需要对页面内某一个选项进行重新显示时,通常会点击该对象进行放大的动态显示,例如当考生点击B选项,此时会跳出放大的三维BIM对象,可以进行变换显示,如图2所示。因此,在一些实施例中,BIM对象至少包括:第一BIM对象与第二BIM对象,并且步骤3可以包括:
步骤3.1,对第一BIM对象进行建模、渲染与显示。
步骤3.2,分别获取第一BIM对象与第二BIM对象的编号
,
。
步骤3.3,获取所有与第一BIM对象关联且与第二BIM对象不关联的链表的编号
,以及获取所有与第一BIM对象不关联且与第二BIM对象关联的链表的编号
,其中
与
为分别满足下面条件表达式的所有的链表:
步骤3.4,删掉所有编号
的链表内的构件,并增加所有编号
的链表内的构件,从而完成对第二BIM对象的建模、渲染与显示。
相应的,本发明还公开了公开了一种基于BIM平台考试开发系统,包括:BIM模块与逻辑计算模块;
逻辑计算模块用于获取每一个BIM对象的所有构件的信息,每一个构件的信息至少包括:构件类型与三维坐标;以及
依次判断每一个未被删掉的构件
:找出其他BIM对象中与
空间关系一致的其他构件;并根据
与其他构件所属的BIM对象,将
插入预设的多个链表中,并删掉
与其他构件;其中,预设的多个链表的数量为
,
为BIM对象的数量;
BIM模块用于根据预设的多个链表,对BIM对象进行建模与渲染,并最终显示在考试页面上。
本发明申请人结合说明书附图对本发明的实施示例做了详细的说明与描述,但是本领域技术人员应该理解,以上实施示例仅为本发明的优选实施方案,详尽的说明只是为了帮助读者更好地理解本发明精神,而并非对本发明保护范围的限制,相反,任何基于本发明的发明精神所作的任何改进或修饰都应当落在本发明的保护范围之内。