七、Sketchup用ruby進行二次開發--利用Transformation實現Move工具(平移、旋轉和縮放)
在Sketchup中,move工具使用的非常廣泛,,可以移動、拉伸和複製幾何體,也可以用來旋轉元件。舉一個簡單地例子。
我們要做一個建築物的尖頂,如下圖所示,就是使用move工具實現的。
接下來我們就要學習如何使用ruby實現這樣的功能。
實體類(Entities)提供了transform_entities方法來實現move的功能,transform_entities需要兩個引數,一個或一系列實體物件和一個變換物件(Transformation)。
例如,上圖中屋頂中間的線我們叫做roof_line,下面的程式碼實現把這條線沿著Z軸網上移動5個單位(英寸)。
ents = Sketchup.active_model.entities
tr = Geom::Transformation.translation [0, 0, 5]
ents.transform_entities tr, roof_line
在第二行,字首“Geom::”是必須的,這是因為Transformation類包含於Geom模型,這在接下來的章節中會介紹它是如何使用的。在這個例子中,tr是一個transformation物件,用於把roof_line從一個位置移動到另一個位置。
transformation可以實現平移、旋轉和縮放。
1、平移
在講平移之前,我們要先了解一個概念,平移向量。我們在高中學習過,從一個點移動到另一個點,如從點(1,2,3)移動到點(3,4,5),只需要知道起點和移動向量就能到達終點,這個移動向量是用終點座標減去起點座標,即向量(2,2,2)。這裡的平移向量類似於移動向量。
SketchUp API提供了三種方法來實現平移動能。
- 呼叫Geom::Transformation.new
- 呼叫Geom::Transformation.translation
- 使用平移向量本身。
下面用一個例子演示如何使用這三種方法,這個例子是將一個面移動三次,首先沿著X軸正向移動4個單位,然後Y軸正向6個單位,最後沿X軸負向移動3個單位。
# 建立一個正方形面 ents = Sketchup.active_model.entities tran_face = ents.add_face [-1, -1, 0], [-1, 1, 0], [1, 1, 0], [1, -1, 0] # T沿著X軸正向移動4個單位 t = Geom::Transformation.new [4, 0, 0] ents.transform_entities t, tran_face # Y軸正向6個單位 t = Geom::Transformation.new [0, 6, 0] ents.transform_entities t, tran_face # X軸負向移動3個單位 ents.transform_entities [-3, 0, 0], tran_face
移動路徑如下圖所示。
2、旋轉
去旋轉一個圖形,我們需要三個引數。
- 旋轉起源點(點)
- 旋轉軸(向量)
- 旋轉角度(浮點型)
看下圖更有助於理解。
系統提供兩種方法用Transformation物件實現旋轉功能
- 呼叫Geom::Transformation.new 和起源點、旋轉軸和角度引數
- 呼叫Geom::Transformation.rotation和起源點、旋轉軸和角度引數
例如,要實現上圖把圓圍繞(0,0,0)和Z軸旋轉30度,程式碼寫為:
tr = Geom::Transformation.new [0, 0, 0], [0, 0, 1], 30.degrees
tr = Geom::Transformation.rotation [0, 0, 0], [0, 0, 1], 30.degrees
另外需要注意的是如果旋轉角度是正值,則按‘逆時鐘方向’旋轉,如果是負值,就按順時針方向旋轉。
3、縮放
在Sketchup中,縮放工具可以改變圖形的大小形狀和改變圖形的位置。在用程式碼實現時,我們建立的縮放Transformation物件即會縮放圖形的大小也會縮放相對於預設點(0,0,0)的距離,例如下面的程式碼縮小了圖形的大小,也減小了到(0,0,0)的距離。
#建立一個正方形
ents = Sketchup.active_model.entities
tran_face = ents.add_face [-1, -1, 0],
[-1, 1, 0], [1, 1, 0], [1, -1, 0]
#沿X軸正向移動4個單位
t = Geom::Transformation.new [4, 0, 0]
ents.transform_entities t, tran_face
#把正方形縮放為原來的一半,即改變形狀也改變距原點的長度
t = Geom::Transformation.new 0.5
ents.transform_entities t, tran_face
效果如下圖所示
實現縮放功能還可以用如下程式碼,效果跟上面的一樣。
ents = Sketchup.active_model.entities
t = Geom::Transformation.scaling 0.5
ents.transform_entities t, shape
除此之外,我們還可以改變預設縮放的源點,即上面的(0,0,0)。例如,下面的程式碼實現把圖形放大2倍並把源點變為(5,5,5),相信在以後的應用中,這種寫法會比較常見。
t = Geom::Transformation.scaling [5, 5, 5], 2
上面介紹了改變源點進行縮放,下面我們介紹一下如何基於座標軸進行縮放。
為實現基於座標軸縮放,需要呼叫Transformation.scaling結合三個引數,即X,Y,Z所縮放值,例如,下面程式碼實現減小X軸的一半,擴大Y軸的3倍,保持Z軸不變。
t = Geom::Transformation.scaling 0.5, 3, 1
示意圖為
scaling最後一種用法是結合以上三種,即,改變源點和x,y,z的縮放值,例如,設定源點為(5,5,5),相對於源點,實現減小X軸的一半,擴大Y軸的3倍,保持Z軸不變程式碼如下。
t = Geom::Transformation.scaling [5, 5, 5], 0.5, 3, 1
總結:
在本節中我們實現了平移、旋轉和縮放功能,下一節中我將簡單介紹將三種方法結合使用。