文為科技有限公司 Win Way Technology CO., LTD.
1-1. 找出此柱的參考柱List --- setlPillarRef()
(1) 從此柱的最底層開始往上找參考柱。
(2) 先將最底層的柱寫入lPillarRef[0],而後開始往上找。
(3) 上層的柱拿來與剛寫入lPillarRef的柱子做比較。
如果長寬相同 且 組合點相同 且 柱主筋外層支數相同 且 柱主筋內層支數相同 => 跳過
如果長寬不同 或 組合點不同 或 柱主筋外層支數不同 或 柱主筋內層支數不同
=> 寫入lPillarRef,成為下一個參考柱
(4) 此柱從最底層開始,至此柱最頂層結束,迴圈第(3)步驟,得到此柱的lPillarRef。
(5) 每寫入一支參考柱,馬上計算參考柱的座標點。
--- getOutInXy012ForPillarRef()
(5-1) 得到此柱psd對應的 X側間隔數量 及 Y側間隔數量 --- getlOutSpaceNum()
=> 如果得出X側只有一個間隔,若符合條件,要修正為兩個;Y側減少一個。
=> 如果得出Y側只有一個間隔,若符合條件,要修正為兩個;X側減少一個。
註: 條件是該側大於30cm
=> 至少要勾一支繫筋,所以間隔要兩個,才能擺放一支主筋。
(5-2) 不計角落四支主筋
=> X側可擺放的鋼筋數量 = X側間隔數量 - 1
=> Y側可擺放的鋼筋數量 = Y側間隔數量 - 1
(5-3) 可得X側及Y側的鋼筋中心距
=> X側鋼筋中心距 = modX / X側間隔數量
=> Y側鋼筋中心距 = modY / Y側間隔數量
重要: 此處計算的是外層主筋的X側間隔數量及Y側間隔數量
=> 因為要以外層的位置來擺放外層主筋及內層主筋。
(5-4) 先擺放外層上側及外層左側座標點,座標點位的順序如下左圖。
(5-5) 複製外層上側座標點給外層下側;複製外層左側座標點給外層右側。
座標點位的順序如下左圖。
(5-6) 外層座標點偏移產生內層座標點,如下右圖。
註: 偏移量為 = 鋼筋直徑 + 3.2cm
(5-7) 外層鋼筋從右上角開始212121....,逆時針給定奇偶值,以下圖為例。
外層上側[2, 1, 2, 1, 2, 1];外層左側[2, 1, 2, 1, 2];
外層下側[1, 2, 1, 2, 1, 2];外層右側[1, 2, 1, 2, 1]。
=> 奇偶值要按照座標點位的順序排列後,才存入奇偶值的List裡面。以下圖為例。
外層上側[2, 1, 2, 1, 2, 1];外層左側[2, 1, 2, 1, 2];
外層下側[1, 2, 1, 2, 1, 2];外層右側[1, 1, 2, 1, 2]。
(5-8) 內層鋼筋從右上角開始121212....,逆時針給定奇偶值,以下圖為例。
內層上側[1, 2, 1, 2, 1, 2];內層左側[1, 2, 1, 2, 1];
內層下側[2, 1, 2, 1, 2, 1];內層右側[2, 1, 2, 1, 2]。
=> 奇偶值要按照座標點位的順序排列後,才存入奇偶值的List裡面。以下圖為例。
內層上側[2, 1, 2, 1, 2, 1];內層左側[1, 2, 1, 2, 1];
內層下側[2, 1, 2, 1, 2, 1];內層右側[2, 2, 1, 2, 1]。
(5-9) 依照內層的鋼筋支數來刪減座標點及012。
=> 如果內層鋼筋沒有資料,內層的座標點及012全部清空。
=> 如果內層鋼筋有值,計算出內層X側主筋數量及內層Y側主筋數量。
--- getlInSpaceNum()
註: 得到內層兩側主筋數量,再用sublist刪減座標點及012。
如左圖例: 內層鋼筋有10-#8
(1) 先扣除角落4支 (10 - 4 = 6)
(2) 剩六支平均擺放4側(6 / 4 = 1 ... 2)
(3) 每側各擺一支
(餘數只可能是0或2,因為主筋數目皆為偶數)
若餘數為0 => 平均擺放4側
若餘數為2 => 多出來的2支放在短邊側。
1-2. 每個參考柱的座標點與上一個參考柱的座標點相比
(1) 全部的lPillarRef迴圈,每個參考柱(pRef2)都跟前一個參考柱(pRef1)比較。
(2) 把pRef2的每一個座標點拿出來迴圈,跟pRef1的座標點list比較。
(3) 將pRef2的座標點傳入getlIndexInTolRange()
(3-1) 如pRef1中有座標點與傳入點 的距離小於容許值,回傳pRef1的座標點index。
=> 座標點(pRef1中)已經取代過pRef2的某一點,要寫成null
=> 防止其他pRef2的座標點找到他。
(3-2) 如沒有,回傳[-1, -1]。
=> 此pRef2的座標點對應的012值與pRef2內前一個座標點的012值比較
=> 若相同,要改成不同,奇偶值才能交錯排列。
註: 容許值 = min (X側鋼筋中心距, Y側鋼筋中心距, 7.5cm) ,因為在算pRef,所以以pRef2為準。
如下圖例:
前一個參考柱(pRef1)
外層主筋: 28-#8 內層主筋: 12-#8
目前參考柱(pRef2)
外層主筋: 22-#8 內層主筋: 10-#8
(1) 若此座標點(綠色底)能在前一個參考柱pRef1的座標點中找到與之相距容許值內的座標點;則將紫色的座標點位及012複製給綠色座標。
(2) 沒有規定紫色下側座標點只能取代綠色下側座標點;紫色下側座標點也能取代綠色右側座標點。紫色內層座標點也能取代綠色外層座標點。只要相距容許值內都可以取代。
1-3. 計算每層的鋼筋座標點
(1) 此柱的各樓層柱迴圈,從此柱的最底層開始,至此柱的最頂層結束。
(2) 將迴圈中的p柱傳入getOutInXy012ForEach()
(3) 判斷傳入柱p是否為參考柱。
(3-1) 若為參考柱,其座標點及012已算過,直接return。
(3-2) 若不是參考柱,找尋傳入柱p在哪兩個參考柱之間。
=> 代表此柱的參考柱為下面那個參考柱,將參考柱的座標點及012複製給傳入柱p。
註: 目前是考慮外層主筋及內層主筋的數量都要相同,才不會成為參考柱。所以可以不用sublist座標點及012(getOutInXy012ForEach()程式碼中的1-4-3、1-4-4可不用,之後可刪除)。
重要: 步驟1-3只是把參考柱的座標點及012複製給主筋支數相同、組合點相同、長寬相同的柱! (只剩下這些柱還沒有座標點及012)
2-1. 得到此柱的llBarHeight --- getPillarBarHeightList()
(1) 定義此柱各樓層的奇偶筋有沒有續接(llcoupler) --- Pillar.getllcoupler()。
(1-1) 給定各樓層的預設值。
=> 地下層全部預設 [True, True] ( 以下敘述簡稱 [T, T] )
=> 地上層預設 [True, False] 或 [False, True] ( 以下敘述簡稱 [T, F] 或 [F, T] )
從1F的上一層開始[T, F],再上一層 [F, T],再上一層[T, F],到總樓層的最頂。
[T, F] 及 [F, T] 交互排列。
=> 一樓預設 [T, T]
=> 此柱的最底層預設 [False, False] ( 以下敘述簡稱 [F, F] )
=> 此柱的最頂層預設 [Null, Null] ( 以下敘述簡稱 [N, N] )
=> 將最底層以下的樓層預設 [N, N]
=> 將最頂層以上的樓層預設 [N, N]
(1-2) 判斷 (i樓層柱高 + i+1樓柱高) 是否超過使用者限定的鋼筋長度(ex.預設值9m)
=> 超過9米,要加續接器,將 i+1樓改成[T, T]。
註: 此llcoupler的長度是固定的,總樓層數有幾樓就幾個,不會因為柱延伸的樓層比較少而變少。以商旅案為例,總樓層數為8層樓(iFloor=0~8),不管計算哪一個柱,該柱的llcoupler.length = 8。
(2) 計算llBarHeight (不含此柱的最頂層) 如流程圖所示
(3) 計算llBarHeight (此柱的最頂層) 如流程圖所示
2-2. 產生VB --- Pillar.createVirtualBox()
(1) 先得到可以使用的ordinal元件序號
(2) 在虛擬面之下創造子物件VB
(3) 用pillar的組合點作為VB的組合點,並產生VB的oloc
(4) 產生虛擬空間VB (VB的shape可使用BlockWire或ExtrudedWire --- getVBShape() )
2-3. 畫出鋼筋 --- drawPillarBar()
(1) 得到樓上柱、樓樓上柱、樓下柱、當前柱的鋼筋座標點及鋼筋描述
(1-1) 樓上柱鋼筋座標點lllXyPosUp及鋼筋描述psdUp
(1-2) 樓樓上柱鋼筋座標點lllXyPosUp2及鋼筋描述psdUp2
(1-3) 樓下柱鋼筋座標點lllXyPosDown及鋼筋描述psdDown
(1-4) 當前柱鋼筋座標點lllXyPos、鋼筋奇偶值ll012及鋼筋描述psd
(2) 畫出主筋
(2-1) 當前柱的每一個鋼筋座標點迴圈,得到這支鋼筋的
=> bDownLd(是否往下Ld)
=> bThead(樓上是否T頭)
=> bThead2(樓樓上是否T頭)
=> lBarSize(用來判斷續接器上下端的號數)
註: lBarSize=[樓下號數, 當前號數, 樓上號數, 樓樓上號數],此時要判斷這支鋼筋是外層主筋還是內層主筋。
(2-2) 用(2-1)得到的參數,產生鋼筋形狀(4個Method) --- createPillarBarAndShape()
(A) 如果此樓層的奇數筋或偶數筋沒有長度 且 不用往下Ld => 不用畫鋼筋
註: 但如果要畫Ld,代表樓下沒有此座標點 = 原先樓下應該畫的鋼筋沒有畫上來
解決: 在 getTopLBarShape() 及 getIBarShape() 中,多加判斷式
=> 如果鋼筋長度為0,要幫樓下把鋼筋畫在此樓層的vBox。
(B) 如果 (傳入的樓層數 = 當前柱底端的iFloor) 且
(只有一層柱 或 上一層的長度為0) => 代表此樓層為柱筋唯一一樓
=> 主筋起點終點皆彎鉤(Z型鋼筋) --- getOneZBarShape()
(C) 如果 (傳入的樓層數 = 當前柱底端的iFloor) => 代表此樓層為柱筋第一樓
=> 主筋起點(底端)彎鉤 --- getBaseLBarShape()
=> 得到母續接器的名字 --- getCouplerFemaleName()
(D) 如果 (傳入的樓層數 = 柱子最高樓層數-1) => 代表此樓層為柱筋最後一樓
如果 (傳入的樓層數 = 柱子最高樓層數-2) 且 (上層的長度為0)
=> 代表此樓層為柱筋倒數第二樓,此柱筋會延伸至柱筋最頂,要畫彎鉤
=> 主筋終點(頂端)彎鉤 --- getTopLBarShape()
(E) 其他 => 代表中間樓層的柱筋
=> 主筋起點終點皆不彎鉤 --- getIBarShape()
=> 得到母續接器的名字 --- getCouplerFemaleName()
註: 只有(C)跟(E)需要紀錄母續接器的名字,只有這兩個Method會畫出母續接器。
註: 續接器的數量計算與號數紀錄,目前都以母續接器為主,比較好算且正確。
(3) 畫出箍筋與繫筋
/