BIMBase之python建模寶典莫比烏斯環(BIMBase之python建模寶典莫比烏斯環)
2023-10-07 15:15:46 1
BIMBase自從2021年發布以來獲得了眾多關心國產BIM和業務數位化轉型的圈內老法師的關注,除了是國內首款完全自主智慧財產權的的BIMBase系統,實現建築信息模型(BIM)關鍵核心技術自主研發安全可控。
同時開創了BIM X python的技術跨界混搭風,得以讓建模可以通過快速編程實現。
So!
BIMBase團隊為了在功能和場景上
幫助大家了解BIMBase
學習建模小技巧
開設了技術專欄
【BIMBase之python建模寶典】
今日分享第十四彈
莫比烏斯帶(德語:Möbiusband),又譯梅比斯環、莫比烏斯環或麥比烏斯帶,是一種只有一個面(表面)和一條邊界的曲面,也是一種重要的拓撲學結構。它是由德國數學家、天文學家莫比烏斯和約翰·李斯丁在1858年獨立發現的。
這個結構可以用一個紙帶旋轉半圈再把兩端粘上之後輕而易舉地製作出來。事實上有兩種不同的莫比烏斯帶鏡像,他們相互對稱。如果把紙帶順時針旋轉再粘貼,就會形成一個右手性的莫比烏斯帶,反之亦類似。
今天就和大家分享一下如何創建莫比烏斯環模型。
圖文教程
BIMBase圓端形橋墩
① 定義參數化模型並定義各個參數及其默認值
from pyp3d import *
class 莫比烏斯環(Component):
def __init__(self):
Component.__init__(self)
self['莫比烏斯環'] = Attr(None, show = True)
self['截面離散數'] = Attr(360, obvious = True, group = '莫比烏斯環')
self['環半徑'] = Attr(500.0, obvious = True, group = '莫比烏斯環')
self['旋轉次數(一次180°)'] = Attr(3, obvious = True, group = '莫比烏斯環')
self.replace
② 設置變量並調用參數(簡化書寫)
@export
def replace(self):
n = self['截面離散數']
R = self['環半徑']
turns = self['旋轉次數(一次180°)']
③ 繪製模型
➤ 方法一:利用線性排布與放樣創建模型
1. 建立截面並初始化列表
利用Section函數傳入Vec2(作為點)以創建正方形截面,並將該截面繞x軸旋轉90°得到初始截面記sec1,並將secs定義為含n個sec1的列表。對應代碼如下:
sec1 = rotx(pi/2) * Section(Vec2(50, 50), Vec2(-50, 50), Vec2(-50, -50), Vec2(50, -50))
secs = [sec1]*n
2. 線性排布、放樣、平滑處理
利用for循環與zip、range、linspace、append等函數實現對截面的線性排布。該過程共排布n個截面,該n個截面繞z軸依序共逆時針旋轉,同時繞y軸依序共順時針旋轉的turns倍,由於linespace輸出包含首尾點位,因此上述旋轉角度均需乘以(n-1)/n倍。每個點位的截面由初始截面繞y、z軸旋轉相應角度然後沿x、y軸分別平移至相應位置獲得。當旋轉次數為偶數時,將初始截面追加入secs列表;當旋轉次數為奇數時,則將初始截面繞y軸順時針旋轉半周並沿x軸正方向平移R個單位,然後追加入secs列表。最後,對secs放樣並平滑處理。
對應代碼如下:
for i,thetaZ,thetaY in zip(range(n), linspace(0,2*pi/n*(n-1), n), linspace(0,turns*pi/n*(n-1), n)):
secs[i] = trans(R*cos(thetaZ), R*sin(thetaZ), 0)*rotz(thetaZ)*roty(-thetaY)*secs[i]
if turns%2==0:
secs.append(secs[0])
else:
secs.append(trans(R, 0, 0)*roty(-pi)*sec1)
mobiusBand = Loft(*secs)
mobiusBand.smooth=True
➤ 方法二:利用sweep_mubiu_arc快速創建
在方法一中,莫比烏斯環的創建涉及到多種函數與語句的嵌套,費時費力,對Python基礎薄弱的用戶並不友好。為解決這一問題,新版本中推出了sweep_mubiu_arc函數,可以幫助用戶快速創建莫比烏斯環,節省了建模思路上耗費的時間,一步到位!
在方法二中,只需利用Section函數傳入Vec2(作為點)創建正方形截面,然後再使用sweep_mubiu_arc函數即可快速創建莫比烏斯環。sweep_mubiu_arc函數需要傳入初始截面、環半徑以及0.5倍旋轉次數。對應代碼如下:
sec2 = Section(Vec2(50, 50), Vec2(-50, 50), Vec2(-50, -50), Vec2(50, -50))
mobiusBand = sweep_mubiu_arc(sec2, R, turns/2)
mobiusBand.smooth=True
➤ 方法比較
由模型輸出結果可知,在輸入參數一致的情況下,兩種方法得到的模型效果基本無異,而方法二則為用戶省去了大量精力與時間,並避免出錯成本。
④ 輸出模型
定義變量並輸出繪製模型。該過程代碼如下:
self['莫比烏斯環'] = mobiusBand
if __name__ == "__main__":
Final_Geometry = 莫比烏斯環
place(Final_Geometry)
模型輸出效果:
模型參數調整效果:
,