BIMBase自从2021年发布以来获得了众多关心国产BIM和业务数字化转型的圈内老法师的关注,除了是国内首款完全自主知识产权的的BIMBase系统,实现建筑信息模型(BIM)关键核心技术自主研发安全可控。
同时开创了BIM X PYthon的技术跨界混搭风,得以让建模可以通过快速编程实现。
So!
BIMBase团队为了在功能和场景上
帮助大家了解BIMBase
学习建模小技巧
开设了技术专栏
【BIMBase之python建模宝典】
今日分享第八弹
前面已经教过大家一种创建三通管的方法了,俗话说的好,“条条道路通罗马”,今天再给大家介绍一种创建三通管的方法。方法没有好坏之分,只有适合与否,大家可以对比学习,选择适合自己的方法。废话不多说,咱直接上干货!
三通管构件
建模方法
BIMBase三通管建模
① 引用pyp3d和numpy,定义参数,变量赋值
from pyp3d import *
import numpy as np
class 三通管2(Component):
def __init__(self):
Component.__init__(self)
self['三通管2'] = Attr(None, show = True)
self['管口内径'] = Attr(20, obvious = True, group = '管口')
self['管壁厚'] = Attr(1, obvious = True, group = '管口')
self['管口长'] = Attr(25, obvious = True, group = '管口')
self['接口内径'] = Attr(28, obvious = True, group = '接口')
self['接口长'] = Attr(8, obvious = True, group = '接口')
self.replace()
@export
def replace(self):
pipe_InR = self['管口内径']
pipe_T = self['管壁厚']
pipe_H = self['管口长']
way_InR = self['接口内径']
way_H = self['接口长']
D = 100 # 管口距中心长度
N_sec = 5 # 管口间连接段离散数
pipe_exR = pipe_InR+pipe_T
way_exR = way_InR+pipe_T
N = 5 # 连接段截面离散数
② 管口部分和文章...创建方法相同,这里不再赘述。
③ 连接段侧表面:通过圆心角确定侧边连接段管壁外表面起点截面上一系列点,通过点生成曲线;类似的方法得到侧边连接段管壁内表面上的曲线以及两管口之间的曲线;通过sweep_surround_lines函数将上述所有曲线连接成为曲面,旋转得到所有管口连接段间的侧表面。
sweep_surround_lines函数是这部分的重点和难点,也是这种创建三通管方法的核心部分,这里详细介绍一下。sweep_surround_lines函数的入参是一组曲线,可以返回这组曲线围成的一个三维几何实体。效果如图。连接段侧表面代码
## 侧边连接段管壁外表面
centralAngle = 30/180*pi # 曲线对应的圆心角
point_1st = []
for i in linspace(-centralAngle/2, centralAngle/2, N):
point_1st.append(Vec3(way_exR*cos(i), pipe_H+way_H-D, way_exR*sin(i)))
pointR_1st = point_1st[::-1]
curveLine_1st = Line(SplineCurve(point_1st))
# sweep_surround_lines的外侧起始线
curveLine_1st_miry = roty(pi)*Line(SplineCurve(pointR_1st))
curveLine_3rd = rotz(2*pi/3)*curveLine_1st_miry
# sweep_surround_lines的外侧终点线
## 侧边连接段管壁内表面
pointIn_1st = []
centerAngle_in = pi/2 - acos(way_exR*sin(centralAngle/2)/way_InR)
for i in linspace(-centerAngle_in, centerAngle_in, N):
pointIn_1st.append(Vec3(way_InR*cos(i), pipe_H+way_H-D, way_InR*sin(i)))
pointInR_1st = pointIn_1st[::-1]
curveLineIn_1st = Line(SplineCurve(pointIn_1st))
# sweep_surround_lines的内侧终点线
curveLineIn_1st_miry = roty(pi)*Line(SplineCurve(pointInR_1st))
curveLineIn_3rd = rotz(2*pi/3)*curveLineIn_1st_miry
# sweep_surround_lines的内侧起始线
## 侧边连接段,sweep_surround_lines的内外侧中间线
P1 = point_1st[int(N/2)]
P2 = rotz(2*pi/3)*roty(pi)*P1
P = Vec3(0, 0, 0)
P_mir = MirrorPoint(P1, P2, P)
P_mir_length = sqrt(P_mir.x**2+P_mir.y**2+P_mir.z**2)
P_mir_unit = P_mir*(-1/P_mir_length)
V1 = P1-P_mir
V2 = P2-P_mir
theta = vectorialAngle(V1, V2)/N_sec
curveLine_2nd = []
curveLineIn_2nd = []
for j in range(1, N_sec):
curveLine_2nd.append(arbitrary_rotate(P_mir, Vec3(0, 0, 1), -theta*j)*curveLine_1st)
curveLineIn_2nd.append(trans(P_mir_unit)*arbitrary_rotate(P_mir, Vec3(0, 0, 1), -theta*j)*curveLine_1st)
curveLineInR_2nd = curveLineIn_2nd[::-1]
## 所有侧边连接段
curveFace_1st = sweep_surround_lines([curveLine_1st, *curveLine_2nd, curveLine_3rd, curveLineIn_3rd, *curveLineInR_2nd, curveLineIn_1st], )
curveFace_2nd = rotz(2*pi/3)*curveFace_1st
curveFace_3rd = rotz(-2*pi/3)*curveFace_1st
curveFace = Combine(curveFace_1st, curveFace_2nd, curveFace_3rd)
连接段侧表面一系列曲线 | 连接段侧表面 |
sweep_surround_lines函数 | |
④ 连接段上下表面:上下表面和侧表面的创建方法基本相同,通过圆心角得到系列点,将点连接得到曲线,分别得到内表面曲线、外表面曲线,通过sweep_surround_lines函数由曲线得到曲面,最后旋转得到所有管口间连接段的上下表面。连接段上下表面代码
# 连接段上下面
## 上下面连接段管壁外表面
capPoints_1st = [] # 顶部截面数据点集
point_1st = [] # 连接段上下截面数据点集
for i in linspace(centralAngle/2, pi/2, N):
point_1st.append(Vec3(way_exR*cos(i), pipe_H+way_H-D, way_exR*sin(i)))
capPoint_1st = point_1st[-1]
pointR_1st = point_1st[::-1]
arcLine_1st = Line(SplineCurve(point_1st))# sweep_surround_lines的外侧起始线
arcLine_1st_miry = roty(centralAngle/2-pi/2)*Line(SplineCurve(pointR_1st))
arcLine_3rd = rotz(2*pi/3)*arcLine_1st_miry# sweep_surround_lines的外侧终点线
## 上下面连接段管壁内表面
pointIn_1st = []
centerAngle_in = pi/2 - acos(way_exR*sin(centralAngle/2)/way_InR)
for i in linspace(centerAngle_in, pi/2, N):
pointIn_1st.append(Vec3(way_InR*cos(i), pipe_H+way_H-D, way_InR*sin(i)))
pointInR_1st = pointIn_1st[::-1]
arcLineIn_1st = Line(SplineCurve(pointIn_1st))# sweep_surround_lines的内侧终点线
arcLineIn_1st_miry = roty(centerAngle_in-pi/2)*Line(SplineCurve(pointInR_1st))
arcLineIn_3rd = rotz(2*pi/3)*arcLineIn_1st_miry# sweep_surround_lines的内侧起始线
## 上下面连接段,sweep_surround_lines的内外侧中间线
arcLine_2nd = []
arcLineIn_2nd = []
for j in range(1, N_sec):
arcLine_temp = arbitrary_rotate(P_mir, Vec3(0, 0, 1), -theta*j)*arcLine_1st
capPoint_temp = arbitrary_rotate(P_mir, Vec3(0, 0, 1), -theta*j)*capPoint_1st
arcLine_2nd.append(arcLine_temp)
capPoints_1st.append(Vec2(capPoint_temp.x, capPoint_temp.y))
arcLineIn_2nd.append(trans(P_mir_unit)*arcLine_temp)
arcLineInR_2nd = arcLineIn_2nd[::-1]
## 所有上下面连接段
arcFace_1st = sweep_surround_lines([arcLine_1st, *arcLine_2nd, arcLine_3rd, *arcLineInR_2nd])
arcFace_2nd = rotz(2*pi/3)*arcFace_1st
arcFace_3rd = rotz(-2*pi/3)*arcFace_1st
arcFaceTop = Combine(arcFace_1st, arcFace_2nd, arcFace_3rd)
arcFaceBottom = mirror("xy")*arcFaceTop
arcFace = Combine(arcFaceTop, arcFaceBottom)
连接段上表面一系列曲线 | 连接段上下表面 |
⑤ 顶面和底面:通过连接段上下表面边缘的点连接成线,将线转化为面,再用sweep函数将面转化为厚度为管壁厚的实体,移动复制得到顶面和底面
# 顶面和底面
capPoints_2nd = rotz(2*pi/3)*capPoints_1st
capPoints_3rd = rotz(-2*pi/3)*capPoints_1st
capSec = Section(Line(*capPoints_1st, *capPoints_2nd, *capPoints_3rd))
capTop = trans(0, 0, way_exR)*Sweep(capSec, Line(Vec3(0, 0, 0), Vec3(0, 0, -pipe_T)))
capBottom = mirror("xy")*capTop
cap2 = Combine(capTop, capBottom)
连接段边界点得到曲线 | 由弧线绘制截面 |
截面放样得到实体 | 组合 |
函数总结
BIMBase三通管建模
1. Cone:圆柱
2. Sweep:扫掠
3. rotx\roty\rotz\arbitrary_rotate:绕X轴旋转、绕Y轴旋转、绕Z轴旋转、绕任意轴旋转
4. Trans:平移
5. mirror:镜像
6. Combine:组合
7. linspace:线性排布
8. sweep_surround_lines:由多条线包围生成三维几何实体
9. SplineCurve:样条曲线
你更喜欢哪种方法呢,大家快动手试试吧!
| 留言与评论(共有 0 条评论) “” |