將bokeh繪圖搬入Flask,使用的是上學期的倉儲。
bokeh網頁原始碼
bokeh在使用後,可以不選擇存檔,而是變成網頁原始碼的型態,讓程式利用。
#不使用from bokeh.plotting import figure, output_file, show, save #而導入: from bokeh.plotting import figure from bokeh.resources import CDN from bokeh.embed import file_html #照常畫圖 plot = figure(...) plot.line(...) #最後傳出給outstring outstring = str(file_html(plot, CDN, "網頁視窗標題"))
變成這樣的形態後,會先讓SLVS程式庫和bokeh計算完原始碼後才使用,算是靜態結果,這樣會產生一個缺點,稍後會提到。
bokeh也有自己的附加功能"JavaScript Callbacks",屬於動態運算,讓圖形能及時更新,不用重新整理。
參考連結:http://bokeh.pydata.org/en/latest/docs/user_guide/interaction/callbacks.html#customjs-for-widgets
試過了範例Slider的方法(最接近需求:給角度求機構當前狀態),在JavaScript中卻不知所以然,不知道要如何把callback的內容帶入我的函式中。
上網看過別人的範例,不同利用方式都不一樣,但是不知道如何修改JS迴圈中的內容。因為機構的圖形要回傳所有的點,可能要了解一下這些物件的關係。
Flask
和上學期的專案一樣,用python wsgi.py啟動後就能呼叫程式並帶入變數求解。
不同的是用到新模組和自己的程式庫。
在自己的檔案中再插入一段Mango(k)來嵌入bokeh的圖形,並希望能控制機構的角度狀態。

稍微調整了bokeh的選項,隱藏工具、取消預設工具、不可拖移、放大介面等等。
@bg9_40323230.route('/crank_rock/<k>')
def Mango(k):
outstring = ""
#相關參數
d0 = 90 #基線長度(mm)
n1 = 35 #短連桿長度(mm)
n2 = 70 #長連桿長度(mm)
t1 = 40 #三角形第一邊(mm)
t2 = 40 #三角形第二邊(mm)
t3 = 70 #三角形第三邊(mm)
#迴圈求路徑用
def crank_rock(degree):
...
#當前機構狀態用
def crank_rock_M(degree):
...
#主程式
X1val = []
Y1val = []
for i in range(0, 361):
x, y = crank_rock(i)
X1val += [x]
Y1val += [y]
x1, y1, x2, y2, x3, y3, x4, y4, x5, y5 = crank_rock_M(float(k))
X2val = [x1, x4, x3, x5, x4, x5, x2]
Y2val = [y1, y4, y3, y5, y4, y5, y2]
X3val = [x1, x2]
Y3val = [y1, y2]
#bokeh
plot = figure(title="simple line example", x_axis_label='x', y_axis_label='y', toolbar_location=None, plot_width=700, plot_height=700)
plot.line(X1val, Y1val, legend="Path.", line_width=2, line_color="blue")
plot.line(X2val, Y2val, legend="Mechanism.", line_width=4, line_color="red")
plot.line(X3val, Y3val, line_width=3, line_dash=[4, 4], line_color="orange")
plot.toolbar.active_drag = None
outstring = str(file_html(plot, CDN, "Crank Rocker: "+str(k)+" degree"))
return outstring
這樣子程式會計算出HTML的原始碼給網頁,而bokeh的網頁中不會用到python程式。
在這裡k是以字串的方式帶進來的,所以必須轉成Float才能計算。
但是如果預先設置了defaults值時(例如120),這裡的120可以代表字串或整數或浮點數,python會搶先認定defaults值能用,儘管自訂的k值後來轉成浮點數,結果仍然會是defaults值。
所以最後不得以把defaults值捨棄。
最後結果:

建立了一支Openshift程式,但是上傳後卻無法使用,不知道是Python 3.3還是其他的問題,整個程式都跑不了。

最近因為有點感冒,研究bokeh的互動功能函式滿久的。
嘗試過用3D的方式解手臂極限範圍,但是程式庫有些盲點。
SLVS似乎會認定4個約束在同平面的3D點,他們之間的2條連線如果約束為平行,是重複約束,目前不知道要怎麼辦。
Comments
comments powered by Disqus