基本体包括点(Point
)、线(Line
)、截面(Section
)、圆弧(Arc
)、立方体(Cube
)、放样(Loft
)、扫掠(Sweep
)、球(Sphere
)(球暂不支持三轴放大)等
旋转、平移、缩放以及放置
线性排布等
2.2.1 圆弧线:Arc
函数: Arc(角度)
示例:
from pyp3d import *
# 定义参数化模型
class 弧(Component):
# 定义各个参数及其默认值
def __init__(self):
Component.__init__(self)
# obvious 属性的可见性 True时可见,False为不可见。默认为False
# readonly 属性的只读性 True时不可调,为置灰状态,False为可调状态。默认为False
self['a轴长度'] = Attr(1000.0, obvious=True, readonly = False)
self['b轴长度'] = Attr(300.0, obvious=True)
self['弧'] = Attr(None, show=True)
self['旋转角度'] = Attr(0,obvious = True)
self['X'] = Attr(300.0, obvious=True)
self['Y'] = Attr(300.0, obvious=True)
self['Z'] = Attr(300.0, obvious=True)
self.replace()
@export
# 开始写模型
def replace(self):
# 在 def relpace(self)中,凡是self['']形式的变量,都会参与输出与绘制。
# 因此,请不要随便使用self['']来作为变量名,尽量在最终输出模型时以该形式作为变量名
# 设置变量,同时调用参数(简化书写过程)
L = self['a轴长度']
W = self['b轴长度']
x = self['X']
y = self['Y']
z = self['Z']
Angle = self['旋转角度']
# 绘制模型
self['弧'] = translate(x,y,z) * rotation(math.pi/180 * Angle) * scale(L,W) * Arc(math.pi*2)
# 输出模型
if __name__ == "__main__":
FinalGeometry = 弧()
place(FinalGeometry)
代码2.2-1 圆弧线示例

示例中所包含的函数:
Arc | 圆弧线函数 | color | 颜色参数 |
---|
示例中,第一行为引用pyp3d工具包,每个脚本的开头都应当引用所需使用的工具包。(后文中所有示例中默认首行已引用pyp3d)
Arc创建的是单位圆弧(半径为单位1的圆弧)。Arc只需要填写角度,即可创建一个单位圆弧。如Arc(pi*2),即为创建一个单位圆。示例中填写的角度值为1.5,则会创建一个半径为1的3/4个圆弧。
Arc的默认绘制起点为X轴上,即圆心为(0,0,0),起点为(1,0,0),绘制方向为逆时针绘制,遵循右手定则。
右手定则:
右手食指到小指四指握拳,大拇指伸出(“点赞”造型)。大拇指指向为旋转轴指向,四指握拳方向为旋转的正方向。即当右手握拳放于桌面上是,大拇指朝上,此时拇指指向为Z轴正方向,桌面为XY平面,旋转方向为逆时针。
三点画弧:
Arc函数可以实现三点画弧功能。只需要将原有的角度值改为三个点即可。这三个点分别为弧线的起点,弧线中任意一点和弧线终点即可。
示例:
from pyp3d import *
# 圆弧线-三点画弧
# 函数名 Arc
# 参数:圆弧角度(弧度制)
# 定义参数化模型
class 弧(Component):
# 定义各个参数及其默认值
def __init__(self):
Component.__init__(self)
self['弧'] = Attr(None, show=True)
self.replace()
@export
# 开始写模型
def replace(self):
# 绘制模型
self['弧'] = Arc(Vec3(0,0,0), Vec3(100,100,0), Vec3(0,200,0)).color(1,0,0,1)
# 输出模型
if __name__ == "__main__":
FinalGeometry = 弧()
place(FinalGeometry)
代码2.2-2
color函数:
color
函数包括了颜色和不透明度。color
中的四组数字分别代表R(红),G(绿),B(蓝)和不透明度。其中R,G,B的取值范围是0到1(对应0到255),不透明度的取值是0到1,数字越大,不透明度越高(透明度越低),当不透明度为0时,构件会在P3D的光照下呈白色和灰色。当不输入颜色时,输出默认颜色,为白色不透明。
place函数:
place函数为放置纯几何体,即需要在BIMBase中手动使用鼠标左键选择布置位置。
通常,非参数化建模过程中,只需要使用create_geometry
和place
中的一个即可,不需要同时使用这两个函数。
2.2.2 立方体:Cube
Cube中同样不需要填充任何参数,它本身是创建一个棱长为1的单位立方体。
示例:
from pyp3d import *
class 立方体(Component):
def __init__(self):
Component.__init__(self)
self['长'] = Attr(1000.0, obvious=True)
self['宽'] = Attr(1000.0, obvious=True)
self['高'] = Attr(1000, obvious = True)
self['立方体'] = Attr(None, show=True)
self['旋转角度'] = Attr(0,obvious = True)
self['X'] = Attr(0.0, obvious=True)
self['Y'] = Attr(0.0, obvious=True)
self['Z'] = Attr(0.0, obvious=True)
self.replace()
@export
def replace(self):
L = self['长']
W = self['宽']
H = self['高']
x = self['X']
y = self['Y']
z = self['Z']
Angle = self['旋转角度']
TestCube = translate(x,y,z) * rotation(math.pi/180 * Angle) * scale(L,W,H) * Cube()
self['立方体'] = TestCube
if __name__ == "__main__":
FinalGeometry =立方体()
place(FinalGeometry)
代码2.2-3 立方体示例
2.2.3 缩放函数:Scale
如果想要创建一个非单位大小的圆弧、立方体等,可以利用scale
函数来实现。Scale
函数可以装填不同的参数。Scale
和要被作用的几何体用乘号相连,乘号表示作用于。用法为Scale * 变量名
示例1:
整体缩放:只装填一个数字a。此时会将被作用的变量(几何体)沿着x,y,z方向同时扩大为原来的a倍。适用全部几何体。
testArc = scale(100) * Arc(pi*1.5).color(1,0,0,1)

图2.1.2-1 放大100倍前后对比
示例2:
平面缩放:在scale中输入两个数值a、b,此时会将被作用的几何体沿X轴方向扩大为原来的a倍、沿Y轴方向扩大为原来的b倍。该方法适用于二维几何体,如Arc、Line等。
testArc = scale(100,50) * Arc(pi*1.5).color(1,0,0,1)

图2.1.3-1 放大(100,50)倍前后对比
示例3:
三轴缩放:输入三组数字a、b、c,此时会将被作用的几何体沿xyz轴分别扩大a、b、c倍。(注:球体暂不支持三轴不同数值缩放)
testcube = scale(500,200,400) * Cube()

图2.1.3-2
2.2.4 线:Line
线,可以是纯二维平面的线,也可以是三维空间内的线。
纯二维平面的线输入的坐标为Vec2,表示二维平面矢量(二维平面坐标),只需要输入XY值。
三维的线输入的坐标为Vec3,表示三维空间矢量(三维坐标),需要输入XYZ的值。
注意,Vec3
和Vec2
不能混用。
示例:
testLine3D = Line(Vec3(0,0,0),Vec3(100,0,25),Vec3(0,100,50),Vec3(100,100,75)).color(1,0,0,1)
testLine2D = Line(Vec2(0,0),Vec2(100,0),Vec2(0,100),Vec2(100,100)).color(0,0,1,1)

图2.1.4-1 图中蓝色为二维线,红色为三维线
```python testLine3D = Line(Vec3(0,0,0),Vec3(100,0,25),Vec3(0,100,50),Vec3(100,100,75)).color(1,0,0,1) testLine3D = scale(10,1,1)*testLine3D ```

图2.1.4-2
2.2.5 截面 Section
Section
可以装填Vec2
(作为点),Line
,Arc
等, 不可传入Vec3
。会依次连接传入的点、线、弧等二维几何体。装填的Line
中不得出现Vec3
。
注意,弧线会自动补全为所在平面变成弓形。
示例:
testsection = Section(Vec2(100, -100),scale(100) * Arc(0.5*pi), Vec2(-100,100), Vec2(-100, -100))

图2.1.5-1
2.2.6 扫掠体 Sweep
扫掠体函数
示例1:
# 描述截面
testsection = Section(Vec3(100,-100,0), scale(100) * Arc(0.5*pi), Vec3(-100,100,0), Vec3(-100,-100,0))
# 描述轨迹
testline = Line(Vec3(0,0,0), Vec3(500,500,500))
# 扫略
testsweep = Sweep(testsection, testline)

图2.1.6-1
其中,如上文所讲,截面可以装填点(`Vec3`),线(`Line`)和弧(`Arc`)。
界面路径,也是扫掠轨迹,可以装填线(`Line`)和弧(`Arc`)。
示例2:
r = 90
sectionOut = translation(200,0,0) * rotate(Vec3(1,0,0), 0.5*pi) * Section(Vec2(0,0), Vec2(100,0), Vec2(100,100), Vec2(0,100))
section_1 = translation(200,0,0) * rotate(Vec3(1,0,0), 0.5*pi) * Section(Vec2(80,80), Vec2(60,80), Vec2(60,60), Vec2(80,60))
section_2 = translation(200,0,0) * rotate(Vec3(1,0,0), 0.5*pi) * Section(Vec2(50,50), Vec2(20,50), Vec2(20,20), Vec2(50,20))
line = Line(Arc(r*pi/180))
sweep = Sweep(sectionOut - section_1 - section_2 , line) #

图2.1.6-2
同时,装填`Arc`时,仅表示截面的旋转角度,不表示截面运动的弧线轨迹。因此请先将截面根据半径移动后,再进行`Sweep`。
2.2.7 放样体 Loft
在放样体中,需要放入多个截面Section
(至少放入两个),且截面需要保证线和弧线要在数量和位置上均保持对应关系。
示例1:
# 描述截面
testarc = Section(scale(100,100)*Arc(2*pi))
# 放样
testloft_arc = Loft(testarc, scale(0.5)*translate(0,0,100) * testarc, rotation(0.5*pi)*translate(0,0,300)*scale(0.5) * testarc)

图2.1.7-1
示例2:
# 描述截面
section = Section(Vec2(100,-100), scale(100) * Arc(0.5*pi), Vec2(-100,100), Vec2(-100,-100))
# 放样
testloft = Loft(section, scale(0.5)*translate(0,0,100) * section, rotation(0.5*pi)*translate(40,0,300) * section)

图2.1.7-2
再次强调,需要注意的是截面在装填时需要保持弧对弧,线对线,点对点。即如果有一个截面是有弧线的,那其他的截面也需要对应的有弧线。
不可以出现平面A、B中线、点、弧的数量不一致的情况。
不可出现平面A中有弧线,平面B中无弧线等类似情况。
可以将平面A旋转、缩放、平移后得到平面B。
2.2.8 球 Sphere
球只能三轴同时放大,因此可以有两种缩放的装填形式。球暂时不支持三轴不等长放大。
示例:
testsphere = scale(200,200,200) * Sphere()
testsphere = scale(200) * Sphere()

图2.1.8-1
2.2.9 圆柱体 Cone
函数:Cone(centerA, centerB, radiusA, radiusB)
表2.3.2 圆锥/圆台函数的参数和含义
参数名称 | 参数含义 | 参数名称 | 参数含义 |
---|---|---|---|
centerA | 底面A的圆心坐标 | centerB | 底面B的圆心坐标 |
radiusA | 底面A的半径 | radiusB | 底面B的半径 |
示例:
Testcone = Cone(Vec3(10000,0,0),Vec3(10000,0,2000),1000,1000).color(1,0,0,0.3)
其含义为创建一个圆锥/圆台,变量名为Cone1
,且当底面A、B半径一致时,生成圆柱。该圆柱底面坐标原点为(0,0,0),顶面原点为(0,0,2000)。底面半径分别为1000mm,1000mm,高度则是由底面A、B原点z方向的高度差确定的2000mm。


圆锥台的轴心是由底面A、B的坐标确定的,因此理论上可以生成任意方向上的圆锥台。
2.2.10 四棱台 Box
函数:Box(baseOrigin, topOrigin, vectorX, vectorY, baseX, baseY, topX, topY)
四棱台函数的参数及含义
参数名称 | 参数含义 | 参数名称 | 参数含义 |
---|---|---|---|
baseOrigin | 底部原点 | topOrigin | 顶部原点 |
vectorX | 局部坐标系基矢 | vectorY | 局部坐标系基矢 |
baseX | 局部坐标系下底部x方向的长度 | baseY | 在局部坐标系下底部y方向的长度 |
topX | 在局部坐标系下顶部x方向的长度 | topY | 在局部坐标系下顶部y方向的长度 |
color | 颜色&不透明度。前三位为颜色,第四位为不透明度。 |
示例:
Textbox = Box(Vec3(0,0,0), Vec3(0,0,3000), Vec3(1,0,0), Vec3(0,1,0), 3000, 5000, 3000, 5000).color(1,1,0,0.5)
该四棱台底面坐标原点为(0,0,0),顶面原点为(0,0,3000)。其局部坐标的基准平面是由向量(1,0,0)和向量(0,1,0)所组成的XY平面。底面长宽分别为3000mm,5000mm,顶面长宽分别为3000mm,5000mm,高度则是由顶面底面原点z方向的高度差确定的2000mm

2.2.11 圆角管 FilletPipe
函数: FilletPipe(points, filletRadius, pipeRadius):
表2.4.1 圆角管函数的参数及含义
参数名称 | 参数含义 | 参数名称 | 参数含义 |
---|---|---|---|
points | 控制点/拐点 | filletRadius | 弯折半径 |
pipeRadius | 管半径 |
控制点(拐点)和弯折半径是两个列表,需要用方括号将拐点和弯折半径括起来。
弯折半径的数量必须与控制点数量一致。弯折半径列表中的第一个和最后一个元素填写0。其他位置的弯折半径必须大于管半径,否则在布尔等操作时会无法正常进行。
示例:
a1 = FilletPipe([Vec3(0,0,0),Vec3(10000,0,0),Vec3(10000,0,5000),Vec3(20000,0,0)], [0,500,500,0], 200).color(1,1,0,1)
在本示例中,一共有四个控制点,管弯曲的时候,其曲率半径均为50mm(注意,起点和终点对应的管半径filletRadius直接填写为0)。管本身的半径为20mm。其实际模型如下图所示:

2.2.12 样条线 待更新
SplineCurve(ctrlPoints=[], discNum=0, orderK=2, splineType='quasi')<br />
控制点列表 离散数量 方程最高阶数 样条线类型