基本体包括点(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_geometryplace中的一个即可,不需要同时使用这两个函数。

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的值。

注意,Vec3Vec2不能混用。

示例:

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 图中蓝色为二维线,红色为三维线
同样,Line也支持缩放函数。
```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
`Sweep`中需要装填截面和截面路径两个参数
其中,如上文所讲,截面可以装填点(`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
需要注意,`Sweep`中装填的`Line`,只能为一段圆弧和一个两点组成的直线段,不能装填多段线,不能装填线、弧结合的`Line`。
同时,装填`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
`Loft`函数中,可以装填多个截面,`Loft`会根据装填顺序依次将这多个截面连接扫掠,形成一个完整的几何体。
再次强调,需要注意的是截面在装填时需要保持弧对弧,线对线,点对点。即如果有一个截面是有弧线的,那其他的截面也需要对应的有弧线。
不可以出现平面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 />

控制点列表 离散数量 方程最高阶数 样条线类型