0.5.2.1 写法
首先,我们来看一下之前讲过的参数化模型写法与建筑基类写法的区别。


基类建模方式
接下来,我们来讲一下基类写法与普通写法的区别。
可以看到,基类方式建模在第一部分引用时,需要引用特定的python文件(库),同时,引用的python库(基类库)必须和当前模型文件在同一文件夹下。
在第二部分的前半部分中,定义class时,不再继承自`Component`,而是继承自引用的库文件中的某个基类。案例中需要创建一个平开门,因此继承自Door库中的平开门。此外,我们发现,在参数定义时,基类写法并没有定义参数;在后半部分的建模过程中,直接使用了一些参数。这里,我们先来看一下door.py里面有什么
from pyp3d import *
class 门(Component):
def __init__(self):
Component.__init__(self)
self.schemaName = "PBM_ArchiModel"
self.className = "PBArchiDoor"
self['Width'] = 900
self.W = 900
self['Height'] = 2100
self.H = 2100
self['BottomHeight'] = 0
self.BH = 0
self['FrameWidth'] = 50
self.FW = 50
self['FrameThick'] = 100
self.FT = 100
self['PaneThick'] = 50
self.PT = 50
self['GlassThick'] = 5
self.GT = 5
def __setitem__(self, key, val):
if key == '门宽':
Noumenon.__setitem__(self, 'Width', val)
elif key == '门高':
Noumenon.__setitem__(self, 'Height', val)
elif key == '门槛高度':
Noumenon.__setitem__(self, 'BottomHeight', val)
elif key == '门框宽度':
Noumenon.__setitem__(self, 'FrameWidth', val)
elif key == '门框厚度':
Noumenon.__setitem__(self, 'FrameThick', val)
elif key == '门板厚度':
Noumenon.__setitem__(self, 'PaneThick', val)
elif key == '玻璃厚度':
Noumenon.__setitem__(self, 'GlassThick', val)
else:
Noumenon.__setitem__(self, key, val)
def __getitem__(self, key):
if key == '门宽':
return Noumenon.__getitem__(self, 'Width')
elif key == '门高':
return Noumenon.__getitem__(self, 'Height')
elif key == '门槛高度':
return Noumenon.__getitem__(self, 'BottomHeight')
elif key == '门框宽度':
return Noumenon.__getitem__(self, 'FrameWidth')
elif key == '门框厚度':
return Noumenon.__getitem__(self, 'FrameThick')
elif key == '门板厚度':
return Noumenon.__getitem__(self, 'PaneThick')
elif key == '玻璃厚度':
return Noumenon.__getitem__(self, 'GlassThick')
else:
return Noumenon.__getitem__(self, key)
@property
def 门宽(self):
return self['Width']
@门宽.setter
def 门宽(self, W):
self['Width'] = W
@property
def 门高(self):
return self['Height']
@门高.setter
def 门高(self, H):
self['Height'] = H
@property
def 门槛高度(self):
return self['BottomHeight']
@门槛高度.setter
def 门槛高度(self, BH):
self['BottomHeight'] = BH
@property
def 门框宽度(self):
return self['FrameWidth']
@门框宽度.setter
def 门框宽度(self, FW):
self['FrameWidth'] = FW
@property
def 门框厚度(self):
return self['FrameThick']
@门框厚度.setter
def 门框厚度(self, FT):
self['FrameThick'] = FT
@property
def 门板厚度(self):
return self['PaneThick']
@门板厚度.setter
def 门板厚度(self, PT):
self['PaneThick'] = PT
@property
def 玻璃厚度(self):
return self['GlassThick']
@玻璃厚度.setter
def 玻璃厚度(self, GT):
self['GlassThick'] = GT
class 平开门(门):
def __init__(self):
门.__init__(self)
self['国标编码'] = '90-01.04.01'
class 推拉门(门):
def __init__(self):
门.__init__(self)
self['国标编码'] = '14-10.20.09.12'
class 卷帘门(门):
def __init__(self):
门.__init__(self)
self['国标编码'] = '14-10.20.09.15'
class 防火门(门):
def __init__(self):
门.__init__(self)
self['国标编码'] = '14-10.20.09.19'
我们可以看到,整个door.py文件中,定义门宽、门高、门板厚度等7个参数;同时定义了多个class,包括卷帘门、防火门、平开门等
因此,我们在创建属于Door这个库中所定义的类别的门时,就可以使用基类写法,在定义部分就设置好继承自谁;在定义参数时,如果这个参数属于Door中已经定义的部分,务必直接使用(可以在第二部分的后半部分重新起个变量名)


例如我们的案例(上图),就是需要创建一个平开门,平开门是Door.py里已经定义的门类别,那就需要在定义的时候选好继承。同时,在这个模型中,使用Door.py中提供的参数已经能满足我们的需要,因此我们不需要创建其他额外参数。如果有其他参数需要定义,请在模型文件内按照通常写法定义即可。
请注意,基类库文件不得擅自修改。即无论何时,务必不要修改或增加、删除引用的基类库文件(如Door.py)中的参数和分类。
当我们以建筑基类方式完成一个构件后,我们的这个构件就可以在建筑专业下使用,并且实现和建筑原有模型的交互了。
0.5.2.2 建筑基类分类
建筑基类 | 库类 | 类别(父类) | 具体类别(子类) | 已有参数 |
建筑板 | Slab | 板 | 无 | 无 |
建筑场地 | Site | 场地 | 无 | 场地厚度 |
建筑窗 | Window | 窗 | 单扇窗 | 窗宽 |
推拉窗 | 窗高 | |||
组合窗 | 窗台高度 | |||
百叶窗 | 窗框宽度 | |||
固定窗 | 窗框厚度 | |||
玻璃厚度 | ||||
建筑栏杆 | Railing | 栏杆 | 无 | 无 |
建筑梁 | Beam | 梁 | 无 | 无 |
建筑楼梯 | Stair | 楼梯 | 无 | 楼梯高度 |
楼梯总宽 | ||||
建筑门 | Door | 门 | 平开门 | 门宽 |
推拉门 | 门高 | |||
卷帘门 | 门槛高度 | |||
防火门 | 门框宽度 | |||
门框厚度 | ||||
门板厚度 | ||||
玻璃厚度 | ||||
建筑幕墙 | CurtainWall | 幕墙 | 无 | 无 |
建筑坡道 | Ramp | 坡道 | 无 | 坡道宽度 |
坡道长度 | ||||
坡道高度 | ||||
坡道坡度 | ||||
建筑墙 | Wall | 墙 | 无 | 墙体厚度 |
建筑台阶 | Step | 台阶 | 无 | 踏面宽度 |
踢面总数 | ||||
踢面高度 | ||||
平台深度 | ||||
平台宽度 | ||||
建筑屋顶 | Roof | 屋顶 | 无 | 结构厚度 |
建筑柱 | Column | 柱 | 圆柱 | 长度 |
矩形柱 | 宽度 | |||
柱高 |